Jenkins Pipeline 完整示例
一个“完整”的 Jenkins Pipeline 示例通常包含:代码拉取、环境准备、构建/测试、制品归档、通知这几个阶段。
下面是一个通用的 Declarative Pipeline 示例,适用于大多数基于 Maven (Java) 或 Node.js 的 Web 项目。代码中包含了详细的注释,方便理解每一部分的作用。
可以将这段代码保存在项目根目录下的 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()
}
}
}
为了让你更好地修改这个模板,这里解释几个核心点:
决定了 Pipeline 在哪里运行。如果你有专门的 Docker 节点,可以写 label ‘docker’。
用于存放环境变量和敏感信息(如密码)。强烈建议使用 credentials() 来引用 Jenkins 凭证,而不是直接把密码写在代码里。
实现了“参数化构建”。当你点击构建时,Jenkins 会弹窗让你输入版本号或选择开关。
条件判断。比如上面的例子中,只有 master 分支才会执行打包 Docker 镜像的操作,其他分支(如 feature 分支)只会构建和测试。
这是构建结束后的收尾工作。通常用于发送通知或归档文件。
- 安装插件:确保 Jenkins 安装了必要的插件,如 Git, Pipeline, Docker, Email Extension 等。
- 新建任务:在 Jenkins 界面选择“新建任务” -> “流水线”。
- 配置流水线:
- 在“构建触发器”中可以选择 GitHub hook trigger 实现自动触发,或者使用 Build periodically 设置定时任务。
- 在“流水线”部分,选择 Pipeline script from SCM,然后填写你的 Git 仓库地址和 Jenkinsfile 的路径。
- 点击构建:保存后点击“立即构建”,观察左侧的构建队列和日志输出。
这个示例涵盖了 CI/CD 的大部分场景,可以根据项目的具体语言(Go, Python, Java 等)替换 steps 中的 Shell 命令即可。