如何在提交无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
相关产品推荐
相关产品推荐

