有没有一种方法可以创建一个Gitlab作业CI规则,当只有一个文件被更新时才不运行作业?

a0zr77ik  于 2023-05-12  发布在  Git
关注(0)|答案(2)|浏览(168)

我正在尝试编写一个gitlab ci作业规则,当只有CHANGELOG.md被提交到默认分支时,它不会运行。但是,如果CHANGELOG.md与提交中的其他文件沿着更新,则运行该作业。这可能吗?谢谢你!
这个的背景是我正在使用backmerge插件进行语义释放。如果被反向合并的提交只是更新CHANGELOG.md,那么不要运行管道。但是如果有其他文件被反向合并,那么运行管道。
对于gitlab ci规则,我正在努力想出一些可以完成任务的东西。

6mzjoqzu

6mzjoqzu1#

您可能需要使用before_script来检查是否满足条件:

stages:
  - build

run_pipeline:
  stage: build
  script:
    - echo "Running pipeline"
  rules:
    - exists:
        - "*"
      when: always
  before_script:
    - |
      CHANGELOG_UPDATED=$(git diff --name-only HEAD~1 | grep -E '^CHANGELOG.md$' | wc -l)
      OTHER_FILES_CHANGED=$(git diff --name-only HEAD~1 | grep -v -E '^CHANGELOG.md$' | wc -l)
      if [ "$CHANGELOG_UPDATED" -eq 1 ] && [ "$OTHER_FILES_CHANGED" -eq 0 ]; then
        echo "Only CHANGELOG.md was updated, skipping the job"
        exit 0
      else
        echo "Other files were updated, running the job"
      fi

在这里,我们使用rules关键字和exists以及when: always,以确保当存储库中存在任何文件时,作业都会运行。
before_script部分检查CHANGELOG.md文件是否被更新,以及是否有任何其他文件在上次提交中被更改。
如果只更新了CHANGELOG.md文件,脚本将以状态代码0退出,从而导致作业被跳过。
如果其他文件已更改,则作业将运行。
rules:changes是最近的版本,15.2,我没有设法让它单独排除CHANGELOG.md

6vl6ewon

6vl6ewon2#

这有点奇怪,但你可以制定这样的规则:

rules:
  changes:
  - '**/{[^C]*,C,C[^H]*,CH,CH[^A]*,CHA,CHA[^N]*,CHAN,CHAN[^G]*,CHANG,CHANG[^E]*,CHANGE,CHANGE[^L]*,CHANGEL,CHANGEL[^O]*,CHANGELO,CHANGELO[^G]*,CHANGELOG,CHANGELOG[^.]*,CHANGELOG.,CHANGELOG.[^m]*,CHANGELOG.m,CHANGELOG.m[^d]*,CHANGELOG.md?*}'

它有the intended effect
这基本上是解决ruby的fnmatch(由rules:changes:使用)不支持! glob元字符这一事实的方法。否则,您可以使用glob模式!CHANGELOG.md
参考:https://stackoverflow.com/a/69906355/5747944

相关问题