Reputation: 3108
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}
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
Running that script in that GitHub action results in this error:
fatal: ref HEAD is not a symbolic ref
How can I generate a tag like that inside a GitHub action?
Upvotes: 133
Views: 181369
Reputation: 16820
A handy way to get the currrent branch and commit sha on the workflow could be getting it and saving on a "variable".
- name: Declare some variables
shell: bash
run: |
echo "sha_short=$(git rev-parse --short "$GITHUB_SHA")" >> "$GITHUB_ENV"
echo "branch=$(echo ${GITHUB_REF#refs/heads/})" >> "$GITHUB_ENV"
- name: Another step
run: |
echo "Branch: ${{ env.branch }}"
echo "Sha: ${{ env.sha_short }}"
Maybe your docker-build.sh
could receive the branch and sha as parameter, os the full version as parameter.
- name: Create docker image
run: ./docker-build.sh "${{ env.branch }}.${{ env.sha_short }}"
OR JUST
- name: Create docker image
run: ./docker-build.sh "${GITHUB_REF#refs/heads/}.${GITHUB_SHA}"
On this action you can see it better.
Upvotes: 50
Reputation: 6705
You should be able to access the SHA for the latest Git commit with ${{ github.event.pull_request.head.sha }}
, assuming this is an Action triggered by a Pull Request
Upvotes: 4
Reputation: 70253
from Using environment variables
github provides two variables that are useful here, you'll need to process them a bit to get the values you desire:
GITHUB_SHA
: The commit SHA that triggered the workflow. For example,ffac537e6cbbf934b08745a378932722df287a53
.
GITHUB_REF
: The branch or tag ref that triggered the workflow. For example,refs/heads/feature-branch-1
. If neither a branch or tag is available for the event type, the variable will not exist.
The short values can be extracted like this:
git_hash=$(git rev-parse --short "$GITHUB_SHA")
git_branch=${GITHUB_REF#refs/heads/}
Upvotes: 141
Reputation: 47
Maybe Like this
name: CI
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Get Branch
id: branch
run: echo "git_branch=${GITHUB_REF#refs/heads/}" >> $GITHUB_BRANCH
- name: Check Branch
run: echo "${{ env.branch }}"
- name: Get Hash
id: hash
run: echo "git_hash=$(git rev-parse --short "$GITHUB_SHA")" >> $GITHUB_HASH
- name: Check Hash
run: echo "${{ env.hash }}"
- name: Create docker image
run: ./docker-build.sh ${{ env.branch }} ${{ env.hash }}
Upvotes: 3
Reputation: 6641
You can get it this way in your sh file -
BRANCH_NAME=$(echo $GITHUB_REF | cut -d'/' -f 3)
GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c1-7)
Upvotes: 4
Reputation: 582
Simplest way to get a shortened SHA using Environment variables:
- name: Build Docker Image
run: ./docker-build.sh alpha.${GITHUB_SHA::6}
Upvotes: 12
Reputation: 3853
Using https://github.com/tj-actions/branch-names provides an output which also works for push
and pull_request
events
...
steps:
- uses: actions/checkout@v2
- name: Get branch names
uses: tj-actions/[email protected]
id: branch-names
- name: Current branch name
if: github.event_name == 'pull_request'
run: |
echo "${{ steps.branch-name.outputs.current_branch }}"
# Outputs: "feature/test" current PR branch.
- name: Current branch name
if: github.event_name == 'push'
run: |
echo "${{ steps.branch-name.outputs.current_branch }}"
# Outputs: "main" the default branch that triggered the push event.
- name: Get Ref brach name
run: |
echo "${{ steps.branch-name.outputs.ref_branch }}"
# Outputs: "main" for non PR branches | "1/merge" for a PR branch
- name: Get Head Ref branch name
if: github.event_name == 'pull_request'
run: |
echo "${{ steps.branch-name.outputs.head_ref_branch }}"
# Outputs: "feature/test" current PR branch.
- name: Get Base Ref branch name
if: github.event_name == 'pull_request'
run: |
echo "${{ steps.branch-name.outputs.base_ref_branch }}"
# Outputs: "main" for main <- PR branch.
Upvotes: 1
Reputation: 1932
Another approach is to use github context.
- name: Create docker image
run: ./docker-build.sh ${{ github.head_ref }}.${{ github.sha }}
The benefit of this approach is that you don't have to add a step to set the values. Note that it uses the full version of the sha (not the short version).
Upvotes: 143