You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保GitHub Actions中矩阵策略作业按指定顺序执行?

GitHub Actions矩阵作业按指定顺序执行的解决方案

背景

  • 工作流包含2个作业:
    • 第一个作业生成含name和type属性的任务列表作为输出
    • 第二个作业对应3种任务type,分别使用不同的Action处理

最小复现示例

jobs:
  orchestration:
    runs-on: ubuntu-latest
    outputs: 
      tasks: ${{ steps.tasks.outputs.tasks }}
    steps:
      - name: Setup Python
        uses: actions/setup-python@v3
        with:
          python-version: '3.x'

      - name: Build Tasks Array
        id: tasks
        run: |
          import json
          import os
          
          tasks = []

          for i in range(1, 20):
            task_type = "TYPE1" if i % 3 == 1 else ("TYPE2" if i % 3 == 2 else "TYPE3")
            tasks.append({"taskId": f"task{i}", "type": task_type})

          print("Tasks list:", tasks)
          with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
            f.write(f"tasks={json.dumps(tasks)}\n")
        shell: python
  
  process:
    runs-on: ubuntu-latest
    needs: [orchestration]
    strategy:
      matrix:
        tasks: ${{fromJson(needs.orchestration.outputs.tasks)}}
    steps:
      - if: contains( matrix.tasks.type , 'TYPE1')
        uses: owner/action-type1@v1
        with:
          TASK_ID: ${{ matrix.tasks.taskId }}

      - if: contains( matrix.tasks.type , 'TYPE2')
        uses: owner/action-type2@v1
        with:
          TASK_ID: ${{ matrix.tasks.taskId }}

      - if: contains( matrix.tasks.type , 'TYPE3')
        uses: owner/action-type3@v1
        with:
          TASK_ID: ${{ matrix.tasks.taskId }}

问题

当前通过矩阵策略运行第二个作业,但作业执行顺序无法保证(如task10可能先于task1运行),需要确保作业严格按照第一个作业生成的列表顺序:task1 --> task2 --> task3 ...执行。

已尝试方案

根据GitHub官方文档:

矩阵中变量的顺序决定了作业的创建顺序。
但并行运行时,矩阵作业的实际执行顺序无法得到保障。

解决方案

要确保矩阵作业按指定顺序执行,最直接的方式是限制矩阵并行数为1,结合矩阵变量的定义顺序来实现串行执行:

修改后的工作流示例

jobs:
  orchestration:
    runs-on: ubuntu-latest
    outputs: 
      tasks: ${{ steps.tasks.outputs.tasks }}
    steps:
      - name: Setup Python
        uses: actions/setup-python@v3
        with:
          python-version: '3.x'

      - name: Build Tasks Array
        id: tasks
        run: |
          import json
          import os
          
          tasks = []

          for i in range(1, 20):
            task_type = "TYPE1" if i % 3 == 1 else ("TYPE2" if i % 3 == 2 else "TYPE3")
            tasks.append({"taskId": f"task{i}", "type": task_type})

          print("Tasks list:", tasks)
          with open(os.environ['GITHUB_OUTPUT'], 'a') as f:
            f.write(f"tasks={json.dumps(tasks)}\n")
        shell: python
  
  process:
    runs-on: ubuntu-latest
    needs: [orchestration]
    strategy:
      max-parallel: 1  # 关键配置:限制并行数为1
      matrix:
        tasks: ${{fromJson(needs.orchestration.outputs.tasks)}}
    steps:
      - if: contains( matrix.tasks.type , 'TYPE1')
        uses: owner/action-type1@v1
        with:
          TASK_ID: ${{ matrix.tasks.taskId }}

      - if: contains( matrix.tasks.type , 'TYPE2')
        uses: owner/action-type2@v1
        with:
          TASK_ID: ${{ matrix.tasks.taskId }}

      - if: contains( matrix.tasks.type , 'TYPE3')
        uses: owner/action-type3@v1
        with:
          TASK_ID: ${{ matrix.tasks.taskId }}

原理说明

  1. max-parallel: 1 会强制矩阵中的作业依次串行执行,而不是并行启动
  2. GitHub Actions 会严格按照矩阵变量的定义顺序(即orchestration作业生成的tasks列表顺序)来启动每个矩阵作业
  3. 只要orchestration作业输出的tasks数组顺序正确,process作业就会按task1 → task2 → task3 ...的顺序执行

注意事项

  • 确保orchestration作业输出的JSON数组没有被重新排序(json.dumps默认会保留列表顺序,无需额外处理)
  • 串行执行会增加整体工作流的耗时,若对执行速度有要求,需权衡顺序一致性和执行效率

内容的提问来源于stack exchange,提问作者GuiFalourd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:35:54