通过矩阵策略和如下两个作业,第一个作业并行运行可能配置的“矩阵”,当所有配置都成功时,它会转移到第二个作业。
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另一个配置是否仍在进行中或已失败。
在下图中,第一种情况是当前将发生的情况,第二种情况是期望的情况:
我觉得这可以通过在不同的上下文中多次启动工作流程来“模拟”。但如何才能做到这一点,例如通过触发器?以某种方式指定on: push工作流程的 3 个版本必须同时运行?
经过一番挖掘,我认为“可重用工作流程”是当前支持的方法。
解决方案是拥有两个工作流程文件。一个包含所有作业,另一个小型工作流程包含矩阵并调用另一个工作流程。
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 按字母顺序列出子作业,而不是按照它们在工作流程中列出的顺序。这样你就失去了工作之间的依赖关系。2023 年 2 月确实如此,所以 Github 可能会在未来改进 UI。在那之前,我们通过将作业命名为 来解决这个问题1. First Job,2. Second Job因此按字母顺序相当于它们运行的顺序。这虽然很hacky,但很有效。
另一件需要注意的事情是fail-fast属性,特别是对于部署而言。应将其设置为false确保矩阵中的每个工作流程都能运行完成,即使其中一个工作流程失败。
| 归档时间: |
|
| 查看次数: |
3817 次 |
| 最近记录: |