Github Actions创建多个顺序作业的矩阵

7
我正在尝试创建以下类似的工作流程,其中矩阵不仅包含一个作业,而是包含多个作业,对于每个环境,我们都希望构建、测试和部署。
如果环境中的某一步骤失败,则该环境的后续步骤不应运行。
矩阵如下:["Env A", "Env B", ... , "Env n"]

Expected workflow

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

有其他方法可以在不重复代码的情况下完成吗?


1
你尝试过使用可重用工作流程,为每个环境使用不同的输入/密钥吗?它也可以与矩阵一起使用。 - undefined
@Rahul,你能解决这个问题吗? - undefined
1个回答

0
你可以在每个环境中使用不同的输入/密钥来使用可重用工作流程。它也可以与矩阵一起使用。 示例: 使用包含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"

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

使用这样的可重复使用的工作流:

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 }}"

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

在矩阵策略中使用max-parallel: 1时,将尊重作为矩阵输入的列表的顺序,并且矩阵运行将按照相同的顺序进行(更多详细信息的参考)。

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

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


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

enter image description here

观察:Github工作流程运行图形界面没有帮助,但是你可以在左侧看到每个作业都按照你在问题中期望的方式执行。
最后一个作业等待所有可重用的作业运行完所有3个操作(构建、测试和部署)。 这里是一个示例,没有在矩阵策略中使用max-parallel: 1。如你所见,速度要快得多,但是矩阵的执行顺序可能不会被遵守。

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