如何在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个回答

1

获取当前分支很简单,如果事件是由推送触发的,则以下代码有效。

github.ref_name 是一个预定义变量,用于获取分支名称。

jobs:
  main-branch-build:
    if: github.ref_name == 'main'
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@v3
  feature-branch-build:
    if: github.ref_name != 'main'
    runs-on: ubuntu-latest
    steps:
    - name: Check out code
      uses: actions/checkout@v3

1

有一个非常简单的git命令可以获取当前分支:

git rev-parse --abbrev-ref HEAD

要将输出放在环境文件变量中,只需执行以下操作:

      - name: 设置CURRENT_BRANCH
        run: echo "CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV

要从环境变量获取输出:

      - name: 获取CURRENT_BRANCH
        run: echo ${{ env.CURRENT_BRANCH}}

来源:https://www.techiedelight.com/determine-current-branch-name-git/


这在操作分离的头部时是不起作用的,例如当你运行 GitHub Action 流水线时通常就是这种情况。 - doublespaces

1
以下是您需要翻译的内容,涉及IT技术:

为了更好地展示其他人在先前回复中作为简单评论所写的内容,这里再次重申:

https://docs.github.com/en/actions/learn-github-actions/environment-variables

此环境变量仅用于拉取请求,暴露了分支名称:GITHUB_HEAD_REF 仅设置拉取请求事件。头分支的名称。

在GitHub操作中,相应的上下文键是:

github.head_ref

1

1
我发现最好的方法是在 GitHub 上使用 pull_request objectgithub context
在你的工作流程 yaml 文件中:
env: 
  PR_NUMBER: ${{ github.event.number }}
  BRANCH_NAME: ${{ github.event.pull_request.head.ref }}
  UPDATED_AT: ${{ github.event.pull_request.updated_at }}

0
为了在删除事件中获取引用名称,我最终使用了sed
on:
  delete:
...
steps:
  - name: Do something
    shell: bash
    run: |
      refname=$(sed -e s:refs/heads/::g -e s:/:-:g <<< ${{ github.event.ref }})

删除 refs/heads/ 并将斜杠转换为破折号,例如:refs/heads/feature/somefeature 转换为 feature-somefeature


0

我曾多次为在 PR 同步事件和推送到主分支时运行的事件(例如构建已标记的容器映像)而执行此操作,但我并不特别喜欢:

  1. 在私有存储库上使用第三方操作。
  2. 使用表达式语法,因为我认为这是一种相当糟糕的开发体验。
  3. 必须记住变量扩展替换的工作方式,因为我也倾向于使用 / 分隔的分支,例如 fix/123

我想添加一个小的 bash 片段,它将在 push 和 pull_request 事件上工作,因为我在这里没有看到一个:

echo "${GITHUB_REF_NAME}" | grep -P '[0-9]+/merge' &> /dev/null && export ref="${GITHUB_HEAD_REF}" || export ref="${GITHUB_REF_NAME}"

在推送和拉取请求事件中,$ref 变量将保存分支名称,并处理 gitflow/style/branches

这是基于 GitHub Actions 通常会为 PR 同步运行的操作创建一个(通常意料之外的){pr number}/merge 分支的假设。当分支名称与(Perl 风格的)正则表达式匹配并且按照 && 路径导出 ref 作为 GITHUB_HEAD_REF 的值时,grep 调用只会返回 0。或者对于不匹配正则表达式的分支(例如 main)。

grep 上的输出重定向只是防止正则表达式匹配打印到标准输出。

当你需要在与正则表达式匹配的分支上进行推送事件时,这自然不起作用。


0
if: github.ref == 'refs/heads/integration' && github.event_name == 'push' 

您可以使用上述命令并替换您想运行的分支或事件。


这是做什么的? - Sebastián Palma

0
这是一段代码片段,根据$GITHUB_REF设置环境变量,如果不存在则默认为dev
根据您的需求调整sed命令。
export GIT_BRANCH=$(echo ${GITHUB_REF:-dev} | sed s/.*\\///g)

0
通常情况下,我总是编写一个脚本,使用nodejspython编写,该脚本从workflow.yaml中调用。该脚本通常负责获取正确的分支引用等工作。
我有一个类似下面这样的函数,在prepare-deployment.js脚本中-
const VALID_REF_PREFIX = 'refs/heads/';
...

function getBranchRef(isProd = false) {
  let branchRef = 'origin/master';

  if (isProd) {
    return branchRef;
  }
  /**
   * When the workflow is invoked from manual flow, the branch name
   * is in GITHUB_REF, otherwise, we have to look into GITHUB_BASE_REF
   */
  if (GITHUB_REF.startsWith(VALID_REF_PREFIX)) {
    // coming from a manual workflow trigger
    branchName = `origin/${GITHUB_REF.replace(VALID_REF_PREFIX, '')}`;
  } else {
    // coming from a PR
    branchRef = `origin/${GITHUB_HEAD_REF}`;
  }

  return branchRef;
}

这个任务涉及以下情况-
  1. 我想把PR的更改部署到我的开发环境
  2. 我想通过手动触发器将任何分支的更改部署到我的开发环境中
  3. 我想将Master分支的更改部署到我的生产环境中

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