我正在使用Azure Devops,并且具有一个包含多个项目的存储库:
当前,我有一个打包所有3个项目并将其推送到Azure工件提要的版本。但是,当三个项目之一没有更改时,就会出现问题:构建失败。这是正常现象,因为内部版本会尝试在Feed中推送带有版本号的软件包,而Feed不允许这样做。
我看不到任何方法来检查Feed中的软件包更改或现有版本,而忽略了包装或推送。还有其他方法可以使没有更改的项目不打包/推送到提要上吗?
您可以使用git get changes rest api获取具有更改的项目,然后仅构建具有更改的这些项目。假设您的Core项目在Core文件夹中,Client在Client文件夹中,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
,如果Client文件夹已更改,则将其值设置为true,并对Core和Azure文件夹执行相同的操作。
在以下任务中,我有三个VSBuild任务来分别构建项目。对于每个VSbuild任务,我都设置一个condtion以检查相应的变量是否为true,如果不正确,则将跳过该变量以运行。例如,如果Azure项目没有更改,则变量Azure将为null,并且将跳过构建Azure项目的VSbuild任务。
通过上面的管道,只有那些有更改的项目才会构建并推送到您的Feed中。
另一种解决方法是创建多个管道(例如,客户管道,核心管道,天蓝色管道)以分别构建和推送不同的项目。并且在这些管道中使用path triggers,例如,在下面的示例中,在Client管道中构建Client项目。仅当更改在客户端项目中时,才会触发此管道。
trigger:
branches:
include:
- master
paths:
include:
- Client/*
exclude:
- Azure/*
- Core/*
希望以上帮助!