Udostępnij za pośrednictwem


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.

Zrzut ekranu przedstawiający etapy uruchamiania z wyłączonym etapem.