如何检查 GitLab CI 中的文件更改,但前提是合并到默认分支?

how to check for file changes in GitLab CI, but only if merging into default branch?

因为我忘记更改版本号而不得不手动更新我的存储库之后...两次,我决定是时候使用一些 CI 魔法了。

事情是这样的:如果我向 main 发出合并请求,我希望应用程序版本号在 3 个不同的文件中发生变化。

到目前为止,这是我的代码:

stages:
  - test
  - deploy

workflow:
  # some rules

unit_test:
  stage: test
  script:
    # run UT

# This is the part the question is about
check_version:
  stage: test
  rules:
    - if: '$CI_PIPELINE_SOURCE' == "merge_request_event" && '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME' == '$CI_DEFAULT_BRANCH'
      changes:
        - composer.json
        - resources/index.php
        - Doxyfile

deploy:
  stage: deploy
  script:
    # deployment script
  rules:
    - if: '$CI_COMMIT_BRANCH' == '$CI_DEFAULT_BRANCH'

如果我理解正确,我所做的是“如果它是 main 的合并请求,请检查 composer.jsonresources/index.phpDoxyfile 中的更改” .

第一:正确吗?

其次:如何在其他分支允许推送和合并请求? “if”后面是否有某种“else”?

根据documentation for the rules keyword,根据您想要的描述,您拥有它的方式是正确的。如果管道 运行 用于 Push 事件,用于不同的分支,或者如果这三个文件没有包含任何更改,则 check_version 作业将不会添加到管道中(您甚至不会在管道图中看到它),所有其他作业将 运行 基于它们自己的 rules 子句(如果有)或显式 when 子句。

但是,从事您的项目的其他人可能会发现这种方式令人困惑,所以我个人总是在这些情况下添加明确的 when:never

...
check_version:
  stage: test
  rules:
    - if: '$CI_PIPELINE_SOURCE' == "merge_request_event" && '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME' == '$CI_DEFAULT_BRANCH'
      changes:
        - composer.json
        - resources/index.php
        - Doxyfile
    - when: never
...

这将得到与您问题中的示例相同的结果,但我认为更清楚。在 push/merge request/trigger/etc 期间对其进行评估时。事件,如果 if 条件通过,作业将添加到管道中。否则,它 [明确地] 不是。