在Jenkins Pipeline中实现复杂的工作流通常涉及多个步骤、条件逻辑、并行执行以及错误处理等。Jenkins提供了强大的声明式语法(Declarative Pipeline)和脚本式语法(Scripted Pipeline),使得构建复杂的工作流变得可能。下面我将通过一个具体的例子来说明如何使用声明式Pipeline实现一个复杂的工作流。
示例场景
假设我们有一个项目,该项目需要进行以下工作流程:
- 在开发分支上运行单元测试。
- 如果单元测试通过,则将代码打包。
- 将打包后的文件部署到开发环境。
- 如果开发环境部署成功,且代码已经合并到了主分支,则运行集成测试。
- 如果集成测试通过,则将代码部署到生产环境。
声明式Pipeline示例
pipeline {
agent any
environment {
BRANCH_NAME = 'develop' // 默认为开发分支
}
stages {
stage('Checkout') {
steps {
script {
// 获取当前分支名
env.BRANCH_NAME = sh(script: 'git rev-parse --abbrev-ref HEAD', returnStdout: true).trim()
}
git branch: "${env.BRANCH_NAME}", url: 'https://repo.example.com/project.git'
}
}
stage('Run Unit Tests') {
when {
expression { env.BRANCH_NAME ==~ /develop/ }
}
steps {
sh 'mvn test'
}
}
stage('Package Application') {
when {
expression { currentBuild.result == 'SUCCESS' }
}
steps {
sh 'mvn package'
}
}
stage('Deploy to Dev Environment') {
when {
expression { currentBuild.result == 'SUCCESS' }
}
steps {
sh 'deploy-to-dev.sh'
}
}
stage('Run Integration Tests') {
when {
allOf {
expression { env.BRANCH_NAME ==~ /main/ }
expression { currentBuild.result == 'SUCCESS' }
}
}
steps {
sh 'mvn verify'
}
}
stage('Deploy to Production') {
when {
allOf {
expression { currentBuild.result == 'SUCCESS' }
expression { env.BRANCH_NAME ==~ /main/ }
}
}
steps {
sh 'deploy-to-prod.sh'
}
}
}
post {
always {
echo 'This will always run.'
}
success {
echo 'Pipeline succeeded!'
}
failure {
echo 'Pipeline failed!'
mail to: '[email protected]',
subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "Something is wrong with ${env.BUILD_URL}"
}
}
}
详细解释
- 环境变量:定义了默认的分支名为
develop
。 - Checkout阶段:从指定的仓库拉取代码,并获取当前的分支名称。
- Run Unit Tests阶段:仅当当前分支是
develop
时才执行单元测试。 - Package Application阶段:如果前一阶段成功,则打包应用程序。
- Deploy to Dev Environment阶段:如果打包成功,则部署到开发环境。
- Run Integration Tests阶段:如果当前分支是
main
且之前的所有阶段都成功,则运行集成测试。 - Deploy to Production阶段:如果集成测试成功且当前分支是
main
,则部署到生产环境。 - Post部分:无论成功还是失败,都会执行一些收尾动作,比如发送邮件通知。
并行执行和条件逻辑
如果需要并行执行某些任务,可以在stages
中嵌套parallel
指令。例如,如果有多个独立的集成测试需要并行执行,可以这样写:
stage('Run Parallel Integration Tests') {
when {
allOf {
expression { env.BRANCH_NAME ==~ /main/ }
expression { currentBuild.result == 'SUCCESS' }
}
}
parallel {
stage('Integration Test 1') {
steps {
sh 'mvn -Ptest1 verify'
}
}
stage('Integration Test 2') {
steps {
sh 'mvn -Ptest2 verify'
}
}
}
}
这个例子展示了如何在Jenkins Pipeline中构建一个复杂的工作流,包括条件判断、阶段间的依赖关系以及并行执行。通过这种方式,你可以灵活地定制适合你项目的CI/CD流程。
标签:Pipeline,NAME,复杂,sh,steps,Jenkins,expression,stage From: https://blog.csdn.net/qq_24766857/article/details/143709192