如何确保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 }}
原理说明
max-parallel: 1会强制矩阵中的作业依次串行执行,而不是并行启动- GitHub Actions 会严格按照矩阵变量的定义顺序(即
orchestration作业生成的tasks列表顺序)来启动每个矩阵作业 - 只要
orchestration作业输出的tasks数组顺序正确,process作业就会按task1 → task2 → task3 ...的顺序执行
注意事项
- 确保
orchestration作业输出的JSON数组没有被重新排序(json.dumps默认会保留列表顺序,无需额外处理) - 串行执行会增加整体工作流的耗时,若对执行速度有要求,需权衡顺序一致性和执行效率
内容的提问来源于stack exchange,提问作者GuiFalourd
相关产品推荐
相关产品推荐

