是否可以在GitHubActions的工作流中使用动态策略矩阵?
我想在工作流程中动态指定一个策略矩阵。所以,而不是:
strategy:
matrix:
foo: [bar, baz]
我想首先调用一些脚本,该脚本将计算并返回一个数组,例如[bar, baz]给我,然后我想将其用作策略矩阵。
这可能吗?
回答
可用的 GitHub Actions 工作流程功能是不可能的,但可以使用一个有点hacky 的解决方案来提供所有必需的矩阵参数值的组合。您可以生成所有组合的JSON在前面的工作流程作业的一个片断并将其作为就业outputs再与基质使用include关键字在接下来的工作提供全部采用矩阵参数和值组合fromJson()功能的演示官方公告。为了更好地解释这个概念,让我们看一下示例静态矩阵作业:
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. 不可能(在撰写本文时)为给定的矩阵参数(如您的问题)动态提供可用值数组,但您至少有动态矩阵作业。