GitLab流水线特定提交标题不触发规则失效问题排查
GitLab流水线问题:提交变更日志后仍触发流水线
我的GitLab流水线执行以下步骤:
- 构建软件
- 部署软件
- 添加Git标签
- 生成变更日志并提交推送
推送变更日志后我不想让流水线再次触发,于是在workflow里加了一条规则,本想匹配类似docs: Changelog updated for release 1.2.4.211的提交标题,但流水线还是会自动运行,看起来正则表达式没匹配上。
原规则代码:
- if: $CI_COMMIT_TITLE =~ /^docs:\ Changelog\ updated\ for\ release\s/ when: never
完整流水线配置如下:
stages: - build - deploy - addtags - addchangelog workflow: rules: - if: $CI_PIPELINE_SOURCE == "web" - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS when: never - if: $CI_COMMIT_BRANCH - if: $CI_COMMIT_TAG when: never - if: $CI_COMMIT_TITLE =~ /^docs:\ Changelog\ updated\ for\ release\s/ when: never build: stage: build script: - echo "This job builds something" rules: - when: always deploy: stage: deploy script: - echo "This job deploys something" rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH addtags: image: public.ecr.aws/docker/library/node script: - git config --global user.name "${GITLAB_USER_NAME}" - git config --global user.email "${GITLAB_USER_EMAIL}" - VERSION_PACKAGE_JSON=$(npm pkg get version --workspaces=false | tr -d ").$CI_PIPELINE_IID - git tag $VERSION_PACKAGE_JSON - git push https://CI_AUTOMATION:${CI_AUTOMATION_GROUP_ACCESS_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git $VERSION_PACKAGE_JSON HEAD:main rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH stage: addtags addchangelog: image: public.ecr.aws/docker/library/node script: - git config --global user.name "${GITLAB_USER_NAME}" - git config --global user.email "${GITLAB_USER_EMAIL}" - git pull --tags origin main - git tag - npx --yes auto-changelog --tag-pattern .+ - git add CHANGELOG.md - LATEST_TAG=$(git describe --tags --abbrev=0 ) - "git commit -m \"docs: Changelog updated for release ${LATEST_TAG}\"" - git push https://CI_AUTOMATION:${CI_AUTOMATION_GROUP_ACCESS_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git HEAD:main rules: - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH stage: addchangelog
另外,我没在提交信息里用[ci skip],因为这个标识会生成空流水线,不是我想要的效果。
问题原因及解决办法
1. 正则表达式匹配问题
你写的正则/^docs:\ Changelog\ updated\ for\ release\s/最后只匹配单个空格,但提交标题里release后面跟着的是版本号(比如1.2.4.211),导致无法完全匹配。可以简化正则,只要匹配前缀即可:
/^docs:\ Changelog\ updated\ for\ release/
2. Workflow规则执行顺序问题
GitLab的workflow规则是从上到下匹配,匹配到即停止。你原来的规则里,- if: $CI_COMMIT_BRANCH在正则规则之前,当推送变更日志到默认分支时,这条规则会先被触发,后面的正则规则根本没机会执行。
修改后的完整Workflow规则
workflow: rules: - if: $CI_PIPELINE_SOURCE == "web" - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS when: never - if: $CI_COMMIT_TITLE =~ /^docs:\ Changelog\ updated\ for\ release/ when: never - if: $CI_COMMIT_BRANCH - if: $CI_COMMIT_TAG when: never
把正则规则移到$CI_COMMIT_BRANCH规则之前,这样会先检查提交标题,匹配成功就直接阻止流水线运行,否则再执行后续分支检查逻辑。
内容的提问来源于stack exchange,提问作者mles
相关产品推荐
相关产品推荐

