Github 工作流程:如何为所有后续作业有条件地设置 ENV?

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

在我的工作流程开始时,我想有条件地为一些 ENV 变量设置值。这些值应该是全局的并且适用于所有作业和步骤。下面的代码在结构上是无效的,但这是我想要完成的

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

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

jobs:
  ...

似乎没有原生的Github 动作来实现你想要的。

作为解决方法,您可以使用 outputs 来实现您想要的,使用 setup 作业,该作业将用作后续作业的“需要”作业,您可以在其中设置你想要的变量。

这是在同一作业或后续作业中使用输出的示例:

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}}"

注意:我无法使用 $GITHUB_ENV variable(做类似 echo "test=abc" >> $GITHUB_ENV 的事情),因为它不是在作业之间共享的。

感谢您向我们展示如何使用 $GITHUB_ENV。它在文档中被提及,但一个例子说明了一切。我需要有条件地设置十几个以上的值,并选择了以下结构。

首先,我将所有设置代码移至当前存储库中的复合操作中。看

文件:./.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    

这在我的主要工作流程中被访问为

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 }}

但我正在重新考虑更换我的环境。使用您的 OUTPUTS 结构编写代码。走着瞧 ... 干杯!