You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 01:05:08