Sdílet prostřednictvím


Zadání úloh v kanálu

Azure DevOps Services | Azure DevOps Server 2022 – Azure DevOps Server 2019

Kanál můžete uspořádat do úloh. Každý kanál má alespoň jednu úlohu. Úloha je řada kroků, které se sekvenčně spouští jako jednotka. Jinými slovy, úloha je nejmenší jednotkou práce, kterou je možné naplánovat ke spuštění.

Informace o klíčových konceptech a komponentách, které tvoří kanál, najdete v tématu Klíčové koncepty pro nové uživatele Azure Pipelines.

Azure Pipelines nepodporuje prioritu úlohy pro kanály YAML. Pokud chcete řídit, kdy se úlohy spustí, můžete zadat podmínky a závislosti.

Definování jedné úlohy

V nejjednodušším případě má kanál jednu úlohu. V takovém případě nemusíte klíčové slovo explicitně používat job , pokud nepoužíváte šablonu. Kroky v souboru YAML můžete zadat přímo.

Tento soubor YAML má úlohu, která běží na agentu hostovaného Microsoftem Hello world

pool:
  vmImage: 'ubuntu-latest'
steps:
- bash: echo "Hello world"

V této úloze můžete zadat více vlastností. V takovém případě můžete použít job klíčové slovo.

jobs:
- job: myJob
  timeoutInMinutes: 10
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - bash: echo "Hello world"

Váš kanál může mít více úloh. V takovém případě použijte jobs klíčové slovo.

jobs:
- job: A
  steps:
  - bash: echo "A"

- job: B
  steps:
  - bash: echo "B"

Váš datový tok může mít několik fází, z nichž každá má více úloh. V takovém případě použijte stages klíčové slovo.

stages:
- stage: A
  jobs:
  - job: A1
  - job: A2

- stage: B
  jobs:
  - job: B1
  - job: B2

Úplná syntaxe pro zadání úlohy je:

- job: string  # name of the job, A-Z, a-z, 0-9, and underscore
  displayName: string  # friendly name to display in the UI
  dependsOn: string | [ string ]
  condition: string
  strategy:
    parallel: # parallel strategy
    matrix: # matrix strategy
    maxParallel: number # maximum number simultaneous matrix legs to run
    # note: `parallel` and `matrix` are mutually exclusive
    # you may specify one or the other; including both is an error
    # `maxParallel` is only valid with `matrix`
  continueOnError: boolean  # 'true' if future jobs should run even if this job fails; defaults to 'false'
  pool: pool # agent pool
  workspace:
    clean: outputs | resources | all # what to clean up before the job runs
  container: containerReference # container to run this job inside
  timeoutInMinutes: number # how long to run the job before automatically cancelling
  cancelTimeoutInMinutes: number # how much time to give 'run always even if cancelled tasks' before killing them
  variables: { string: string } | [ variable | variableReference ] 
  steps: [ script | bash | pwsh | powershell | checkout | task | templateReference ]
  services: { string: string | container } # container resources to run as a service container

Úplná syntaxe pro zadání úlohy je:

- job: string  # name of the job, A-Z, a-z, 0-9, and underscore
  displayName: string  # friendly name to display in the UI
  dependsOn: string | [ string ]
  condition: string
  strategy:
    parallel: # parallel strategy
    matrix: # matrix strategy
    maxParallel: number # maximum number simultaneous matrix legs to run
    # note: `parallel` and `matrix` are mutually exclusive
    # you may specify one or the other; including both is an error
    # `maxParallel` is only valid with `matrix`
  continueOnError: boolean  # 'true' if future jobs should run even if this job fails; defaults to 'false'
  pool: pool # agent pool
  workspace:
    clean: outputs | resources | all # what to clean up before the job runs
  container: containerReference # container to run this job inside
  timeoutInMinutes: number # how long to run the job before automatically cancelling
  cancelTimeoutInMinutes: number # how much time to give 'run always even if cancelled tasks' before killing them
  variables: { string: string } | [ variable | variableReference ] 
  steps: [ script | bash | pwsh | powershell | checkout | task | templateReference ]
  services: { string: string | container } # container resources to run as a service container
  uses: # Any resources (repos or pools) required by this job that are not already referenced
    repositories: [ string ] # Repository references to Azure Git repositories
    pools: [ string ] # Pool names, typically when using a matrix strategy for the job

Pokud primárním záměrem vaší úlohy je nasazení aplikace (na rozdíl od sestavení nebo otestování aplikace), můžete použít speciální typ úlohy označované jako úloha nasazení.

Syntaxe úlohy nasazení je:

- deployment: string        # instead of job keyword, use deployment keyword
  pool:
    name: string
    demands: string | [ string ]
  environment: string
  strategy:
    runOnce:
      deploy:
        steps:
        - script: echo Hi!

I když můžete přidat kroky pro úlohy nasazení v nástroji job, doporučujeme místo toho použít úlohu nasazení. Úloha nasazení má několik výhod. Můžete například nasadit do prostředí, které zahrnuje výhody, jako je například možnost zobrazit historii nasazených prostředků.

Typy úloh

Úlohy můžou být různé typy v závislosti na tom, kde běží.

  • Úlohy fondu agentů běží na agentovi ve fondu agentů.
  • Úlohy serveru běží na Azure DevOps Serveru.
  • Úlohy kontejneru se běží v kontejneru v agentovi ve fondu agentů. Další informace o výběru kontejnerů najdete v tématu Definování úloh kontejneru.
  • Úlohy fondu agentů běží na agentovi ve fondu agentů.
  • Úlohy serveru běží na Azure DevOps Serveru.

Úlohy fondu agentů

Mezi nejběžnější úlohy patří úkoly spojené s pozorováním agenta. Tyto úlohy probíhají na agentovi ve fondu agentů. Můžete určit fond, na kterém se má úloha spouštět, a můžete také zadat požadavky, které mají určit, jaké schopnosti musí agent ke spuštění úlohy použít. Agenti můžou být hostovaní Microsoftem nebo v místním prostředí. Další informace viz agenty Azure Pipelines .

  • Když používáte agenty hostované Microsoftem, každá úloha v pipeline získá nového agenta.
  • Pokud používáte agenty v místním prostředí, můžete použít požadavky k určení, jaké schopnosti musí mít agent, aby spouštěl vaši úlohu. Můžete mít stejného agenta pro po sobě jdoucí úlohy podle toho, zda je ve fondu agentů více než jeden agent, který odpovídá požadavkům vaší pipeline. Pokud je ve vašem fondu jenom jeden agent, který odpovídá požadavkům kanálu, kanál počká, dokud tento agent nebude dostupný.

Poznámka:

Požadavky a možnosti jsou navržené pro použití s agenty v místním prostředí, aby se úlohy mohly shodovat s agentem, který splňuje požadavky úlohy. Při použití agentů hostovaných Microsoftem vyberete image agenta, která odpovídá požadavkům úlohy. I když je možné přidat funkce do agenta hostovaného Microsoftem, nemusíte používat funkce s agenty hostovanými Microsoftem.

pool:
  name: myPrivateAgents    # your job runs on an agent in this pool
  demands: agent.os -equals Windows_NT    # the agent must have this capability to run the job
steps:
- script: echo hello world

Nebo více požadavků:

pool:
  name: myPrivateAgents
  demands:
  - agent.os -equals Darwin
  - anotherCapability -equals somethingElse
steps:
- script: echo hello world

Přečtěte si další informace o možnostech agenta.

Úlohy serveru

Server orchestruje a spouští úlohy v úloze serveru. Úloha serveru nevyžaduje agenta ani žádné cílové počítače. V úloze serveru se teď podporuje jenom několik úkolů. Maximální doba pro úlohu serveru je 30 dnů.

Podporované úlohy bez agentů

V současné době jsou pro úlohy bez agentů podporovány pouze následující úlohy:

Vzhledem k tomu, že jsou úlohy rozšiřitelné, můžete přidat další úlohy bez agentů pomocí rozšíření. Výchozí časový limit pro úlohy bez agentů je 60 minut.

Úplná syntaxe pro zadání úlohy serveru je:

jobs:
- job: string
  timeoutInMinutes: number
  cancelTimeoutInMinutes: number
  strategy:
    maxParallel: number
    matrix: { string: { string: string } }

  pool: server # note: the value 'server' is a reserved keyword which indicates this is an agentless job

Můžete také použít zjednodušenou syntaxi:

jobs:
- job: string
  pool: server # note: the value 'server' is a reserved keyword which indicates this is an agentless job

Závislosti

Když v jedné fázi definujete více úloh, můžete mezi nimi zadat závislosti. Kanály musí obsahovat alespoň jednu úlohu bez závislostí. Ve výchozím nastavení se úlohy kanálu YAML Azure DevOps spouští paralelně, pokud není nastavená dependsOn hodnota.

Poznámka:

Každý agent může současně spustit pouze jednu úlohu. Pokud chcete paralelně spouštět více úloh, musíte nakonfigurovat více agentů. Potřebujete také dostatek paralelních úloh.

Syntaxe pro definování více úloh a jejich závislostí je:

jobs:
- job: string
  dependsOn: string
  condition: string

Ukázkové úlohy, které se sestavují postupně:

jobs:
- job: Debug
  steps:
  - script: echo hello from the Debug build
- job: Release
  dependsOn: Debug
  steps:
  - script: echo hello from the Release build

Ukázkové úlohy, které se vytvářejí paralelně (bez závislostí):

jobs:
- job: Windows
  pool:
    vmImage: 'windows-latest'
  steps:
  - script: echo hello from Windows
- job: macOS
  pool:
    vmImage: 'macOS-latest'
  steps:
  - script: echo hello from macOS
- job: Linux
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: echo hello from Linux

Příklad ventilátoru:

jobs:
- job: InitialJob
  steps:
  - script: echo hello from initial job
- job: SubsequentA
  dependsOn: InitialJob
  steps:
  - script: echo hello from subsequent A
- job: SubsequentB
  dependsOn: InitialJob
  steps:
  - script: echo hello from subsequent B

Příklad ventilátoru:

jobs:
- job: InitialA
  steps:
  - script: echo hello from initial A
- job: InitialB
  steps:
  - script: echo hello from initial B
- job: Subsequent
  dependsOn:
  - InitialA
  - InitialB
  steps:
  - script: echo hello from subsequent

Podmínky

Můžete zadat podmínky, za kterých se každá úloha spouští. Ve výchozím nastavení se úloha spustí, pokud nezávisí na žádné jiné úloze, nebo pokud všechny úlohy, na kterých závisí, byly úspěšně dokončeny. Toto chování můžete přizpůsobit vynucením spuštění úlohy, i když předchozí úloha selže nebo zadáte vlastní podmínku.

Příklad spuštění úlohy na základě stavu spuštění předchozí úlohy:

jobs:
- job: A
  steps:
  - script: exit 1

- job: B
  dependsOn: A
  condition: failed()
  steps:
  - script: echo this will run when A fails

- job: C
  dependsOn:
  - A
  - B
  condition: succeeded('B')
  steps:
  - script: echo this will run when B runs and succeeds

Příklad použití vlastní podmínky:

jobs:
- job: A
  steps:
  - script: echo hello

- job: B
  dependsOn: A
  condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/main'))
  steps:
  - script: echo this only runs for master

Můžete určit, že se úloha spustí na základě hodnoty výstupní proměnné nastavené v předchozí úloze. V tomto případě můžete použít pouze proměnné nastavené v přímo závislých úlohách:

jobs:
- job: A
  steps:
  - script: "echo '##vso[task.setvariable variable=skipsubsequent;isOutput=true]false'"
    name: printvar

- job: B
  condition: and(succeeded(), ne(dependencies.A.outputs['printvar.skipsubsequent'], 'true'))
  dependsOn: A
  steps:
  - script: echo hello from B

Časové limity

Abyste se vyhnuli tomu, že vaše úloha přestane reagovat nebo čeká příliš dlouho, můžete nastavit omezení doby, po kterou může úloha běžet. Pomocí nastavení časového limitu úlohy určete limit pro spuštění úlohy v minutách. Nastavení hodnoty na nulu znamená, že úloha může běžet:

  • Navždy na agentech v místním prostředí
  • 360 minut (6 hodin) na agentech hostovaných Microsoftem s veřejným projektem a veřejným úložištěm
  • Na 60 minut na agentech hostovaných Microsoftem s privátním projektem nebo soukromým úložištěm (pokud není zaplacena dodatečná kapacita)

Období časového limitu začíná při spuštění úlohy. Nezahrnuje čas, kdy je úloha zařazená do fronty nebo čeká na agenta.

Umožňuje timeoutInMinutes nastavit limit pro dobu provádění úlohy. Pokud není zadáno, výchozí hodnota je 60 minut. Při zadání 0 se použije maximální limit.

Umožňuje cancelTimeoutInMinutes nastavit limit pro čas zrušení úlohy, když je úloha nasazení nastavena tak, aby běžela, pokud předchozí úloha selhala. Pokud není zadáno, výchozí hodnota je 5 minut. Hodnota by měla být v rozsahu od 1 do 35790 minut.

jobs:
- job: Test
  timeoutInMinutes: 10 # how long to run the job before automatically cancelling
  cancelTimeoutInMinutes: 2 # how much time to give 'run always even if cancelled tasks' before stopping them

Časové limity mají následující úroveň priority.

  1. U agentů hostovaných Microsoftem jsou úlohy omezené na dobu, po kterou se můžou spouštět na základě typu projektu a jestli běží pomocí placené paralelní úlohy. Po uplynutí intervalu časového limitu úlohy hostované Microsoftem se úloha ukončí. U agentů hostovaných Microsoftem nemůžou úlohy běžet déle, než je tento interval, bez ohledu na vypršení časových limitů na úrovni úloh zadaných v úloze.
  2. Časový limit nakonfigurovaný na úrovni úlohy určuje maximální dobu trvání spuštění úlohy. Po uplynutí časového limitu na úrovni úlohy se úloha ukončí. Pokud je úloha spuštěna na agentu hostovaného Microsoftem, nastavení časového limitu na úrovni úlohy větší než integrovaného časového limitu na úrovni úlohy hostované Microsoftem nemá žádný vliv.
  3. Časový limit pro každý úkol můžete nastavit také jednotlivě – viz možnosti řízení úkolů. Pokud časový limit na úrovni úlohy uplynul před dokončením úkolu, je spuštěná úloha ukončena, i když je úkol nakonfigurovaný s delším časovým limitem.

Konfigurace více úloh

Z jedné úlohy, kterou vytvoříte, můžete paralelně spouštět více úloh na více agentech. Mezi některé příklady patří:

  • Sestavení s více konfiguracemi: Můžete paralelně sestavit více konfigurací. Můžete například vytvořit aplikaci Visual C++ pro obě debug i release konfigurace na obou x86x64 platformách. Další informace najdete v tématu Visual Studio Build – více konfigurací pro více platforem.

  • Nasazení s více konfiguracemi: Můžete paralelně spouštět více nasazení, například do různých geografických oblastí.

  • Vícekonfigurační testování: Můžete paralelně spustit test více konfigurací.

  • Vícekonfigurování vždy generuje aspoň jednu úlohu, i když je proměnná s více konfiguracemi prázdná.

Strategie matrix umožňuje vícenásobně odesílat úlohu s různými sadami proměnných. Značka maxParallel omezuje množství paralelismu. Následující úloha se odešle třikrát s hodnotami umístění a prohlížeče nastaveným podle zadaného nastavení. Současně však běží jenom dvě úlohy.

jobs:
- job: Test
  strategy:
    maxParallel: 2
    matrix: 
      US_IE:
        Location: US
        Browser: IE
      US_Chrome:
        Location: US
        Browser: Chrome
      Europe_Chrome:
        Location: Europe
        Browser: Chrome

Poznámka:

Názvy konfigurací matice (například US_IE v příkladu) musí obsahovat pouze základní písmena latinky (A – Z, a – z), čísla a podtržítka (_). Musí začínat písmenem. Musí mít také 100 znaků nebo méně.

K vygenerování matice je také možné použít výstupní proměnné. Tato metoda může být praktická, pokud potřebujete generovat matici pomocí skriptu.

matrix přijímá výraz modulu runtime obsahující řetězecifikovaný objekt JSON. Tento objekt JSON při rozbalení musí odpovídat syntaxi matice. V následujícím příkladu jsme pevně naprogramovali řetězec JSON, ale můžete ho vygenerovat pomocí skriptovacího jazyka nebo programu příkazového řádku.

jobs:
- job: generator
  steps:
  - bash: echo "##vso[task.setVariable variable=legs;isOutput=true]{'a':{'myvar':'A'}, 'b':{'myvar':'B'}}"
    name: mtrx
  # This expands to the matrix
  #   a:
  #     myvar: A
  #   b:
  #     myvar: B
- job: runner
  dependsOn: generator
  strategy:
    matrix: $[ dependencies.generator.outputs['mtrx.legs'] ]
  steps:
  - script: echo $(myvar) # echos A or B depending on which leg is running

Krájení

Úlohu agenta lze použít ke paralelnímu spuštění sady testů. Můžete například spustit velkou sadu 1 000 testů na jednom agentu. Nebo můžete použít dva agenty a spustit na každém z nich paralelně 500 testů.

Aby bylo možné použít řezy, měly by být úkoly v úloze dostatečně inteligentní, aby porozuměly řezu, do které patří.

Úloha Visual Studio Test je jednou z takových úloh, která podporuje řezy testů. Pokud jste nainstalovali více agentů, můžete určit, jak se úloha Visual Studio Test spustí paralelně na těchto agentech.

Strategie parallel umožňuje úlohu duplikovat mnohokrát. System.JobPositionInPhase Proměnné a System.TotalJobsInPhase přidají se do každé úlohy. Proměnné se pak dají použít ve vašich skriptech k rozdělení práce mezi úlohy. Viz Paralelní a více spuštění pomocí úloh agenta.

Následující úloha se odešle pětkrát s hodnotami System.JobPositionInPhase a System.TotalJobsInPhase nastavenými odpovídajícím způsobem.

jobs:
- job: Test
  strategy:
    parallel: 5

Proměnné úloh

Pokud používáte YAML, můžete v úloze zadat proměnné. Proměnné lze předat vstupům úkolů pomocí syntaxe makra $(variableName) nebo přistupovat ve skriptu pomocí proměnné fáze.

Tady je příklad definování proměnných v úloze a jejich použití v rámci úkolů.

variables:
  mySimpleVar: simple var value
  "my.dotted.var": dotted var value
  "my var with spaces": var with spaces value

steps:
- script: echo Input macro = $(mySimpleVar). Env var = %MYSIMPLEVAR%
  condition: eq(variables['agent.os'], 'Windows_NT')
- script: echo Input macro = $(mySimpleVar). Env var = $MYSIMPLEVAR
  condition: in(variables['agent.os'], 'Darwin', 'Linux')
- bash: echo Input macro = $(my.dotted.var). Env var = $MY_DOTTED_VAR
- powershell: Write-Host "Input macro = $(my var with spaces). Env var = $env:MY_VAR_WITH_SPACES"

Informace o použití podmínky naleznete v tématu Zadání podmínek.

Pracovní prostor

Když spustíte úlohu fondu agentů, vytvoří v agentu pracovní prostor. Pracovní prostor je adresář, ve kterém stáhne zdroj, spustí kroky a vytvoří výstupy. Na adresář pracovního prostoru můžete v úloze odkazovat pomocí Pipeline.Workspace proměnné. V tomto případě se vytvoří různé podadresáře:

  • Build.SourcesDirectory je místo, kde úkoly stahuje zdrojový kód aplikace.
  • Build.ArtifactStagingDirectory je místo, kde úkoly stahují artefakty potřebné pro kanál nebo nahrávají artefakty před jejich publikováním.
  • Build.BinariesDirectory je místo, kde úkoly zapisují své výstupy.
  • Common.TestResultsDirectory je místo, kde úkoly nahrávají výsledky testů.

$(Build.ArtifactStagingDirectory) a $(Common.TestResultsDirectory) se před každým sestavením odstraní a znovu vytvoří.

Když kanál spustíte na agentovi v místním prostředí, ve výchozím nastavení se žádný z podadresářů jiný než $(Build.ArtifactStagingDirectory) a $(Common.TestResultsDirectory) nevyčistí se mezi dvěma po sobě jdoucími spuštěními. V důsledku toho můžete provádět inkrementální sestavení a nasazení, pokud jsou úlohy implementovány tak, aby je mohly využívat. Toto chování můžete přepsat pomocí workspace nastavení úlohy.

Důležité

Možnosti čištění pracovního prostoru platí jenom pro agenty v místním prostředí. Úlohy se vždy spouštějí na novém agentu s agenty hostovanými Microsoftem.

- job: myJob
  workspace:
    clean: outputs | resources | all # what to clean up before the job runs

Když zadáte jednu z clean možností, budou interpretovány takto:

  • outputs: Před spuštěním nové úlohy odstraňte Build.BinariesDirectory .
  • resources: Před spuštěním nové úlohy odstraňte Build.SourcesDirectory .
  • all: Před spuštěním nové úlohy odstraňte celý Pipeline.Workspace adresář.
  jobs:
  - deployment: MyDeploy
    pool:
      vmImage: 'ubuntu-latest'
    workspace:
      clean: all
    environment: staging

Poznámka:

V závislosti na schopnostech agenta a nárocích na zpracování může být každá úloha směrována na jiného agenta ve vašem vlastně spravovaném fondu. V důsledku toho můžete získat nového agenta pro následná spuštění kanálu (nebo fáze nebo úlohy ve stejném kanálu), takže ne čištění není zárukou, že následné spuštění, úlohy nebo fáze budou mít přístup k výstupům z předchozích spuštění, úloh nebo fází. Můžete nakonfigurovat možnosti agenta a požadavky pipeline, abyste určili, kteří agenti se používají ke spuštění úlohy pipeline. Pokud ale ve fondu není pouze jeden agent, který splňuje požadavky, nelze zaručit, že následné úlohy využijí stejného agenta jako úlohy předchozí. Další informace naleznete v tématu Zadání požadavků.

Kromě čištění pracovního prostoru můžete také nakonfigurovat čištění tak , že v uživatelském rozhraní nastavení kanálu nakonfigurujete nastavení Vyčistit . Pokud je nastavení Vyčistit pravdivé, což je také jeho výchozí hodnota, je ekvivalentem zadání clean: true pro každý krok rezervace ve vašem kanálu. Když zadáte clean: true, nejprve spustíte git clean -ffdx a poté git reset --hard HEAD před načtením Git. Konfigurace nastavení Vyčistit:

  1. Upravte kanál, zvolte ...a vyberte Aktivační události.

    Úpravy aktivačních událostí

  2. Vyberte YAML, Získat zdroje a nakonfigurujte požadované nastavení Vyčistit . Výchozí hodnota je true.

    Čisté nastavení.

Stažení artefaktů

Tento příklad souboru YAML publikuje artefakt WebSite a pak stáhne artefakt do $(Pipeline.Workspace). Úloha Nasazení se spustí pouze v případě, že je úloha sestavení úspěšná.

# test and upload my code as an artifact named WebSite
jobs:
- job: Build
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: npm test
  - task: PublishBuildArtifacts@1
    inputs:
      pathtoPublish: '$(System.DefaultWorkingDirectory)'
      artifactName: WebSite

# download the artifact and deploy it only if the build job succeeded
- job: Deploy
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - checkout: none #skip checking out the default repository resource
  - task: DownloadBuildArtifacts@0
    displayName: 'Download Build Artifacts'
    inputs:
      artifactName: WebSite
      downloadPath: $(Pipeline.Workspace)

  dependsOn: Build
  condition: succeeded()

Informace o použití funkce dependsOn a podmínky naleznete v tématu Zadání podmínek.

Přístup k tokenu OAuth

Skriptům spuštěným v úloze můžete povolit přístup k aktuálnímu tokenu zabezpečení OAuth služby Azure Pipelines. Token se dá použít k ověření v rozhraní REST API služby Azure Pipelines.

Token OAuth je vždy dostupný pro kanály YAML. Musí být explicitně namapován na úkol nebo krok pomocí env. Tady je příklad:

steps:
- powershell: |
    $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=4.1-preview"
    Write-Host "URL: $url"
    $pipeline = Invoke-RestMethod -Uri $url -Headers @{
      Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
    }
    Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"
  env:
    SYSTEM_ACCESSTOKEN: $(system.accesstoken)

Co bude dál