Specify runner to be used depending on condition in a GitHub Actions workflow

5.9k Views Asked by At

We have two runners, one for running production jobs and another for running non production jobs, but I am unable to do that using a workflow level environment variable.

Below is what I have:

name: Workflow file

on:
  workflow-dispatch

env:
 RUNNER_NAME: ${{ contains(github.ref, 'main') && 'Prod Runner' || 'non-Prod Runner' }}

jobs:
  job-run:
    runs-on: [${{ env.RUNNER_NAME }}]
    needs: ...
    steps:
      ..........

I get the following error message:

Invalid workflow file

You have an error in your yaml syntax on line ###

How do I do this? I don't want to have separate workflow files for prod and non-prod workflows.

1

There are 1 best solutions below

5
On

For what you can check on this Github Actions ISSUE, it seems it's not possible to use natively env variable on the runs-on job field (yet?).


However, there is a workaround if you configure a variable as output in a previous job, so you would be able to use it afterwards.

Example: runs-on: ${{ needs.setup.outputs.runner }}

In your case, the workflow would look like this:

on:
  workflow_dispatch:

jobs:
  setup:
    runs-on: ubuntu-latest
    outputs:
      runner: ${{ steps.step1.outputs.runner }}
    steps:
      - name: Check branch
        id: step1
        run: |
          if [ ${{ github.ref }} == 'refs/heads/main' ]; then
            echo "runner=ubuntu-latest" >> $GITHUB_OUTPUT
          else
            echo "runner=macos-latest" >> $GITHUB_OUTPUT
          fi

  job1:
    needs: [setup]
    runs-on: ${{ needs.setup.outputs.runner }}
    steps:
      - run: echo "My runner is ${{ needs.setup.outputs.runner }}" #ubuntu-latest if main branch

I've made a test here if you want to have a look: