如何在Github Actions中获取当前的分支?

348

我正在使用Github Actions构建Docker镜像,想要对镜像打上分支名称的标签。

我找到了GITHUB_REF变量,但它返回refs/heads/feature-branch-1,而我只需要feature-branch-1


使用此操作:https://github.com/EthanSK/git-branch-name-action,它适用于pull_request和push触发器。 - Ethan SK
4
在我看来,https://dev59.com/GVMH5IYBdhLWcg3w1TyK#64210623 应该成为被采纳的答案;它解决了@ambientlight对当前被采纳答案的反对意见,避免了现在已经不再使用的 setenv 函数,并且没有使用任何外部库。 - michielbdejong
我在GitHub上发起了一个“功能请求”,希望能够添加本地支持。许多其他CI提供商(Travis CI、CircleCI、Semaphore CI)都有本地支持,因此增加类似的功能是有很好的先例的。如果您想看到这种行为被添加,请给该功能请求投票支持! - blimmer
13
${{ github.ref_name }} 对我有效。 - Neil McGuigan
https://docs.github.com/en/enterprise-cloud@latest/actions/learn-github-actions/variables#default-environment-variables - CatCatMcMeows
1
如果我需要在推送时(从特性分支到主分支)知道源分支名称,应该使用哪个上下文? 因为github.ref_name和github.head_ref都会给出主分支作为分支名称。 - DollyShukla
35个回答

18

GitHub Action FranzDiebold/github-env-vars-action可公开几个有用的环境变量,如当前分支名称和其slug值。我正是为这种情况而制作了此操作。

用法

steps:
  - uses: FranzDiebold/github-env-vars-action@v1.2.0
  - name: Print environment variables
    run: |
      echo "GITHUB_REPOSITORY_SLUG=$GITHUB_REPOSITORY_SLUG"
      echo "GITHUB_REPOSITORY_OWNER=$GITHUB_REPOSITORY_OWNER"
      echo "GITHUB_REPOSITORY_OWNER_SLUG=$GITHUB_REPOSITORY_OWNER_SLUG"
      echo "GITHUB_REPOSITORY_NAME=$GITHUB_REPOSITORY_NAME"
      echo "GITHUB_REPOSITORY_NAME_SLUG=$GITHUB_REPOSITORY_NAME_SLUG"
      echo "GITHUB_REF_SLUG=$GITHUB_REF_SLUG"
      echo "GITHUB_REF_NAME=$GITHUB_REF_NAME"
      echo "GITHUB_REF_NAME_SLUG=$GITHUB_REF_NAME_SLUG"
      echo "GITHUB_SHA_SHORT=$GITHUB_SHA_SHORT"

输入图像描述

仓库的演示工作流文件中也提供了适用于所有操作系统(Linux、macOS和Windows)的演示!


14

要将其设置为环境变量,我使用以下语法:

- name: Extract branch name
  shell: bash
  run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/} | sed 's/\//_/g')"
- name: Test
  run: echo "${BRANCH_NAME}"

我在这里发现了这个语法:Github actions - starter worflows#如何定义环境变量?#68

Rmq: sed 's/\//_/g' 是将分支名称中的/替换为_


如果您在Windows上运行步骤,则可以按照以下方式执行:- run: echo ("::set-env name=BRANCH_NAME::" + $env:GITHUB_REF.replace('refs/heads/', ''))。此命令的Shell应该是默认的PowerShell。 - Sal
3
这已经过时了。 - eljefedelrodeodeljefe
已弃用,返回:错误:无法成功处理命令'::set-env name=BRANCH_NAME::ci'。 错误:`set-env`命令已禁用。请升级到使用环境文件或通过将`ACTIONS_ALLOW_UNSECURE_COMMANDS`环境变量设置为`true`来选择不安全的命令执行。有关更多信息,请参见:https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/ - GuySoft

12

这是一个适用于pushpull_request事件的完整工作流程。

name: whichBranch
on: [pull_request, push]

jobs:
  which_branch:
    runs-on: ubuntu-latest
    steps:
      - name: Extract branch name on push
        if: github.event_name != 'pull_request'
        shell: bash
        run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_REF#refs/heads/})"
        id: extract_branch

      - name: Extract branch name on pull request
        if: github.event_name == 'pull_request'
        run: echo "::set-env name=BRANCH_NAME::$(echo ${GITHUB_HEAD_REF})"

      - name: Print branch name
        run: echo 'The branch name is' $BRANCH_NAME

11

我刚刚在 GitHub Actions 中使用一个 Bash 脚本进行了简单的测试:

#!/bin/bash

echo Reserved for REPO_NAME=${GITHUB_REPOSITORY##*/}
echo GITHUB_REF=${GITHUB_REF}
echo EXTRACT_GITHUB_REF=${GITHUB_REF##*/}
echo EXTRACT_GITHUB_REF_HEADS=$(echo ${GITHUB_REF#refs/heads/})

cd $REPO_NAME
git checkout ${GITHUB_REF##*/}
git checkout $(echo ${GITHUB_REF#refs/heads/})

这是输出的截图:

enter image description here 因此,${GITHUB_REF##*/}$(echo ${GITHUB_REF#refs/heads/})都是正确的。


6

如果你正在使用actions/checkout的V2版本,那么你可以随时运行 git branch --show-current 来获取当前检出分支的名称。


5
现在,${{github.ref}} 是获取分支名称的正确方式。 请记住${{github.ref}} 带有refs/heads/..前缀。

你也可以使用 github.ref_name 来获取分支或标签名称,而不包括前缀。 - techpeace

4
解决同时处理pull_requestpush事件的方法。实现解决方案以保存获取的分支名称以供后续步骤使用,因为set-env已被弃用。 不需要第三方操作。
name: CI
on: [ pull_request, push ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: "Get branch name and save to env"
        env:
          IS_PR: ${{ github.EVENT_NAME == 'pull_request' }}
        run: |
          if ${IS_PR}; then
            BRANCH_NAME="${GITHUB_HEAD_REF}"
          else
            BRANCH_NAME="${GITHUB_REF##*/}"
          fi
          echo "BRANCH_NAME=${BRANCH_NAME}" >> $GITHUB_ENV

      - name: "Another step uses branch name"
        run: echo "Branch name is ${{ env.BRANCH_NAME }}"

GitHub Actions中的运行时变量


3
为了处理 pull_request 事件 (此时 $GITHUB_REF 包含类似于 refs/pull/519/merge 这样没有用的字符串),您可以使用以下一行代码:
   - name: Set branch name
     run: echo "::set-output name=branch_name::$(echo ${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}})"

2

对于使用Windows镜像运行操作的人,需要了解以下几点:

  1. 错误的认为GitHub actions使用CMD shell。它们默认使用PowerShell
  2. 您可以通过以下方式指定要使用的shell:
- run: |
    ...
  shell: cmd
  1. 您可以使用值“bash”在bash shell的上下文中执行命令。

总之,您不需要浪费可能数小时的时间来尝试以破旧的cmd方式完成任务(就像我一样)。

而且,为了简单地获取当前分支的名称,您可以在将shell设置为“bash”的同时使用流行的解决方案,或者例如使用以下简单方法在默认PowerShell shell中设置一个变量:

$branchName = $Env:GITHUB_REF -replace "refs/heads/", ""

2

在GitHub Actions中使用分支名称

方便的操作,可用于使用当前分支名称。 使用方法

name: build
on: push

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - run: npm ci
    - uses: nelonoel/branch-name@v1
    # Use branch name for whatever purpose
    - run: echo ${BRANCH_NAME}

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