【问题标题】:How to get branch name on GitHub action?如何在 GitHub 操作上获取分支名称?
【发布时间】:2020-06-03 14:41:10
【问题描述】:

在 GitHub 操作期间,我想知道分支的名称:

  • 对于推送操作:当前分支的名称
  • 对于 pull_request 操作:目标分支的名称

我需要一个像 developmasterfeature/xxx 这样的字符串(而不是 refs/pull/...)。

${{ github.ref }} 变量给了我refs/heads/develop。我怎样才能只得到develop

【问题讨论】:

  • 这能回答你的问题吗? How to get current branch within github actions
  • 当您说“对于 pull_request 操作:目标分支的名称”时,您是指源分支吗?例如,如果您创建一个 PR 将分支 topic-1 合并到 master,您想要源分支 topic-1 还是目标分支 master

标签: github github-actions


【解决方案1】:

您可以创建GITHUB_REF 的最后一部分的步骤输出,如下所示。

on: push
jobs:
  example:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Set output
        id: vars
        run: echo ::set-output name=short_ref::${GITHUB_REF#refs/*/}

      - name: Check output
        run: echo ${{ steps.vars.outputs.short_ref }}

【讨论】:

  • 此值与 PR 期间目标分支的名称不匹配,因为 OP 要求
【解决方案2】:

这将创建一个具有以下行为的环境变量 GIT_BRANCH:

  • 在 PR 之外,设置为分支短名称(master,而不是 refs/heads/master
  • 在 PR 中,设置为目标分支短名称(master,而不是 refs/pull/123/merge
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set environment variables
        run: |
          # Short name for current branch. For PRs, use target branch (base ref)
          GIT_BRANCH=${GITHUB_BASE_REF:-${GITHUB_REF#refs/heads/}}
          echo "GIT_BRANCH=$GIT_BRANCH" >> $GITHUB_ENV

这是如何工作的:

  • GITHUB_BASE_REF 是 PR 触发期间目标分支的短分支名称,否则为空。
  • GITHUB_REF 始终有一个值,但该值会根据上下文而变化。在 PR 之外,GITHUB_REF 是“完整”分支名称 (refs/heads/master)。在 PR 中,它是 PR 分支名称 (refs/pull/123/merge)。

所以这个脚本使用 GITHUB_BASE_REF 如果设置,否则它使用 GITHUB_REF 并删除“refs/heads/”前缀。

【讨论】:

  • OP 也在询问如何获得功能分支。这将返回 PR 所针对的分支,而不是 PR 分支本身。
  • OP 要求的是目标分支,而不是源分支。我个人认为源分支在这里更有意义,但 OP 明确表示“对于 pull_request 操作:目标分支的名称”。
  • 要在 PR 期间获取源分支而不是目标分支(这对我来说更有意义),您可以使用 env var GITHUB_HEAD_REF 而不是 GITHUB_BASE_REF
【解决方案3】:

您可以从github 对象中获取它,例如${{ github.head_ref }}

【讨论】:

  • head_ref 仅针对拉取请求设置,因此尽管这适用于拉取请求操作,但不适用于分支推送操作(OP 询问两者)。对于分支推送操作,需要从$GITHUB_REF${{ github.ref }}中提取分支名称
  • 您要找的可能是github.base_ref。见docs.github.com/en/actions/reference/…
【解决方案4】:

另一种选择是将其作为环境变量:

  steps:
    - name: Set env.BRANCH
      run: echo "BRANCH=$(echo $GITHUB_REF | cut -d'/' -f 3)" >> $GITHUB_ENV

    - name: Is main?
      if: env.BRANCH == 'main'
      run: echo "This is 'main' branch"

【讨论】:

  • 这种技术在拉取请求中不会有所需的值(GITHUB_REF 将是“refs/pull/123/merge”而不是请求的目标分支)
【解决方案5】:

您可以使用以下语法获取分支名称 -

name: build

on: [push, pull_request]

jobs:
  dummy-fake:
    runs-on: ubuntu-latest
    steps: 
      - name: Checkout repo
        uses: actions/checkout@v2
      - name: Verify run id
        run : echo Run Id $GITHUB_RUN_ID 
      - name: Output the branch name
        run: echo $(echo $GITHUB_REF | cut -d'/' -f 3)

【讨论】:

  • 如果分支名称中有斜线,则此操作将失败,例如refs/heads/feature/foo.
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-10-27
  • 1970-01-01
  • 2020-04-10
  • 2020-12-30
  • 2021-06-02
  • 1970-01-01
相关资源
最近更新 更多