如何在Azure DevOps Pipeline中仅构建.NET Core解决方案的变更项目?
实现Azure DevOps增量构建与部署(针对多项目.NET解决方案)
针对你描述的多项目.NET Core 7解决方案场景,要实现仅构建部署变更项目,可通过构建管道变更检测+发布管道条件执行的组合方案实现,以下是具体步骤:
一、构建管道优化:仅构建变更项目
1. 添加变更检测脚本
在构建管道开头添加PowerShell脚本,对比当前提交与上一次成功构建的提交,识别出有文件变更的项目,并设置管道变量供后续任务使用:
# 定义你的项目列表(需与实际项目名称一致) $projects = @("ProjectA", "ProjectB", "ProjectC") $changedProjects = @() try { # 获取上一次成功构建的提交ID $apiUrl = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$($env:SYSTEM_TEAMPROJECTID)/_apis/build/builds?definitions=$($env:SYSTEM_DEFINITIONID)&statusFilter=succeeded&top=1&api-version=7.1-preview.7" $lastBuild = Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} $lastSuccessfulCommit = $lastBuild.value[0].sourceVersion # 获取两次提交间的变更文件列表 $changedFiles = git diff --name-only $lastSuccessfulCommit HEAD } catch { # 首次构建或无历史成功构建时,默认全量构建 Write-Host "No valid previous build found, falling back to full build" $changedProjects = $projects } # 匹配变更文件对应的项目 if ($changedFiles) { foreach ($proj in $projects) { # 假设项目文件都在src/[项目名]目录下,可根据实际路径调整 if ($changedFiles | Where-Object { $_ -like "src/$proj/*" }) { $changedProjects += $proj } } } # 设置管道变量,后续任务可引用 Write-Host "##vso[task.setvariable variable=ChangedProjects;]$($changedProjects -join ',')" Write-Host "Detected changed projects: $($changedProjects -join ',')"
注意:需在管道的"代理作业"设置中勾选"允许脚本访问OAuth令牌",确保脚本能调用Azure DevOps API。
2. 替换全量构建为增量构建
删除原来的全量解决方案构建任务,改用循环任务仅构建变更项目:
# 循环处理每个变更项目 - ${{ each proj in split(variables.ChangedProjects, ',') }}: - task: DotNetCoreCLI@2 displayName: "Publish ${{ proj }}" inputs: command: 'publish' projects: 'src/${{ proj }}/${{ proj }}.csproj' # 项目csproj路径,按需调整 arguments: '-c Release -o $(Build.ArtifactStagingDirectory)/${{ proj }}' zipAfterPublish: true # 仅发布变更项目的工件 - task: PublishBuildArtifacts@1 displayName: 'Publish Changed Artifacts' inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
二、发布管道优化:仅部署变更项目
1. 传递构建变量到发布管道
在发布管道的"触发器"设置中,勾选"允许来自构建的变量",确保ChangedProjects变量能从构建管道传递到发布管道。
2. 给部署任务添加执行条件
将原来的3个固定部署任务,每个都添加条件判断,仅当对应项目在变更列表中时执行:
# 部署ProjectA - task: AzureWebApp@1 displayName: 'Deploy ProjectA' condition: contains(variables.ChangedProjects, 'ProjectA') inputs: azureSubscription: '你的服务连接名称' appType: 'webApp' appName: 'ProjectA对应的App Service名称' package: '$(System.ArtifactsDirectory)/drop/ProjectA.zip' # 部署ProjectB - task: AzureWebApp@1 displayName: 'Deploy ProjectB' condition: contains(variables.ChangedProjects, 'ProjectB') inputs: azureSubscription: '你的服务连接名称' appType: 'webApp' appName: 'ProjectB对应的App Service名称' package: '$(System.ArtifactsDirectory)/drop/ProjectB.zip' # 部署ProjectC - task: AzureWebApp@1 displayName: 'Deploy ProjectC' condition: contains(variables.ChangedProjects, 'ProjectC') inputs: azureSubscription: '你的服务连接名称' appType: 'webApp' appName: 'ProjectC对应的App Service名称' package: '$(System.ArtifactsDirectory)/drop/ProjectC.zip'
(可选)用模板简化大型项目配置
如果是数百个项目的大型解决方案,可创建部署模板deploy-webapp.yml,避免重复编写任务:
parameters: - name: projects type: object default: [] jobs: - ${{ each proj in parameters.projects }}: - job: Deploy_${{ proj.name }} condition: contains(variables.ChangedProjects, '${{ proj.name }}') steps: - task: AzureWebApp@1 displayName: 'Deploy ${{ proj.name }}' inputs: azureSubscription: '${{ proj.serviceConnection }}' appType: 'webApp' appName: '${{ proj.appServiceName }}' package: '$(System.ArtifactsDirectory)/drop/${{ proj.name }}.zip'
然后在发布管道中引用模板,只需维护项目配置列表:
jobs: - template: deploy-webapp.yml parameters: projects: - name: ProjectA serviceConnection: '你的服务连接名称' appServiceName: 'ProjectAAppService' - name: ProjectB serviceConnection: '你的服务连接名称' appServiceName: 'ProjectBAppService' - name: ProjectC serviceConnection: '你的服务连接名称' appServiceName: 'ProjectCAppService' # 更多项目配置...
内容的提问来源于stack exchange,提问作者Dharmendra Sinsinwar
相关产品推荐
相关产品推荐

