github 动作矩阵中的成对值

Bee*_*ope 4 github-actions

我想针对 C 和 C++ 项目的三个编译器版本进行构建:gcc、gcc-8 和 clang(对于 C 编译器),对于 C++ 编译器,它们应该分别使用 g++、g++-8 和 clang++。

总共3个配置。我不想使用所有 C 和 C++ 编译器版本的产品进行构建,即。没有 gcc/g++-8 等。

如何指定具有这三种配置的矩阵,每种配置都设置两个变量?

目前我正在使用它(请注意,指定了 2 个操作系统,因此总共有 6 个配置):

    strategy:
      matrix:
        os: [ubuntu-16.04, ubuntu-latest]
        cpp_compiler: [g++, g++-8, clang++]
        include:
          - c_compiler: gcc
          - cpp_ompiler: g++-8
            c_compiler: gcc-8
          - cpp_compiler: clang++
            c_compiler: clang
Run Code Online (Sandbox Code Playgroud)

本质上就是把C++编译器( cpp_compiler)作为主版本,然后include用hacky的方式c_compiler根据cpp_compiler版本来设置,但一定有更好的...

Spr*_*ite 58

除了@jidicula 的答案(存储matrix为 an )之外array,您还可以将其存储为 a map,这将使工作流程更具可读性。

所以下面的工作流程应该工作得更好:

# simplified

strategy:
  matrix:
    os: [ubuntu-16.04, ubuntu-latest]
    compiler: [ {cpp: g++, c: gcc}, {cpp: g++-8, c: gcc-8}, {cpp: clang++, c: clang} ]
steps:
  - name: Compile with C++ compiler
    run: ${{ matrix.compiler.cpp }} source.cpp
  - name: Compile with C compiler
    run: ${{ matrix.compiler.c }} source.c
Run Code Online (Sandbox Code Playgroud)

当这个工作流被触发时,它将与不同的matrix.

1: matrix.os == ubuntu-16.04, matrix.compiler.cpp == g++, matrix.compiler.c == gcc
2: matrix.os == ubuntu-16.04, matrix.compiler.cpp == g++-8, matrix.compiler.c == gcc-8
3: matrix.os == ubuntu-16.04, matrix.compiler.cpp == clang++, matrix.compiler.c == clang
4: matrix.os == ubuntu-latest, matrix.compiler.cpp == g++, matrix.compiler.c == gcc
5: matrix.os == ubuntu-latest, matrix.compiler.cpp == g++-8, matrix.compiler.c == gcc-8
6: matrix.os == ubuntu-latest, matrix.compiler.cpp == clang++, matrix.compiler.c == clang
Run Code Online (Sandbox Code Playgroud)

然而,无论是 anarray还是 a map,语法目前都没有记录,尽管从某个时间点开始,语法检查器不再将其标记为错误。所以这一切未来可能会改变。


jid*_*ula 6

我刚刚尝试了这个,结果证明你可以在构建矩阵中嵌套数组,但它没有记录。因此,您可以在job.matrix. 让我们称之为compiler-versioncompiler-version: [[g++, gcc], [g++-8, gcc-8], [clang++, clang]]。然后,您可以使用compiler-version零索引访问数组的每个元素中的每个值:matrix.compiler-version[0]对于 C++ 编译器matrix.compiler-version[1]及其对应的 C。

您的工作流程将变成:

    strategy:
      matrix:
        os: [ubuntu-16.04, ubuntu-latest]
        compiler-version: [[g++, gcc], [g++-8, gcc-8], [clang++, clang]]
    steps:
      # .... checkout steps
      - name: Compile file with C++ compiler
        env:
          COMPILER: ${{ matrix.compiler-version[0] }}
        run: |
          $COMPILER file.c
          ./a.out
      - name: Compile file with C compiler
        env:
          COMPILER: ${{ matrix.compiler-version[1] }}
        run: |
          $COMPILER file.c
          ./a.out
Run Code Online (Sandbox Code Playgroud)

我已经用 2 个 Python 版本和 2 个 Ubuntu 版本的矩阵编写了一个最小示例,其中 3.7 与 Ubuntu-18.04 配对,3.8 与 Ubuntu-20.04 配对。你可以看到工作流文件在这里和其相应的运行位置

此解决方案解决了必须在工作流文件中的 2 个位置定义 C++ 选项的尴尬。即使它没有记录,我认为它是稳定的,因为 GitHub Actions 上下文对象是(或至少被视为)JavaScript 对象,所以我们实际上只是将数组文字定义为矩阵对象属性并访问它们的值。

  • 一些补充: `matrix` 的值也可以存储 `map`。示例:`val: [ { x: 'str1' }, { y: 'str2' } ]`,用法:`${{ matrix.val.x }}`。这将使代码更具可读性。但无论是“数组”还是“映射”,Actions 的语法检查器都会用红色下划线标记它,并报告错误“矩阵选项必须仅包含原始值”。它确实有效,只需忽略该错误即可。然而,由于目前还没有记录,所有这一切都可能在未来发生变化。 (3认同)

小智 6

除了其他人的答案之外,需要您更改 yml 代码以稍微更改使用矩阵“变量”的方式,您可以通过使用标签仅include包含您想要的情况来简单地实现特定矩阵的所需结果使用。这使得代码更具可读性并且需要更少的工作

例子:

    strategy:
      matrix:
        include:
          - cpp_compiler: g++
            c_compiler: gcc,
          - cpp_compiler: g++-8
            c_compiler: gcc-8
          - cpp_compiler: clang++
            c_compiler: clang
Run Code Online (Sandbox Code Playgroud)