Jenkins - Pipeline Retry
引言
日常运行自动化测试用例,通常是晚上定时启动 pipeline job,一个 pipeline 脚本可能会涉及到多个 Job, 最后 post 发邮件汇总测试 report。有时会遇到 Jenkins 环境问题导致某 Job 失败,第二天需要手动触发 job 重跑,这样影响工作效率。那我们是否可以在 pipeline 脚本里自动 retry 呢?
retry
在 Jenkins Pipeline 中,可以使用 retry
指令来重试某个步骤。以下是一个基本的示例:
groovy
pipeline {
agent any
stages {
stage('Test') {
steps {
retry(3) {
// 这里放置你想要重试的步骤
}
}
}
}
}
在这个示例中,如果步骤失败,Jenkins 会尝试重新运行它,最多重试 3 次。你可以根据需要更改重试次数。
retry 实例
可以运行下面这个 pipeline 脚本实例,其中 Build stage 中有加 retry 3 次。
groovy
pipeline {
agent { label "xxx" }
stages {
stage('Preparation') {
steps {
echo 'Preparing...'
}
}
stage('Build') {
steps {
retry(3) {
script {
echo "Attempting to build..."
// 可能失败的命令
sh 'make build'
}
}
}
}
stage('Test') {
steps {
echo 'Running tests...'
}
}
}
}
jenkins pipeline 执行 log,Build stage 执行了 3 次均失败,所以 Test stage 将不再执行。
bash
20:08:23 [Pipeline] {
20:08:23 [Pipeline] stage
20:08:23 [Pipeline] { (Preparation)
20:08:23 [Pipeline] echo
20:08:23 Preparing...
20:08:23 [Pipeline] }
20:08:23 [Pipeline] // stage
20:08:23 [Pipeline] stage
20:08:23 [Pipeline] { (Build)
20:08:23 [Pipeline] retry
20:08:23 [Pipeline] {
20:08:23 [Pipeline] script
20:08:23 [Pipeline] {
20:08:23 [Pipeline] echo
20:08:23 Attempting to build...
20:08:23 [Pipeline] sh
20:08:24 + make build
20:08:24 make: *** No rule to make target 'build'. Stop.
20:08:24 [Pipeline] }
20:08:24 [Pipeline] // script
20:08:24 [Pipeline] }
20:08:24 ERROR: script returned exit code 2
20:08:24 Retrying
20:08:24 [Pipeline] {
20:08:24 [Pipeline] script
20:08:24 [Pipeline] {
20:08:24 [Pipeline] echo
20:08:24 Attempting to build...
20:08:24 [Pipeline] sh
20:08:24 + make build
20:08:24 make: *** No rule to make target 'build'. Stop.
20:08:24 [Pipeline] }
20:08:24 [Pipeline] // script
20:08:24 [Pipeline] }
20:08:24 ERROR: script returned exit code 2
20:08:24 Retrying
20:08:24 [Pipeline] {
20:08:25 [Pipeline] script
20:08:25 [Pipeline] {
20:08:25 [Pipeline] echo
20:08:25 Attempting to build...
20:08:25 [Pipeline] sh
20:08:25 + make build
20:08:25 make: *** No rule to make target 'build'. Stop.
20:08:25 [Pipeline] }
20:08:25 [Pipeline] // script
20:08:25 [Pipeline] }
20:08:25 [Pipeline] // retry
20:08:25 [Pipeline] }
20:08:25 [Pipeline] // stage
20:08:25 [Pipeline] stage
20:08:25 [Pipeline] { (Test)
20:08:25 Stage "Test" skipped due to earlier failure(s)
20:08:25 [Pipeline] }
20:08:25 [Pipeline] // stage
20:08:25 [Pipeline] }
20:08:26 [Pipeline] // node
20:08:26 [Pipeline] End of Pipeline
20:08:26 ERROR: script returned exit code 2
20:08:26 Finished: FAILURE