[英]Is it possible to have a dynamic strategy matrix in a workflow in GitHub Actions?
我想在工作流中动态指定一个策略矩阵。 所以,而不是:
strategy:
matrix:
foo: [bar, baz]
我想首先调用一些脚本,该脚本将计算并返回一个数组,例如[bar, baz]
给我,然后我想将其用作策略矩阵。
这可能吗?
可用的 GitHub 操作工作流功能无法实现,但可以通过一些 hacky 解决方案来提供所有必需的矩阵参数值组合。 您可以在以前的工作流作业之一中将所有组合生成为 JSON 片段并将其公开为作业outputs
,然后在下一个作业中将其与矩阵include
关键字一起使用,以使用fromJson()
提供所有矩阵参数及其值的组合function 如官方公告所示。 为了更好地解释这个概念,让我们看一下示例 static 矩阵作业:
jobs:
matrix-job:
runs-on: ubuntu-latest
strategy:
matrix:
includes:
- foo: foo-1
bar: bar-1
- foo: foo-1
bar: bar-2
- foo: foo-2
bar: bar-1
steps:
- run: |
echo foo=${{ matrix.foo }}
echo bar=${{ matrix.bar }}
工作流结果是:
在此工作流程中,所有矩阵参数值组合都是静态提供的。 我们可以将其转换为动态提供,如下所示:
jobs:
setup-matrix:
runs-on: ubuntu-latest
steps:
- name: Setup matrix combinations
id: setup-matrix-combinations
run: |
MATRIX_PARAMS_COMBINATIONS='
{"foo": "foo-1", "bar": "bar-1"},
{"foo": "foo-1", "bar": "bar-2"},
{"foo": "foo-2", "bar": "bar-1"},
'
echo ::set-output name=matrix-combinations::{\"include\":[$MATRIX_PARAMS_COMBINATIONS]}
outputs:
matrix-combinations: ${{ steps.setup-matrix-combinations.outputs.matrix-combinations }}
matrix-job:
runs-on: ubuntu-latest
needs: setup-matrix
strategy:
matrix: ${{ fromJson(needs.setup-matrix.outputs.matrix-combinations) }}
steps:
- run: |
echo foo=${{ matrix.foo }}
echo bar=${{ matrix.bar }}
结果:
这两个工作流对于matirx-job
有相同的结果,但最后一个提供了一个动态生成的矩阵输入。 这是您可以动态生成矩阵构建的唯一方法,您必须使用matrix.include
自己提供所有组合。 不可能(在撰写本文时)为给定的矩阵参数(如您的问题)动态提供可用值的数组,但您至少有动态矩阵作业。
是的,您可以使用从您的步骤所依赖的先前步骤的 output 摄取的矩阵(“需要”):
jobs:
set:
runs-on: ubuntu-20.04
outputs:
matrix: ${{steps.list_dirs.outputs.matrix}}
steps:
- uses: actions/checkout@v2
- id: list_dirs
run: echo "::set-output name=matrix::$(ls|jq -cnR '[inputs | select(length>0)]')"
get:
runs-on: ubuntu-20.04
needs: set
strategy:
matrix:
subdir: ${{fromJson(needs.set.outputs.matrix)}}
我有如上所示的类似结构,但我通过执行从 Yaml 输入文件读取的 Python 代码生成该结构。 但是,不知何故,我无法让它工作。 由于我使用的是 Python 脚本,因此我需要将结构(如下)写入环境变量,然后才能将其分配给设置输出。 然后我注意到(经过大量试验后)我需要将每一组都放在一个新行中,但这似乎不起作用。 任何帮助将不胜感激。
MATRIX_PARAMS_COMBINATIONS='
{"foo": "foo-1", "bar": "bar-1"},
{"foo": "foo-1", "bar": "bar-2"},
{"foo": "foo-2", "bar": "bar-1"},
'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.