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

将标签验证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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:24:54