如何避免GitHub Action步骤被取消?Terraform状态保存问题求助
解决GitHub Action中Terraform被取消导致State未保存的问题
一、让Terraform优雅响应中断,保住State
- 用Shell的
trap命令捕获中断信号,在Workflow被取消时强制保存State:
这样哪怕Workflow被手动取消或系统终止,脚本会先执行State推送,避免已完成的变更丢失。# 捕获SIGINT/SIGTERM信号,触发State保存 trap 'echo "检测到中断,正在保存Terraform State..."; terraform state push terraform.tfstate' SIGINT SIGTERM # 执行你的Terraform操作(比如apply) terraform apply -auto-approve - 给Terraform命令加
-lock-timeout参数,延长State锁的持有时间,降低中断导致的State损坏概率:terraform apply -auto-approve -lock-timeout=5m
二、减少Workflow被取消的触发场景
- 调整
concurrency配置,避免新Workflow实例取消正在运行的旧实例:
把cancel-in-progress设为false,让新实例排队等待旧实例完成,而不是直接取消它:
这是目前最接近“阻止任务被取消”的配置,同分支同Workflow的运行不会互相干扰。concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: false
三、额外兜底:备份State文件
- 在Terraform操作前后,把State备份到GitHub Artifacts里,就算中途出问题也能恢复:
- name: 备份初始State run: terraform state pull > initial.tfstate - uses: actions/upload-artifact@v4 with: name: terraform-state-backup path: initial.tfstate # 这里放你的Terraform执行步骤 - name: 执行Terraform Apply run: terraform apply -auto-approve - name: 备份最终State if: always() # 不管步骤成功失败都执行 run: terraform state pull > final.tfstate - uses: actions/upload-artifact@v4 if: always() with: name: terraform-state-backup path: final.tfstate
内容的提问来源于stack exchange,提问作者Steven Black
相关产品推荐
相关产品推荐

