Jeremy Woodland
Jeremy Woodland

Reputation: 3745

Github Workflow: How to conditionally setup ENV for all subsequent Jobs?

At the start of my workflow I want to conditionally set values for some ENV variables. These values should be global and apply to all jobs and steps. The following code is structurally invalid but it’s what I’m trying to accomplish

if: github.ref_name == "target branch"  (for example)
  env:
    var1: 'Right Branch'

if: github.ref_name != "target branch" 
  env:
    var1: 'Wrong Branch'

jobs:
  ...

Upvotes: 19

Views: 22655

Answers (3)

user2073484
user2073484

Reputation: 75

Can you try this:

var1: ${{ github.ref_name == "target branch" && 'Right Branch' || 'Wrong Branch' }}

Change the "target branch" to the name of your actual gitHub.ref_name.

Upvotes: 0

GuiFalourd
GuiFalourd

Reputation: 23210

There doesn't seem to be something native with Github Actions to achieve what you want.

As a workaround, you could use outputs to do it, using a setup job that would be used as a "needed" job for the subsequent jobs, where you would set the variables you want.

Here is an example using the output in the same job, or in a subsequent job:

jobs:
  setup-job:
    runs-on: ubuntu-latest
    outputs:
      var1: ${{ steps.set-variable.outputs.test }}
    steps:
      - uses: actions/checkout@v2
      - name: Set test variable
        id: set-variable
        run: |
          if [ ${{ github.ref }} != 'refs/heads/main' ]; then
            echo "IS NOT main branch"
            echo "::set-output name=test::abc"
          else
            echo "IS main branch"
            echo "::set-output name=test::123"
          fi
        shell: bash
      - name: Read exported variable
        run: |
          echo "OUTPUT: ${{ steps.check.test-env.test }}"

  subsequent-job:
    runs-on: ubuntu-latest
    needs: [setup-job]
    steps:
      - uses: actions/checkout@v2
      - name: Read exported variable
        run: |
          echo "OUTPUT: ${{needs.setup-job.outputs.var1}}"

Note: I couldn't do it using the $GITHUB_ENV variable (doing something like that echo "test=abc" >> $GITHUB_ENV) as it wasn't shared between jobs.


Update 10/22: Warning: The set-output command is deprecated and will be disabled soon. Please upgrade to using Environment Files. For more information see: github.blog/changelog/…

Now, to set an environment variable, you'll need to use the following syntax:

echo "{environment_variable_name}={value}" >> $GITHUB_ENV

Upvotes: 13

Jeremy Woodland
Jeremy Woodland

Reputation: 3745

Thanks for showing us how to use $GITHUB_ENV. It was mentioned in the docs but an example speaks volumes. I need to conditionally set a dozen+ values and have opted for the following structures.

First, I moved all my setup code into a Composite Action, within my current repo. See How to share code between github actions in the same repository?

File: ./.github/workflows/env_setup/action.yml

runs:
  using: "composite"
    steps:
      # Then I have the following block for each ENV variant
      - shell: bash
        if: <...>
        run: |
          echo "var1=val1
            var2=val2
          " >> $GITHUB_ENV    

This gets accessed in my primary workflow as

my_job:
  steps:
    # Each Job needs to start with the following boilerplate
    - uses: actions/checkout@v2
    - uses: ./.github/workflows/env_setup

    # REAL CODE STARTS HERE
    - run: echo ${{ env.var1 }}

But I'm reconsidering replacing my env. code with your OUTPUTS structure. We'll see ... Cheers!

Upvotes: 2

Related Questions