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

Azure构建管道技术问询:项目构建范围与CI/CD流程分离

关于Azure构建管道的两个核心问题解答

嘿,我来帮你理清这两个在Azure DevOps管道配置里很常见的疑问~

1. 是否需要排除WinForms客户端项目?怎么操作?

答案取决于你的实际需求,但如果这个WinForms项目和WebAPI没有构建依赖,且你不需要在这个CI管道里构建/发布它,强烈建议排除它——这样能减少不必要的构建时间、资源消耗,避免无关项目的构建失败影响WebAPI的CI流程。

具体排除的方法有几种,选最适合你的:

  • 直接指定构建WebAPI项目而非整个解决方案:
    在Azure管道的VSBuild或DotNetCoreCLI任务中,把projects参数从默认的**/*.sln改成你的WebAPI项目路径,比如:
    - task: VSBuild@1
      inputs:
        solution: '**/MyWebApiProject.csproj'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
    
  • 创建专门的CI解决方案配置:
    在Visual Studio里打开解决方案,点击「生成」→「配置管理器」,新建一个比如CI_Release的配置,在这个配置里取消勾选WinForms项目的「生成」选项。然后在管道的构建任务里指定使用这个配置:
    - task: VSBuild@1
      inputs:
        solution: '**/*.sln'
        platform: '$(buildPlatform)'
        configuration: 'CI_Release'
    
  • 用MSBuild参数排除项目:
    如果坚持要构建整个解决方案,可以在msbuildArguments里添加排除参数:
    - task: VSBuild@1
      inputs:
        solution: '**/*.sln'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
        msbuildArguments: '/exclude:MyWinFormsProject.csproj'
    

2. CI/CD场景中是否需要分离构建与发布/部署环节?

必须要分离!这是CI/CD的最佳实践之一,原因有这些:

  • 构建产物复用:一次构建生成的产物(比如WebAPI的部署包)可以部署到测试、预生产、生产等多个环境,不用重复构建,既节省时间,也避免重复构建可能带来的不一致问题。
  • 可追溯性更强:每个构建都有唯一的ID和版本号,部署出问题时可以快速定位到对应的构建版本,方便排查和回滚。
  • 流程解耦更灵活:CI阶段只负责完成构建、测试、打包这些环节,CD阶段专注于部署到不同环境,还能灵活添加审批、环境校验等 gates(比如生产环境部署需要手动审批)。

在Azure管道里实现分离很简单,用**阶段(Stages)**来划分:

  1. CI阶段:执行构建、单元测试、将构建产物发布为管道工件(Pipeline Artifacts)或上传到Azure Artifacts。
  2. CD阶段:依赖CI阶段的产物,根据环境(测试/生产)执行部署任务,比如部署到Azure App Service。

举个简单的阶段划分示例:

stages:
- stage: CI
  jobs:
  - job: BuildTest
    steps:
    - task: VSBuild@1
      inputs:
        solution: '**/MyWebApiProject.csproj'
        configuration: 'Release'
    - task: VSTest@2
      inputs:
        testAssemblyVer2: '**/*Tests.dll'
    - task: PublishPipelineArtifact@1
      inputs:
        targetPath: '$(Build.ArtifactStagingDirectory)'
        artifact: 'WebApiPackage'
        publishLocation: 'Container'

- stage: CD_Test
  dependsOn: CI
  jobs:
  - job: DeployTest
    steps:
    - task: DownloadPipelineArtifact@2
      inputs:
        artifact: 'WebApiPackage'
        path: '$(System.ArtifactsDirectory)'
    - task: AzureWebApp@1
      inputs:
        azureSubscription: 'YourAzureSubscription'
        appType: 'webApp'
        appName: 'YourTestWebApp'
        package: '$(System.ArtifactsDirectory)/**/*.zip'

- stage: CD_Production
  dependsOn: CD_Test
  condition: succeeded()
  jobs:
  - job: DeployProduction
    steps:
    - task: DownloadPipelineArtifact@2
      inputs:
        artifact: 'WebApiPackage'
        path: '$(System.ArtifactsDirectory)'
    - task: AzureWebApp@1
      inputs:
        azureSubscription: 'YourAzureSubscription'
        appType: 'webApp'
        appName: 'YourProductionWebApp'
        package: '$(System.ArtifactsDirectory)/**/*.zip'

另外补充一句:如果之后你的WinForms项目也需要CI/CD,可以单独创建一个管道,或者在同一个管道里新增独立的阶段来处理它,这样两个项目的CI/CD流程互不干扰。

内容的提问来源于stack exchange,提问作者Ivan-Mark Debono

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:42:47