You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:52:02