【问题标题】:Publishing mutiple nuget packages from a single repository in azure devops从 azure devops 中的单个存储库发布多个 nuget 包
【发布时间】:2020-03-25 08:40:38
【问题描述】:

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

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

目前我有一个打包所有 3 个项目并将它们推送到 Azure 工件源的构建。但是,当 3 个项目之一没有更改时,就会出现问题:构建失败。这是正常的,因为构建会尝试推送带有版本号的包,但该版本不允许这样做。

我认为无法检查提要中的包更改或现有版本,而忽略打包或推送。是否有另一种方法可以使没有变化的项目不会被打包/推送到提要上?

【问题讨论】:

    标签: azure-devops repository build-system azure-artifacts


    【解决方案1】:

    您可以使用git get changesrest 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 项目没有变化,那么变量 Azure 将为空,构建 Azure 项目的 VSbuild 任务将被跳过。

    通过上述管道,只有这些有变化的项目才会被构建并推送到您的 Feed。

    另一种解决方法是创建多个管道(例如客户端管道、核心管道、Azure 管道)来分别构建和推送不同的项目。并在这些管道中使用path triggers,例如,在客户端管道中构建客户端项目。只有在客户项目中发生更改时才会触发此管道。

    trigger:
      branches:
        include:
        - master
      paths:
        include:
        - Client/*
        exclude:
        - Azure/*
        - Core/*
    

    希望以上有帮助!

    【讨论】:

    • 这很有帮助。我刚刚开始在管道中使用更复杂的解决方案,这些案例对我来说真的很头疼,因为我是管道和 api 的初学者。谢谢。
    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 2023-01-23
    • 2019-03-26
    • 2020-01-30
    • 2020-03-31
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多