You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:50:31