Azure DevOps流水线中Terraform跨Job共享tfplan失败求助
解决Azure DevOps流水线中Terraform跨Job共享tfplan文件的问题
问题核心:Azure DevOps的每个Job会在独立的代理虚拟机上运行,Plan阶段生成的tfplan仅存于该Job的代理本地磁盘,Deploy阶段的Job无法直接访问。必须通过**流水线工件(Pipeline Artifact)**实现跨Job文件共享。
修改方案
1. Plan阶段:生成tfplan后上传为流水线工件
在Terraform Plan任务后,添加PublishPipelineArtifact任务,将tfplan文件上传到流水线工件库。
2. Deploy阶段:先下载流水线工件中的tfplan,再执行apply
在Terraform Init任务前,添加DownloadPipelineArtifact任务,将之前上传的tfplan下载到当前Job的工作目录,再执行terraform apply。
修改后的完整流水线配置
trigger: - main pool: vmImage: 'ubuntu-latest' # 替换原中文引号为英文引号 variables: - group: KV-SQL-SERVER-TEST stages: - stage: Plan displayName: 'Terraform Plan' jobs: - job: TerraformPlan displayName: 'Terraform Plan' steps: - task: TerraformInstaller@0 inputs: terraformVersion: 'latest' # 替换中文引号为英文引号 - script: | terraform --version terraform init -backend-config="access_key=$(storagetest101-key1)" # 替换中文引号为英文引号 terraform plan -out=tfplan displayName: 'Terraform Init and Plan' # 新增:上传tfplan为流水线工件 - task: PublishPipelineArtifact@1 inputs: targetPath: 'tfplan' artifact: 'tfplan-artifact' publishLocation: 'Container' - stage: Deploy displayName: 'Terraform Apply' jobs: - job: TerraformApply displayName: 'Terraform Apply' steps: # 新增:下载流水线工件中的tfplan - task: DownloadPipelineArtifact@2 inputs: artifact: 'tfplan-artifact' path: '$(System.DefaultWorkingDirectory)' - task: TerraformInstaller@0 inputs: terraformVersion: 'latest' # 替换中文引号为英文引号 - script: | terraform --version terraform init -backend-config="access_key=$(storagetest101-key1)" # 替换中文引号为英文引号 terraform validate terraform apply -auto-approve -input=false tfplan displayName: 'Terraform Init and Apply'
额外注意事项
- 原配置中使用了中文引号(如‘ubuntu-latest’、“access_key=...”),这会导致脚本执行报错,必须全部替换为英文引号。
- 确保上传和下载的工件名称一致(示例中为
tfplan-artifact),避免找不到工件。
内容的提问来源于stack exchange,提问作者Weng
相关产品推荐
相关产品推荐

