在 GitHub Actions 中,整个工作流程的矩阵策略。

4

通过矩阵策略和以下两个作业,第一个作业并行运行可能配置的“矩阵”,当它们全部成功时,它会转移到第二个作业。

jobs:
  job1:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        version: [10, 12, 14]
    steps:
      # etc

  job2:
    runs-on: ubuntu-latest
    needs: job1
    strategy:
      matrix:
        version: [10, 12, 14]
    steps:
      # etc

很好的一点是,基本上在整个工作流程中都有一个矩阵,对于每个矩阵值,整个作业工作流程都可以并行运行,不受影响。这意味着对于特定的配置,job2可以在该配置的job1完成后立即进行,而不管另一个配置的job1是否仍在处理中或已失败。

在下图中,第一种情况是当前发生的情况,而第二种情况是期望的情况:

diagram of github actions matrix

我觉得可以通过使用不同的上下文多次启动工作流程来“模拟”这个过程。但是,例如从触发器中如何实现呢?是否可以在on: push中指定同时运行3个版本的工作流程?


我能想到的唯一解决方案是,将job2放在一个独立的工作流中,而不是使用矩阵,而是将版本作为输入接受。然后,每个job1变体都会在其运行结束时使用自己的版本触发此工作流程。显然,这远不如将所有内容放在一个工作流中那么好。 - tmt
@tmt 感谢你的建议。我们决定使用可重用的工作流程,但你可以创建一个矩阵,调用一个完整的其他工作流程,其中包含所有的任务。请参见下面的回答。 - Alexander Kondratskiy
1个回答

8
经过一番探索,我认为“可重复使用的工作流”是目前支持的方法。
解决方案是拥有两个工作流文件。一个包含所有作业,另一个小的工作流则包含矩阵并调用其他工作流。
name: Common Workflow

on:
  workflow_call:
    inputs:
      version: # the variable you can use in place of a matrix
        required: true
        type: number

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - run: echo 'job1 version ${{ inputs.version }}'

  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
      - run: echo 'job2 version ${{ inputs.version }}'

name: Master Workflow

on:
  push:

jobs:
  version-matrix:
    strategy:
      # super important if you want to see all results, even if one fails
      # fail-fast is true by default
      fail-fast: false
      matrix:
        version: [10, 12, 14]
    uses: ./.github/workflows/common-workflow.yml # calls the one above ^
    with:
      version: ${{ matrix.version }}
    secrets: inherit

这是一个在UI中运行的真实示例:

Reusable Workflows UI lists jobs in alphabetical order

运行此程序时,你会遇到一个问题,即UI会按字母顺序列出子作业,而不是按照工作流中列出的顺序。因此,你会失去作业之间依赖关系的感觉。这在2023年2月是正确的,所以也许Github将来会改进UI。在那之前,我们通过像1. 第一个作业2. 第二个作业这样命名我们的作业,使字母顺序等同于它们运行的顺序。这很巧妙,但它有效。

另一个需要注意的事项,特别是对于部署,是fail-fast属性。应将其设置为false,以确保矩阵中的每个工作流都能完成运行,即使其中一个失败了。


截至2023年5月31日,UI问题仍然存在,尽管对我而言,子任务并不一定按字母顺序排列,而仅以随机顺序在UI中显示,并且UI树只是一个大的作业列表,而不是真正展示每个矩阵值子作业依赖关系的树形结构。 - Amit Ben Ami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接