将标签验证Bash脚本移植到GitLab CI Job时全标签判定无效
GitLab CI标签验证Job全量判定无效问题排查
问题背景
现有一个验证标签格式的Bash脚本,功能正常,但移植为GitLab CI Job后,所有标签均被判定为无效。
原功能正常的Bash脚本
#!/bin/bash VERSION_REGEX="^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)((-(alpha|beta|rc)\.(0|[1-9][0-9]*))|((-(0|[1-9][0-9]*))?-[0-9]{14}-[[:xdigit:]]{12}))?$" # Iterate over the array and echo each version (array in examples below) for CI_COMMIT_TAG in "${versions[@]}"; do if [[ "$CI_COMMIT_TAG" =~ $VERSION_REGEX ]]; then echo "$CI_COMMIT_TAG" else echo "Invalid tag format: $CI_COMMIT_TAG" fi done
移植后的GitLab CI Job配置
stages: - validate variables: VERSION_REGEX: > ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)((-(alpha|beta|rc)\.(0|[1-9][0-9]*))|((-(0|[1-9][0-9]*))?-[0-9]{14}-[[:xdigit:]]{12}))?$\ validate_tag: stage: validate rules: - if: "$CI_COMMIT_TAG" # Run this job when a tag is created manually or added through the UI at Code > Tags script: - echo $VERSION_REGEX - | if [[ "$CI_COMMIT_TAG" =~ $VERSION_REGEX ]]; then echo "Valid tag format: $CI_COMMIT_TAG" else echo "Invalid tag format: $CI_COMMIT_TAG" exit 1 fi
测试用标签集合
# Declare the array with version strings versions=( # Valid "v0.0.0" "v1.2.3" "v11.22.33" "v0.1.6-alpha.0" "v0.1.2-alpha.0" "v0.1.2-alpha.3" "v1.2.3-beta.45" "v23.34.45-rc.567" "v0.0.0-20170915032832-14c0d48ead0c" "v0.0.0-5-20170915032832-14c0d48ead0c" # Invalid "0" "V0" "v1" "v000" "v1.9" "v.1.9" "v1.90" "v1.090" "v00.00.00" "v01.02.03" "v1.9-alpha.2" "v0.1.2-alpha.03" "v1.2.3-beta-hardcoded.4" "v0.0.0-5-20170915032832-14c0d48eaxyz" "vX.Y.Z-C-20170915032832-14c0d48ead0c" "v0.0.0-5-20170915032832-14c0d48ead0c-modified" )
GitLab Runner输出示例
预期有效标签的输出
$ echo $VERSION_REGEX ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)((-(alpha|beta|rc)\.(0|[1-9][0-9]*))|((-(0|[1-9][0-9]*))?-[0-9]{14}-[[:xdigit:]]{12}))?$\ $ if [[ "$CI_COMMIT_TAG" =~ $VERSION_REGEX ]]; then # collapsed multi-line command Invalid tag format: v0.1.6-alpha.0 Cleaning up project directory and file based variables 00:01 ERROR: Job failed: exit code 1
预期无效标签的输出
$ echo $VERSION_REGEX ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)((-(alpha|beta|rc)\.(0|[1-9][0-9]*))|((-(0|[1-9][0-9]*))?-[0-9]{14}-[[:xdigit:]]{12}))?$\ $ if [[ "$CI_COMMIT_TAG" =~ $VERSION_REGEX ]]; then # collapsed multi-line command Invalid tag format: v0.1.6-alpha.invalid Cleaning up project directory and file based variables 00:01 ERROR: Job failed: exit code 1
问题定位与解决
从Runner输出可见,VERSION_REGEX末尾多了一个反斜杠\,导致正则表达式结尾变为$\,而非原脚本中的$。原脚本用$匹配标签结尾,额外的\会要求标签必须以\结尾才能匹配,显然所有测试标签都不满足该条件,因此全量判定无效。
解决步骤:修改GitLab CI变量中的VERSION_REGEX,删除末尾的反斜杠\,确保正则结尾为$:
variables: VERSION_REGEX: > ^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)((-(alpha|beta|rc)\.(0|[1-9][0-9]*))|((-(0|[1-9][0-9]*))?-[0-9]{14}-[[:xdigit:]]{12}))?$
内容的提问来源于stack exchange,提问作者tharen
相关产品推荐
相关产品推荐

