如何在 GitHub action 上,在推送标签时获取分支名称?

16

我使用以下方式来触发我的工作流程:

on:
  push:
    tags:

GITHUB_REF在这种情况下不包含分支名称,我该如何获取它?

GITHUB_REF在此情况下不包含分支名称,如何获取?


1
你可以使用 git branch --contains $GITHUB_REF 或者 git_branch=$(git for-each-ref | grep ${commit_num} | grep origin | sed "s/.*\///")(参见 https://dev59.com/UWnWa4cB1Zd3GeqPykOJ) - dan1st
@dan1st 那个不起作用是因为 Github Actions 检出的方式。你需要在包含命令中添加 -r 标志才能使其工作。我的回答中提供了示例。 - Edward Romero
3个回答

13

您需要进行一些字符串操作才能使其正常工作。基本上,当进行标记创建推送时,就像在本地执行git checkout v<tag>,但是没有对原始分支的引用。这就是为什么您需要在git branch中包含命令中使用-r标志的原因。

我们可以通过以下两个命令获得干净的分支。

    raw=$(git branch -r --contains ${{ github.ref }})
    branch=${raw/origin\/}

这是一个创建分支环境的流水线

 name: Tag
 on: 
   create:
     tags:
       - v*
 jobs:
   job1:
     runs-on: ubuntu-latest
     steps:
     - name: checkout source code
       uses: actions/checkout@v1
     - name: Get Branch
       run: |
         raw=$(git branch -r --contains ${{ github.ref }})
         branch=${raw/origin\/}
         echo ::set-env name=BRANCH::$branch
     - run: echo ${{ env.BRANCH }}

工作示例

注意: 我通过创建一个标签并将其推送到 origin,触发了上述流程


8
好的解决方案!我有一些问题:
  1. set-env已被弃用,所以我使用了echo "BRANCH=$branch" >> $GITHUB_ENV
  2. git branch的输出包含前导空格。我使用了branch=${raw##*/}来删除最后一个斜杠之前的所有内容。
- wensveen
5
如果您使用 checkout@v2,那么默认只会获取最新的提交记录,这会导致 git branch 无法找到当前分支。要解决这个问题,您需要在 checkout@v2 步骤中设置 fetch-depth: 0。参考链接:https://github.com/actions/checkout#Fetch-all-history-for-all-tags-and-branches - wensveen
非常感谢你们,太棒了,这个解决方案。 - Kevin Vella
不错的解决方案。需要注意的是:标签可以存在于多个分支上,所以 raw 可能包含多个分支。 - samwize
我尝试运行 "git branch -r --contains ${{ github.ref }}",但没有输出。我还尝试运行 "git branch -r",也没有输出。这个解决方案不再可用吗? - Yuk Chan

6
在Edward的回答基础上,这里有一个现代脚本,可以获取分支名称并在作业之间传递它,还可以根据分支条件性地运行作业。
# This only runs for tags, and the job only processes for "master" branch
name: Example

on:
  push:
    tags:
      - "*"

jobs:
  check:
    runs-on: ubuntu-latest
    outputs:
      branch: ${{ steps.check_step.outputs.branch }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Get current branch
        id: check_step
        run: |
          raw=$(git branch -r --contains ${{ github.ref }})
          branch=${raw##*/}
          echo "{name}=branch" >> $GITHUB_OUTPUT
          echo "Branch is $branch."

  job2:
    runs-on: ubuntu-latest
    needs: check # Wait for check step to finish
    if: ${{ needs.check.outputs.branch == 'master' }} # only run if branch is master

    steps:
      - run: echo "Running task..."

1
FYI,输出捕获方法将很快更改:https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ - pixelou

2

您可以从github.event变量中获取它:

on:
  push:
    tags:
      - '*'

jobs:
  main:
    runs-on: ubuntu-latest
    steps:
      - name: Echo branch
        run: echo "${{ github.event.base_ref }}"

代码的结果如下:

在此输入图片描述


注:保留了原文中的HTML标签。

3
这仅适用于 pull_request https://docs.github.com/zh/actions/learn-github-actions/contexts#steps-context - kraggle
1
@user2863275 您是指 github.base_ref,而我写的是 github.event.base_ref。我肯定是在使用 push。这是一个可行的解决方案,已经在我的 CI/CD 中使用了。 - egvo
我在标签推送触发器上将其设置为 null。 - challet
@challet 你确定使用的是 github.event.base_ref 而不是 github.base_ref 吗?因为它们是不同的。在我的情况下,这个方法可行。但我现在不能保证,因为那是很久以前的事了。 - egvo

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