繁体   English   中英

GitHub Actions 的工作流中是否可以有动态策略矩阵?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM