Azure devops 在azure devops中从单个存储库发布多个nuget包
我正在使用Azure Devops,并且有一个包含多个项目的存储库:Azure devops 在azure devops中从单个存储库发布多个nuget包,azure-devops,repository,build-system,azure-artifacts,Azure Devops,Repository,Build System,Azure Artifacts,我正在使用Azure Devops,并且有一个包含多个项目的存储库: 核心:包含其他项目使用的模型 客户端:其他项目使用的库 Azure:特定于平台的实现 目前我有一个构建,它打包了所有3个项目,并将它们推送到Azure工件提要上。但是,当3个项目中的一个没有更改时,会出现一个问题:构建失败。这是正常的,因为构建尝试推送源中已经有版本号的包,而源不允许这样做 我认为没有办法检查提要中的包更改或现有版本,而忽略包或推送。是否有其他方法可以使没有更改的项目不打包/推送到提要上?您可以使用rest
- 核心:包含其他项目使用的模型
- 客户端:其他项目使用的库
- 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任务,它调用RESTAPI来获取更改的路径。然后我定义变量Client
,如果客户机文件夹发生更改,则将其值设置为true,并对Core和Azure文件夹执行相同的操作
在以下任务中,我有三个VSBuild任务分别用于构建项目。对于每个VSbuild任务,我都设置了一个检查相应变量是否为true的参数,如果不是true,则将跳过该参数以运行。例如,如果Azure项目没有更改,则变量Azure将为null,并且生成Azure项目的VSbuild任务将被跳过
通过上述管道,只有这些有变化的项目才会被构建并推送到您的提要中
另一个解决方法是创建多个管道(例如客户端管道、核心管道、azure管道),分别构建和推送不同的项目。在这些管道中,使用客户机管道来构建客户机项目。只有在客户端项目中发生更改时,才会触发此管道
trigger:
branches:
include:
- master
paths:
include:
- Client/*
exclude:
- Azure/*
- Core/*
希望以上帮助 这很有帮助。我刚刚开始在管道中使用更复杂的解决方案,这些案例对我来说真的很头疼,因为我是管道和api的初学者。谢谢