从 azure devops 中的单个存储库发布多个 nuget 包
Publishing mutiple nuget packages from a single repository in azure devops
我正在使用 Azure Devops 并且有一个包含多个项目的存储库:
- 核心:包含其他项目使用的模型
- 客户端:其他项目使用的库
- Azure:特定于平台的实现
目前我有一个打包所有 3 个项目并将它们推送到 Azure 工件提要的构建。但是,当 3 个项目之一没有更改时会出现问题:构建失败。这是正常现象,因为构建会尝试推送版本号已在提要中的包,而提要不允许这样做。
我看不出有什么方法可以检查提要中的包更改或现有版本,并忽略打包或推送。是否有另一种方法可以使没有变化的项目不在 Feed 上 packed/pushed?
您可以使用 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
并将其值设置为 true 如果 Client 文件夹发生变化,并对 Core 和 Azure 文件夹执行相同的操作。
在接下来的任务中,我有三个VSBuild任务分别构建项目。对于每个 VSbuild 任务,我设置一个 condtion 来检查相应的变量是否为真,如果不为真,将跳到 运行。例如,如果Azure project 没有变化,那么变量Azure 将为null,将跳过构建Azure project 的VSbuild 任务。
使用上述管道,只有这些有更改的项目才会被构建并推送到您的 Feed。
另一种解决方法是创建多个管道(例如客户端管道、核心管道、Azure 管道)以分别构建和推送不同的项目。并在这些管道中使用 path triggers,例如,在客户端管道中构建客户端项目。只有在客户端项目中发生更改时才会触发此管道。
trigger:
branches:
include:
- master
paths:
include:
- Client/*
exclude:
- Azure/*
- Core/*
希望以上对您有所帮助!
我正在使用 Azure Devops 并且有一个包含多个项目的存储库:
- 核心:包含其他项目使用的模型
- 客户端:其他项目使用的库
- Azure:特定于平台的实现
目前我有一个打包所有 3 个项目并将它们推送到 Azure 工件提要的构建。但是,当 3 个项目之一没有更改时会出现问题:构建失败。这是正常现象,因为构建会尝试推送版本号已在提要中的包,而提要不允许这样做。
我看不出有什么方法可以检查提要中的包更改或现有版本,并忽略打包或推送。是否有另一种方法可以使没有变化的项目不在 Feed 上 packed/pushed?
您可以使用 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
并将其值设置为 true 如果 Client 文件夹发生变化,并对 Core 和 Azure 文件夹执行相同的操作。
在接下来的任务中,我有三个VSBuild任务分别构建项目。对于每个 VSbuild 任务,我设置一个 condtion 来检查相应的变量是否为真,如果不为真,将跳到 运行。例如,如果Azure project 没有变化,那么变量Azure 将为null,将跳过构建Azure project 的VSbuild 任务。
使用上述管道,只有这些有更改的项目才会被构建并推送到您的 Feed。
另一种解决方法是创建多个管道(例如客户端管道、核心管道、Azure 管道)以分别构建和推送不同的项目。并在这些管道中使用 path triggers,例如,在客户端管道中构建客户端项目。只有在客户端项目中发生更改时才会触发此管道。
trigger:
branches:
include:
- master
paths:
include:
- Client/*
exclude:
- Azure/*
- Core/*
希望以上对您有所帮助!