Jenkins 声明式管道条件 post 操作取决于阶段(而非管道)状态
Jenkins declarative pipeline conditional post action depending on stage (not pipeline) status
我有一个 Jenkins 声明式管道,其中某些阶段有一个 post 操作:
stage('1 unit tests') { ..... }
stage('2 other tests') {
steps { ..... }
post {
success { ...... }
}
}
似乎如果单元测试失败(构建在阶段 1 中变得不稳定),则不会执行阶段 2 的条件 post 操作。
如何确保仅在构建状态更改时才跳过 post 操作
在当前阶段?
有一些“选项”,我不知道你会喜欢或接受什么。如果跳过一个阶段;它还会跳过所有内部结构。
1: 这不是您想要的,但您可以 manipulate/mark 一个不同于其他阶段的阶段,并使用 skipStagesAfterUnstable option or catchError. For more info see this 之类的东西继续执行post。但它也可能 heavy-handed 并迫使您获得有限的结果集或导致不必要的执行。
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
2:您可以将舞台移动到单独的pipeline/job,并通过此管道运行或之后触发它
3: 另一种选择可能类似于下面的 pseudo-code,但这感觉更像是一种 hack 和添加 ('global') 'state flags' 增加混乱:
failedOne = false
failedTwo = false
pipeline {
agent any
stages {
stage('Test One') {
steps {...}
post {
failure {
failedOne=true
postFailureOne()
}
}
}
stage('Test Two') {
steps {...}
post {
failure {
failedTwo=true
postFailureTwo()
}
}
}
}
post {
success { .... }
failure {
if (!failedTwo) postFailureTwo()
}
}
}
void postFailureOne() { echo 'Oeps 1' }
void postFailureTwo() { echo 'Oeps 2' }
我有一个 Jenkins 声明式管道,其中某些阶段有一个 post 操作:
stage('1 unit tests') { ..... }
stage('2 other tests') {
steps { ..... }
post {
success { ...... }
}
}
似乎如果单元测试失败(构建在阶段 1 中变得不稳定),则不会执行阶段 2 的条件 post 操作。
如何确保仅在构建状态更改时才跳过 post 操作 在当前阶段?
有一些“选项”,我不知道你会喜欢或接受什么。如果跳过一个阶段;它还会跳过所有内部结构。
1: 这不是您想要的,但您可以 manipulate/mark 一个不同于其他阶段的阶段,并使用 skipStagesAfterUnstable option or catchError. For more info see this 之类的东西继续执行post。但它也可能 heavy-handed 并迫使您获得有限的结果集或导致不必要的执行。
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
2:您可以将舞台移动到单独的pipeline/job,并通过此管道运行或之后触发它
3: 另一种选择可能类似于下面的 pseudo-code,但这感觉更像是一种 hack 和添加 ('global') 'state flags' 增加混乱:
failedOne = false
failedTwo = false
pipeline {
agent any
stages {
stage('Test One') {
steps {...}
post {
failure {
failedOne=true
postFailureOne()
}
}
}
stage('Test Two') {
steps {...}
post {
failure {
failedTwo=true
postFailureTwo()
}
}
}
}
post {
success { .... }
failure {
if (!failedTwo) postFailureTwo()
}
}
}
void postFailureOne() { echo 'Oeps 1' }
void postFailureTwo() { echo 'Oeps 2' }