问题描述
在Jenkins声明性流水线中有一个阶段(stage),看起来像这样:
stage('Step Tests') {
steps {
dir('test') {
catchError(catchInterruptions: true, buildResult: 'FAILURE') {
timeout(time: 5, unit: 'MINUTES', activity: true) {
sh "yarn step-tests"
}
}
}
}
}
在这段代码中,如果我的测试在5分钟内没有向控制台输出任何内容,超时将被触发,并且后续的阶段仍然会执行。然而,构建仍然被标记为中止,而不是失败,尽管我认为buildResult
参数是用来处理这种情况的。
解决方案
请注意以下操作注意版本差异及修改前做好备份。
解决方案
您可以尝试以下两种方法来在超时时将构建标记为不稳定(unstable)或失败(failure)。
方法1:使用catchError
和timeout
结合
stage('Step Tests') {
steps {
dir('test') {
catchError(catchInterruptions: true) {
timeout(time: 5, unit: 'MINUTES', activity: true) {
sh "yarn step-tests"
}
error('Build marked as FAILURE due to timeout')
}
}
}
}
在这个示例中,我们在catchError
块中使用了timeout
块。当超时发生时,会将构建标记为中止,同时在构建结束时输出一条错误消息,将构建标记为失败。
方法2:使用try-catch
块
stage('Step Tests') {
steps {
dir('test') {
script {
try {
timeout(time: 5, unit: 'MINUTES', activity: true) {
sh "yarn step-tests"
}
} catch (Exception e) {
currentBuild.result = 'FAILURE'
}
}
}
}
}
在这个示例中,我们使用了一个try-catch
块来捕获超时引发的异常。如果超时发生,我们将当前构建的结果设置为失败。
注意事项
请注意,Jenkins版本可能会对解决方案的可行性产生影响。确保根据您的Jenkins版本进行适当的测试和调整。
总结
通过在Jenkins声明性流水线中使用catchError
和timeout
结合,或者使用try-catch
块来捕获超时事件,您可以将构建标记为不稳定或失败,以便更好地管理超时情况。记住根据您的Jenkins版本进行测试和调整,以确保解决方案的有效性。
用户评论:感谢,这很有效。有趣的是,
catchError
有不同的行为。由于https://issues.jenkins-ci.org/browse/JENKINS-45579,我最终使用了unstable
步骤代替currentBuild.result = 'UNSTABLE
。
如果您有任何疑问或需要进一步的帮助,请随时提问!
正文完