Bitbucket Pipelines执行Terraform apply时找不到plan文件如何解决
问题根因
报文件找不到是两个配置写得有问题:
- Bitbucket收集artifact的阶段读不到deployment维度配置的环境变量,你在artifacts字段写的
output-${ENVIRONMENT}.plan不会被正常解析,等于根本没把生成的plan文件打包成跨步骤传递的产物,后续步骤自然拿不到。 - 两个步骤用了不同的deployment标识,部分开了部署环境严格隔离的仓库会默认拦截跨环境的artifact传递;另外你两个步骤没固定Terraform版本,要是拉到不同版本的镜像,就算文件传过去也可能读失败;还有apply步骤没初始化backend,就算拿到plan也连不上远端状态文件。
修复方法
按下面的点改就行:
- pre-deploy里的artifact配置别拼变量,直接用通配符匹配所有output开头的plan文件,绕开变量不解析的问题
- 两个步骤固定同一个Terraform版本,别用latest标签,避免版本差导致plan文件不兼容
- apply步骤开头先执行和pre-deploy完全一致的init命令,初始化backend连接,plan文件本身不存储鉴权信息,init不会改动已生成的plan内容
- 两个步骤显式传入相同的ENVIRONMENT变量值,别全靠deployment环境里的配置,避免变量值不一致找错文件
- 调试阶段可以在两个步骤加
ls -la打印当前目录文件,确认文件生成、下载正常,跑通后删掉就行
改完可直接用的配置
definitions: steps: - step: &pre-deploy name: 初始化Terraform并生成执行计划 image: hashicorp/terraform:1.7.5 script: - terraform init -backend-config ${ENVIRONMENT}-backend.tfvars - terraform validate - terraform plan -var-file=${ENVIRONMENT}.tfvars -out output-${ENVIRONMENT}.plan # 调试用,确认文件生成成功,跑通可删 - ls -la output-*.plan artifacts: # 禁用变量拼接,直接通配匹配 - output-*.plan - step: &terraform-apply name: 执行Terraform部署 image: hashicorp/terraform:1.7.5 script: # 先确认文件存在,不存在直接报错方便排查 - ls -la output-${ENVIRONMENT}.plan - terraform init -backend-config ${ENVIRONMENT}-backend.tfvars - terraform apply -auto-approve output-${ENVIRONMENT}.plan pipelines: branches: develop: - step: <<: *pre-deploy deployment: terraform-prepare variables: - ENVIRONMENT: development - step: <<: *terraform-apply trigger: manual deployment: terraform-deploy variables: - ENVIRONMENT: development
避坑提醒
- 生成的plan文件不要改名、不要压缩转码,Terraform对plan文件完整性校验极严,哪怕改一个字节都会加载失败
- 如果改完还是报找不到文件,先检查仓库设置里是不是开了跨部署环境的artifact拦截,开了的话要么把两个步骤放到同一个deployment环境,要么放开对应权限
- Terraform版本必须完全一致,哪怕小版本差都可能导致plan文件不兼容,固定镜像版本是最稳妥的方案
内容的提问来源于stack exchange,提问作者jok
相关产品推荐
相关产品推荐

