Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Jenkins Pipeline 完整示例

一个“完整”的 Jenkins Pipeline 示例通常包含:代码拉取、环境准备、构建/测试、制品归档、通知这几个阶段。

下面是一个通用的 Declarative Pipeline 示例,适用于大多数基于 Maven (Java) 或 Node.js 的 Web 项目。代码中包含了详细的注释,方便理解每一部分的作用。

🛠️ 完整 Jenkinsfile 示例

可以将这段代码保存在项目根目录下的 Jenkinsfile 中,或者直接在 Jenkins 任务的配置页面中输入。

pipeline {
    // 1. Agent 配置:指定在哪个节点运行
    // 'any' 表示任意可用的 agent
    // 也可以指定标签,如 label 'docker-node'
    agent any

    // 2. 环境变量定义
    // 这里定义的变量可以在整个 Pipeline 中使用
    environment {
        // 从 Jenkins 凭证管理中获取 Docker 仓库密码
        // 'docker-hub' 是你在 Jenkins 中创建的凭证 ID
        DOCKER_CREDENTIALS = credentials('docker-hub')
        // 定义应用名称
        APP_NAME = 'my-awesome-app'
        // 获取构建编号,用于打 Docker 镜像标签
        IMAGE_TAG = '{BUILD_NUMBER}'
    }

    // 3. 参数化构建
    // 允许在点击“立即构建”时手动输入参数
    parameters {
        string(name: 'VERSION', defaultValue: '1.0', description: '请输入构建的版本号')
        booleanParam(name: 'DEBUG_BUILD', defaultValue: false, description: '是否开启调试模式?')
    }

    // 4. 主要执行阶段
    stages {
        // 阶段 1:检出代码
        stage('检出代码') {
            steps {
                script {
                    echo '开始拉取代码...'
                    // 删除工作空间旧文件(相当于 clean)
                    cleanWs()
                }
                // 使用 Git 插件拉取代码
                // 替换为你自己的仓库地址
                git branch: 'main',
                     url: 'https://github.com/yourname/your-repo.git',
                     credentialsId: 'github-token' // 如果是私有仓库需要凭证
            }
        }

        // 阶段 2:依赖安装与构建
        stage('构建项目') {
            steps {
                script {
                    echo '开始构建项目,版本: {params.VERSION}'

                    // 示例:如果是 Node.js 项目
                    // sh 'npm install'
                    // sh 'npm run build'

                    // 示例:如果是 Maven 项目
                    // sh 'mvn clean package -DskipTests'

                    // 这里我们模拟一个构建过程
                    sh 'echo "模拟编译过程..."'
                    sh 'sleep 5' // 模拟耗时操作
                }
            }
        }

        // 阶段 3:运行测试
        stage('运行测试') {
            steps {
                script {
                    echo '运行单元测试...'
                    // 这里可以集成 JUnit 测试报告
                    // sh 'mvn test'
                    sh 'echo "测试通过!"'

                // 归档测试报告(如果有的话)
                // junit '**/target/surefire-reports/*.xml'
                }
            }
        }

        // 阶段 4:代码质量检查 (SonarQube 示例)
        stage('代码质量检查') {
            steps {
                script {
                    echo '正在扫描代码质量...'
                // 需要安装 SonarQube Scanner 插件
                // withSonarQubeEnv('MySonarServer') {
                //     sh 'mvn sonar:sonar'
                // }
                }
            }
        }

        // 阶段 5:制作 Docker 镜像
        stage('打包 Docker 镜像') {
            when {
                // 仅在 master 分支执行
                branch 'main'
            }
            steps {
                script {
                    echo '正在构建 Docker 镜像...'
                    // 使用 Docker 插件
                    docker.build('{env.APP_NAME}:{env.IMAGE_TAG}')
                }
            }
        }

        // 阶段 6:部署
        stage('部署到服务器') {
            when {
                expression {
                    // 只有构建参数 DEBUG_BUILD 为 false 时才部署
                    return !params.DEBUG_BUILD
                }
            }
            steps {
                script {
                    echo '开始部署应用...'
                    // 这里可以使用 SSH 插件发送脚本到远程服务器
                    // sshPublisher(publishers: [
                    //     sshPublisherDesc(
                    //         configName: 'prod-server',
                    //         transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'docker-compose up -d', ...)]
                    //     )
                    // ])

                    // 模拟部署
                    sh 'echo "应用已部署到生产环境!"'
                }
            }
        }
    }

    // 5. 无论构建成功还是失败,都会执行的清理或通知步骤
    post {
        // 构建成功
        success {
            steps {
                echo '🎉 构建成功!'
            // 发送企业微信或钉钉通知
            // slackSend channel: '#jenkins', message: "构建成功: {env.BUILD_URL}"
            }
        }

        // 构建失败
        failure {
            steps {
                echo '🚨 构建失败!请检查日志。'
                // 发送邮件通知负责人
                emailext(
                    subject: '构建失败: {currentBuild.fullDisplayName}',
                    body: "请登录 Jenkins 查看详细日志: ${env.BUILD_URL}",
                    to: 'dev-team@example.com'
                )
            }
        }

        // 始终执行(归档制品)
        always {
            steps {
                script {
                    // 归档构建产物(如 jar 包、zip 文件)
                    // 这样可以在 Jenkins 界面下载
                    archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
                }
            }
        }

        // 清理工作空间
        cleanup {
            cleanWs()
        }
    }
}

🧩 关键组件解析

为了让你更好地修改这个模板,这里解释几个核心点:

agent any

决定了 Pipeline 在哪里运行。如果你有专门的 Docker 节点,可以写 label ‘docker’。

environment

用于存放环境变量和敏感信息(如密码)。强烈建议使用 credentials() 来引用 Jenkins 凭证,而不是直接把密码写在代码里。

parameters

实现了“参数化构建”。当你点击构建时,Jenkins 会弹窗让你输入版本号或选择开关。

when 指令

条件判断。比如上面的例子中,只有 master 分支才会执行打包 Docker 镜像的操作,其他分支(如 feature 分支)只会构建和测试。

post 阶段

这是构建结束后的收尾工作。通常用于发送通知或归档文件。


🚀 如何使用

  1. 安装插件:确保 Jenkins 安装了必要的插件,如 Git, Pipeline, Docker, Email Extension 等。
  2. 新建任务:在 Jenkins 界面选择“新建任务” -> “流水线”。
  3. 配置流水线:
    • 在“构建触发器”中可以选择 GitHub hook trigger 实现自动触发,或者使用 Build periodically 设置定时任务。
    • 在“流水线”部分,选择 Pipeline script from SCM,然后填写你的 Git 仓库地址和 Jenkinsfile 的路径。
  4. 点击构建:保存后点击“立即构建”,观察左侧的构建队列和日志输出。

这个示例涵盖了 CI/CD 的大部分场景,可以根据项目的具体语言(Go, Python, Java 等)替换 steps 中的 Shell 命令即可。