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

如何用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

规则说明

  1. 排除MR流水线:用CI_PIPELINE_SOURCE == "merge_request_event"变量识别MR流水线,设置when: never直接跳过该任务,避免在MR中显示可触发的Stop任务。
  2. 保留合法触发场景:第二个规则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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:50:17