理解 Groovy retry() 和 catchError()

问题描述 投票:0回答:1

我有这个 Jenkins 管道,它执行

terraform init
terraform plan
terraform apply
,以在未供电的 Xen Orchestra (XO) 上部署一些虚拟机。我的 XO 服务器资源非常有限,需要重新运行 terraform apply 几次才能使所有虚拟机成功启动。我尝试使用 Groovy
retry()
来实现这些重新运行。这是管道的相关部分:

stage("Terraform apply") {
  steps {
    script {
      def maxRetries = 10
      def retryCount = 0
      dir('dev/xo/clusters/sandbox') {
        withCredentials([string(credentialsId: 'XOA_PASSWORD', variable: 'xoaPassword')]){
          retry(maxRetries) {
            retryCount++
            echo "Terraform apply. Attempt $retryCount of $maxRetries"
            catchError {
              sh '''
              export XOA_PASSWORD="${xoaPassword}"
              terraform apply -parallelism=1 -no-color "theplan"
              '''
            }
          }
        }
      }
    }
  }

运行上述代码时,第一次“尝试”失败,但没有“重试”,整个管道因错误而退出。我做错了什么?

jenkins-groovy xen
1个回答
0
投票

您的 catchError 块捕获异常并将构建状态设置为错误,并且构建在该块的末尾继续。那是在您的重试块内,因此您期望重试块捕获异常,但由于它已经被捕获,所以它不能。是的,构建状态是错误的,但重试只会在异常时重试,而不会在构建状态错误时重试。

因此,您应该能够删除 catchError,并让异常由重试块捕获。

© www.soinside.com 2019 - 2024. All rights reserved.