如何在GitLab YAML中为.NET测试项目动态设置parallel:matrix?
GitLab CI 自动并行运行所有.NET测试项目
问题原因分析
你当前的写法无法生效,核心原因是:
GitLab CI 的 parallel:matrix 是在流水线初始化阶段解析的,而 before_script 中定义的变量是在单个Job运行阶段才会被赋值。这就导致matrix解析时,TEST_NAMES 还没有被定义,最终只会把字符串TEST_NAMES作为唯一的测试名称来运行,出现你截图中的问题。
解决方案:用动态子流水线实现自动发现+并行测试
这是GitLab CI中实现运行阶段动态生成并行Job的标准方式,配置简洁且完全满足你无需手动新增配置的需求:
1. 创建生成测试矩阵的脚本
在项目根目录创建generate-test-matrix.sh脚本,自动发现解决方案中的测试项目并生成子流水线配置:
#!/bin/bash set -e # 初始化子流水线YAML模板 echo "stages: [test]" echo "" echo ".test_template:" echo " allow_failure: false" echo " dependencies: [build]" echo " image: mcr.microsoft.com/dotnet/sdk:6.0" echo " script:" echo " - dotnet test --no-restore ./Tests/\${TEST_NAME} -l \"JUnit;LogFilePath=../../TestResults/\${TEST_NAME}.xml\"" echo " artifacts:" echo " paths:" echo " - ./TestResults/" echo "" # 从解决方案中提取所有测试项目名称(精准匹配Tests目录下的项目) TEST_PROJECTS=$(dotnet sln list --path ./ | grep Tests/ | sed 's|Tests/||' | sed 's|\.csproj||') # 为每个测试项目生成对应的Job配置 for PROJECT in $TEST_PROJECTS; do echo "test_${PROJECT}:" echo " <<: *test_template" echo " stage: test" echo " variables:" echo " TEST_NAME: \"${PROJECT}\"" echo "" done
2. 主.gitlab-ci.yml配置
stages: - build - generate-test-matrix - test # 保留你原有的build阶段配置 build: # ... 你的build配置 ... # 生成测试矩阵的前置Job generate-test-matrix: stage: generate-test-matrix image: mcr.microsoft.com/dotnet/sdk:6.0 script: - chmod +x generate-test-matrix.sh - ./generate-test-matrix.sh > test-matrix.yml artifacts: paths: - test-matrix.yml # 触发动态子流水线 tests: stage: test trigger: include: - artifact: test-matrix.yml job: generate-test-matrix strategy: depend
替代方案:用parallel:matrix结合预定义变量(仅作参考)
如果坚持要用parallel:matrix,可在项目CI/CD变量中定义数组TEST_NAMES(包含所有测试项目名称),然后直接引用:
.test: &test allow_failure: false dependencies: [build] image: mcr.microsoft.com/dotnet/sdk:6.0 script: - dotnet test --no-restore ./Tests/${TEST_NAME} -l "JUnit;LogFilePath=../../TestResults/${TEST_NAME}.xml" artifacts: paths: - ./TestResults/ test: stage: test <<: *test parallel: matrix: - TEST_NAME: $TEST_NAMES
但此方式需手动维护TEST_NAMES数组,不符合自动发现的需求。
内容的提问来源于stack exchange,提问作者Friso
相关产品推荐
相关产品推荐

