.gitlab-ci.yml中正则表达式未按预期生效问题排查
问题分析与解决
核心问题点
你的正则规则存在三个关键错误:
- 正则语法错误:
/-hotfix-/n末尾多了个多余的n,这会导致该正则表达式失效,GitLab无法正确解析它。 - 匹配条件过于严格:你的正则
/-release_candidate-/和/-hotfix-/要求分支名必须包含前后都带横杠的目标字符串(比如xxx-release_candidate-xxx或yyy-hotfix-yyy),但如果分支名是release_candidate、hotfix_2这类仅包含目标关键词、前后没有横杠的情况,就无法匹配。 - 错误分支被匹配的原因:那个名为
1283-pouvoir-pusher-en-prod-des-branches-autres-que-hotfix-et-release_candidate的分支里包含-hotfix-子串(que-hotfix-et部分),正好符合你正则里的/-hotfix-/(虽然末尾多了n,但GitLab可能忽略了这个无效字符或者仍然匹配了前面的部分),所以被错误触发。
修正后的规则
要实现分支名包含hotfix或release_candidate即可匹配的需求,应该调整正则,去掉不必要的横杠限制,同时修正语法错误:
rules: - if: $CI_COMMIT_BRANCH =~ /hotfix/ || $CI_COMMIT_BRANCH =~ /release_candidate/
如果需要更严谨(比如避免类似myhotfixbranch这种连写的情况,确保hotfix是独立的词,比如前面是开头/横杠,后面是横杠/下划线/结尾),可以用RE2的边界匹配:
rules: - if: $CI_COMMIT_BRANCH =~ /(^|-)hotfix([-_]|$)/ || $CI_COMMIT_BRANCH =~ /(^|-)release_candidate([-_]|$)/
这个正则的意思是:
(^|-):匹配分支名开头,或者前面有一个横杠hotfix/release_candidate:目标关键词([-_]|$):匹配后面是横杠、下划线,或者分支名结尾
关于GitLab正则的/分隔符
GitLab中用/包裹正则表达式,是为了明确标记正则的起始和结束,和JavaScript、Ruby等语言的正则写法一致,RE2引擎会识别/之间的内容作为正则表达式主体。
内容的提问来源于stack exchange,提问作者Alexis Dufrenoy
相关产品推荐
相关产品推荐

