如何在GitHub Actions外部作业中定义OS矩阵并复用工作流?
解决方案:动态传递矩阵参数到复用工作流
要实现外部作业定义OS矩阵并复用共享测试代码,核心是让可复用工作流接收外部传入的矩阵配置,而非在内部固定矩阵。以下是具体实现步骤:
1. 修改可复用工作流 test.yml
将原固定的strategy改为接收外部输入参数,通过JSON字符串传递矩阵数据,再在工作流内部解析使用:
name: 可复用测试工作流 on: workflow_call: inputs: os_matrix: description: 运行测试的操作系统列表 type: string required: true jobs: unit-test: runs-on: ${{ matrix.os }} strategy: matrix: # 将传入的JSON字符串解析为数组 os: ${{ fromJSON(inputs.os_matrix) }} steps: - name: 拉取代码 uses: actions/checkout@v4 # 这里保留你的共享测试步骤(安装依赖、执行测试等) - name: 执行单元测试 run: | echo "在 ${{ matrix.os }} 上运行测试" # 替换为实际测试命令,比如 npm test 或 pytest 等
2. 在主工作流中动态传递矩阵
主工作流里的每个作业(如test_run_a、test_run_b)可以自定义OS列表,以JSON字符串形式传递给复用工作流:
name: 主工作流 on: [push, pull_request] jobs: test_run_a: name: 双系统测试(Ubuntu + macOS) uses: ./.github/workflows/test.yml with: # 传递包含双系统的JSON数组 os_matrix: '["ubuntu-latest", "macos-latest"]' test_run_b: name: 单系统测试(仅macOS) uses: ./.github/workflows/test.yml with: # 传递仅包含macOS的JSON数组 os_matrix: '["macos-latest"]'
关键说明
- GitHub Actions的
workflow_call输入暂不直接支持数组类型,因此用JSON字符串传递矩阵数据,再通过fromJSON()函数解析为可识别的数组。 - 若需要传递更复杂的矩阵(如同时包含OS和其他参数,比如Node.js版本),可以扩展输入参数为完整的矩阵配置:
主工作流传递完整矩阵:# test.yml 中修改输入和矩阵 inputs: full_matrix: description: 完整的测试矩阵配置 type: string required: true jobs: unit-test: strategy: matrix: ${{ fromJSON(inputs.full_matrix) }} runs-on: ${{ matrix.os }} steps: - name: 安装 Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }}test_run_c: uses: ./.github/workflows/test.yml with: full_matrix: '{"os": ["ubuntu-latest"], "node-version": ["18", "20"]}'
内容的提问来源于stack exchange,提问作者k huang
相关产品推荐
相关产品推荐

