GitLab CI中Terraform Plan与Apply分阶段执行失败排查
GitLab CI Terraform plan文件在apply阶段找不到?看这几个解决点
1. 先盯紧制品路径配置
plan阶段生成的tfplan如果在terraform/目录下,artifacts的paths必须写全路径,不能只写tfplan。比如plan阶段的配置里,artifacts要这么写:
artifacts: paths: - terraform/tfplan # 必须指定到具体目录下的文件 expire_in: 1 week # 别设太短,不然apply还没跑文件就没了
要是路径写错,apply阶段根本拉不到这个文件。
2. apply阶段要找对工作目录
plan阶段是在terraform/目录下生成的tfplan,apply阶段要么切换到这个目录执行命令,要么直接写完整路径。比如:
apply: script: - cd terraform - terraform apply tfplan dependencies: - plan # 明确告诉CI要拉取plan阶段的制品,稳一点
别在根目录直接跑terraform apply tfplan,那肯定找不到。
3. 先确认plan阶段真的生成了文件
在plan阶段的脚本最后加个ls -la,看看tfplan到底有没有生成。比如:
plan: script: - cd terraform - terraform init - terraform plan -out=tfplan - ls -la # 当场验证文件存在与否
要是这里都没生成,那后面肯定找不到,得先排查terraform plan命令有没有报错。
4. 别让Runner拖后腿
如果plan和apply用了不同标签的Runner,有些Runner可能没共享制品存储,导致文件传不过去。尽量让两个阶段用相同的tags,或者确认你的GitLab Runner是用的共享制品存储(默认是开的)。
5. 检查.gitignore有没有搞破坏
看看项目里的.gitignore文件,是不是把tfplan加进去了。GitLab CI上传制品的时候会跳过被.gitignore忽略的文件,要是有这条,赶紧删掉。
给你个能用的完整配置示例
stages: - validate - plan - apply validate: stage: validate image: 你的自定义Terraform镜像地址 script: - cd terraform - terraform init - terraform validate plan: stage: plan image: 你的自定义Terraform镜像地址 script: - cd terraform - terraform init - terraform plan -out=tfplan - ls -la # 验证文件生成 artifacts: paths: - terraform/tfplan expire_in: 1 week apply: stage: apply image: 你的自定义Terraform镜像地址 script: - cd terraform - terraform apply tfplan dependencies: - plan when: manual # 手动触发更安全,避免误操作 only: - main # 只允许主分支执行apply,按需改
内容的提问来源于stack exchange,提问作者khaled lhale
相关产品推荐
相关产品推荐

