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

问题描述 投票:0回答:1

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

  • 核心:包含其他项目使用的模型
  • 客户端:其他项目使用的库
  • Azure:特定于平台的实现

当前,我有一个打包所有3个项目并将其推送到Azure工件提要的版本。但是,当三个项目之一没有更改时,就会出现问题:构建失败。这是正常现象,因为内部版本会尝试在Feed中推送带有版本号的软件包,而Feed不允许这样做。

我看不到任何方法来检查Feed中的软件包更改或现有版本,而忽略了包装或推送。还有其他方法可以使没有更改的项目不打包/推送到提要上吗?

azure-devops repository build-system azure-artifacts
1个回答
0
投票

您可以使用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/*

希望以上帮助!

© www.soinside.com 2019 - 2024. All rights reserved.