根据 GitHub Actions 工作流程中的条件指定要使用的运行器

Kei*_*h C 3 github-actions github-actions-self-hosted-runners

我们有两个运行程序,一个用于运行生产作业,另一个用于运行非生产作业,但我无法使用工作流程级别环境变量来做到这一点。

以下是我所拥有的:

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:
      ..........
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

工作流程文件无效

You have an error in your yaml syntax on line ###
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?我不想为产品和非产品工作流程提供单独的工作流程文件。

Gui*_*urd 6

对于您可以在这个Github Actions ISSUE上检查的内容,似乎不可能在工作字段env上使用本机变量runs-on(还?)。


但是,如果您在上一个作业中将变量配置为输出,则有一个解决方法,这样您就可以在以后使用它。

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

在您的情况下,工作流程将如下所示:

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
Run Code Online (Sandbox Code Playgroud)

我在这里做了一个测试,如果你想看一下:

  • 我已经更新了答案以使用新语法来设置输出。感谢您注意到@maximkrouk (4认同)