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

Azure DevOps YAML拆分ASP.NET Core测试与发布任务,解决空间不足

解决方案:拆分作业分散磁盘压力

完全可以将还原、构建步骤独立为一个作业,测试和发布作为依赖该作业的独立作业执行。每个作业使用独立的Microsoft Hosted Agent,能有效避免单个Agent磁盘空间被耗尽的问题。

调整后的流水线结构

  • Build作业:负责还原NuGet包、编译整个解决方案,发布编译后的二进制产物(包括测试项目和主项目的编译输出)。
  • Test作业:依赖Build作业,下载编译产物后运行单元测试并生成代码覆盖率报告。
  • Publish作业:依赖Build作业,下载编译产物后执行发布操作,生成最终部署包。

调整后的YAML配置

trigger:
  branches:
    include:
    - refs/heads/master
  batch: True

pool:
  vmImage: 'windows-latest'

variables:
  - name: BuildConfiguration
    value: 'Release'
  - name: dotnet_version
    value: '8.0'
  - name: solution
    value: '**/MySolutionFolder/MySolution.Enterprise.sln'
  - name: buildArtifactsName
    value: 'build-outputs'

stages:
  - stage: Build_Test_Publish
    displayName: Build, Test and Publish Applications
    jobs:
      - job: build_solution
        displayName: Restore and Build Solution
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET Core SDK'
          inputs:
            packageType: sdk
            version: $(dotnet_version).x
            installationPath: $(Agent.ToolsDirectory)/dotnet
        - task: NuGetAuthenticate@1
        - task: DotNetCoreCLI@2
          displayName: dotnet Clean
          inputs:
            command: custom
            projects: '$(solution)'
            arguments: '--configuration $(BuildConfiguration)'
            custom: clean
        - task: DotNetCoreCLI@2
          displayName: 'Restore NuGet Packages'
          inputs:
            command: 'restore'
            projects: '$(solution)'
            feedRestore: 5479eefd-1641-4591-a316-1a01f8c5712c
            verbosityRestore: Detailed
        - task: DotNetCoreCLI@2
          displayName: dotnet Build
          inputs:
            projects: '$(solution)'
            command: 'custom'
            custom: build
            arguments: '--configuration $(BuildConfiguration)'
            verbosityRestore: Detailed
        # 发布编译后的二进制文件(排除obj目录减少体积)
        - task: PublishPipelineArtifact@1
          displayName: 'Publish Build Artifacts'
          inputs:
            targetPath: '**/bin/$(BuildConfiguration)/**'
            ArtifactName: '$(buildArtifactsName)'
            exclude: '**/obj/**'

      - job: run_tests
        displayName: Run Unit Tests with Coverage
        dependsOn: build_solution
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET Core SDK'
          inputs:
            packageType: sdk
            version: $(dotnet_version).x
            installationPath: $(Agent.ToolsDirectory)/dotnet
        # 下载Build作业生成的编译产物
        - task: DownloadPipelineArtifact@2
          displayName: 'Download Build Artifacts'
          inputs:
            artifact: '$(buildArtifactsName)'
            path: '$(System.DefaultWorkingDirectory)'
        # 运行测试并生成代码覆盖率(需确保测试项目已引用Coverlet相关NuGet包)
        - task: DotNetCoreCLI@2
          displayName: 'dotnet test with Coverage'
          env:
            ASPNETCORE_ENVIRONMENT: build
          inputs:
            command: test
            projects: '**/Cloud/Tests/**/*Test.csproj'
            arguments: >
              --no-build 
              --configuration $(BuildConfiguration)
              --collect:"XPlat Code Coverage"
              --results-directory $(Build.ArtifactStagingDirectory)/test-results
            publishTestResults: true
        # 发布覆盖率报告
        - task: PublishPipelineArtifact@1
          displayName: 'Publish Coverage Report'
          inputs:
            targetPath: '$(Build.ArtifactStagingDirectory)/test-results'
            ArtifactName: 'coverage-report'

      - job: publish_apps
        displayName: Publish Applications
        dependsOn: build_solution
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET Core SDK'
          inputs:
            packageType: sdk
            version: $(dotnet_version).x
            installationPath: $(Agent.ToolsDirectory)/dotnet
        # 下载Build作业生成的编译产物
        - task: DownloadPipelineArtifact@2
          displayName: 'Download Build Artifacts'
          inputs:
            artifact: '$(buildArtifactsName)'
            path: '$(System.DefaultWorkingDirectory)'
        # 发布Web App One
        - task: DotNetCoreCLI@2
          displayName: dotnet Publish Web App One
          inputs:
            command: custom
            custom: 'publish'
            arguments: '--no-build --configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/output/one'
            publishWebProjects: false
            projects: 'MySolutionFolder/WebAppOne/MySolution.WebOne.csproj'
        # 发布Web App Two
        - task: DotNetCoreCLI@2
          displayName: dotnet Publish Web App Two
          inputs:
            command: custom
            custom: 'publish'
            arguments: '--no-build --configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/output/two'
            publishWebProjects: false
            projects: 'MySolutionFolder/WebAppOne/MySolution.WebTwo.csproj'
        # 发布Web App Three
        - task: DotNetCoreCLI@2
          displayName: dotnet Publish Web App Three
          inputs:
            command: custom
            custom: 'publish'
            arguments: '--no-build --configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/output/three'
            publishWebProjects: false
            projects: 'MySolutionFolder/WebAppOne/MySolution.WebThree.csproj'
        # 发布控制台工具应用
        - task: DotNetCoreCLI@2
          displayName: dotnet Publish tools console app
          inputs:
            command: custom
            custom: 'publish'
            arguments: '--no-build --configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/output/Tools'
            publishWebProjects: false
            projects: 'MySolutionFolder/Tools/Tools.csproj'
        # 发布最终部署包
        - task: PublishPipelineArtifact@1
          displayName: 'Publish Deployment Artifact'
          inputs:
            targetPath: '$(Build.ArtifactStagingDirectory)/output'
            ArtifactName: 'drop'

关键说明

  • 作业隔离:每个作业运行在独立Agent上,磁盘空间互不干扰,避免单Agent因代码库、包、构建产物、覆盖率报告累积导致空间不足。
  • 产物复用:Build作业发布编译后的二进制文件,Test和Publish作业直接复用,无需重复还原构建,节省资源和时间。
  • 覆盖率配置:示例使用XPlat Code Coverage收集数据,需确保测试项目已安装Coverlet.MSBuild或coverlet.collector NuGet包。
  • 体积优化:发布Build产物时排除obj目录,减少不必要的文件传输。

内容的提问来源于stack exchange,提问作者Ghassan Karwchan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:29:51