Github Actions 创建多个连续作业的矩阵

Rah*_*mar 8 yaml github github-actions

我正在尝试创建一个如下所示的工作流程,其中矩阵不仅仅包含一项作业,而是包含多个作业,对于我们想要构建、测试和部署的每个环境。

如果环境中的某个步骤失败,则不应运行该环境的后续步骤。

矩阵就像["Env A", "Env B", ... , "Env n"]

预期工作流程

  • 希望避免重复每个环境的所有作业。
  • 不能使用单个矩阵作业进行构建,然后使用单个矩阵作业进行测试等,因为将不会维护环境中的黑白步骤依赖性。

有没有其他方法可以在不重复代码的情况下做到这一点?

Gui*_*urd 4

您可以为每个环境使用具有不同输入/秘密的可重用工作流程。它也适用于矩阵。

例子:

使用包含 3 个作业的第一个工作流程:

  • 第一个设置矩阵。
  • 第二个根据矩阵输入按顺序执行可重用的环境。
  • 对每个环境执行操作后最终确定的第三个。
on:
  push:

jobs:
  common-job-1:
    runs-on: ubuntu-latest
    outputs: 
      environments: ${{ steps.environments.outputs.environments }}
    steps:
      - name: Build Environments Array
        id: environments
        run: |
          myArray=()
          myArray+=("env1")
          myArray+=("env2")
          myArray+=("env3")
          myArray=$(jq --compact-output --null-input '$ARGS.positional' --args -- "${myArray[@]}")
          echo "Updated environments list: $myArray"
          echo "environments=$myArray" >> $GITHUB_OUTPUT
        shell: bash

  reusable:
    needs: [common-job-1]
    strategy:
      matrix:
        environment: ${{ fromJSON(needs.common-job-1.outputs.environments) }}
      fail-fast: true
      max-parallel: 1
    # environment:
    #   name: ${{ matrix.environment }}
    uses: OWNER/REPO/.github/workflows/reusable.yml@main
    with:
      stage: ${{ matrix.environment }}

  common-job-2:
    needs: [common-job-1, reusable]
    runs-on: ubuntu-latest
    steps:
      - name: Do something
        run: echo "Do something"
Run Code Online (Sandbox Code Playgroud)

注意:工作流程文件可以在这里找到

通过这样的可重用工作流程:

on:
  workflow_call:
    inputs:
      stage:
        required: true
        type: string

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Build in ${{ inputs.stage }}
        run: |
          echo "Build in ${{ inputs.stage }}"

  test:
    runs-on: ubuntu-latest
    steps:
      - name: Test in ${{ inputs.stage }}
        run: |
          echo "Test in ${{ inputs.stage }}"

  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy in ${{ inputs.stage }}
        run: |
          echo "Deploy in ${{ inputs.stage }}"
Run Code Online (Sandbox Code Playgroud)

注意:工作流程文件可以在这里找到

在矩阵策略中使用时max-parallel: 1,会遵守用作矩阵输入的列表的顺序,并且矩阵运行将遵循相同的顺序(更多详细信息请参考)。

请注意,如果删除该max-parallel: 1字段,工作流程将执行得更快(因为所有作业将并行运行),并且仍将在每个环境中执行构建、测试和部署操作。

问题是,根据您的上下文,您可能希望先在一个环境中运行部署,然后再在其他环境中运行它。


以下max-parallel: 1是在矩阵策略中使用上述实现(使用其他作业名称)后运行的工作流的输出。

在此输入图像描述

观察:Github 工作流程运行图像 UI 没有帮助,但您可以在左侧看到每个作业都已按照您在问题中的预期执行。

最后一个作业等待所有可重用作业运行所有 3 个操作(构建、测试和部署)。

max-parallel: 1是没有在矩阵策略中使用的示例。正如您所看到的,它要快得多,但是可能不遵守矩阵执行顺序。