如果提交没有标签,我该如何取消 GitHub Actions 工作流程?

3
我已经通过npm发布了GitHub Actions,我希望只有当我的提交包含标签时才运行该操作,否则不运行操作,因为如果我没有给我的提交添加任何标签,那么操作将会运行失败,原因是它试图使用相同的标签发布已经发布的npm包。例如,对于我的最新提交,我有一个标签1.2.3,并且我的npm包是使用1.2.3版本发布的。当我在没有任何标签的情况下向我的分支添加新的提交时,操作将尝试使用1.2.3版本标签发布我的软件包,从而导致操作失败。下面是我的操作代码,请问是否有解决方法。
感谢您的建议。
name: NPM Publish

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

jobs:
  build:
    name: Build  & Publish 
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v2.4.0
        with:
          node-version: 12
          registry-url: https://registry.npmjs.org/      
      - run: npm install
      - run: npm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}

我需要在yml文件中添加类似以下的内容:

如果(git提交有标签)则继续任务,否则停止任务;

修改版本

根据@Enrico Campidoglio建议,我编辑了我的yml文件,但仍然不起作用。 我进行了两次提交,第一次没有标签,它取消了操作,但第二次有标签,它仍然取消了操作。是否有任何新的建议或解决方案?

name: NPM Publish

on:
  push:
    branches:
    - master

jobs:
  build:
    name: Build  & Publish 
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v2.4.0
        with:
          node-version: 12
          registry-url: https://registry.npmjs.org/
      - run: echo "GIT_COMMIT=`echo $(git rev-parse --short HEAD)`" >> $GITHUB_ENV
      - run: echo "GIT_TAG=`echo $(git describe --tags --exact-match ${{ env.GIT_COMMIT }} || :)`" >> $GITHUB_ENV
      - run: echo ${{ env.GIT_TAG }} != v*
      - run: |
          if [[ ${{ env.GIT_TAG }} == v* ]] ; then
          echo "Tag found..."
          else
          echo "No git tag found, action cancelled..."
          exit 1
          fi


      - uses: andymckay/cancel-action@0.2
        if: ${{ env.GIT_TAG }} != v*
          
      - run: npm install
      - run: npm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}

我无法弄清楚问题的原因,这里有一个操作结果:

enter image description here

这是最新失败的操作: https://github.com/sametcelikbicak/enum2array/runs/3513521031?check_suite_focus=true

2个回答

3
我尝试了很多次后终于找到了解决方案。我改变了想法并尝试运行 shell脚本 ,它奏效了 :)
只需在我的yml文件中添加那一行即可。
      - name: Check Git Tag to continue publish
        run: ./scripts/publish.sh

我创建了一个sh文件来控制提交标签。你可以在下面找到最新的脚本和yml文件定义。

这是我的最新的yml文件npm-publish.yml

name: NPM Publish

on:
  push:
    branches:
    - master

jobs:
  build:
    name: Build  & Publish 
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-node@v2.4.0
        with:
          node-version: 12
          registry-url: https://registry.npmjs.org/

      - name: Check Git Tag to continue publish
        run: ./scripts/publish.sh
          
      - run: npm install
      - run: npm publish --access public
        env:
          NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}

这是我的脚本文件,publish.sh
#!/usr/bin/env bash

GIT_COMMIT=$(git rev-parse --short HEAD)
GIT_TAG=$(git describe --tags --exact-match $COMMIT || :)

if [[ ${GIT_TAG} == v* ]] ; then
    echo "$GIT_TAG Tag found..."
else
    echo "No git tag found, action cancelled..."
    exit 1
fi

0

目前还没有官方的操作来取消当前工作流程。但是,有官方的GitHub API第三方操作可以调用它。您可以将其与if条件语句github上下文结合使用,以实现您想要的效果:

steps:
  - uses: andymckay/cancel-action@0.2
    if: startsWith(github.ref, 'refs/tags')

请注意,通过API取消工作流是一种异步操作,这意味着直到工作流运行程序处理请求之前,后续步骤可能仍会执行。
一个更加可靠的方法是在发布步骤上设置条件,只有在工作流由新标签触发时才运行:
steps:
  - run: npm publish --access public
    if: startsWith(github.ref, 'refs/tags')
    env:
      NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}

谢谢您的回答,我做了一些更改并更新了我的问题,但仍然不起作用 :( - Samet ÇELİKBIÇAK
你更新后的工作流似乎有问题。第一步调用了cancel-action,但没有任何if条件,这意味着它总是会取消构建。 - Enrico Campidoglio
哪个位置或行有误,请在我的最新yml文件中指出该位置。 - Samet ÇELİKBIÇAK
我猜- uses: andymckay/cancel-action@0.2 if: ${{ env.GIT_TAG }} != v*这几行代码有问题,我该如何处理这个控制? - Samet ÇELİKBIÇAK
尝试将if条件替换为if: startsWith(github.ref, 'refs/tags/v') - Enrico Campidoglio
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接