github actions 中整个工作流程的矩阵策略

Ale*_*kiy 5 github-actions

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

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
Run Code Online (Sandbox Code Playgroud)

最好的是在整个工作流程中本质上有一个矩阵,其中对于每个矩阵值,整个作业工作流程不受阻碍地并行运行。这意味着特定配置job2可以在该配置完成后立即继续job1,无论job1另一个配置是否仍在进行中或已失败。

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

github 动作矩阵图

我觉得这可以通过在不同的上下文中多次启动工作流程来“模拟”。但如何才能做到这一点,例如通过触发器?以某种方式指定on: push工作流程的 3 个版本必须同时运行?

Ale*_*kiy 9

经过一番挖掘,我认为“可重用工作流程”是当前支持的方法。

解决方案是拥有两个工作流程文件。一个包含所有作业,另一个小型工作流程包含矩阵并调用另一个工作流程。

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 }}'
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

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

可重用工作流程 UI 按字母顺序列出作业

不过,一旦运行此程序,您将遇到的一件事是,UI 按字母顺序列出子作业,而不是按照它们在工作流程中列出的顺序。这样你就失去了工作之间的依赖关系。2023 年 2 月确实如此,所以 Github 可能会在未来改进 UI。在那之前,我们通过将作业命名为 来解决这个问题1. First Job2. Second Job因此按字母顺序相当于它们运行的​​顺序。这虽然很hacky,但很有效。

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