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
的事情),因为它不是在作业之间共享的。
这里是我用来测试的workflow file
这是 workflow run 输出。
感谢您向我们展示如何使用 $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 结构编写代码。走着瞧 ...
干杯!
在我的工作流程开始时,我想有条件地为一些 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
的事情),因为它不是在作业之间共享的。
这里是我用来测试的workflow file
这是 workflow run 输出。
感谢您向我们展示如何使用 $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 结构编写代码。走着瞧 ... 干杯!