GitLab-CI动态生成依赖前置作业的后续作业(含GitHub Actions方案)
GitLab CI 实现方案
方法1:子流水线(推荐)
前置作业收集系统状态后,生成包含后续测试任务的CI配置文件,触发子流水线执行动态任务。
stages: - collect - trigger-tests collect data: stage: collect script: # 收集系统状态,比如检测可用测试环境、设备 - echo "收集系统状态信息..." # 根据状态生成子流水线配置 - | cat > child-pipeline.yml << EOF stages: - test test-env-1: stage: test script: - echo "执行环境1的测试任务" test-env-2: stage: test script: - echo "执行环境2的测试任务" EOF artifacts: paths: - child-pipeline.yml trigger dynamic tests: stage: trigger-tests trigger: include: - artifact: child-pipeline.yml job: collect data strategy: depend
方法2:动态Parallel矩阵
通过前置作业将矩阵数据写入文件,后续作业读取并生成并行矩阵。
stages: - collect - test collect data: stage: collect script: # 收集系统状态,生成测试矩阵数据 - echo '["device1", "device2", "device3"]' > test-matrix.json artifacts: paths: - test-matrix.json test: stage: test script: - echo "针对设备 $DEVICE 执行测试" # 这里添加对应设备的测试逻辑 parallel: matrix: - DEVICE: $(cat test-matrix.json) needs: ["collect data"]
GitHub Actions 实现方案
利用作业输出变量传递动态数据,结合fromJSON解析生成测试矩阵。
name: Dynamic System Tests on: [push] jobs: collect-data: runs-on: self-hosted outputs: test-matrix: ${{ steps.generate.outputs.matrix }} steps: - name: 收集系统状态 id: generate run: | # 根据系统状态生成测试目标列表 TEST_TARGETS='["target-a", "target-b", "target-c"]' echo "matrix=$TEST_TARGETS" >> $GITHUB_OUTPUT run-tests: needs: collect-data runs-on: self-hosted strategy: matrix: target: ${{ fromJSON(needs.collect-data.outputs.test-matrix) }} steps: - name: 执行 ${{ matrix.target }} 的测试 run: | echo "启动目标 ${{ matrix.target }} 的测试流程" # 添加具体测试逻辑
内容的提问来源于stack exchange,提问作者Simon Rose
相关产品推荐
相关产品推荐

