我有这个 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"
'''
}
}
}
}
}
}
运行上述代码时,第一次“尝试”失败,但没有“重试”,整个管道因错误而退出。我做错了什么?
您的 catchError 块捕获异常并将构建状态设置为错误,并且构建在该块的末尾继续。那是在您的重试块内,因此您期望重试块捕获异常,但由于它已经被捕获,所以它不能。是的,构建状态是错误的,但重试只会在异常时重试,而不会在构建状态错误时重试。
因此,您应该能够删除 catchError,并让异常由重试块捕获。