从 azure devops 中的单个存储库发布多个 nuget 包

Publishing mutiple nuget packages from a single repository in azure devops

我正在使用 Azure Devops 并且有一个包含多个项目的存储库:

目前我有一个打包所有 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/*

希望以上对您有所帮助!