Создавайте пакет Nuget, только если проект был изменен - PullRequest
0 голосов
/ 10 января 2020

Учитывая решение, содержащее как проект Web Api, проект клиента Api, так и проект сборки, содержащий общие объекты Dto, следующим образом:

  • Решение
    • Проект Web Api
    • Общий проект Dto
    • Клиентский проект Api
    • Модульные тесты

У меня есть Azure конвейер сборки Devops для сборки и протестировать все проекты. В этом конвейере сборки у меня есть шаг, который создает 2 пакета Nuget для клиента Api и проектов Shared Dto.

Однако мне не нужно все время создавать новые пакеты, скажем, я только добавил модульное тестирование или исправление ошибки в проекте Web Api, я не хочу создавать новые пакеты Nuget (или беспокоиться о повышении версии пакета), если ничего в клиентском проекте Api (или его зависимостях) не изменилось, но я делаю Я все еще хочу провести регрессионное тестирование.

Я подумал, что, возможно, я мог бы сделать это, имея несколько конвейеров сборки, один для проекта Web Api и другие для проектов Api Client & Shared, а затем использовал фильтры пути для запуска соответствующие сборки.

Есть ли другие способы добиться этого? Какова лучшая практика? Я не хочу поддерживать больше определений сборки, чем мне нужно.

Ответы [ 2 ]

1 голос
/ 17 января 2020

В итоге я использовал небольшую модификацию этот ответ

# Checks which files have been updated to determine if new Nuget packages are required
$editedFiles = git diff HEAD HEAD~ --name-only
echo "$($editedFiles.Length) files modified:"
$editedFiles | ForEach-Object {
   echo $_
    Switch -Wildcard ($_ ) {
        'Whds.Configuration.Models/*' { 
              # If the Models project is updated, we need to create both packages
              Write-Output "##vso[task.setvariable variable=CreateModelsPackage]True"
              Write-Output "##vso[task.setvariable variable=CreateClientPackage]True"  
         }        
        'Whds.Configuration.Standard/*' { Write-Output "##vso[task.setvariable 
variable=CreateClientPackage]True" }
        # The rest of your path filters
    }
}

Этот скрипт устанавливает переменные, на которые затем ссылаются в пользовательских условиях на шаге do tnet pack в сборке pipe:

and(succeeded(), eq(variables['CreateModelsPackage'], 'True'))

Если проект Dto изменяется, обе переменные устанавливаются для создания обоих пакетов. Если изменился только клиентский (стандартный) проект, пакет для проекта Dto не будет создан.

0 голосов
/ 13 января 2020

Есть ли другие способы добиться этого? Какова лучшая практика? Я не хочу поддерживать больше определений сборки, чем мне нужно.

Существуют разные способы достижения этого, но я не уверен, какой из них является наилучшим, все зависит от ваших требований или вкусы.

Простой метод *1007* похож на вашу мысль. Также необходимо создать новый конвейер сборки. Разница в том, что нам не нужно поддерживать это определение сборки.

Подробности:

  • Добавить новый конвейер без дополнительных задач в этом конвейере и использовать фильтры path для вызвать соответствующие сборки (Api Client и проекты Shared Dto).
  • Добавить завершение сборки к исходному Azure конвейеру сборки Devops: enter image description here
  • Добавить пользовательское условие для шага, который создает 2 пакета Nuget на основе Build.Reason, например:

    and(succeeded(), eq(variables['Build.Reason'], 'BuildCompletion'))
    

Теперь шаги по созданию 2 пакетов Nuget only выполняются, когда изменения файла происходят из указанного c проекта. Конечно, ограничением этого решения является то, что, если у вас уже есть завершение сборки, оно не будет работать.

Если приведенный выше метод не тот, который вам нужен, мы можем вызвать REST API commitits чтобы получить информацию о коммите для каждой сборки:

GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits/{commitId}?changeCount=100&api-version=5.1

Мы могли бы найти изменения / путь в возвращенном теле:

  "changes": [
    {
      "item": {
        "gitObjectType": "blob",
        "path": "/.gitattributes",
        "url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/.gitattributes?versionType=Commit"
      },
      "changeType": "add"
    },
    {
      "item": {
        "gitObjectType": "blob",
        "path": "/.gitignore",
        "url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/.gitignore?versionType=Commit"
      },
      "changeType": "add"
    },
    {
      "item": {
        "gitObjectType": "tree",
        "path": "/MyWebSite",
        "isFolder": true,
        "url": "https://dev.azure.com/fabrikam/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items/MyWebSite?versionType=Commit"
      },
      "changeType": "add"
    },

Затем мы могли бы использовать скрипт powershell, чтобы пройти их пути, чтобы увидеть, включают ли они Api Client и проекты Shared Dto, если да, мы устанавливаем переменную со значением, добавляем условие на основе этого значения для шагов, которые создают 2 пакета Nuget.

Примечание: перед использованием API REST фиксирует , нам нужно использовать Commits - Get Commits , чтобы получить последний идентификатор фиксации:

GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits?$top=1&api-version=5.1

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...