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

如何在提交无Git标签时取消GitHub Actions工作流,仅在有标签时执行npm发布

解决方案

你之前的配置出现带标签也取消运行的问题,核心有两个原因:

  • GitHub Actions的if条件表达式不支持直接用!= v*这种通配符匹配语法,必须用内置的startsWith函数做前缀判断
  • actions/checkout默认采用浅克隆,不会拉取全量标签信息,导致git describe命令无法正确识别当前提交绑定的标签

另外你完全不需要手动执行git命令判断标签,GitHub官方提供了内置的上下文变量,可以直接判断当前触发的推送是否为标签推送,方案更稳定简洁。

最优方案:使用内置上下文变量直接判断

直接修改工作流配置如下,不需要额外加判断步骤,job级别就会自动过滤非标签推送:

name: NPM Publish

on:
  push:
    branches:
      - master
    tags: 
      - v*

jobs:
  build:
    name: Build 🏗 & Publish 🚀
    runs-on: ubuntu-latest
    # 只有当前触发是标签推送、且标签以v开头时才运行job
    if: github.ref_type == 'tag' && startsWith(github.ref_name, 'v')
    steps:
      - uses: actions/checkout@v4 # 建议升级到最新稳定版
      - uses: actions/setup-node@v4
        with:
          node-version: 20 # Node 12早已停止维护,建议升级到LTS版本
          registry-url: https://registry.npmjs.org/      
      - run: npm install
      - run: npm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}

这个方案的逻辑是:

  • 只有推送到master分支、或者推送v开头的标签时才会触发工作流
  • job级别的if判断会自动过滤掉推送到master分支的非标签提交,只有推送v开头标签的场景才会实际运行后续发布步骤,完全符合你的需求。

如果你要保留手动判断标签的逻辑,修改如下:

如果一定要在step层面做判断,按以下修改即可解决之前的问题:

name: NPM Publish

on:
  push:
    branches:
    - master

jobs:
  build:
    name: Build 🏗 & Publish 🚀
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # 拉取全量代码和标签信息
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          registry-url: https://registry.npmjs.org/
      - run: echo "GIT_TAG=$(git describe --tags --exact-match HEAD 2>/dev/null || echo '')" >> $GITHUB_ENV
      - name: 无标签时终止执行
        if: ${{ !startsWith(env.GIT_TAG, 'v') }}
        run: |
          echo "No git tag found, action cancelled..."
          exit 1
      - run: npm install
      - run: npm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}

这个方案修改了几个点:

  • 给checkout步骤加了fetch-depth: 0拉取全量信息,确保能拿到所有标签
  • 简化了标签提取的命令,避免多余的转义问题
  • 改用startsWith函数做标签前缀判断,符合GitHub Actions表达式语法
  • 不需要额外引入第三方取消action,直接exit 1终止工作流即可

内容的提问来源于stack exchange,提问作者Samet ÇELİKBIÇAK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:21:02