Gitlab-ci:如果 MR 存在则触发 merge_request 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行

Posted

技术标签:

【中文标题】Gitlab-ci:如果 MR 存在则触发 merge_request 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行【英文标题】:Gitlab-ci: if MR exist just trigger merge_request detach pipeline, if not trigger source branch pipeline. Those 2 pipelines shouldn't run in same time 【发布时间】:2021-12-17 01:57:46 【问题描述】:

我想在创建 MR 时在 MR(合并请求)命令部分查看声纳结果。

我的主要期望:

如果源分支存在现有 MR,则触发分离的管道(不要触​​发功能管道。我只需要那个来查看 MR 命令中的声纳结果) 如果源分支没有现有的 MR,只需触发正常的特征(源)分支管道

我尝试使用下面的示例阶段来做到这一点。但是当我将提交推送到源管道时,源分支存在 MR。我仍然得到双管道。分离和源管道正在运行,我不想同时看到两者,除了不使用规则配置。如何将除了部分与规则部分集成。

这是我的 gitlab-ci 阶段:

deploy:
  stage: deployment
  when: manual
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CUSTOM_VARIABLE == "true" || $CUSTOM_VARIABLE == "true"'
  script:
    - ....
    - ....
  except:
    - tags
    - main

我也尝试了以下规则,如果其中一个符合我的条件,请不要运行另一个。但它仍然会触发两个管道。

deploy:
  stage: deployment
  when: manual
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CUSTOM_VARIABLE == "true"'
      when: on_success
    - if: '$CI_PIPELINE_SOURCE == "push" && $CUSTOM_VARIABLE == "true"'
      when: on_success
  script:
    - ....
    - ....
  except:
    - tags
    - main

【问题讨论】:

【参考方案1】:

覆盖在workflow:rules templates,在这种情况下,您可以使用CI_OPEN_MERGE_REQUESTS variable来确定是运行管道合并请求还是只运行功能分支。

如果您同时使用 [用于合并请求的管道和分支管道],则可能会同时运行重复的管道。为防止重复管道,请使用 CI_OPEN_MERGE_REQUESTS 变量。

使用workflow:rules,您可以对整个管道执行此操作,但同样的原则也可以应用于单个作业。

workflow:
  rules:
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS'
      when: never
    - if: '$CI_COMMIT_BRANCH'

这意味着您的管道将运行:

用于合并请求 对于分支管道,除非有打开的合并请求

【讨论】:

它有效,谢谢您的回答。我还有一个快速的问题。在此工作流程之前,我的每个阶段都有only: variables: [ $sample == "one" ] 条件。现在我不能在工作流中使用它,不是吗?样本变量必须等于 1,否则不会运行。如何将此条件也应用于工作流规则? @hammer89 您可以应用另一个规则——如果您需要该变量存在,请将带有&& 的条件添加到第一个和最后一个- if 规则中。像if: '$CI_COMMIT_BRANCH && $sample == "one"' -- 如果您希望管道在该变量存在时另外运行(即,不考虑其他规则),您可以添加- if: '$sample == "one"' 作为另一个规则 再次感谢您。如果我想在我的阶段使用except: -tags 怎么办。据我所知,除了不能使用规则方法。我该如何使用来避免它?这也是我对此的另一个问题。 my another question

以上是关于Gitlab-ci:如果 MR 存在则触发 merge_request 分离管道,如果不存在则触发源分支管道。这两条管道不应同时运行的主要内容,如果未能解决你的问题,请参考以下文章

MapReduce多重MR如何实现

如何排除 gitlab-ci.yml 更改触发作业

Gitlab-ci.yml 创建合并请求

如果存在条目匹配,则 SQL 触发器从其他表中添加数据

Gitlab-CI 又名管道依赖项中的上游触发

关于K-mer