如何配置GitHub Action矩阵与最大并行数,充分利用两台自托管Runner
解决方案
核心思路是调整矩阵结构,消除笛卡尔积带来的串行调度优先级问题,同时控制并行数避免任务因长期排队超时。
调整矩阵为显式任务列表
将原笛卡尔积矩阵改为用include显式定义每台机器对应的18个任务,让所有任务在调度时处于平级状态。GitHub Actions会从任务队列中优先分配任务给在线的Runner,而非先跑完某一台机器的所有任务再处理另一台。
修改后的工作流配置如下:
jobs: build-and-run: # 根据任务实际时长调整超时时间,示例设置为30天(43200分钟) timeout-minutes: 43200 strategy: max-parallel: 2 fail-fast: true matrix: include: # OrangePi 的18个任务 - os: orangePi client: "client1" network: "network1" - os: orangePi client: "client2" network: "network2" # ... 此处补充OrangePi剩余16个任务 # Graviton3 的18个任务 - os: Graviton3 client: "client1" network: "network1" - os: Graviton3 client: "client2" network: "network2" # ... 此处补充Graviton3剩余16个任务 runs-on: ${{ matrix.os }} steps: # 此处编写你的任务执行步骤
配置说明
include矩阵:显式列出每台机器的任务,消除维度优先级,调度器会优先将任务分配给在线的Runner,两台机器可同时各自处理一个任务。max-parallel: 2:限制同时运行的任务数为2,刚好匹配你的两台Agent数量,避免任务过多导致队列积压,防止超过24小时未启动的任务被标记失败。- 调整
timeout-minutes:原配置的2880分钟(48小时)无法支持数周的任务,需根据实际需求设置更长的超时时间。
简化维护的优化技巧
如果client和network的命名有规律,可使用YAML锚点复用任务模板,减少重复代码:
# 定义任务模板锚点 client-network-tasks: &client-network-tasks - client: "client1" network: "network1" - client: "client2" network: "network2" # ... 补充剩余16个任务 jobs: build-and-run: timeout-minutes: 43200 strategy: max-parallel: 2 fail-fast: true matrix: include: # 复用模板生成OrangePi的任务 - os: orangePi <<: *client-network-tasks # 复用模板生成Graviton3的任务 - os: Graviton3 <<: *client-network-tasks runs-on: ${{ matrix.os }} steps: # 任务执行步骤
内容的提问来源于stack exchange,提问作者Kamil Chodoła
相关产品推荐
相关产品推荐

