Getting current branch and commit hash in GitHub action

Rüd*_*ulz 26 git github github-actions

I want to build a docker image using a GitHub action, migrating from TeamCity.

In the build script, I want to tag the image with a combination of branch and commit, e.g. master.ad959de. Testing that locally, I get that information like this:

git_branch=`git symbolic-ref --short HEAD`
git_hash=`git rev-parse --short HEAD`
docker_version=${git_branch}.${git_hash}
Run Code Online (Sandbox Code Playgroud)

This is the relevant part of the GitHub action:

name: CI
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1

    - name: Create docker image
      run: ./docker-build.sh  

Run Code Online (Sandbox Code Playgroud)

Running that script in that GitHub action results in this error:

fatal: ref HEAD is not a symbolic ref
Run Code Online (Sandbox Code Playgroud)

How can I generate a tag like that inside a GitHub action?

小智 113

另一种方法是使用github context

- name: Create docker image
  run: ./docker-build.sh ${{ github.head_ref }}.${{ github.sha }}
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是您不必添加设置值的步骤。请注意,它使用完整版本的 sha(而不是短版本)。

  • 这应该是正确的答案,因为“${{ github.sha }}”是获取提交 SHA 的正确方法 (26认同)
  • @Pietrek我使用`$(git rev-parse --short HEAD)`方法。 (2认同)

Ant*_*ile 38

使用环境变量

github 提供了两个在这里很有用的变量,你需要对它们进行一些处理以获得你想要的值:

GITHUB_SHA:触发​​工作流的提交 SHA。例如,ffac537e6cbbf934b08745a378932722df287a53

GITHUB_REF:触发​​工作流的分支或标记引用。例如,refs/heads/feature-branch-1。如果分支或标记均不适用于事件类型,则该变量将不存在。

可以像这样提取短值:

git_hash=$(git rev-parse --short "$GITHUB_SHA")
git_branch=${GITHUB_REF#refs/heads/}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果分支名称包含 `/` git_branch 值将不正确。例如,“ref/heads/actions/test”转换为“test”,其中“actions/test”是实际的分支名称。而是使用 `git_branch=${branch#refs/heads/}` 。源代码:/sf/answers/4062468371/ (11认同)
  • 自从这个答案发布以来,也许 github 添加了更多的环境变量;`git_branch` 现在应该可以作为 `GITHUB_REF_NAME` 环境变量使用。 (4认同)
  • 请注意,如果操作的触发器是“pull_request”,则“${{github.sha}}”不是分支上的最新提交。请参阅 https://github.community/t/github-sha-isnt-the-value-expected/17903 (2认同)

Tia*_*vêa 26

获取当前分支并在工作流上提交 sha 的一种方便方法可能是获取它并保存“变量”。

  - name: Declare some variables
    id: vars
    shell: bash
    run: |
      echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
      echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"

  - name: Another step
    run: |
      echo "Branch: ${{ steps.vars.outputs.branch }}"
      echo "Sha: ${{ steps.vars.outputs.sha_short }}"
Run Code Online (Sandbox Code Playgroud)

也许你docker-build.sh可以接收分支和她作为参数,完整版本作为参数。

  - name: Create docker image
     run: ./docker-build.sh "${{ steps.vars.outputs.branch }}.${{ steps.vars.outputs.sha_short }}"
Run Code Online (Sandbox Code Playgroud)

要不就

  - name: Create docker image
     run: ./docker-build.sh "${GITHUB_REF#refs/heads/}.${GITHUB_SHA}"
Run Code Online (Sandbox Code Playgroud)

此操作中,您可以看到我所做的许多测试,以了解哪些有效,哪些无效。


Azi*_*yed 9

使用环境变量获得缩短的 SHA 的最简单方法:

- name: Build Docker Image
    run: ./docker-build.sh alpha.${GITHUB_SHA::6}
Run Code Online (Sandbox Code Playgroud)

  • 难道你不应该改变6→7来得到7位短SHA吗? (2认同)
  • 最后这个 `::6` 魔法是什么?我从未见过这种情况,Github Actions 也不喜欢它更简单:“工作流程无效。” 意外的符号:'GITHUB_SHA::6'。` (2认同)