如何用GitLab CI/CD控制生产环境部署与停止任务?
修复GitLab CI/CD中Stop任务在MR流水线被调度的问题
问题分析
当前配置里,Stop任务没加分支限制时会在Merge Request流水线中出现;仅限制main分支又会导致从GitLab UI的Environments页面点击Stop按钮时无法触发任务。核心需求是:
- Stop任务仅在main分支流水线或UI手动点击Stop按钮时可触发
- 禁止Stop任务在Merge Request流水线中被调度
解决方案
通过添加规则排除Merge Request流水线,并保留其他场景的手动触发权限,修改后的Stop任务配置如下:
stop: stage: deploy environment: name: prod action: stop rules: # 排除Merge Request流水线,阻止Stop任务在此类流水线中出现 - if: $CI_PIPELINE_SOURCE == "merge_request_event" when: never # 允许其他所有场景(main分支流水线、UI点击Stop按钮)手动触发 - when: manual script: - docker compose down
规则说明
- 排除MR流水线:用
CI_PIPELINE_SOURCE == "merge_request_event"变量识别MR流水线,设置when: never直接跳过该任务,避免在MR中显示可触发的Stop任务。 - 保留合法触发场景:第二个规则
when: manual允许两种合法操作:- 在main分支的流水线中手动触发Stop任务
- 从GitLab UI的Environments页面点击Stop按钮时,GitLab会自动触发该任务(此场景下
CI_PIPELINE_SOURCE为web,不属于MR流水线,因此规则允许执行)
验证Deploy任务配置(保持原有逻辑)
Deploy任务的配置无需修改,已满足三种触发场景的需求:
deploy: stage: deploy environment: name: prod url: https://***.***.com/ on_stop: stop rules: - if: $CI_PIPELINE_SOURCE == "schedule" && $CI_EVENT == "security_updates" - if: $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "main" when: on_success - if: $CI_COMMIT_BRANCH == "main" when: manual script: - docker compose up --build -d
内容的提问来源于stack exchange,提问作者Gigi
相关产品推荐
相关产品推荐

