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)**来划分:
- CI阶段:执行构建、单元测试、将构建产物发布为管道工件(Pipeline Artifacts)或上传到Azure Artifacts。
- 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
相关产品推荐
相关产品推荐

