Aktivace jednoho kanálu za druhým

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Velké produkty mají několik komponent, které jsou vzájemně závislé. Tyto komponenty jsou často nezávisle sestaveny. Když se například změní nadřazená komponenta (knihovna), musí se podřízené závislosti znovu vytvořit a znovu aktualizovat.

V takových situacích přidejte trigger kanálu, který se spustí po úspěšném dokončení aktivačního kanálu.

Poznámka:

Dříve jste možná přešli do klasického editoru kanálu YAML a v uživatelském rozhraní jste nakonfigurovali triggery dokončení sestavení. I když tento model stále funguje, už se nedoporučuje. Doporučeným přístupem je zadat triggery kanálu přímo v souboru YAML. Triggery dokončení sestavení definované v klasickém editoru mají různé nevýhody, které jsou teď vyřešené v triggerech kanálu. Například neexistuje způsob, jak aktivovat kanál ve stejné větvi jako aktivační kanál pomocí triggerů dokončení sestavení.

Konfigurace triggerů prostředků kanálu

Pokud chcete aktivovat kanál po dokončení jiného kanálu, nakonfigurujte trigger prostředku kanálu.

Následující příklad nakonfiguruje trigger prostředku kanálu tak, aby se kanál pojmenovaný app-ci spustil po dokončení jakéhokoli spuštění security-lib-ci kanálu.

Tento příklad obsahuje následující dva kanály.

  • security-lib-ci – Tento kanál se spustí jako první.

    # security-lib-ci YAML pipeline
    steps:
    - bash: echo "The security-lib-ci pipeline runs first"
    
  • app-ci – Tento kanál má trigger prostředku kanálu, který konfiguruje app-ci automatické spuštění kanálu při každém spuštění security-lib-ci kanálu.

    # app-ci YAML pipeline
    # We are setting up a pipeline resource that references the security-lib-ci
    # pipeline and setting up a pipeline completion trigger so that our app-ci
    # pipeline runs when a run of the security-lib-ci pipeline completes
    resources:
      pipelines:
      - pipeline: securitylib # Name of the pipeline resource.
        source: security-lib-ci # The name of the pipeline referenced by this pipeline resource.
        project: FabrikamProject # Required only if the source pipeline is in another project
        trigger: true # Run app-ci pipeline when any run of security-lib-ci completes
    
    steps:
    - bash: echo "app-ci runs after security-lib-ci completes"
    
  • - pipeline: securitylib určuje název prostředku kanálu. Popisek definovaný zde použijte při odkazování na prostředek kanálu z jiných částí kanálu, například při použití proměnných prostředků kanálu nebo stahování artefaktů.
  • source: security-lib-ci určuje název kanálu, na který odkazuje tento prostředek kanálu. Název kanálu můžete načíst z portálu Azure DevOps na několika místech, jako je cílová stránka Pipelines. Ve výchozím nastavení jsou kanály pojmenované za úložištěm, které kanál obsahuje. Pokud chcete aktualizovat název kanálu, přečtěte si téma Nastavení kanálu. Pokud je kanál obsažen ve složce, zadejte název složky, včetně úvodního \, například \security pipelines\security-lib-ci.
  • project: FabrikamProject – Pokud je aktivační kanál v jiném projektu Azure DevOps, musíte zadat název projektu. Tato vlastnost je volitelná, pokud zdrojový kanál i aktivovaný kanál jsou ve stejném projektu. Pokud tuto hodnotu zadáte a kanál se neaktivuje, podívejte se na poznámku na konci této části.
  • trigger: true – Tato syntaxe slouží k aktivaci kanálu při dokončení jakékoli verze zdrojového kanálu. V následujících částech tohoto článku se dozvíte, jak filtrovat verze dokončení zdrojového kanálu, které spustí spuštění. Pokud jsou zadány filtry, musí spuštění zdrojového kanálu odpovídat všem filtrům, aby se aktivovalo spuštění.

Pokud aktivační kanál a aktivovaný kanál používají stejné úložiště, spustí se oba kanály se stejným potvrzením, když jeden aktivuje druhé. To je užitečné, pokud váš první kanál sestaví kód a druhý kanál ho otestuje. Pokud ale tyto dva kanály používají různá úložiště, aktivovaný kanál použije verzi kódu ve větvi určené nastavením Default branch for manual and scheduled builds , jak je popsáno v důležitých aspektech větve pro triggery dokončení kanálu.

Poznámka:

V některých scénářích výchozí větev ručních sestavení a plánovaných sestavení neobsahuje předponu refs/heads . Výchozí větev může být například nastavená na main hodnotu místo refs/heads/mainna hodnotu . V tomto scénáři nefunguje trigger z jiného projektu. Pokud při nastavení project jiné hodnoty než cílového kanálu narazíte na problémy, můžete výchozí větev aktualizovat tak, aby zahrnovala refs/heads změnou její hodnoty na jinou větev, a pak ji změnit zpět na výchozí větev, kterou chcete použít.

V šablonách YAML se nepodporují konfigurace triggerů dokončení kanálu. Prostředky kanálu můžete stále definovat v šablonách.

Filtry větví

Volitelně můžete určit větve, které se mají zahrnout nebo vyloučit při konfiguraci triggeru. Pokud zadáte filtry větví, aktivuje se nový kanál vždy, když se úspěšně dokončí spuštění zdrojového kanálu, které odpovídá filtrům větví. V následujícím příkladu se app-ci kanál spustí, pokud se dokončí v security-lib-ci jakékoli releases/* větvi s výjimkou releases/old*.

# app-ci YAML pipeline
resources:
  pipelines:
  - pipeline: securitylib
    source: security-lib-ci
    trigger: 
      branches:
        include: 
        - releases/*
        exclude:
        - releases/old*

Pokud chcete aktivovat podřízený kanál pro různé větve, pro které se aktivuje nadřazený objekt, zahrňte všechny filtry větví, pro které se nadřazený kanál aktivuje. V následujícím příkladu se app-ci kanál spustí, pokud se security-lib-ci dokončí v jakékoli releases/* větvi nebo hlavní větvi s výjimkou releases/old*.

# app-ci YAML pipeline
resources:
  pipelines:
  - pipeline: securitylib
    source: security-lib-ci
    trigger: 
      branches:
        include: 
        - releases/*
        - main
        exclude:
        - releases/old*

Poznámka:

Pokud filtry větví nefungují, zkuste použít předponu refs/heads/. Například místo refs/heads/releases/old*.releases/old*

Filtry značek

tags Vlastnost trigger filtrů, které události dokončení kanálu můžou aktivovat. Pokud aktivační kanál odpovídá všem značek v tags seznamu, kanál se spustí.

resources:
  pipelines:
  - pipeline: MyCIAlias
    source: Farbrikam-CI
    trigger:
      tags:        # This filter is used for triggering the pipeline run
      - Production # Tags are AND'ed
      - Signed

Poznámka:

Prostředek kanálu má tags také vlastnost. Vlastnost tags prostředku kanálu se používá k určení, ze kterého kanálu se mají načítat artefakty, když se kanál aktivuje ručně nebo podle naplánované aktivační události. Další informace najdete v tématu Prostředky: kanály a vyhodnocení verze artefaktů.

Filtry fází

Poznámka:

Filtry fází pro triggery prostředků kanálu vyžadují Azure DevOps Server 2020 Update 1 nebo vyšší.

Kanál můžete aktivovat, když se pomocí filtru dokončí jedna nebo více fází aktivačního stages kanálu. Pokud zadáte více fází, spustí se aktivovaný kanál po dokončení všech uvedených fází.

resources:
  pipelines:
  - pipeline: MyCIAlias  
    source: Farbrikam-CI  
    trigger:    
      stages:         # This stage filter is used when evaluating conditions for 
      - PreProduction # triggering your pipeline. On successful completion of all the stages
      - Production    # provided, your pipeline will be triggered. 

Důležité informace o větvích

Triggery dokončení kanálu používají výchozí větev pro ruční a plánované nastavení sestavení k určení verze větve kanálu YAML, která se má vyhodnotit při určování, jestli se má kanál spustit jako výsledek dokončení jiného kanálu. Ve výchozím nastavení odkazuje toto nastavení na výchozí větev úložiště.

Po dokončení kanálu modul runtime Azure DevOps vyhodnotí filtry větve triggeru prostředku kanálu u všech kanálů pomocí triggerů dokončení kanálu, které odkazují na dokončený kanál. Kanál může mít v různých větvích více verzí, takže modul runtime vyhodnotí filtry větví ve verzi kanálu ve větvi určené nastavením Default branch for manual and scheduled builds . Pokud existuje shoda, kanál se spustí, ale verze kanálu, která se spouští, může být v jiné větvi v závislosti na tom, jestli je aktivovaný kanál ve stejném úložišti jako dokončený kanál.

  • Pokud jsou dva kanály v různých úložištích, spustí se aktivovaná verze kanálu ve větvi určené službou Default branch for manual and scheduled builds .
  • Pokud jsou dva kanály ve stejném úložišti, spustí se verze aktivovaného kanálu ve stejné větvi jako aktivační kanál (v době splnění podmínky triggeru pomocí verze kanálu z této větve), i když se tato větev liší od Default branch for manual and scheduled buildstéto větve, a to i v případě, že tato verze nemá filtry větví, které odpovídají větvi dokončeného kanálu. Důvodem je to, že filtry větví z Default branch for manual and scheduled builds větve se používají k určení, jestli se má kanál spustit, a ne filtry větví ve verzi, která je v dokončené větvi kanálu.

Pokud se zdá, že se triggery dokončení kanálu neaktivují, zkontrolujte hodnotu výchozí větve pro ruční a plánované nastavení sestavení pro aktivovaný kanál. Filtry větví ve verzi kanálu této větve slouží k určení, jestli trigger dokončení kanálu inicializuje spuštění kanálu. Ve výchozím nastavení Default branch for manual and scheduled builds je nastavená výchozí větev úložiště, ale po vytvoření kanálu ji můžete změnit.

Typický scénář, ve kterém se trigger dokončení kanálu neaktivuje při vytvoření nové větve, filtry větve triggeru dokončení kanálu se upraví tak, aby zahrnovaly tuto novou větev, ale když se první kanál dokončí ve větvi, která odpovídá novým filtrům větví, druhý kanál se neaktivuje. K tomu dochází v případě, že filtry větví ve verzi kanálu ve Default branch for manual and scheduled builds větvi neodpovídají nové větvi. Pokud chcete tento problém s triggerem vyřešit, máte následující dvě možnosti.

Kombinování typů aktivačních událostí

Když v kanálu zadáte triggery CI i triggery kanálu, můžete očekávat, že se nová spuštění spustí při každém odeslání, které odpovídá filtrům triggeru CI, a spuštění zdrojového kanálu, které odpovídá filtrům triggeru dokončení kanálu.

Představte si například dva pojmenované A kanály, B které jsou ve stejném úložišti, mají triggery CI a B má trigger dokončení kanálu nakonfigurovaný pro dokončení kanálu A. Pokud provedete vložení do úložiště:

  • Spustí se nové spuštění na základě triggeru A CI.
  • Současně se spustí nové spuštění na základě triggeru B CI. Toto spuštění využívá artefakty z předchozího spuštění kanálu A.
  • Po A dokončení aktivuje další spuštění B, na základě triggeru dokončení kanálu v B.

Pokud chcete zabránit aktivaci dvou spuštění v tomto příkladu B , musíte zakázat jeho trigger CI (trigger: none) nebo trigger kanálu (pr: none).