20

I have a github repository like the following

johndoe/hello-world

I am trying to set the following environment variables in github actions

env:
  DOCKER_HUB_USERID: ${{ github.actor }}
  REPOSITORY_NAME: ${GITHUB_REPOSITORY#*\/}
  IMAGE_NAME_CLIENT: "$REPOSITORY_NAME-client"
  IMAGE_NAME_SERVER: "$REPOSITORY_NAME-server"

My expected results for these variables are:

johndoe
hello-world
hello-world-client
hello-world-server

But i am getting

johndoe
${REPOSITORY_NAME#*\/}
$REPOSITORY_NAME-client
$REPOSITORY_NAME-server

Looks like the expressions are not being evaluated while declaring the env vars.

How can I achieve the expected behavior?

Rakib
  • 12,376
  • 16
  • 77
  • 113
  • For the second one, why not `${{github.repository}}`, similar to the first one that works? It looks like from [here](https://github.community/t5/GitHub-Actions/Repository-name-in-environment-variable/m-p/38030/highlight/true#M3198) that would work. – Wayne Feb 27 '20 at 21:36
  • `${{github.repository}}` includes the username... i want to get it without the username – Rakib Feb 28 '20 at 12:01

4 Answers4

20

Shell parameter expansion is not possible outside of a run step.

env:
  REPOSITORY_NAME: ${GITHUB_REPOSITORY#*\/}

Create an extra step to compute the value into a new variable, appending it to the file at $GITHUB_ENV.

      - name: Set env
        run: echo "REPOSITORY_NAME=${GITHUB_REPOSITORY#*\/}" >> $GITHUB_ENV
      - name: Test
        run: echo $REPOSITORY_NAME

Or create a step output.

      - name: Set outputs
        id: vars
        run: echo ::set-output name=repo_name::${GITHUB_REPOSITORY#*\/}
      - name: Test set output
        run: echo ${{ steps.vars.outputs.repo_name }}

Once the computed environment variable REPOSITORY_NAME, or step output steps.vars.outputs.repo_name, exists, they can be used to set other variables like this.

env:
  IMAGE_NAME_CLIENT: ${{ env.REPOSITORY_NAME }}-server
  IMAGE_NAME_SERVER: ${{ steps.vars.outputs.repo_name }}-server
Henrik
  • 9,714
  • 5
  • 53
  • 87
peterevans
  • 34,297
  • 7
  • 84
  • 83
8

Github has changed the way you set environment variables for security reasons, now you have to use this way.

steps:
  - name: Set the environment variable
    run: echo REPOSITORY_NAME=${GITHUB_REPOSITORY#*\/} >> $GITHUB_ENV

then use it like this

  - name: Use the value
    run: echo $REPOSITORY_NAME # This will output repository name

Example of use on env

  - name: Install dependencies And Build Yarn and npm
    uses: fabiel-leon/npm-build@master
    env:
      REPO: ${{ env.REPOSITORY_NAME }}
  - name: Build and push Docker images
    uses: docker/build-push-action@v1
    with:
      tags: ${{ env.REPOSITORY_NAME }}

https://docs.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable

Fabiel León
  • 111
  • 1
  • 5
4

Like this

IMAGE_NAME_SERVER: "${{ REPOSITORY_NAME }}-server"
artemnih
  • 4,136
  • 2
  • 18
  • 28
3

New as of this month, still in a 'run'.

https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/

echo "action_state=yellow" >> $GITHUB_ENV

I also found that things like uses:with:ref will not take ${action_state} expansion, but they will take ${{ env.action_state }} expansion after being stuffed.

leemr
  • 71
  • 6