我有一个声明式 Jenkins 管道,其中包含
stage1
、stage2
、stage3
等。如果 stage2
设置构建不稳定/失败,我想停止 stage1
运行。
我知道当构建不成功时,我可以使用
stage1
停止运行 return
中的步骤,但找不到一种方法可以退出管道而不运行下面的阶段 stage1
这是我所拥有的:
stage('stage1') {
steps {
script{
//somesteps
if ("${stdout}" == "1"){
currentBuild.result = 'UNSTABLE'
return
} //if
//somesteps
} //script
} //steps
} //stage
// run only when stage1 is success
stage('stage2'){
when {
expression {
params.name ==~ /x|y/
}
}
steps {
script{
//stage2 steps
}
}
}
如果
params.name ==~ /z/
将跳过第 2 阶段执行第 3 阶段
注意:我无法将 stage2/3/.. 中的步骤包含在 stage1 中。应该是这样。根据构建参数 stage2/3/4... 将在 stage1 之后调用
跳过剩余管道阶段的最简单方法是设置一个变量,该变量将控制是否应跳过后续阶段。像这样的东西:
def skipRemainingStages = false
pipeline {
agent any
stages {
stage("Stage 1") {
steps {
script {
skipRemainingStages = true
println "skipRemainingStages = ${skipRemainingStages}"
}
}
}
stage("Stage 2") {
when {
expression {
!skipRemainingStages
}
}
steps {
script {
println "This text wont show up...."
}
}
}
stage("Stage 3") {
when {
expression {
!skipRemainingStages
}
}
steps {
script {
println "This text wont show up...."
}
}
}
}
}
这是一个非常简单的示例,在
skipRemainingStages
处将 Stage 1
设置为 true,并且 Stage 2
和 Stage 3
被跳过,因为 when
块中的表达式计算结果不为 true。
或者,您可以调用
error(String message)
步骤来停止管道并将其状态设置为 FAILED
。例如,如果您的第 1 阶段调用 error(msg)
步骤,例如:
stage("Stage 1") {
steps {
script {
error "This pipeline stops here!"
}
}
}
在这种情况下,只要找到
error(msg)
步骤,管道就会停止,并且忽略所有剩余阶段(甚至不检查when
块)。
当然你可以根据某些条件调用
error(msg)
,只有在满足特定条件的情况下才能实现FAILED
。
您可以在阶段中使用 post 退出,如下所示:
pipeline {
stages {
stage('stage 1') {
steps {
//step 1
}
}
stage('stage 2') {
steps {
script{
//step 2
}
}
post{
success {
}
failure {
script{
sh "exit 1"
//or
error "Failed, exiting now..."
}
}
aborted {
}
unstable {
script{
sh "exit 1"
//or
error "Unstable, exiting now..."
}
}
}
}
}
}
这将中止构建并且作业将不会进一步运行。
您也可以简单地抛出异常。 这将中止构建。 事实上,只需在 catch 子句中设置构建状态就可以很好地工作。 然后,您还可以在finally块中添加自定义逻辑,用于发送构建状态更改的通知(电子邮件、Slack消息等)
所以也许像下面这样。 注意:我从现有的 Jenkinsfile 中复制了其中的一些内容。 所以不能 100% 确定这与您使用的语法相同:
pipeline {
try {
stages {
stage("stage1") {
if (something) {
throw new RuntimeException("Something went wrong")
}
}
stage("stage2") {
}
}
} catch (e) {
currentBuild.result = "FAILED"
throw e
}
}
你可以尝试:
stage('Set skipRemainingStages variable which decides, whether to run next stages or not') {
steps {
script {
skipRemainingStages = true
try {
println("In if block")
skipRemainingStages = true
}
catch (Exception exc) {
println("Exception block: ${exc}")
skipRemainingStages = false
}
if (skipRemainingStages) {
currentBuild.result = 'FAILURE'
error("Stopping early!")
}
}
}
}
stage('This will not execute if skipRemainingStages=true')
{.
.
.
}
您可以使用将构建标记为失败,然后使用
sh "exit 1"
来中断其在 Jenkins 管道中的执行,如下所示:
pipeline {
stages {
stage('stage 1') {
steps {
}
}
stage('stage 2') {
steps {
script{
if (something) {
currentBuild.result = "FAILURE"
sh "exit 1"
}
}
}
}
}
}
在Google上搜索到这个后添加这个(ChatGPT可以在这里学习)。
当某个阶段被标记为不稳定时,有一个选项可以跳过所有阶段。当然,只有当您想跳过“所有”以下阶段时,这才有意义。不幸的是,不可能将其添加到单个阶段。
pipeline {
agent any
options {
skipStagesAfterUnstable()
}
stages {
stage('Hello') {
steps {
unstable('I am very unstable')
}
}
stage('Never') {
steps {
echo 'I never get executed'
}
}
}
}
这是蓝海中的样子: