Запуск сборок Azure DevOps на основе изменений в подпапках - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть решение Visual Studio с несколькими проектами, каждый проект представляет собой отдельный микросервис. Для команды разработчиков очень удобно иметь все сервисы в одном решении и git repo, так как сервисы могут вызывать друг друга.

Master.sln - SubFolderA - MicroserviceA.sln
           - SubFolderB - MicroserviceB.sln
           - SubFolderC - MicroserviceC.sln

Однако я хотел бы независимо собирать / выпускать отдельные микросервисы в DevOps Azure при их изменении, поэтому, если ServiceA является единственной службой, которую нужно изменить, то ServiceA является единственной службой, созданной и развернутой.

С этой целью я создал новое определение конвейера сборки с установленными «Фильтрами пути», чтобы запускать сборку при изменении содержимого папки микросервиса (поэтому один фильтр пути добавляется на каждый микросервис для мониторинга).

Моя проблема здесь заключается в том, что когда запускается сборка (на основании изменения SubFolderA, например), у меня нет возможности сказать определению сборки, что нужно только построить файл .sln в SubFolderA.

Я мог бы создать отдельное определение сборки для каждого микросервиса и запускать каждую сборку в отдельных подпапках, но это потребовало бы значительных накладных расходов, т. Е. Мне нужно было бы поддерживать 15 отдельных определений сборки (опять же, для каждой ветви, которую я строю), и хранилище, требуемое нашим агентом сборки собственного хоста, теперь будет NumberOfService x NumberOfBranchesBeingBuild x SizeOfRepo.

Есть ли способ использовать одно определение сборки с git «Фильтры пути» и несколькими заданными путями, что, в свою очередь, запускает несколько экземпляров сборки и передает значение пути, вызвавшего сборку, в определение сборки и так говорит экземпляр сборки, какой файл .sln собрать?

Надеюсь, это имеет смысл!

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Jayendran ответ очень отлично! Вот более PowerShell-у способ сделать шаг 2:

$editedFiles = git diff HEAD HEAD~ --name-only
$editedFiles | ForEach-Object {
    Switch -Wildcard ($_ ) {
        'SubFolderA/*' { Write-Output "##vso[task.setvariable variable=MicroserviceA]True" }
        # The rest of your path filters
    }
}
0 голосов
/ 28 апреля 2019

На вкладке Триггеры есть возможность указать путь к проекту, который вы хотите построить. Если указан этот путь, сборка будет выполняться только в тех фиксациях, которые содержат изменения, соответствующие правилам включения / исключения.

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

enter image description here

0 голосов
/ 09 ноября 2018

Вы можете сделать как ниже

  1. Создание переменных на основе ваших микроуслуг со значениями "False"

Например, MicroserviceAUpdated = "Ложь", MicroserviceBUpdated = "Ложь" и т. Д.,

  1. Добавьте задачу скрипта Powershell в начале определения вашей сборки. Сценарий powershell сделает следующее:

Получить набор изменений / фиксацию в сборке, чтобы проверить, какие файлы изменены.

  • Обновите переменную MicroserviceAUpdated на "true", если она есть файлы изменены в SubFolderA.
  • Обновите переменную MicroserviceBUpdated на "true", если она есть
    файлы изменены в SubFolderA.

Так далее ....

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

Для задачи сборки MicroserviceA

«Пользовательские условия»: and(succeeded(), eq(variables['MicroserviceAUpdated'], 'True'))

Для задачи сборки MicroserviceB

«Пользовательские условия»: and(succeeded(), eq(variables['MicroserviceBUpdated'], 'True'))

Так далее ...

Таким образом, MicoserviceTask будет пропущен, если значение переменной равно False

для шага 2

$files=$(git diff HEAD HEAD~ --name-only)
$temp=$files -split ' '
$count=$temp.Length
echo "Total changed $count files"
For ($i=0; $i -lt $temp.Length; $i++)
{
  $name=$temp[$i]
  echo "this is $name file"
  if ($name -like "SubFolderA/*")
    {
      Write-Host "##vso[task.setvariable variable=MicroserviceAUpdated]True"
    }
}
...