GitLab CI构建.NET 8 WPF项目及单元测试优化求助
优化.NET 8 WPF项目GitLab CI流水线的方案
问题根源分析
- Linux Runner测试失败:WPF依赖
Microsoft.WindowsDesktop.App框架,该框架仅支持Windows平台,Linux环境无法运行WPF相关测试(包括UI测试或依赖桌面框架的单元测试),因此测试阶段报错。 - Windows Runner速度慢:共享Windows Runner通常资源有限,加上环境初始化、重复构建/下载等开销,导致整体耗时过长。
针对性优化方案
方案1:Linux构建+Windows测试(兼顾速度与兼容性)
利用Linux Runner构建速度快的优势完成编译,仅用Windows Runner执行测试,同时减少Windows阶段的重复操作:
image: mcr.microsoft.com/dotnet/sdk:8.0 stages: - build - test workflow: rules: - when: always build-job: stage: build before_script: - cd MyProject.MyProject script: - dotnet restore --use-lock-file - dotnet build --configuration Release --no-restore artifacts: paths: - MyProject.MyProject/**/bin/Release/ - MyProject.MyProject/**/obj/Release/ expire_in: 1 week test: stage: test tags: [shared-windows, windows, windows-1809] before_script: - cd MyProject.MyProject dependencies: - build-job script: - dotnet test --configuration Release --no-build --logger "html;LogFileName=test-results.html;MethodFormat=Class;FailureBodyFormat=Verbose" artifacts: when: always paths: - MyProject.MyProject/**/test-results.html expire_in: 1 week
优化点说明:
- 构建阶段用Linux Runner,通过
--use-lock-file锁定NuGet版本加速还原,--no-restore跳过重复还原步骤 - 构建产物作为artifacts传递给测试阶段,测试阶段用
--no-build直接复用编译结果,避免Windows环境下重复构建 - 测试阶段仅执行测试逻辑,大幅减少Windows环境的执行开销
方案2:优化Windows Runner执行效率
若必须全程使用Windows Runner,可通过以下方式提速:
- 启用依赖缓存:缓存NuGet包和构建输出,避免每次重新下载
.windows_runners: tags: [shared-windows, windows, windows-1809] before_script: - cd MyProject.MyProject cache: key: "$CI_PROJECT_ID-$CI_COMMIT_REF_SLUG" paths: - ~/.nuget/packages/ - MyProject.MyProject/**/obj/ build-job: stage: build extends: .windows_runners script: - dotnet restore --use-lock-file - dotnet build --configuration Release --no-restore test: stage: test extends: .windows_runners dependencies: - build-job script: - dotnet test --configuration Release --no-build --logger "html;LogFileName=test-results.html;MethodFormat=Class;FailureBodyFormat=Verbose"
- 升级Runner版本:切换到
windows-2022标签,新版本镜像包含更优化的.NET环境,资源分配更合理 - 并行执行测试:测试用例较多时,添加
--parallel参数启用并行测试:dotnet test --parallel --configuration Release --no-build --logger "html;LogFileName=test-results.html;MethodFormat=Class;FailureBodyFormat=Verbose"
方案3:拆分测试任务(针对混合测试场景)
如果项目包含不依赖WPF框架的单元测试,可拆分测试任务:
- Linux Runner执行非UI单元测试
- Windows Runner仅执行WPF相关测试
以此减少Windows阶段的执行时间,示例配置:
image: mcr.microsoft.com/dotnet/sdk:8.0 stages: - build - test-non-ui - test-wpf workflow: rules: - when: always build-job: stage: build before_script: - cd MyProject.MyProject script: - dotnet restore --use-lock-file - dotnet build --configuration Release --no-restore artifacts: paths: - MyProject.MyProject/**/bin/Release/ - MyProject.MyProject/**/obj/Release/ expire_in: 1 week test-non-ui: stage: test-non-ui before_script: - cd MyProject.MyProject dependencies: - build-job script: - dotnet test MyProject.MyProject.NonUiTests.csproj --configuration Release --no-build --logger "html;LogFileName=non-ui-test-results.html" artifacts: when: always paths: - MyProject.MyProject/**/non-ui-test-results.html expire_in: 1 week test-wpf: stage: test-wpf tags: [shared-windows, windows, windows-1809] before_script: - cd MyProject.MyProject dependencies: - build-job script: - dotnet test MyProject.MyProject.WpfTests.csproj --configuration Release --no-build --logger "html;LogFileName=wpf-test-results.html" artifacts: when: always paths: - MyProject.MyProject/**/wpf-test-results.html expire_in: 1 week
额外注意事项
- 确保
dotnet test指定正确的测试项目路径,避免执行不必要的测试 - 若共享Windows Runner长期速度不足,可考虑使用自托管Windows Runner,自定义环境配置并分配更多资源
内容的提问来源于stack exchange,提问作者Thomas ESCUDERO
相关产品推荐
相关产品推荐

