在Jenkins声明性流水线中如何在超时时将步骤标记为失败或不稳定,而不是中止构建

160次阅读
没有评论

问题描述

在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:使用catchErrortimeout结合

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声明性流水线中使用catchErrortimeout结合,或者使用try-catch块来捕获超时事件,您可以将构建标记为不稳定或失败,以便更好地管理超时情况。记住根据您的Jenkins版本进行测试和调整,以确保解决方案的有效性。

用户评论:感谢,这很有效。有趣的是,catchError有不同的行为。由于https://issues.jenkins-ci.org/browse/JENKINS-45579,我最终使用了unstable步骤代替currentBuild.result = 'UNSTABLE

如果您有任何疑问或需要进一步的帮助,请随时提问!

正文完