如何在Gitlab CI中在合并请求被批准后运行管道?

8
我希望 GitLab CI 在合并请求被合并后运行一个作业。我不希望它在创建新的合并请求时运行,也不希望在目标分支更新时运行。(因为可以直接提交到目标分支,而在这种情况下不应运行该作业。)
这是否可能?
如果是,我还想知道触发作业的合并请求的信息。
(实际上,我想在合并请求被合并时更新我的项目管理系统。因此,我需要知道哪个合并请求已经被合并(或已批准))
提前致谢。

1
这个回答解决了你的问题吗?Gitlab在合并请求被合并时运行管道作业 - Sty
4个回答

7
我希望GitLab CI在合并请求完成后运行一个任务。
不幸的是,GitLab没有提供“合并请求已合并”触发器。
您可以做的是让流水线对某个分支中的任何推送运行,并使用分支保护确保推送只能来自合并请求。要这样做:
1. 将您的流水线设置为仅对主分支运行。
# if you want to use "only":
my_job: 
  only:
    - main

# or alternatively if you want to use rules you can do the same with: 
my_job:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_REF_NAME == "master"'
  1. 启用分支保护以禁用对主分支的直接推送,只允许MR(合并请求): enter image description here

请问您能否在这里添加更多细节... - sri05
我已经添加了更多细节。希望对您有所帮助。 - uupascal
如果 if: '$CI_PIPELINE_SOURCE == "push" && $CI_BUILD_REF_NAME == "master"' 不起作用,那么对我来说什么都没有触发。我错过了什么吗? - Lucas Willems
1
@LucasWillems 以下代码应该可以工作。至少在GitLab 15.1上对我有效。 if: $CI_COMMIT_BRANCH == "main" - Liam
如果管道中断,这会导致合并失败吗?这与 https://docs.gitlab.com/ee/ci/pipelines/merged_results_pipelines.html 有什么关系? - Hanan Shteingart

3
你可以通过使用Gitlab CI预定义变量$CI_MERGE_REQUEST_APPROVED来在合并后运行pipeline。在GitLab v14.1中,此变量将在合并完成后返回true。
您可以像这样在作业中添加规则。
rules:
  - if: $CI_MERGE_REQUEST_APPROVED

1
使用$CI_MERGE_REQUEST_APPROVED不是应该用于这个问题的。如果有人批准了合并请求,$CI_MERGE_REQUEST_APPROVED将变为true,而不是MR是否已合并。一个MR可以被批准但尚未合并。 - mdailey77

0

不确定为什么以前没有提到过,但我能够通过利用环境 on_stop 事件来实现我想要的。

  1. 设置管道仅在 MR 上下文中运行
  2. 有一个与 MR 相关联的环境
  3. 为 MR 的环境设置 on_stop 事件来运行一个阶段,例如 "OnStop"
  4. 将您想要触发的任何内容放入 "OnStop" 阶段

https://docs.gitlab.com/ee/ci/yaml/#environmenton_stop


0
这可能是控制你的工作的规则。
job:
   rules:
     - if : '$CI_PIPELINE_SOURCE == "merge_request_event" || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_COMMIT_BRANCH '
       when: never
     - if: $CI_COMMIT_TITLE =~ /Merge branch.*/
       when: on_success
   script:
     - echo "the merge request which has done has the ID $CI_MERGE_REQUEST_IID"
     # other scripts to run your job

在GitLab的用户界面中,合并请求左侧菜单以及作业和流水线列表中,将以“!number”格式显示CI_MERGE_REQUEST_IID的值。我猜你可以使用这个ID号来验证哪个合并请求已成功完成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接