如何使Azure DevOps Pipeline在build-steps.yaml中Terraform验证失败时终止
问题描述
尽管terraform validate存在错误,但Azure DevOps Pipeline并未终止,以下是build-steps.yaml中的相关配置片段:
- task: TerraformCLI@0 displayName: "Run Terraform fmt" inputs: command: 'fmt' commandOptions: '-check -recursive' allowTelemetryCollection: false - bash: | find . -type f \ -name "*.tf" | \ xargs -I % dirname % | \ sort -u | \ xargs -I ? bash -c \ '(cd ? && terraform init -backend=false && terraform validate ; rm -rf .terraform)' \ displayName: "Run Terraform validate"
我已尝试添加continueOnError: false参数,但并未解决问题:
- task: TerraformCLI@0 displayName: "Run Terraform fmt" inputs: command: 'fmt' commandOptions: '-check -recursive' allowTelemetryCollection: false - bash: | find . -type f \ -name "*.tf" | \ xargs -I % dirname % | \ sort -u | \ xargs -I ? bash -c \ '(cd ? && terraform init -backend=false && terraform validate ; rm -rf .terraform)' \ displayName: "Run Terraform validate" continueOnError: false
请问如何让Azure DevOps Pipeline在该build-steps.yaml文件的Terraform验证步骤失败时终止任务?
解决方案
问题出在bash脚本的分号逻辑:(cd ? && terraform init -backend=false && terraform validate ; rm -rf .terraform)里的;会强制后续的rm命令无论前面验证是否失败都执行,且整个bash子命令的退出码会取最后一个命令(即rm,通常返回0)的结果,导致Azure DevOps判定该任务执行成功,不会终止Pipeline。
以下是几种修正方案:
方案1:仅验证成功时执行清理
把分号改为&&,确保只有terraform validate成功后才清理.terraform目录,这样任意前置步骤失败都会让整个子命令返回失败码:
- bash: | find . -type f \ -name "*.tf" | \ xargs -I % dirname % | \ sort -u | \ xargs -I ? bash -c \ '(cd ? && terraform init -backend=false && terraform validate && rm -rf .terraform)' \ displayName: "Run Terraform validate" continueOnError: false
方案2:强制返回验证的退出码
如果需要无论验证成功与否都执行清理,就先保存terraform validate的退出码,执行清理后再返回该码:
- bash: | find . -type f \ -name "*.tf" | \ xargs -I % dirname % | \ sort -u | \ xargs -I ? bash -c \ '(cd ? && terraform init -backend=false && terraform validate; exit_code=$?; rm -rf .terraform; exit $exit_code)' \ displayName: "Run Terraform validate" continueOnError: false
方案3:使用官方TerraformCLI任务替代自定义脚本
直接用TerraformCLI@0的validate命令,任务会自动正确返回失败状态,无需手动处理退出码:
- task: TerraformCLI@0 displayName: "Run Terraform validate" inputs: command: 'validate' allowTelemetryCollection: false # 如需指定目录,添加以下参数 # workingDirectory: '$(System.DefaultWorkingDirectory)/your-terraform-dir' continueOnError: false
内容的提问来源于stack exchange,提问作者Marwan Tarek
相关产品推荐
相关产品推荐

