如何在github动作中获取当前分支

时间:2019-09-20 18:15:20

标签: github github-actions

我正在使用Github Actions构建docker映像,并想用分支名称标记映像, 我只发现了GITHUB_REF变量,但结果为refs/heads/feature-branch-1,我只需要feature-branch-1

17 个答案:

答案 0 :(得分:40)

请注意,如果您在请求请求触发器上执行GitHub动作,则GITHUB_REF变量将包含类似refs/pull/421/merge的内容,因此,如果您尝试将git push命名为该名称,它将最有可能失败。

您可以使用的是YAML中GitHub上下文上的引用。类似于:${{ github.head_ref }}

https://help.github.com/en/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#github-context

Github action context refs

答案 1 :(得分:11)

我添加了一个单独的步骤,用于从$GITHUB_REF中提取分支名称,并将其设置为步骤输出

- name: Extract branch name
      shell: bash
      run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
      id: extract_branch

之后,我可以在

的后续步骤中使用它
- name: Push to ECR
      id: ecr
      uses: jwalton/gh-ecr-push@master
      with:
        access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        region: us-west-2
        image: eng:${{ steps.extract_branch.outputs.branch }}

答案 2 :(得分:7)

我相信GITHUB_REF是唯一包含分支名称的环境变量。

您可以像这样从字符串的其余部分中仅提取分支名称:

${GITHUB_REF##*/}

示例:

$ GITHUB_REF=refs/heads/feature-branch-1
$ echo ${GITHUB_REF##*/}
feature-branch-1

更新:添加了完整的工作流程示例。

工作流程

name: CI
on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Git checkout
        uses: actions/checkout@v1
      - name: Branch name
        run: echo running on branch ${GITHUB_REF##*/}
      - name: Build
        run: docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .

来源:https://github.com/tedmiston/x/blob/master/.github/workflows/workflow.yml

样本输出-主分支

Run docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
  docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
  shell: /bin/bash -e {0}
Sending build context to Docker daemon  146.9kB

Step 1/1 : FROM alpine
latest: Pulling from library/alpine
9d48c3bd43c5: Pulling fs layer
9d48c3bd43c5: Verifying Checksum
9d48c3bd43c5: Download complete
9d48c3bd43c5: Pull complete
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
 ---> 961769676411
Successfully built 961769676411
Successfully tagged tedmiston/tag-example:master

日志:https://github.com/tedmiston/x/commit/cdcc58a908e41d3d90c39ab3bf6fef1ad2c4238a/checks#step:4:16

样本输出-非主分支

Run docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
  docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
  shell: /bin/bash -e {0}
Sending build context to Docker daemon  144.9kB

Step 1/1 : FROM alpine
latest: Pulling from library/alpine
9d48c3bd43c5: Pulling fs layer
9d48c3bd43c5: Verifying Checksum
9d48c3bd43c5: Download complete
9d48c3bd43c5: Pull complete
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
 ---> 961769676411
Successfully built 961769676411
Successfully tagged tedmiston/tag-example:branch-name-test

日志:https://github.com/tedmiston/x/commit/4e8d31259f861aaa2c30375756fc081c3659bddf/checks#step:4:16


有关参数扩展语法的更多信息,请参见this answer

供参考,页面Virtual environments for GitHub Actions列出了执行环境中可用的所有环境变量。

答案 3 :(得分:7)

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

假设${{ github.ref }}refs/heads/mybranch类似,则可以使用以下方法提取分支名称:

steps:
  - name: Prints the current branch name
    run: echo "${GITHUB_BRANCH##*/}"
    env:
      GITHUB_BRANCH: ${{ github.ref }}

如果您的分支包含斜杠(例如feature/foo),请使用以下语法:

steps:
  - name: Prints the current branch name
    run: echo "${GITHUB_REF#refs/heads/}"

信用:@rmunn comment

或使用接受的答案中的方法,这里的版本要短得多(不掉毛):

steps:
  - name: Get the current branch name
    shell: bash
    run: echo "::set-output name=branch::${GITHUB_REF#refs/heads/}"
    id: myref

然后在其他步骤中称为${{ steps.myref.outputs.branch }}

注意:

答案 4 :(得分:7)

GitHub Action FranzDiebold/github-env-vars-action公开了几个有用的环境变量,例如当前分支名称及其子值。我正是针对此用例进行了此操作。

用法

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"

enter image description here

存储库的demo workflows file中还提供了适用于所有操作系统(Linux,macOS和Windows)的演示!

答案 5 :(得分:6)

使用setenvnow deprecated。建议使用environment files。以@youjin的answer为基础,同时仍然允许feature/分支(将/的所有出现替换为-),我现在使用的是:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Get branch name (merge)
        if: github.event_name != 'pull_request'
        shell: bash
        run: echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/} | tr / -)" >> $GITHUB_ENV

      - name: Get branch name (pull request)
        if: github.event_name == 'pull_request'
        shell: bash
        run: echo "BRANCH_NAME=$(echo ${GITHUB_HEAD_REF} | tr / -)" >> $GITHUB_ENV

      - name: Debug
        run: echo ${{ env.BRANCH_NAME }}

答案 6 :(得分:2)

这里有一个适用于<ul id="example-1"> <li v-for="item in cards" :key="item.id"> <i class="fa fa-cc-{{item.brand}} fa-2x" style="color:black"></i> {{ item.brand }} </li> </ul> push事件的完整工作流程

pull_request

答案 7 :(得分:1)

您可以使用https://github.com/rlespinasse/github-slug-action

- uses: rlespinasse/github-slug-action@master
- name: Print slug variables
  run: |
    echo ${{ env.GITHUB_REF_SLUG }}
    echo ${{ env.GITHUB_HEAD_REF_SLUG }}
    echo ${{ env.GITHUB_BASE_REF_SLUG }}

它将从环境变量中提取github_ref。

答案 8 :(得分:1)

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

#!/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/})都是正确的

答案 9 :(得分:1)

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

- 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#How to define env variable? #68

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

答案 10 :(得分:1)

对于使用 Windows 映像运行操作的用户,需要了解的几个关键点:

  1. 假设 GitHub 操作使用 CMD shell 是不正确的。默认情况下它们use PowerShell
  2. 您可以通过以下方式指定要使用的外壳:
- run: |
    ...
  shell: cmd
  1. 您可以使用值“bash”在 bash shell 的上下文中执行命令。

所以,总而言之,您不需要浪费可能的时间来试图弄清楚如何以破旧的 cmd 方式做事(就像我所做的那样)。

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

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

答案 11 :(得分:0)

这是一个基于 $GITHUB_REF 设置环境变量的代码段,如果不存在,则默认为 dev

根据您的要求调整 sed 命令。

export GIT_BRANCH=$(echo ${GITHUB_REF:-dev} | sed s/.*\\///g)

答案 12 :(得分:0)

如果您使用的是 actions/checkout 的 V2,那么您始终可以运行 git branch --show-current 来获取当前检出的分支的名称。

答案 13 :(得分:0)

无论是否触发 pull_request,我都做了一个获取分支名称的操作。 https://github.com/EthanSK/git-branch-name-action

答案 14 :(得分:0)

在GitHub操作上使用分支名称

使用当前分支名称的便捷操作。 用法

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}

答案 15 :(得分:0)

在Windows上运行? Windows默认命令是PowerShell终端。

  - name: SET CURRENT_BRANCH
    run: |
      $branchName = "${{github.ref}}".Split("/")["${{github.ref}}".Split("/").Length -1]
      echo "::set-env name=CURRENT_BRANCH::$(echo $branchName)"

答案 16 :(得分:0)

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

您可以使用上面的命令替换您要为其运行的任何分支或事件。