构建流水线中应用构建/测试失败时,如何回滚已部署的IaC基础设施?
基础设施回滚方案(针对构建/测试失败场景)
核心逻辑
既然基础设施部署在应用构建、测试之前,一旦后续环节失败,就得把刚部署的基础设施回退到之前的稳定状态——核心是靠Terraform的状态管理和代码版本控制来落地。
具体实现步骤
1. 提前留存稳定基准
每次基础设施部署成功后,做好两个绑定:
- 用Git标签标记当前的IaC代码版本,比如
infra-stable-202405201430 - 把当前的
terraform.tfstate状态文件备份到可靠存储(比如对象存储),文件名和标签对应
2. 流水线中加回滚触发分支
当阶段2(构建)或阶段3(测试)失败时,自动触发回滚步骤:
- 拉取最近的稳定IaC版本:
git checkout infra-stable-202405201430 - 恢复对应的状态文件:把备份的稳定状态文件替换当前的
terraform.tfstate - 执行回滚:
terraform apply -auto-approve,这会根据稳定状态和代码,把基础设施还原到之前的状态
3. 规避回滚风险
- 回滚前先跑
terraform plan确认变更内容,避免误操作 - 如果只是新增了基础设施资源,也可以直接用
terraform destroy销毁刚创建的资源,但只适合纯新增的场景,不适合修改现有资源的情况
4. 流水线配置示例(伪代码)
stages: - 部署基础设施 - 构建应用 - 运行测试 - 部署应用 - 回滚基础设施 部署基础设施: script: - terraform init - terraform apply -auto-approve - STABLE_TAG=infra-stable-$(date +%Y%m%d%H%M) - git tag -a $STABLE_TAG -m "部署成功后的稳定基础设施版本" - cp terraform.tfstate s3://我的基础设施备份桶/$STABLE_TAG.tfstate 构建应用: script: npm run build allow_failure: false 运行测试: script: npm run test allow_failure: false 部署应用: script: # 应用部署命令 needs: [构建应用, 运行测试] 回滚基础设施: script: - LATEST_STABLE_TAG=$(git describe --abbrev=0 --tags --match "infra-stable-*") - git checkout $LATEST_STABLE_TAG - cp s3://我的基础设施备份桶/$LATEST_STABLE_TAG.tfstate terraform.tfstate - terraform init - terraform apply -auto-approve when: on_failure needs: [部署基础设施]
额外注意点
- 状态文件要做好权限管控,防止未授权修改
- 回滚操作要留存日志,方便后续排查
- 如果涉及有状态资源(比如数据库),回滚前要确认数据是否需要备份,避免丢失
内容的提问来源于stack exchange,提问作者rhonda
相关产品推荐
相关产品推荐

