我正在尝试编写一个gitlab ci作业规则,当只有CHANGELOG.md被提交到默认分支时,它不会运行。但是,如果CHANGELOG.md与提交中的其他文件沿着更新,则运行该作业。这可能吗?谢谢你!这个的背景是我正在使用backmerge插件进行语义释放。如果被反向合并的提交只是更新CHANGELOG.md,那么不要运行管道。但是如果有其他文件被反向合并,那么运行管道。对于gitlab ci规则,我正在努力想出一些可以完成任务的东西。
CHANGELOG.md
6mzjoqzu1#
您可能需要使用before_script来检查是否满足条件:
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)
rules
exists
when: always
rules:changes
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
fnmatch
rules:changes:
!
!CHANGELOG.md
2条答案
按热度按时间6mzjoqzu1#
您可能需要使用
before_script
来检查是否满足条件:在这里,我们使用
rules
关键字和exists
以及when: always
,以确保当存储库中存在任何文件时,作业都会运行。before_script
部分检查CHANGELOG.md
文件是否被更新,以及是否有任何其他文件在上次提交中被更改。如果只更新了
CHANGELOG.md
文件,脚本将以状态代码0退出,从而导致作业被跳过。如果其他文件已更改,则作业将运行。
(
rules:changes
是最近的版本,15.2,我没有设法让它单独排除CHANGELOG.md
)6vl6ewon2#
这有点奇怪,但你可以制定这样的规则:
它有the intended effect。
这基本上是解决ruby的
fnmatch
(由rules:changes:
使用)不支持!
glob元字符这一事实的方法。否则,您可以使用glob模式!CHANGELOG.md
。参考:https://stackoverflow.com/a/69906355/5747944