现在,如果我想将环境变量传递给可重用的工作流程,我必须这样做:
name: Reusable workflow
on:
workflow_call:
inputs:
my_env_var:
required: false
type: string
env:
my_env_var: ${{ inputs.my_env_var }}
但是,为此我首先需要将我想要传递的每个环境变量定义为输入。这是可行的,但必须对环境变量进行硬编码使我的可重用工作流程不那么通用。有没有一种方法可以传递环境而不必一一定义它们?我在想这样的事情:
name: Calling reusable workflow
on:
workflow_dispatch:
jobs:
push-image-dev:
uses: ./.github/workflows/my-reusable-workflow.yml
with:
input1: ...
input2: ...
env:
env1: ...
env2: ...
但是,我一直在阅读一些文档,但我认为这种情况不存在。是否有其他方法可以做到这一点,例如继承环境变量或创建一个变量字典的单个输入,稍后解析并设置可重用工作流程中的所有环境变量?
我创建了这个简单的逻辑,它允许我以与输入相关的 1:N 关系传递我想要的所有环境变量。我创建了一个输入,它需要一个环境变量列表,格式为“env=value”,稍后在工作流程内的一个步骤中转换为环境变量。
调用工作流程:
name: Calling reusable workflow
on:
workflow_dispatch:
jobs:
my-job:
uses: ./.github/workflows/my-reusable-workflow.yml
with:
env_vars: |
env1=value1
env2=value2
env3=value3
工作流程定义:
name: My reusable workflow
on:
workflow_call:
inputs:
env_vars:
description: List of environment variables to set up, given in env=value format.
required: false
type: string
jobs:
my-job:
runs-on: ubuntu-latest
steps:
- name: Set environment variables
if: ${{ inputs.env_vars }}
run: |
for i in "${{ inputs.env_vars }}"
do
printf "%s\n" $i >> $GITHUB_ENV
done
与 Luiscri 发布的逻辑相同,但我将其扩展以屏蔽值,因为我使用它来传递 API 凭据。
on:
workflow_call:
secrets:
env_vars:
description: "Environment variables that will be passed to the Maven build"
required: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Set environment variables
run: |
echo "${{ secrets.env_vars }}" | while IFS= read -r line
do
if [ -n "$line" ]
then
# Split the line into key and value based on "=" character.
key="${line%%=*}" # Retain the part before the first "="
val="${line#*=}" # Retain the part after the first "="
echo "::add-mask::$val" # Mask values because they could be sensitive
echo "INFO: Setting variable $key"
echo "${key}=${val}" >> "$GITHUB_ENV"
fi
done