【问题标题】:Why does retry not working in my Jenkins pipeline?为什么重试在我的 Jenkins 管道中不起作用?
【发布时间】:2021-12-02 22:03:17
【问题描述】:

Jenkins v2.263.3

我有以下代码,旨在将 zip 文件上传到我们的私人 Nexus 存储库。我希望它尝试 3 次。请注意,所有使用的变量都在脚本的其他地方定义,并且都是有效的。

    withCredentials([[$class: 'UsernamePasswordMultiBinding',
                      credentialsId:'nexus-user',
                      usernameVariable: 'NEXUS_USR',
                      passwordVariable: 'NEXUS_PW']]) {
      final Integer maxTries = 3
      Integer numTries = 1
      retry(maxTries) {
        timeout(time: 5) { // Timeout in minutes
          println "Trying $numTries/$maxTries upload to file server."
          numTries++
          sh """
            curl -v -u $NEXUS_USR:$NEXUS_PW --upload-file $artifact $remoteUrl/$remoteDir/$artifact
          """
        }
      }
    }

但是,当管道在第一次尝试后失败时就退出,也就是说,它只是忽略了retry{} 块。我错过了什么?

【问题讨论】:

  • 您的sh step 方法的失败是否会引发异常,还是仅返回退出代码> 1?
  • 它只是返回一个非零错误代码。

标签: jenkins jenkins-pipeline


【解决方案1】:

Pipeline: Basic Steps Plugin 存在问题 (JENKINS-51454),其中插件未针对代码执行引发的任何 FlowInterruptedException 重试。
该问题最近已修复,因此更新此插件应该可以解决您的问题。

为什么插件会有这样的行为?
此行为最初旨在防止重试,以防用户手动中止构建 - 从而导致抛出 FlowInterruptedException - 从而跳过重试。
问题是timeout 步骤在达到超时时也会抛出FlowInterruptedException,因此retry 步骤在代码超时时避免再次重试。
这是最近的fixed,确保retry 步骤避免仅因用户中断而重试。

如果更新没有解决您的问题,您可以将timeout 步骤替换为--max-time 标志curl(请参阅more options),这将为您提供与今天相同的行为,但当@ 987654334@ 步骤失败,它将被retry 步骤捕获。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2021-11-16
    • 2017-11-26
    • 1970-01-01
    相关资源
    最近更新 更多