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.collectorNuGet包。 - 体积优化:发布Build产物时排除
obj目录,减少不必要的文件传输。
内容的提问来源于stack exchange,提问作者Ghassan Karwchan
相关产品推荐
相关产品推荐

