Dodawanie etapów, zależności i warunków
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
Etap to granica logiczna w potoku usługi Azure DevOps. Etapy mogą służyć do grupowania akcji w procesie tworzenia oprogramowania (na przykład kompilowania aplikacji, uruchamiania testów, wdrażania w środowisku przedprodukcyjnym). Każdy etap zawiera co najmniej jedno zadania.
Podczas definiowania wielu etapów w potoku domyślnie są one uruchamiane po drugim. Etapy mogą również zależeć od siebie. Możesz użyć słowa kluczowego dependsOn
, aby zdefiniować zależności. Etapy mogą być również uruchamiane na podstawie wyniku poprzedniego etapu z warunkami.
Aby dowiedzieć się, jak etapy współpracują z zadaniami równoległymi i licencjonowaniem, zobacz Konfigurowanie zadań równoległych i płacenie za nie.
Aby dowiedzieć się, jak etapy odnoszą się do innych części potoku, takich jak zadania, zobacz Kluczowe pojęcia dotyczące potoków.
Możesz również dowiedzieć się więcej o tym, jak etapy odnoszą się do części potoku w artykule dotyczącym etapów schematu YAML.
Zadania potoku można uporządkować w etapach. Etapy to główne podziały w potoku: kompilowanie tej aplikacji, uruchamianie tych testów i wdrażanie w środowisku przedprodukcyjnym to dobre przykłady etapów. Są to granice logiczne w potoku, w których można wstrzymać potok i wykonać różne kontrole.
Każdy potok ma co najmniej jeden etap, nawet jeśli nie zdefiniujesz go jawnie. Etapy można również rozmieścić w grafie zależności, tak aby jeden etap był uruchamiany przed innym. Istnieje limit 256 zadań dla etapu.
Uwaga
Dodano obsługę etapów w usłudze Azure DevOps Server 2019.1.
Określanie etapów
Uwaga
Dodano obsługę etapów w usłudze Azure DevOps Server 2019.1.
W najprostszym przypadku nie potrzebujesz żadnych granic logicznych w potoku. W takim przypadku nie musisz jawnie używać słowa kluczowego stage
. Zadania można określić bezpośrednio w pliku YAML.
# this has one implicit stage and one implicit job
pool:
vmImage: 'ubuntu-latest'
steps:
- bash: echo "Hello world"
# this pipeline has one implicit stage
jobs:
- job: A
steps:
- bash: echo "A"
- job: B
steps:
- bash: echo "B"
W przypadku organizowania potoku w wielu etapach użyj słowa kluczowego stages
.
stages:
- stage: A
jobs:
- job: A1
- job: A2
- stage: B
jobs:
- job: B1
- job: B2
Jeśli zdecydujesz się określić wartość pool
na poziomie etapu, wszystkie zadania zdefiniowane w tym etapie używają tej puli, chyba że określono je na poziomie zadania.
Uwaga
W usłudze Azure DevOps Server 2019 pule można określić tylko na poziomie zadania.
stages:
- stage: A
pool: StageAPool
jobs:
- job: A1 # will run on "StageAPool" pool based on the pool defined on the stage
- job: A2 # will run on "JobPool" pool
pool: JobPool
Pełna składnia określająca etap to:
stages:
- stage: string # name of the stage, A-Z, a-z, 0-9, and underscore
displayName: string # friendly name to display in the UI
dependsOn: string | [ string ]
condition: string
pool: string | pool
variables: { string: string } | [ variable | variableReference ]
jobs: [ job | templateReference]
Określanie zależności
Uwaga
Dodano obsługę etapów w usłudze Azure DevOps Server 2019.1.
Podczas definiowania wielu etapów w potoku domyślnie są one uruchamiane sekwencyjnie w kolejności, w której definiujesz je w pliku YAML. Wyjątkiem jest dodanie zależności. W przypadku zależności etapy są uruchamiane w kolejności dependsOn
wymagań.
Potoki muszą zawierać co najmniej jeden etap bez zależności.
Składnia definiowania wielu etapów i ich zależności jest następująca:
stages:
- stage: string
dependsOn: string
condition: string
Przykładowe etapy, które są uruchamiane sekwencyjnie:
# if you do not use a dependsOn keyword, stages run in the order they are defined
stages:
- stage: QA
jobs:
- job:
...
- stage: Prod
jobs:
- job:
...
Przykładowe etapy, które są uruchamiane równolegle:
stages:
- stage: FunctionalTest
jobs:
- job:
...
- stage: AcceptanceTest
dependsOn: [] # this removes the implicit dependency on previous stage and causes this to run in parallel
jobs:
- job:
...
Przykład wentylatora i wentylatora:
stages:
- stage: Test
- stage: DeployUS1
dependsOn: Test # this stage runs after Test
- stage: DeployUS2
dependsOn: Test # this stage runs in parallel with DeployUS1, after Test
- stage: DeployEurope
dependsOn: # this stage runs after DeployUS1 and DeployUS2
- DeployUS1
- DeployUS2
Definiowanie warunków
Możesz określić warunki, w których każdy etap jest uruchamiany z wyrażeniami. Domyślnie etap jest uruchamiany, jeśli nie zależy od innego etapu lub czy wszystkie etapy, od których zależy, zostały ukończone i zakończyły się pomyślnie. To zachowanie można dostosować, wymuszając uruchomienie etapu, nawet jeśli poprzedni etap zakończy się niepowodzeniem lub przez określenie warunku niestandardowego.
Jeśli dostosujesz domyślny warunek poprzednich kroków dla etapu, usuniesz warunki ukończenia i powodzenia. Dlatego jeśli używasz warunku niestandardowego, często należy and(succeeded(),custom_condition)
sprawdzić, czy poprzedni etap został uruchomiony pomyślnie. W przeciwnym razie etap jest uruchamiany niezależnie od wyniku poprzedniego etapu.
Uwaga
Warunki niepowodzenia ('JOBNAME/STAGENAME') i powodzenia ('JOBNAME/STAGENAME'), jak pokazano w poniższym przykładzie działają tylko dla potoków YAML.
Uwaga
Dodano obsługę etapów w usłudze Azure DevOps Server 2019.1.
Przykład uruchamiania etapu na podstawie stanu uruchamiania poprzedniego etapu:
stages:
- stage: A
# stage B runs if A fails
- stage: B
condition: failed()
# stage C runs if B succeeds
- stage: C
dependsOn:
- A
- B
condition: succeeded('B')
Przykład użycia warunku niestandardowego:
stages:
- stage: A
- stage: B
condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/main'))
Określanie zasad kolejkowania
Potoki YAML nie obsługują zasad kolejkowania. Każde uruchomienie potoku jest niezależne od innych przebiegów. Innymi słowy, dwa kolejne zatwierdzenia mogą wyzwalać dwa potoki, a oba z nich będą wykonywać tę samą sekwencję etapów bez oczekiwania na siebie. Mimo że pracujemy nad wprowadzeniem zasad kolejkowania do potoków YAML, zalecamy użycie zatwierdzeń ręcznych w celu ręcznego sekwencjonowania i kontrolowania kolejności wykonywania, jeśli ma to znaczenie.
Określanie zatwierdzeń
Możesz ręcznie kontrolować, kiedy etap powinien być uruchamiany przy użyciu kontroli zatwierdzania. Jest to często używane do kontrolowania wdrożeń w środowiskach produkcyjnych. Kontrole są mechanizmem dostępnym dla właściciela zasobu w celu kontrolowania, czy i kiedy etap w potoku może zużywać zasób. Jako właściciel zasobu, takiego jak środowisko, można zdefiniować kontrole, które muszą być spełnione przed rozpoczęciem etapu zużywania tego zasobu.
Obecnie testy ręcznego zatwierdzania są obsługiwane w środowiskach. Aby uzyskać więcej informacji, zobacz Zatwierdzenia.
Zatwierdzenia nie są jeszcze obsługiwane w potokach YAML w tej wersji serwera Azure DevOps Server.
Dodawanie wyzwalacza ręcznego
Etapy potoku YAML wyzwalane ręcznie umożliwiają posiadanie ujednoliconego potoku bez konieczności uruchamiania go do ukończenia.
Na przykład potok może obejmować etapy tworzenia, testowania, wdrażania w środowisku przejściowym i wdrażania w środowisku produkcyjnym. Możesz chcieć, aby wszystkie etapy działały automatycznie z wyjątkiem wdrożenia produkcyjnego, które wolisz wyzwalać ręcznie, gdy wszystko będzie gotowe.
Aby użyć tej funkcji, dodaj trigger: manual
właściwość do etapu.
W poniższym przykładzie etap programowania jest uruchamiany automatycznie, a etap produkcyjny wymaga ręcznego wyzwalania. Oba etapy uruchamiają skrypt wyjściowy hello world.
stages:
- stage: development
displayName: Deploy to development
jobs:
- job: DeployJob
steps:
- script: echo 'hello, world'
displayName: 'Run script'
- stage: production
displayName: Deploy to production
trigger: manual
jobs:
- job: DeployJob
steps:
- script: echo 'hello, world'
displayName: 'Run script'
Oznaczanie etapu jako niepamiętnego
Oznacz etap, isSkippable: false
aby uniemożliwić użytkownikom potoku pomijanie etapów. Na przykład może istnieć szablon YAML, który wprowadza etap, który wykonuje wykrywanie złośliwego oprogramowania we wszystkich potokach. Jeśli ustawisz isSkippable: false
ten etap, funkcja Pipeline nie będzie mogła pominąć wykrywania złośliwego oprogramowania.
W poniższym przykładzie etap wykrywania złośliwego oprogramowania jest oznaczony jako niemożliwy do pominięcia, co oznacza, że należy go wykonać w ramach uruchomienia potoku.
- stage: malware_detection
displayName: Malware detection
isSkippable: false
jobs:
- job: check_job
...
Gdy etap nie można pominąć, zostanie ono wyświetlone z wyłączonym polem wyboru w obszarze Etapy do uruchomienia panelu konfiguracji.