Utlösa en pipeline efter en annan

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

Stora produkter har flera komponenter som är beroende av varandra. Dessa komponenter är ofta fristående byggda. När en överordnad komponent (till exempel ett bibliotek) ändras måste underordnade beroenden återskapas och återkallas.

I situationer som dessa lägger du till en pipelineutlösare för att köra pipelinen när den utlösande pipelinen har slutförts.

Kommentar

Tidigare kanske du har navigerat till den klassiska redigeraren för YAML-pipelinen och konfigurerat utlösare för bygge i användargränssnittet. Även om modellen fortfarande fungerar rekommenderas den inte längre. Den rekommenderade metoden är att ange pipelineutlösare direkt i YAML-filen. Utlösare för bygge som definierats i den klassiska redigeraren har olika nackdelar, som nu har åtgärdats i pipelineutlösare. Det finns till exempel inget sätt att utlösa en pipeline på samma gren som den utlösande pipelinen med hjälp av utlösare för bygge.

Konfigurera pipelineresursutlösare

Om du vill utlösa en pipeline när en annan pipeline har slutförts konfigurerar du en pipelineresursutlösare .

I följande exempel konfigureras en pipelineresursutlösare så att en pipeline med namnet app-ci körs när alla körningar av pipelinen security-lib-ci har slutförts.

I det här exemplet finns följande två pipelines.

  • security-lib-ci – Den här pipelinen körs först.

    # security-lib-ci YAML pipeline
    steps:
    - bash: echo "The security-lib-ci pipeline runs first"
    
  • app-ci – Den här pipelinen har en pipelineresursutlösare som konfigurerar pipelinen så att den app-ci körs automatiskt varje gång en körning av pipelinen security-lib-ci slutförs.

    # 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 anger namnet på pipelineresursen. Använd etiketten som definieras här när du refererar till pipelineresursen från andra delar av pipelinen, till exempel när du använder pipelineresursvariabler eller laddar ned artefakter.
  • source: security-lib-ci anger namnet på pipelinen som refereras av den här pipelineresursen. Du kan hämta en pipelines namn från Azure DevOps-portalen på flera platser, till exempel landningssidan Pipelines. Som standard namnges pipelines efter lagringsplatsen som innehåller pipelinen. Information om hur du uppdaterar en pipelines namn finns i Pipelineinställningar. Om pipelinen finns i en mapp inkluderar du mappnamnet, inklusive den inledande \, till exempel \security pipelines\security-lib-ci.
  • project: FabrikamProject – Om den utlösande pipelinen finns i ett annat Azure DevOps-projekt måste du ange projektnamnet. Den här egenskapen är valfri om både källpipelinen och den utlösta pipelinen finns i samma projekt. Om du anger det här värdet och pipelinen inte utlöses läser du anteckningen i slutet av det här avsnittet.
  • trigger: true – Använd den här syntaxen för att utlösa pipelinen när någon version av källpipelinen har slutförts. Se följande avsnitt i den här artikeln för att lära dig hur du filtrerar vilka versioner av källpipelinen som slutförs utlöser en körning. När filter har angetts måste källpipelinekörningen matcha alla filter för att utlösa en körning.

Om den utlösande pipelinen och den utlösta pipelinen använder samma lagringsplats körs båda pipelinerna med samma incheckning när den ena utlöser den andra. Det här är användbart om din första pipeline skapar koden och den andra pipelinen testar den. Men om de två pipelinerna använder olika lagringsplatser använder den utlösta pipelinen den version av koden i grenen som anges av inställningen, enligt beskrivningen Default branch for manual and scheduled builds i Branch considerations for pipeline completion triggers (Grenöverväganden för pipelinens slutförandeutlösare).

Kommentar

I vissa scenarier innehåller standardgrenen för manuella versioner och schemalagda versioner inte något refs/heads prefix. Standardgrenen kan till main exempel vara inställd på i stället för på refs/heads/main. I det här scenariot fungerar inte en utlösare från ett annat projekt. Om du får problem när du anger project ett annat värde än målpipelinens kan du uppdatera standardgrenen så att den inkluderas refs/heads genom att ändra dess värde till en annan gren och sedan ändra tillbaka den till den standardgren som du vill använda.

Det går inte att konfigurera utlösare för slutförande av pipeline i YAML-mallar. Du kan fortfarande definiera pipelineresurser i mallar.

Grenfilter

Du kan också ange vilka grenar som ska inkluderas eller exkluderas när du konfigurerar utlösaren. Om du anger grenfilter utlöses en ny pipeline när en källpipelinekörning har slutförts som matchar grenfiltren. I följande exempel körs pipelinen app-ci om den security-lib-ci slutförs på någon releases/* gren, förutom releases/old*.

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

Om du vill utlösa den underordnade pipelinen för olika grenar som det överordnade objektet utlöses för, tar du med alla grenfilter som det överordnade objektet utlöses för. I följande exempel körs pipelinen app-ci om den security-lib-ci slutförs på någon releases/* gren eller huvudgren, förutom .releases/old*

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

Kommentar

Om grenfiltren inte fungerar kan du prova att använda prefixet refs/heads/. Använd till exempel refs/heads/releases/old*i stället för releases/old*.

Taggfilter

Egenskapen tags för de trigger filter som pipelinens slutförandehändelser kan utlösa din pipeline. Om den utlösande pipelinen matchar alla taggar i tags listan körs pipelinen.

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

Kommentar

Pipelineresursen har också en tags egenskap. Egenskapen tags för pipelineresursen används för att avgöra vilken pipelinekörning som ska hämta artefakter från, när pipelinen utlöses manuellt eller av en schemalagd utlösare. Mer information finns i Resurser: pipelines och Utvärdering av artefaktversion.

Fasfilter

Du kan utlösa din pipeline när en eller flera steg i den utlösande pipelinen slutförs med hjälp stages av filtret. Om du anger flera steg körs den utlösta pipelinen när alla de angivna stegen har slutförts.

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. 

Branchöverväganden

Pipeline-slutförandeutlösare använder standardgrenen för manuella och schemalagda versioner för att avgöra vilken grens version av en YAML-pipelines grenfilter som ska utvärderas när du avgör om en pipeline ska köras till följd av att en annan pipeline slutförs. Som standard pekar den här inställningen på standardgrenen för lagringsplatsen.

När en pipeline är klar utvärderar Azure DevOps-körningen grenfiltren för pipelineresursutlösare för alla pipelines med utlösare för pipelinens slutförande som refererar till den slutförda pipelinen. En pipeline kan ha flera versioner i olika grenar, så körningen utvärderar grenfiltren i pipelineversionen i den gren som anges av Default branch for manual and scheduled builds inställningen. Om det finns en matchning körs pipelinen, men den version av pipelinen som körs kan finnas i en annan gren beroende på om den utlösta pipelinen finns på samma lagringsplats som den slutförda pipelinen.

  • Om de två pipelinerna finns i olika lagringsplatser körs den utlösta pipelineversionen i grenen som anges av Default branch for manual and scheduled builds .
  • Om de två pipelines finns på samma lagringsplats körs den utlösta pipelineversionen i samma gren som den utlösande pipelinen (med pipelineversionen från den grenen när utlösarvillkoret uppfylls), även om grenen Default branch for manual and scheduled buildsskiljer sig från , och även om den versionen inte har grenfilter som matchar den slutförda pipelinens gren. Det beror på att grenfiltren från grenen Default branch for manual and scheduled builds används för att avgöra om pipelinen ska köras och inte grenfiltren i den version som finns i den slutförda pipelinegrenen.

Om pipelinens slutförandeutlösare inte verkar utlösas kontrollerar du värdet för standardgrenen för manuella och schemalagda versioner för den utlösta pipelinen. Grenfiltren i den grenens version av pipelinen används för att avgöra om pipelinens slutförandeutlösare initierar en körning av pipelinen. Som standard Default branch for manual and scheduled builds anges standardgrenen för lagringsplatsen, men du kan ändra den när pipelinen har skapats.

Ett typiskt scenario där utlösaren för pipelinens slutförande inte utlöses är när en ny gren skapas, och utlösargrensfiltren för pipelinens slutförande ändras så att den inkluderar den nya grenen, men när den första pipelinen slutförs på en gren som matchar de nya grenfiltren utlöses inte den andra pipelinen. Detta händer om grenfiltren i pipelineversionen i grenen Default branch for manual and scheduled builds inte matchar den nya grenen. För att lösa det här utlösarproblemet har du följande två alternativ.

  • Uppdatera grenfiltren i pipelinen i grenen Default branch for manual and scheduled builds så att de matchar den nya grenen.
  • Uppdatera standardgrenen för manuella och schemalagda versioner till en gren som har en version av pipelinen med de grenfilter som matchar den nya grenen.

Kombinera utlösartyper

När du anger både CI-utlösare och pipelineutlösare i din pipeline kan du förvänta dig att nya körningar startas varje gång en push görs som matchar ci-utlösarens filter, och en körning av källpipelinen slutförs som matchar filtren för pipelinens slutförandeutlösare.

Överväg till exempel två pipelines med namnet A och B som finns på samma lagringsplats, båda har CI-utlösare och B har en pipeline-slutförandeutlösare konfigurerad för slutförande av pipelinen A. Om du gör en push-överföring till lagringsplatsen:

  • En ny körning av A startas, baserat på dess CI-utlösare.
  • Samtidigt startas en ny körning av B , baserat på dess CI-utlösare. Den här körningen använder artefakterna från en tidigare körning av pipelinen A.
  • När A det är klart utlöser det en annan körning av B, baserat på pipelinens slutförandeutlösare i B.

För att förhindra att två körningar utlöses B i det här exemplet måste du inaktivera ci-utlösaren (trigger: none) eller pipelineutlösaren (pr: none).