如何限制GitHub仓库标签格式,使其遵循Semantic Versioning规范?
确保GitHub仓库标签符合语义化版本(SemVer)格式的实现方法
GitHub的受保护分支规则仅支持简单的通配符匹配,无法实现SemVer格式的复杂校验,你可以通过GitHub Actions来实现标签的自动校验,具体步骤如下:
方法一:使用Shell正则表达式校验
- 在仓库的
.github/workflows目录下创建一个新的工作流文件,比如validate-semver-tag.yml - 将以下内容写入文件:
name: 校验SemVer标签格式 on: push: tags: - '*' jobs: validate-tag: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 校验标签是否符合SemVer格式 run: | # 提取推送的标签名称 TAG_NAME="${GITHUB_REF#refs/tags/}" # SemVer 2.0 标准正则,支持带v前缀或不带的情况 SEMVER_REGEX="^v?\d+\.\d+\.\d+(-[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?(\+[0-9A-Za-z-]+(\.[0-9A-Za-z-]+)*)?$" if [[ ! "$TAG_NAME" =~ $SEMVER_REGEX ]]; then echo "❌ 标签 '$TAG_NAME' 不符合Semantic Versioning 2.0格式" echo "✅ 有效示例:v1.0.0, 2.1.3-beta, 3.0.0+build123" exit 1 fi echo "✅ 标签 '$TAG_NAME' 符合SemVer格式"
方法二:使用官方semver包校验(更可靠)
如果担心正则表达式的疏漏,可以使用Node.js的semver官方包来校验:
name: 校验SemVer标签格式 on: push: tags: - '*' jobs: validate-tag: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 设置Node环境 uses: actions/setup-node@v4 with: node-version: '20' - name: 安装semver包 run: npm install -g semver - name: 校验标签格式 run: | TAG_NAME="${GITHUB_REF#refs/tags/}" # 移除标签的v前缀(若存在),semver包默认不识别带v的标签 TAG_WITHOUT_V="${TAG_NAME#v}" if ! semver "$TAG_WITHOUT_V"; then echo "❌ 标签 '$TAG_NAME' 不符合SemVer格式" exit 1 fi echo "✅ 标签 '$TAG_NAME' 符合SemVer格式"
生效说明
将上述工作流文件提交到仓库后,任何用户尝试推送不符合SemVer格式的标签时,GitHub Actions会自动触发校验并返回失败,该标签将无法推送到仓库。
内容的提问来源于stack exchange,提问作者Paul D Smith
相关产品推荐
相关产品推荐

