Публикация нескольких пакетов nuget из одного репозитория в azure devops - PullRequest
0 голосов
/ 25 марта 2020

Я использую Azure Devops и имею репозиторий с несколькими проектами:

  • Ядро: содержит модели, используемые другими проектами
  • Клиент: библиотека, которая используется другими проектами
  • Azure: спецификация платформы c реализация

В настоящее время у меня есть сборка, которая упаковывает все 3 проекта и помещает их в фид Azure. Однако существует проблема, когда один из трех проектов не имеет изменений: сборка завершается неудачно. Это нормально, так как сборка пытается извлечь sh пакет с номером версии, который уже есть в ленте, а фид этого не позволяет.

Я не вижу способа проверить изменения пакета или существующую версию в корме и игнорировать упаковку или pu sh. Есть ли другой способ сделать так, чтобы проекты без изменений не упаковывались / не помещались в ленту новостей?

1 Ответ

1 голос
/ 26 марта 2020

Вы можете использовать git получить изменения rest api, чтобы узнать, в каком проекте есть изменения, а затем построить только те проекты, в которых есть изменения. Предположим, что ваши основные проекты находятся в основной папке, клиент в папке клиента, 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, если в папке клиента есть изменения, и делаю то же самое для папки Core и Azure.

В следующих задачах у меня есть три задачи VSBuild для сборки проекты соответственно. Для каждой задачи VSbuild я устанавливаю условие , чтобы проверить, является ли соответствующая переменная истинной, и будет пропущен для запуска, если она не истинна. Например, если проект Azure не содержит изменений, переменная Azure будет иметь значение NULL, а задача VSbuild, которая создает проект Azure, будет пропущена.

В указанном выше конвейере только эти проекты имеют изменения будут собраны и отправлены в ваш канал.

Другой обходной путь - создание нескольких конвейеров (например, конвейер клиента, базовый конвейер, azure конвейер) для сборки и pu sh другого проекта соответственно. И в этих конвейерах используйте триггеры пути . Например, в конвейере клиента для построения проекта клиента. Этот конвейер будет запущен, только если изменения внесены в клиентский проект.

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

Надеюсь, что выше помогает!

...