Gitlab CI部署新版本前如何自动停止此前部署的k8s旧环境
解决方案
你可以通过以下两种常用方式实现部署前自动关停旧环境,按需选择即可:
方式一:直接在部署脚本前置清理逻辑(最简便)
直接把关停逻辑放到deploy任务的执行步骤最前面,加个忽略资源不存在的参数,避免首次部署时报错:
deploy: image: dtzar/helm-kubectl stage: deploy only: kubernetes: active environment: name: definitelynotproduction on_stop: stop_deployment script: # 先清理旧部署,--ignore-not-found=true 避免第一次部署找不到资源报错 - kubectl delete -f ... --ignore-not-found=true # 可选:等待旧资源完全销毁后再部署新的,避免残留配置冲突 - kubectl wait --for=delete pod -l app=你的应用标签 --timeout=60s || true - kubectl apply -f ...
原来的手动触发stop_deployment任务可以保留,用于手动关停环境的场景。
方式二:拆分阶段复用关停逻辑
如果你不想重复写关停脚本,可以调整流水线阶段顺序,新增一个前置自动关停阶段:
- 先定义流水线阶段顺序
stages: - stop_old - deploy - stop_deployment
- 新增前置自动关停任务,无需手动触发:
stop_old: image: dtzar/helm-kubectl stage: stop_old only: kubernetes: active environment: name: definitelynotproduction action: stop script: - kubectl delete -f ... --ignore-not-found=true rules: # 对应你的部署触发规则,符合部署条件时自动执行 - if: $CI_COMMIT_BRANCH == "你的部署分支名" when: always
- 原来的
stop_deployment任务保持不变,仍用于手动触发关停。
注意事项
- 如果你是多环境部署,要注意匹配对应环境的资源标签、yaml文件路径,避免误删其他环境资源
- 如果配置变更涉及端口、PVC这类不可热更新的资源,建议清理完成后再加几秒等待时间,确保资源完全释放
内容的提问来源于stack exchange,提问作者Fritz
相关产品推荐
相关产品推荐

