我们来学习 Pipeline as Code(流水线即代码)。这是 Jenkins 最推荐的实践方式,将流水线的定义(Jenkinsfile)和应用程序代码一起存储在 Git 仓库中,从而实现版本控制、代码审查和自动化更新。


🎯 学习目标

  • 理解为什么要把 Pipeline 脚本放入 Git。

  • 将现有的 Pipeline 脚本从 Jenkins 网页迁移到 Jenkinsfile

  • 修改 Jenkins 任务配置,从 Git 仓库读取 Jenkinsfile

  • 验证修改后的效果:当 Jenkinsfile 更新并推送到 GitLab 后,Jenkins 自动使用新脚本。


📝 第一步:在本地项目根目录创建 Jenkinsfile

  1. 在 Cursor 中打开你的项目文件夹 D:\gitlabjenkins\my-cicd-demo

  2. 在项目根目录(与 app.py 同级)创建一个新文件,命名为 Jenkinsfile(注意大小写,没有扩展名)。

        3.将使用Vscode将运行的 Pipeline 脚本完整复制到 Jenkinsfile 中。就是你最后一次在 Jenkins 网页中使用的脚本(包含 CheckoutBuildTestDeploy 和 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

  1. 登录 Jenkins,进入任务 flask-cicd-demo → 配置

  2. 滚动到 Pipeline 部分。

  3. 将 Definition 从 Pipeline script 改为 Pipeline script from SCM

  4. 在 SCM 下拉菜单中选择 Git(如果未选择)。

  5. 填写以下字段:

    • Repository URLhttp://192.168.88.137/root/my-cicd-demo.git

    • Credentials:选择你之前添加的 gitlab-root-cred(如果没出现,可以重新添加)。

    • Branches to build*/main(表示从 main 分支拉取)。

    • Script Path:保持默认的 Jenkinsfile(因为我们在根目录创建了该文件)。

  6. 点击 保存

此时发生了什么?
Jenkins 不再使用网页中保存的脚本,而是每次构建时从 Git 仓库拉取 Jenkinsfile 并执行。这样流水线定义就与应用程序代码版本一致了。


🧪 第四步:测试验证

  1. 在 Jenkins 任务页面,点击 Build Now

  2. 查看 Console Output。你会在日志开头看到类似:

    text

    Cloning repository http://192.168.88.137/root/my-cicd-demo.git
    ...
    [Pipeline] readTrusted
    > git rev-parse origin/main^{commit} # ...

  3. 这表明 Jenkins 从 Git 仓库拉取了 Jenkinsfile 并执行。

  4. 构建完成后,访问 http://192.168.88.135:5000,确认 Flask 应用依然正常运行。


🔁 第五步:体验“修改 Jenkinsfile 即自动生效”

  1. 在本地修改 Jenkinsfile,比如在 Build 阶段的 echo 信息中加一句 "This is v2"

  2. 提交并推送:

    bash

    git add Jenkinsfile
    git commit -m "Update pipeline message"
    git push origin main
  3. 在 Jenkins 中再次点击 Build Now(无需任何配置改动)。

  4. 观察 Console Output,会发现新的 echo 信息已经生效——说明 Jenkins 自动使用了仓库中最新版本的 Jenkinsfile


📌 关键知识点

概念 解释
Pipeline as Code 将构建、测试、部署的步骤以代码形式存储在版本控制系统中(这里是 Git)。
Jenkinsfile 包含 Pipeline 定义的文本文件,通常放在项目根目录。
SCM 触发 Jenkins 会在每次构建时从 SCM(源码管理)拉取最新的 Jenkinsfile
版本控制优势 修改流水线可以像普通代码一样进行 Code Review、回滚、追溯。
解耦配置 无需登录 Jenkins 界面修改,开发人员直接修改 Jenkinsfile 即可。

🧠 扩展思考

  • 如果你的项目有多个分支(如 devfeature),每个分支可以有自己的 Jenkinsfile,使得不同分支的流水线行为可以不同(比如 dev 部署到测试环境,main 部署到生产环境)。

  • 如果你的 Jenkins 任务配置为 Pipeline script from SCM,那么即使 Jenkins 服务器重装或迁移,只要 Git 仓库存在,所有流水线定义都可以恢复。


✅ 总结

现在你的 CI/CD 流水线已经完全 Pipeline as Code 化。所有流水线逻辑都保存在 Git 仓库中,团队成员可以协作修改,Jenkins 自动拉取并使用最新版本。这使得整个 DevOps 流程更加标准化和透明。

如果你对自动触发(Poll SCM 或 Webhook)感兴趣,我们下一步可以继续配置,让 Jenkins 在推送代码时自动构建,完全无需手动点击。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐