Uruchamianie kompilacji usługi Azure DevOps na podstawie zmian w podkatalogach

Mam rozwiązanie Visual Studio z wieloma projektami, każdy projekt jest indywidualną mikrousługą. Jest to bardzo wygodne dla zespołu programistów, aby mieć wszystkie usługi w tym samym rozwiązaniu i git repo, ponieważ usługi mogą dzwonić do siebie.

Master.sln - SubFolderA - MicroserviceA.sln
           - SubFolderB - MicroserviceB.sln
           - SubFolderC - MicroserviceC.sln
[1]} chciałbym jednak niezależnie budować / wypuszczać poszczególne mikroserwisy w Azure DevOps, gdy się zmieniają, więc jeśli ServiceA jest jedyną usługą, która może się zmienić, to ServiceA jest jedyną usługą zbudowaną i rozmieszczone.

W tym celu stworzyłem nową definicję potoku kompilacji z ustawionym "filtrami ścieżek", aby wywołać kompilację, gdy zawartość folderu mikroserwisu się zmieni (więc jeden filtr ścieżek dodany dla mikroserwisu do monitorowania).

Mój problem polega na tym, że gdy build jest wyzwalany (na podstawie zmiany na Podfoldera np.) nie mam sposobu, aby powiedzieć definicji build tylko budować .plik sln w podfolderze.

Mógłbym stworzyć osobną definicję build dla każdego mikroserwisu i wyzwalanie każdej kompilacji na osobnych podfolderach, ale byłoby to w znacznym stopniu narzutowe, tj. musiałbym zachować 15 oddzielnych definicji kompilacji( to samo dla każdej gałęzi, którą buduję), a Przechowywanie Wymagane na naszym własnym hostu build agent będzie teraz NumberOfService x Numberfbranchesbeingbuild X SizeOfRepo.

Czy istnieje sposób na użycie jednej definicji kompilacji z git "filtry ścieżek" i wiele ścieżek zdefiniowanych, co z kolei uruchamia wiele instancji kompilacji i podaje wartość ścieżka, która wywołała build do definicji build i tak mówi instancję build, która .plik sln do zbudowania?

Mam nadzieję, że to ma sens!
Author: riQQ, 2018-11-09

6 answers

Możesz zrobić jak poniżej

  1. Tworzenie zmiennych na podstawie mikroserwisów z wartościami "False"

E. g, MicroserviceAUpdated= "False", MicroserviceBUpdated = "False" itd.,

  1. Dodaj zadanie skryptu Powershell na początku definicji budowania. Skrypt powershell wykona następujące czynności:

Pobierz changeset/commit w kompilacji, aby sprawdzić, które pliki zostaną zmienione.

  • zaktualizuj zmienną MicroserviceAUpdated do "true", Jeśli tylko pliki są zmieniane pod SubFolderA.
  • zaktualizuj zmienną MicroserviceBUpdated do "true", Jeśli tylko
    pliki są zmieniane pod SubFolderA.

Tak dalej....

  1. Utwórz osobne zadanie kompilacji dla każdej mikroserwisu, skonfiguruj zadania kompilacji do uruchamiania z niestandardowymi warunkami jak poniżej

Dla zadania MicroserviceA build

" Warunki niestandardowe": and(succeeded(), eq(variables['MicroserviceAUpdated'], 'True'))

Dla zadania MicroserviceB build

" Warunki niestandardowe": and(succeeded(), eq(variables['MicroserviceBUpdated'], 'True'))

Więc on..

W ten sposób MicoserviceTask zostanie pominięty, jeśli wartość zmiennej jest False

Dla Kroku 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"
    }
}
 36
Author: Jayendran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-10 05:10:20

Na karcie wyzwalacze znajduje się opcja określająca ścieżkę do projektu, który chcesz zbudować. Gdy ta ścieżka jest określona, tylko commity zawierające modyfikacje pasujące do reguł include/exclude wywołają kompilację.

W moim przypadku jest to znacznie lepsze rozwiązanie niż skrypt PowerShell, który nadal uruchamiał buildy i Wydania wszystkich projektów spamujących nasz Slack i wypełniających śmieciami historię naszego projektu.

Tutaj wpisz opis obrazka

 27
Author: deleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-28 00:32:54

ODPOWIEDŹ Jayendran jest bardzo doskonała! Oto bardziej PowerShell - y sposób na krok 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
    }
}
 17
Author: Taul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-18 17:01:31

Ten post Bardzo mi pomógł, więc chciałem dodać kilka przydatnych modyfikacji, które wprowadziłem do mojego procesu.

Pierwszy poważny problem jaki znalazłem to to, że polecenie git diff nie obsługuje wielu commitów naraz.

git diff HEAD HEAD~ --name-only

HEAD~ patrzy tylko za 1 commitem, gdzie jako pojedyncze pchnięcie może zawierać wiele commitów naraz.

Zdałem sobie sprawę, że muszę zrobić rozróżnienie pomiędzy HEAD i identyfikatorem commitu, ponieważ potok ostatnio działał pomyślnie.

git diff HEAD [commit id of last successful build] --name-only

This commit identyfikator jest dostępny po wywołaniu interfejsu API usługi Azure DevOps w /build / latest endpoint, sourceVersion.

$response = (Invoke-RestMethod -Uri $url -Method GET -Headers $AzureDevOpsAuthenicationHeader)
$editedFiles = (git diff HEAD $response.sourceVersion --name-only)

Dokonałem również modyfikacji logiki znajdowania zmienionych folderów projektu / modułu. Nie chciałem modyfikować skryptu PowerShell za każdym razem, gdy dodaję nowy projekt przez twarde kodowanie nazw projektów.

$editedFiles | ForEach-Object { 
    $sepIndex = $_.IndexOf('/')
    if($sepIndex -gt 0) {
        $projectName = $_.substring(0, $sepIndex)
        AppendQueueVariable $projectName
    }
}

AppendQueueVariable zachowa listę wszystkich zmienionych projektów, aby powrócić do potoku.

Na koniec biorę listę kolejkowanych projektów i przekazuję je do mojego Maven multi-module build pipeline task.

mvn -amd -pl [list returned from PS task] clean install
 8
Author: fearnight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-14 19:17:41

W bash możesz zrobić coś takiego:

  - task: Bash@3
    displayName: 'Determine which apps were updated'
    inputs:
      targetType: 'inline'
      script: |
        DIFFS="$(git diff HEAD HEAD~ --name-only)"
        [[ "${DIFFS[@]}" =~ "packages/shared" ]] && echo "##vso[task.setvariable variable=SHARED_UPDATED]True"
        [[ "${DIFFS[@]}" =~ "packages/mobile" ]] && echo "##vso[task.setvariable variable=MOBILE_UPDATED]True"
        [[ "${DIFFS[@]}" =~ "packages/web" ]] && echo "##vso[task.setvariable variable=WEB_UPDATED]True"
 6
Author: Stephen Saucier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-05 17:52:38

Aby uzupełnić odpowiedź deleba, oto kod YAML do Ustawienia wyzwalacza ścieżki:

trigger:
  branches:
    include:
    - master
  paths:
    include:
    - /path/to/src*

Zauważ, że musisz mieć WYZWALACZ gałęzi również, aby użyć wyzwalacza ścieżki.

Https://docs.microsoft.com/en-us/azure/devops/pipelines/repos/azure-repos-git?view=azure-devops&tabs=yaml#paths

 5
Author: Lazer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-08 20:59:47