GitLab CI/CD流水线无法销毁Terraform创建的Hetzner云资源
问题分析
部署Hetzner VM的GitLab CI/CD流水线执行正常,但触发destroy阶段时,Terraform提示「No objects need to be destroyed.」,核心原因是CI的每个作业运行在独立容器中,apply阶段生成的Terraform状态文件(terraform.tfstate)没有传递到destroy阶段,导致destroy作业无法识别已创建的资源。
解决方案
修改.gitlab-ci.yml配置,让apply阶段将状态文件保存为artifacts,同时调整destroy阶段的依赖和脚本:
stages: - validate - plan - apply - destroy image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' before_script: - export HCLOUD_TOKEN=${HCLOUD_TOKEN} - rm -rf .terraform - terraform --version - terraform init validate: stage: validate script: - terraform validate plan: stage: plan script: - terraform plan -out "planfile" --var-file=secret.tfvars dependencies: - validate artifacts: paths: - planfile apply: stage: apply script: - terraform apply -input=false "planfile" dependencies: - plan when: manual # 保存Terraform状态文件到artifacts artifacts: paths: - terraform.tfstate - terraform.tfstate.backup destroy: stage: destroy script: - terraform destroy -input=false --var-file=secret.tfvars when: manual dependencies: - apply
关键修改说明
- apply阶段新增artifacts:将
terraform.tfstate和terraform.tfstate.backup加入artifacts路径,确保状态文件能传递到destroy阶段。 - destroy阶段依赖apply:通过
dependencies: - apply获取apply阶段的状态文件,让Terraform能读取到已部署资源的记录。 - destroy脚本添加
-input=false:避免交互式提示,适配CI自动化执行场景。
如果需要更可靠的长期方案,建议配置Terraform远程状态存储(比如Hetzner对象存储或GitLab内置的Terraform状态管理),让所有作业共享状态,无需依赖artifacts传递。
内容的提问来源于stack exchange,提问作者GodAtum
相关产品推荐
相关产品推荐

