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



在我的工作流程开始时,我想有条件地为一些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 Actions似乎没有什么原生的东西可以实现您想要的。

作为一种变通方法,您可以使用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的事情(,因为它没有在作业之间共享

  • 这是我用来测试的工作流文件。

  • 这是工作流运行输出。


更新10/22:警告:set-output命令已弃用,很快将被禁用。请升级到使用环境文件。有关更多信息,请参阅:github.blog/changelog/…

现在,要设置环境变量,您需要使用以下语法:

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

感谢您向我们展示如何使用$GITHUB_ENV。文档中提到了这一点,但一个例子足以说明问题。我需要有条件地设置十几个+值,并选择了以下结构。

首先,我将所有的设置代码移动到当前回购中的Composite Action中。看见如何在同一存储库中的github操作之间共享代码?

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

但我正在重新考虑更换我的env。使用OUTPUTS结构进行编码。我们拭目以待。。。干杯

最新更新