Вы можете использовать git получить изменения rest api, чтобы узнать, в каком проекте есть изменения, а затем построить только те проекты, в которых есть изменения. Предположим, что ваши основные проекты находятся в основной папке, клиент в папке клиента, Azure в Azure папке. Пожалуйста, проверьте пример ниже:
- job: Build
pool:
vmImage: 'windows-latest'
steps:
- powershell: |
$url="$(System.CollectionUri)/$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.ID)/commits/$(Build.SourceVersion)/changes?api-version=5.1"
$result = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method GET
$changesFolder = $result.changes | Where-Object{$_.item.gitObjectType -match "tree"} | Select-Object -Property {$_.item.path}
foreach($path in $changesFolder){
if($path -match '/Client'){
echo "##vso[task.setvariable variable=Client;isOutput=true]$True"
break
}
}
foreach($path in $changesFolder){
if($path -match '/Core'){
echo "##vso[task.setvariable variable=Core;isOutput=true]$True"
break
}
foreach($path in $changesFolder){
if($path -match '/Azure'){
echo "##vso[task.setvariable variable=Azure;isOutput=true]$True"
break
}
}
name: MyVariable
- task: VSBuild@1
condition: eq(variables['MyVariable.Core'], 'true')
name: buildCore
...
- task: VSBuild@1
condition: eq(variables['MyVariable.Azure'], 'true')
name: buildAzure
...
- task: VSBuild@1
condition: eq(variables['MyVariable.Client'], 'true')
name: buildClient
...
В приведенном выше примере конвейера у меня есть задача powershell, которая вызывает rest api, чтобы получить измененный путь. Затем я определяю переменную Client
и устанавливаю ее значение в true, если в папке клиента есть изменения, и делаю то же самое для папки Core и Azure.
В следующих задачах у меня есть три задачи VSBuild для сборки проекты соответственно. Для каждой задачи VSbuild я устанавливаю условие , чтобы проверить, является ли соответствующая переменная истинной, и будет пропущен для запуска, если она не истинна. Например, если проект Azure не содержит изменений, переменная Azure будет иметь значение NULL, а задача VSbuild, которая создает проект Azure, будет пропущена.
В указанном выше конвейере только эти проекты имеют изменения будут собраны и отправлены в ваш канал.
Другой обходной путь - создание нескольких конвейеров (например, конвейер клиента, базовый конвейер, azure конвейер) для сборки и pu sh другого проекта соответственно. И в этих конвейерах используйте триггеры пути . Например, в конвейере клиента для построения проекта клиента. Этот конвейер будет запущен, только если изменения внесены в клиентский проект.
trigger:
branches:
include:
- master
paths:
include:
- Client/*
exclude:
- Azure/*
- Core/*
Надеюсь, что выше помогает!