Terraform流水线无资源变更时跳过Deployment阶段及凭证问题解决
Azure DevOps Terraform流水线:无变更时跳过部署阶段
问题根源
你之前在检测阶段遇到GCS凭证缺失,是因为Deployment阶段配置了${{ parameters.myConn}}凭证,但检测阶段没做同样的凭证初始化,导致Terraform无法访问远程状态桶,自然报错。
解决方案
直接在检测阶段复用Azure DevOps里的GCP凭证,通过terraform plan的退出码判断是否有变更,再用流水线变量控制Deployment阶段的跳过逻辑。
以下是完整的流水线配置示例:
stages: - stage: Just_state displayName: 检查Terraform状态与变更 jobs: - job: Check_changes displayName: 检测资源变更 steps: - task: GoogleCloudPlatform@2 displayName: 配置GCP凭证 inputs: connectionName: ${{ parameters.myConn }} command: 'auth' serviceAccountKey: $(myConn.ServiceAccountKey) # 从Azure DevOps凭证库读取密钥 - task: TerraformCLI@0 displayName: Terraform初始化 inputs: command: 'init' workingDirectory: '$(sourceDirectory)/terraform' backendType: 'gcs' - bash: | terraform plan -detailed-exitcode -out=tfplan exit_code=$? if [ $exit_code -eq 0 ]; then echo "##vso[task.setvariable variable=has_changes;isOutput=true]false" elif [ $exit_code -eq 2 ]; then echo "##vso[task.setvariable variable=has_changes;isOutput=true]true" else echo "Terraform Plan执行失败" exit 1 fi displayName: 检测变更并设置变量 workingDirectory: '$(sourceDirectory)/terraform' name: check_changes_task - stage: Deployment displayName: 部署云资源 dependsOn: Just_state condition: eq(dependencies.Just_state.outputs['Check_changes.check_changes_task.has_changes'], 'true') jobs: - job: Deploy displayName: 执行Terraform部署 steps: - task: GoogleCloudPlatform@2 displayName: 配置GCP凭证 inputs: connectionName: ${{ parameters.myConn }} command: 'auth' serviceAccountKey: $(myConn.ServiceAccountKey) - task: TerraformCLI@0 displayName: Terraform初始化 inputs: command: 'init' workingDirectory: '$(sourceDirectory)/terraform' backendType: 'gcs' - task: TerraformCLI@0 displayName: Terraform应用变更 inputs: command: 'apply' workingDirectory: '$(sourceDirectory)/terraform' commandOptions: 'tfplan' # 复用之前生成的plan文件,避免重复检测
关键说明
- 凭证复用:在Just_state阶段和Deployment阶段都配置
GoogleCloudPlatform@2任务,加载Azure DevOps中存储的${{ parameters.myConn}}凭证,确保Terraform能访问GCS状态桶。 - 变更检测逻辑:
terraform plan -detailed-exitcode会返回三种退出码:- 0:无资源变更
- 2:有资源变更
- 1:执行出错
通过bash脚本捕获退出码,设置流水线输出变量has_changes。
- 阶段跳过控制:Deployment阶段通过
condition判断has_changes的值,只有当值为true时才执行。 - 复用Plan文件:生成
tfplan文件后,部署阶段直接使用该文件,避免重复执行plan,提升效率。
内容的提问来源于stack exchange,提问作者Kreg
相关产品推荐
相关产品推荐

