GitHub 动作构建矩阵:$ 是如何工作的?

GitHub Action build matrix: How does the $ work?

来自documentation

runs-on: $
strategy:
  matrix:
    node: [6, 8, 10]
    os: [ubuntu-16.04, ubuntu-18.04]
steps:
- uses: actions/setup-node@v1
  with:
    version: $

此代码段表示 "setup-node" 操作在六种不同的配置中是 运行(两个不同的 os 版本上的三个不同的节点版本)。

但是,我不明白 $ 的实际工作原理。 runs-on 如何获取 os 数组中的值? version 键如何获取 node 数组的值?

使用构建矩阵选项的自定义操作看起来如何?

$ 运算符尚未记录在案,但在示例中您可以看到它的用法。它似乎类似于 MongoDB's $ operator,如果您熟悉那个的话。在 MongoDB 中,显然在这里,$ 代表 "the value of the current element in the list"。例如,文档片段将创建六个作业,三个 运行 在 Ubuntu 16.04 和三个 Ubuntu 18.04.

文档还不够完整,您引用的文档片段中使用 $ 运算符的方式将来会发生变化。片段 应该 是:

runs-on: ${{ matrix.os }}
strategy:
  matrix:
    node: [6, 8, 10]
    os: [ubuntu-16.04, ubuntu-18.04]
steps:
- uses: actions/setup-node@v1
  with:
    version: ${{ matrix.node }}

虽然 GitHub 动作解析器可以很简单地找出应该分配给 runs-on 参数的字符串列表(因为 6、8 和 10 不是runs-on 的有效值),它不知道 setup-nodeversion 输入的有效值是什么。 (顺便说一句,截至 2019 年 8 月 14 日,它已重命名为 node-version,但文档片段尚未更新)。 action.yml 配置文件中没有列出有效输入值的任何内容,只有名称和描述。

因此,由于此文档片段无法按原样工作,我猜它会在某个时候更新,以说明 $ 是当前选定的矩阵变量集,并且 ${{ variableName }}(例如,${{ matrix.node }}${{ matrix.os }})是您应该在使用这些变量的作业配置部分中放置的内容。

至于你问题的第二部分,"How would a custom action look like that works with the build matrix option?",我认为它看起来像是一个正常的动作,在 action.yml 中记录它的输入(参见 the action.yml for setup-node v1 的示例这看起来像什么)。然后当你在你的工作中调用它时,你会做:

strategy:
  matrix:
    someVariable: [foo, bar]
steps:
- uses: my-actions/quux@v1.0
    with:
      someInput: ${{ matrix.someVariable }}