In GitHub Actions, I'd like to evaluate a bash expression and then assign it to an environment variable:
- name: Tag image
env:
GITHUB_SHA_SHORT: ${{ $(echo $GITHUB_SHA | cut -c 1-6) }}
..do other things...
However, this naive attempt has failed. According to the docs this doesn't seem to be supported; a somewhat clean workaround would be fine.
4 Answers 4
The original answer to this question used the Actions runner function set-env. Due to a security vulnerability set-env is being deprecated and should no longer be used.
This is the new way to set environment variables.
name: my workflow
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set env
run: echo "GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c 1-6)" >> $GITHUB_ENV
- name: Test
run: echo $GITHUB_SHA_SHORT
Setting an environment variable
echo "{name}={value}" >> $GITHUB_ENVCreates or updates an environment variable for any actions running next in a job. The action that creates or updates the environment variable does not have access to the new value, but all subsequent actions in a job will have access. Environment variables are case-sensitive and you can include punctuation.
Example using the output to $GITHUB_ENV method:
echo "GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c 1-6)" >> $GITHUB_ENV
This is an alternative way to reference the environment variable in workflows.
- name: Test
run: echo ${{ env.GITHUB_SHA_SHORT }}
18 Comments
set-output that I've detailed here. stackoverflow.com/questions/57819539/… $env:GITHUB_ENV, i.e. something like run: echo "GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c 1-6)" >> $env:GITHUB_ENV. - name: Set and Retrieve Github ENV variables
shell: bash
run: |
# define variables
tests=16
failures=2
# set them as GitHub ENV variables
echo "Tests=$tests" >> $GITHUB_ENV
echo "Failures=$failures" >> $GITHUB_ENV
# retrieve these GitHub ENV variables
echo "${{ env.Failures }} out of ${{ env.Tests }} tests failed on CI"
Output
2 out of 16 test failed on CI
7 Comments
env.Failures and env.Tests values.... >> "$GITHUB_ENV". And I could only access the variable in a new step, not within the same step in which I assigned the variable. This is the GitHub docs page that I followed: docs.github.com/en/actions/using-workflows/… As described in other answers the use of $GITHUB_ENV is limited to steps within a single job.
If you want to use a variable across multiple jobs there is a solution, but it's not concise.
The steps are:
- Define a job that does that actual commands, and saves the result as an
outputof a step, and that value as anoutputof the job. - In each job where you need the value, reference the commands job outputs.
Here is an example job to save the output.
jobs:
command-outputs:
runs-on: ubuntu-latest
outputs:
GITHUB_SHA_SHORT: ${{ steps.commands.outputs.GITHUB_SHA_SHORT }}
steps:
- id: commands
run: |
echo "GITHUB_SHA_SHORT=$(echo $GITHUB_SHA | cut -c 1-6)" >> "$GITHUB_OUTPUT"
Then use that value in another job:
different-job:
needs: [command-outputs]
env:
GITHUB_SHA_SHORT: ${{ needs.command-outputs.outputs.GITHUB_SHA_SHORT }}
steps:
- name: Tag image
run: git tag v1.2.3 ${{ env.GITHUB_SHA_SHORT }} -m "Tagged"
# do other things
If you only need the value in one step you can skip the setting of env and use the needs directly.
Comments
The documentation https://docs.github.com/en/free-pro-team@latest/actions/reference/environment-variables#about-environment-variables describes 2 ways of defining environment-variables.
To set custom environment variables, you need to specify the variables in the workflow file. You can define environment variables for a step, job, or entire workflow using the jobs.<job_id>.steps[*].env, jobs.<job_id>.env, and env keywords.
steps:
- name: Hello world
run: echo Hello world $FIRST_NAME $middle_name $Last_Name!
env:
FIRST_NAME: Mona
middle_name: The
Last_Name: Octocat
You can also use the GITHUB_ENV environment file to set an environment variable that the following steps in a workflow can use. The environment file can be used directly by an action or as a shell command in a workflow file using the run keyword.
2 Comments
env: FIRST_NAME:?
set-envwould work in a previous step. help.github.com/en/articles/…git rev-parse --short $GITHUB_SHAovercutto create a short version of the rev, because it automatically uses the shortest length which doesn't yield collisions. So while a length of 6 may work fine in the beginning, that may not apply anymore when the number of objects in the repository grows.