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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:14:52