Jenkins:Pipeline as Code(流水线即代码)
我们来学习 Pipeline as Code(流水线即代码)。这是 Jenkins 最推荐的实践方式,将流水线的定义(Jenkinsfile)和应用程序代码一起存储在 Git 仓库中,从而实现版本控制、代码审查和自动化更新。
🎯 学习目标
-
理解为什么要把 Pipeline 脚本放入 Git。
-
将现有的 Pipeline 脚本从 Jenkins 网页迁移到
Jenkinsfile。 -
修改 Jenkins 任务配置,从 Git 仓库读取
Jenkinsfile。 -
验证修改后的效果:当
Jenkinsfile更新并推送到 GitLab 后,Jenkins 自动使用新脚本。
📝 第一步:在本地项目根目录创建 Jenkinsfile
-
在 Cursor 中打开你的项目文件夹
D:\gitlabjenkins\my-cicd-demo。 -
在项目根目录(与
app.py同级)创建一个新文件,命名为Jenkinsfile(注意大小写,没有扩展名)。

3.将使用Vscode将运行的 Pipeline 脚本完整复制到 Jenkinsfile 中。就是你最后一次在 Jenkins 网页中使用的脚本(包含 Checkout、Build、Test、Deploy 和 post 部分)。

pipeline {
agent any
stages {
// ---------- 1️⃣ 拉取代码 ----------
stage('Checkout') {
steps {
git branch: 'main',
credentialsId: 'gitlab-root-cred',
url: 'http://192.168.88.137/root/my-cicd-demo.git'
}
}
// ---------- 2️⃣ 构建(安装依赖) ----------
stage('Build') {
steps {
sh '''
cd $WORKSPACE
echo "正在安装 Python 依赖..."
pip3 install -r requirements.txt
echo "✅ 构建完成"
'''
}
}
// ---------- 3️⃣ 测试(并行任务) ----------
stage('Test') {
parallel {
stage('语法检查 (Syntax Check)') {
steps {
sh '''
cd $WORKSPACE
echo "正在检查 Python 语法..."
python3 -m py_compile app.py
echo "✅ 语法检查通过"
'''
}
}
stage('单元测试 (Unit Test 占位)') {
steps {
sh '''
cd $WORKSPACE
echo "正在运行单元测试(占位)..."
python3 -c "print('所有测试通过!')"
echo "✅ 单元测试通过"
'''
}
}
}
}
// ---------- 4️⃣ 部署(仅当 main 分支) ----------
stage('Deploy') {
when {
branch 'main'
}
steps {
sh '''
cd $WORKSPACE
echo "正在部署到测试服务器..."
pkill -f "app.py" || true
nohup python3 app.py > app.log 2>&1 &
echo "✅ Flask 应用已部署到 http://192.168.88.135:5000"
'''
}
}
}
// ---------- 5️⃣ 后置动作 ----------
post {
always {
echo "流水线执行结束(无论成败)。"
}
success {
echo "🎉 恭喜!构建、测试、部署全部成功!"
}
failure {
echo "🚨 流水线失败,请检查控制台日志。"
}
unstable {
echo "⚠️ 流水线状态不稳定(例如测试通过但覆盖率不足)。"
}
}
}
为什么要这样做?
把流水线代码放到 Git 仓库后,所有对流水线的修改都会像代码一样被记录,你可以随时回滚、查看历史,团队也能协作修改。
📤 第二步:提交并推送到 GitLab 的 main 分支
在本地终端中执行:
bash
git add Jenkinsfile
git commit -m "Add Jenkinsfile for CI/CD pipeline"
git push origin main

此时,你的 GitLab 仓库 root/my-cicd-demo 的 main 分支中就有了 Jenkinsfile 文件。
⚙️ 第三步:修改 Jenkins 任务,使用仓库中的 Jenkinsfile
-
登录 Jenkins,进入任务
flask-cicd-demo→ 配置。 -
滚动到 Pipeline 部分。
-
将 Definition 从
Pipeline script改为Pipeline script from SCM。 -
在 SCM 下拉菜单中选择 Git(如果未选择)。
-
填写以下字段:
-
Repository URL:
http://192.168.88.137/root/my-cicd-demo.git -
Credentials:选择你之前添加的
gitlab-root-cred(如果没出现,可以重新添加)。 -
Branches to build:
*/main(表示从main分支拉取)。 -
Script Path:保持默认的
Jenkinsfile(因为我们在根目录创建了该文件)。
-
-
点击 保存。

此时发生了什么?
Jenkins 不再使用网页中保存的脚本,而是每次构建时从 Git 仓库拉取 Jenkinsfile 并执行。这样流水线定义就与应用程序代码版本一致了。
🧪 第四步:测试验证
-
在 Jenkins 任务页面,点击 Build Now。
-
查看 Console Output。你会在日志开头看到类似:
text
Cloning repository http://192.168.88.137/root/my-cicd-demo.git ... [Pipeline] readTrusted > git rev-parse origin/main^{commit} # ...
-
这表明 Jenkins 从 Git 仓库拉取了
Jenkinsfile并执行。 -
构建完成后,访问
http://192.168.88.135:5000,确认 Flask 应用依然正常运行。

🔁 第五步:体验“修改 Jenkinsfile 即自动生效”
-
在本地修改
Jenkinsfile,比如在Build阶段的echo信息中加一句"This is v2"。 -
提交并推送:
bash
git add Jenkinsfile git commit -m "Update pipeline message" git push origin main
-
在 Jenkins 中再次点击 Build Now(无需任何配置改动)。
-
观察 Console Output,会发现新的
echo信息已经生效——说明 Jenkins 自动使用了仓库中最新版本的Jenkinsfile。

📌 关键知识点
| 概念 | 解释 |
|---|---|
| Pipeline as Code | 将构建、测试、部署的步骤以代码形式存储在版本控制系统中(这里是 Git)。 |
| Jenkinsfile | 包含 Pipeline 定义的文本文件,通常放在项目根目录。 |
| SCM 触发 | Jenkins 会在每次构建时从 SCM(源码管理)拉取最新的 Jenkinsfile。 |
| 版本控制优势 | 修改流水线可以像普通代码一样进行 Code Review、回滚、追溯。 |
| 解耦配置 | 无需登录 Jenkins 界面修改,开发人员直接修改 Jenkinsfile 即可。 |
🧠 扩展思考
-
如果你的项目有多个分支(如
dev、feature),每个分支可以有自己的Jenkinsfile,使得不同分支的流水线行为可以不同(比如dev部署到测试环境,main部署到生产环境)。 -
如果你的 Jenkins 任务配置为
Pipeline script from SCM,那么即使 Jenkins 服务器重装或迁移,只要 Git 仓库存在,所有流水线定义都可以恢复。
✅ 总结
现在你的 CI/CD 流水线已经完全 Pipeline as Code 化。所有流水线逻辑都保存在 Git 仓库中,团队成员可以协作修改,Jenkins 自动拉取并使用最新版本。这使得整个 DevOps 流程更加标准化和透明。
如果你对自动触发(Poll SCM 或 Webhook)感兴趣,我们下一步可以继续配置,让 Jenkins 在推送代码时自动构建,完全无需手动点击。
更多推荐



所有评论(0)