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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:10:13