Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020
Důležité
Vyberte verzi tohoto článku, která odpovídá vaší platformě a verzi. Selektor verzí je nad obsahem dokumentu. Vyhledejte platformu a verzi Azure DevOps.
Výrazy se dají použít na mnoha místech, kde při vytváření kanálu potřebujete zadat řetězec, logickou hodnotu nebo číselnou hodnotu. Když výraz vrátí matici, použijí se normální pravidla indexování a index začíná znakem 0.
Nejběžnější použití výrazů je v podmínkách k určení, jestli se má úloha nebo krok spustit.
# Expressions are used to define conditions for a step, job, or stage
steps:
- task: ...
condition: <expression>
Dalším běžným použitím výrazů je definování proměnných.
Výrazy lze vyhodnotit v době kompilace nebo v době běhu.
Výrazy času kompilace lze použít kdekoli; Výrazy modulu runtime lze použít v proměnných a podmínkách. Výrazy modulu runtime jsou určeny jako způsob, jak vypočítat obsah proměnných a stavu (například: condition).
# Two examples of expressions used to define variables
# The first one, a, is evaluated when the YAML file is compiled into a plan.
# The second one, b, is evaluated at runtime.
# Note the syntax ${{}} for compile time and $[] for runtime expressions.
variables:
a: ${{ <expression> }}
b: $[ <expression> ]
Rozdíl mezi syntaxí výrazů za běhu a kompilace je primárně tím, jaký kontext je k dispozici.
Ve výrazu vyhodnocovaném při kompilaci (${{ <expression> }}) máte přístup k parameters a staticky definovaným variables.
Ve výrazu modulu runtime ($[ <expression> ]) máte přístup k více variables položkám, ale k žádným parametrům.
V tomto příkladu výraz modulu runtime nastaví hodnotu $(isMain). Statická proměnná ve výrazu kompilace nastaví hodnotu $(compileVar).
variables:
staticVar: 'my value' # static variable
compileVar: ${{ variables.staticVar }} # compile time expression
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] # runtime expression
steps:
- script: |
echo ${{variables.staticVar}} # outputs my value
echo $(compileVar) # outputs my value
echo $(isMain) # outputs True
Výraz může být literál, odkaz na proměnnou, odkaz na závislost, funkci nebo platnou vnořenou kombinaci.
Literály
Jako součást výrazu můžete použít logické literály, nulové literály, číselné literály, řetězcové literály nebo literály verze.
# Examples
variables:
someBoolean: ${{ true }} # case insensitive, so True or TRUE also works
someNumber: ${{ -1.2 }}
someString: ${{ 'a b c' }}
someVersion: ${{ 1.2.3 }}
logický
True a False jsou logické literální výrazy.
Nula
Null je speciální literálový výraz, který se vrací při neúspěšném vyhledávání ve slovníku, například (variables['noSuch']). Hodnota Null může být výstupem výrazu, ale nelze ji volat přímo ve výrazu.
Číslo
Začíná na -, .nebo 0 až 9.
Řetězec
Musí být v jednoduchých uvozovkách. Například: 'this is a string'.
Pokud chcete vyjádřit literální jednoduchý apostrof, unikněte ho dalším jednoduchým apostrofem.
Například: 'It''s OK if they''re using contractions.'.
Znak svislé čáry (|) můžete použít pro víceřádkové řetězce.
myKey: |
one
two
three
Verze
Číslo verze, které má až čtyři segmenty.
Musí začínat číslem a obsahovat dva nebo tři znaky tečky (.).
Například: 1.2.3.4.
Proměnné
Jako součást výrazu můžete přistupovat k proměnným pomocí jedné ze dvou syntaxí:
- Syntaxe indexu:
variables['MyVar'] - Syntaxe dereference vlastností:
variables.MyVar
Aby bylo možné použít syntaxi dereference vlastností, musí název vlastnosti:
- Začít od
a-Znebo_ - Mělo by následovat
a-Z0-9nebo_
V závislosti na kontextu spuštění jsou k dispozici různé proměnné.
- Pokud vytváříte kanály pomocí YAML, jsou k dispozici proměnné kanálu.
- Pokud vytváříte kanály sestavení pomocí klasického editoru, proměnné sestavení jsou k dispozici.
- Pokud vytváříte vydávací kanály pomocí klasického editoru, jsou proměnné vydání k dispozici.
Proměnné jsou vždy řetězce. Pokud chcete použít typové hodnoty, měli byste místo toho použít parametry .
Poznámka:
Při nastavování těchto proměnných prostřednictvím záložky proměnných v uživatelském rozhraní platí omezení pro použití proměnných s výrazy pro klasické i YAML kanály. Proměnné definované jako výrazy by neměly záviset na jiné proměnné s výrazem v hodnotě, protože není zaručeno , že oba výrazy budou vyhodnoceny správně. Například máme proměnnou a , jejíž hodnota $[ <expression> ] se používá jako součást pro hodnotu proměnné b. Vzhledem k tomu, že pořadí zpracovávaných proměnných není zaručené, b může mít po vyhodnocení nesprávnou hodnotu proměnné a .
Popsané konstrukce jsou povoleny pouze při nastavování proměnných prostřednictvím klíčového slova variables v YAML pipeline. Je nutné umístit proměnné do pořadí, v jakém by se měly zpracovat, aby se po zpracování získaly správné hodnoty.
Functions
Ve výrazech lze použít následující předdefinované funkce.
a
- Vyhodnotí na
True, pokud jsou všechny parametryTrue - Minimální parametry: 2. Maximální parametry: N
- Převádí parametry na logické hodnoty k účelům vyhodnocení.
- Zkraty po prvním
False - Příklad:
and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))
sloučit
- Vyhodnotí parametry v pořadí (zleva doprava) a vrátí první hodnotu, která se nerovná hodnotě null nebo prázdný řetězec.
- Není vrácena žádná hodnota, pokud všechny hodnoty parametrů mají hodnotu null nebo prázdné řetězce.
- Minimální parametry: 2. Maximální parametry: N
- Příklad:
coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')
obsahuje
-
TrueVyhodnotí, jestli řetězec levého parametru obsahuje správný parametr. - Minimální parametry: 2. Maximální parametry: 2
- Přetypuje parametry na řetězec za účelem vyhodnocení.
- Provede porovnání řadových případů ignorování.
- Příklad:
contains('ABCDE', 'BCD')(vrátí hodnotu True)
obsahujeHodnotu
-
TrueVyhodnotí, jestli je levý parametr pole a jakákoli položka se rovná správnému parametru. Také vyhodnotíTrue, zda levý parametr je objekt a hodnota jakékoli vlastnosti se rovná správnému parametru. - Minimální parametry: 2. Maximální parametry: 2
- Pokud je levý parametr pole, převeďte každou položku tak, aby odpovídala typu pravého parametru. Pokud je levý parametr objekt, převeďte hodnotu každé vlastnosti tak, aby odpovídala typu pravého parametru. Porovnání rovnosti pro každou konkrétní položku
Falsese vyhodnotí, pokud převod selže. - Porovnání řadových případů přeskakování u řetězců
- Zkraty po prvním zápasu
Poznámka:
V rámci YAML pipeline neexistuje žádná doslovná syntaxe pro zadání pole. Tato funkce je omezena v obecných kanálech. Je určen pro použití v kontextu dekoračního kontextu potrubí s poli poskytovanými systémem, jako je seznam kroků.
Pomocí výrazu containsValue můžete najít odpovídající hodnotu v objektu. Tady je příklad, který ukazuje hledání v seznamu zdrojových větví pro shodu pro Build.SourceBranch.
parameters:
- name: branchOptions
displayName: Source branch options
type: object
default:
- refs/heads/main
- refs/heads/test
jobs:
- job: A1
steps:
- ${{ each value in parameters.branchOptions }}:
- script: echo ${{ value }}
- job: B1
condition: ${{ containsValue(parameters.branchOptions, variables['Build.SourceBranch']) }}
steps:
- script: echo "Matching branch found"
převéstNaJson
- Vezme složitý objekt a vypíše ho jako JSON.
- Minimální parametry: 1. Maximální parametry: 1.
parameters:
- name: listOfValues
type: object
default:
this_is:
a_complex: object
with:
- one
- two
steps:
- script: |
echo "${MY_JSON}"
env:
MY_JSON: ${{ convertToJson(parameters.listOfValues) }}
Výstup skriptu:
{
"this_is": {
"a_complex": "object",
"with": [
"one",
"two"
]
}
}
čítač
- Tuto funkci lze použít pouze ve výrazu, který definuje proměnnou. Nedá se použít jako součást podmínky pro krok, úlohu nebo fázi.
- Vyhodnotí číslo, které se zvýší při každém spuštění potrubí.
- Parametry: 2.
prefixaseed. - Předpona je řetězcový výraz. Pro každou unikátní hodnotu předpony je sledována samostatná hodnota čítače. Mělo by
prefixpoužívat znaky UTF-16. - Počáteční hodnota (nebo semeno) čítače
Můžete vytvořit čítač, který se při každém spuštění vašeho kanálu automaticky zvýší o jedno. Při definování čítače zadáte prefix a seed. Tady je příklad, který to ukazuje.
variables:
major: 1
# define minor as a counter with the prefix as variable major, and seed as 100.
minor: $[counter(variables['major'], 100)]
steps:
- bash: echo $(minor)
Hodnota minor v předchozím příkladu při prvním spuštění potrubí je 100. Ve druhém spuštění je to 101 za předpokladu, že hodnota major je stále 1.
Pokud upravíte soubor YAML a aktualizujete hodnotu proměnné major na hodnotu 2, pak v dalším spuštění kanálu bude hodnota minor 100. Následná spuštění zvyšují čítač na 101, 102, 103, ...
Pokud později upravíte soubor YAML a nastavíte hodnotu major zpět na hodnotu 1, hodnota čítače se obnoví tam, kde pro tuto předponu skončila. V tomto příkladu se obnoví na 102.
Tady je další příklad nastavení proměnné tak, aby fungovala jako čítač, který začíná na 100, se pro každé spuštění zvýší o 1 a každý den se resetuje na 100.
Poznámka:
pipeline.startTime není k dispozici mimo výrazy.
pipeline.startTime formátuje system.pipelineStartTime do objektu data a času, aby byl k dispozici pro práci s výrazy.
Výchozí časové pásmo je pipeline.startTime UTC. Časové pásmo pro vaši organizaci můžete změnit.
jobs:
- job:
variables:
a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
steps:
- bash: echo $(a)
Tady je příklad čítače, který udržuje samostatnou hodnotu pro PR a běhy CI.
variables:
patch: $[counter(variables['build.reason'], 0)]
Čítače jsou vymezeny na pipeline. Jinými slovy, jeho hodnota se zvýší při každém spuštění tohoto řetězce. Neexistují žádné čítače ve specifikaci projektu.
končí na
-
TrueVyhodnotí, jestli řetězec levého parametru končí pravým parametrem. - Minimální parametry: 2. Maximální parametry: 2
- Přetypuje parametry na řetězec za účelem vyhodnocení.
- Provede porovnání řadových případů ignorování.
- Příklad:
endsWith('ABCDE', 'DE')(vrátí hodnotu True)
Eq
-
TrueVyhodnotí, jestli jsou parametry stejné. - Minimální parametry: 2. Maximální parametry: 2
- Převede pravý parametr tak, aby odpovídal typu levého parametru. Vrátí
False, pokud převod selže. - Porovnání řadových případů přeskakování u řetězců
- Příklad:
eq(variables.letters, 'ABC')
formát
- Vyhodnotí koncové parametry a vloží je do řetězce počátečního parametru.
- Minimální parametry: 1. Maximální parametry: N
- Příklad:
format('Hello {0} {1}', 'John', 'Doe') - Používá specifikátory vlastního formátu data a času pro formátování dat v .NET (
yyyy,yy,MM,M,dd,d,HH,H,m,mm,ss,s,f,ff,ffff,K) - Příklad:
format('{0:yyyyMMdd}', pipeline.startTime). V tomto případěpipeline.startTimeje speciální proměnná objektu data a času. - Vynechejte pomocí zdvojení závorek. Příklad:
format('literal left brace {{ and literal right brace }}')
germanium
-
TrueVyhodnotí, jestli je levý parametr větší nebo roven správnému parametru. - Minimální parametry: 2. Maximální parametry: 2
- Převede pravý parametr tak, aby odpovídal typu levého parametru. Chyby v případě selhání převodu
- Porovnání řadových případů přeskakování u řetězců
- Příklad:
ge(5, 5)(vrátí hodnotu True)
GT
-
TrueVyhodnotí, jestli je levý parametr větší než správný parametr. - Minimální parametry: 2. Maximální parametry: 2
- Převede pravý parametr tak, aby odpovídal typu levého parametru. Chyby v případě selhání převodu
- Porovnání řadových případů přeskakování u řetězců
- Příklad:
gt(5, 2)(vrátí hodnotu True)
v
-
TrueVyhodnotí, jestli je levý parametr roven libovolnému správnému parametru. - Minimální parametry: 1. Maximální parametry: N
- Převede správné parametry tak, aby odpovídaly typu levého parametru. Porovnání rovnosti se vyhodnotí pouze tehdy, pokud převod selže.
- Porovnání řadových případů přeskakování u řetězců
- Přeruší se po první shodě
- Příklad:
in('B', 'A', 'B', 'C')(vrátí hodnotu True)
iif
- Vrátí druhý parametr, pokud se první parametr vyhodnotí jako
True, a třetí parametr v opačném případě. - Minimální parametry: 1. Maximální parametry: 3
- Prvním parametrem musí být podmínka.
- Příklad:
iif(eq(variables['Build.Reason'], 'PullRequest'), 'ManagedDevOpsPool', 'Azure Pipelines')vrátí hodnotu 'ManagedDevOpsPool', když se potrubí spustí v reakci na návrh na sloučení.
připojit
- Zřetězí všechny prvky v pravém poli parametrů oddělené řetězcem levého parametru.
- Minimální parametry: 2. Maximální parametry: 2
- Každý prvek v poli je převeden na řetězec. Komplexní objekty se převádějí na prázdný řetězec.
- Pokud správný parametr není pole, je výsledkem správný parametr převedený na řetězec.
V tomto příkladu se mezi každou položku v poli přidá středník. Typ parametru je objekt.
parameters:
- name: myArray
type: object
default:
- FOO
- BAR
- ZOO
variables:
A: ${{ join(';',parameters.myArray) }}
steps:
- script: echo $A # outputs FOO;BAR;ZOO
Le
-
TrueVyhodnotí, jestli je levý parametr menší nebo roven správnému parametru. - Minimální parametry: 2. Maximální parametry: 2
- Převede pravý parametr tak, aby odpovídal typu levého parametru. Chyby v případě selhání převodu
- Porovnání řadových případů přeskakování u řetězců
- Příklad:
le(2, 2)(vrátí hodnotu True)
délka
- Vrátí délku řetězce nebo pole, buď z systému, nebo z parametru.
- Minimální parametry: 1. Maximální počet parametrů 1
- Příklad: vrátí hodnotu 8.
length('fabrikam')
nižší
- Převede text nebo hodnotu proměnné na malá písmena.
- Minimální parametry: 1. Maximální počet parametrů 1
- Vrátí ekvivalent malého písmena řetězce.
- Příklad:
lower('FOO')vrátífoo
lt
-
TrueVyhodnotí, jestli je levý parametr menší než správný parametr. - Minimální parametry: 2. Maximální parametry: 2
- Převede pravý parametr tak, aby odpovídal typu levého parametru. Chyby v případě selhání převodu
- Porovnání řadových případů přeskakování u řetězců
- Příklad:
lt(2, 5)(vrátí hodnotu True)
severovýchod
-
TrueVyhodnotí, jestli se parametry nerovnají. - Minimální parametry: 2. Maximální parametry: 2
- Převede pravý parametr tak, aby odpovídal typu levého parametru. Vrátí
True, pokud převod selže. - Porovnání řadových případů přeskakování u řetězců
- Příklad:
ne(1, 2)(vrátí hodnotu True)
ne
- Vyhodnocuje
True, jestliže je parametrFalse - Minimální parametry: 1. Maximální parametry: 1
- Převede hodnotu na logickou hodnotu pro vyhodnocení.
- Příklad:
not(eq(1, 2))(vrátí hodnotu True)
Moderátor
- Vyhodnotí, jestli se levý parametr nerovná
Truežádnému správnému parametru. - Minimální parametry: 1. Maximální parametry: N
- Převede správné parametry tak, aby odpovídaly typu levého parametru. Porovnání rovnosti se vyhodnotí pouze tehdy, pokud převod selže.
- Porovnání řadových případů přeskakování u řetězců
- Přeruší se po první shodě
- Příklad:
notIn('D', 'A', 'B', 'C')(vrátí hodnotu True)
nebo
-
TrueVyhodnotí, jestli je některý parametrTrue - Minimální parametry: 2. Maximální parametry: N
- Převádí parametry na logické hodnoty k účelům vyhodnocení.
- Zkraty po prvním
True - Příklad:
or(eq(1, 1), eq(2, 3))(vrátí hodnotu True, předčasně ukončuje)
nahradit
- Vrátí nový řetězec, ve kterém jsou všechny instance řetězce v aktuální instanci nahrazeny jiným řetězcem.
- Minimální parametry: 3. Maximální parametry: 3
-
replace(a, b, c): vrátí a, kde jsou všechny instance b nahrazeny c. - Příklad:
replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server')(vrátíhttp://server/saml/consume)
rozdělit
- Rozdělí řetězec na podřetězce na základě zadaných oddělovacích znaků.
- Minimální parametry: 2. Maximální parametry: 2
- Prvním parametrem je řetězec, který se má rozdělit.
- Druhý parametr je oddělovač znaků.
- Vrátí pole podřetězců. Pole obsahuje prázdné řetězce, když se oddělovací znaky objeví po sobě nebo na konci řetězce.
- Příklad:
variables: - name: environments value: prod1,prod2 steps: - ${{ each env in split(variables.environments, ',')}}: - script: ./deploy.sh --environment ${{ env }} - Příklad použití funkce split() s replace():
parameters: - name: resourceIds type: object default: - /subscriptions/mysubscription/resourceGroups/myResourceGroup/providers/Microsoft.Network/loadBalancers/kubernetes-internal - /subscriptions/mysubscription02/resourceGroups/myResourceGroup02/providers/Microsoft.Network/loadBalancers/kubernetes - name: environments type: object default: - prod1 - prod2 trigger: - main steps: - ${{ each env in parameters.environments }}: - ${{ each resourceId in parameters.resourceIds }}: - script: echo ${{ replace(split(resourceId, '/')[8], '-', '_') }}_${{ env }}
začínáNa
-
TrueVyhodnotí, jestli levý řetězec parametru začíná správným parametrem. - Minimální parametry: 2. Maximální parametry: 2
- Přetypuje parametry na řetězec za účelem vyhodnocení.
- Provede porovnání řadových případů ignorování.
- Příklad:
startsWith('ABCDE', 'AB')(vrátí hodnotu True)
stříhat
- Vrátí parametr bez úvodních a koncových prázdných znaků.
- Minimální parametry: 1. Maximální parametry: 1
- Příklad:
trim(' variable ')vrátí 'proměnnou'.
horní
- Převede řetězec nebo proměnnou hodnotu na všechna velká písmena.
- Minimální parametry: 1. Maximální počet parametrů 1
- Vrátí řetězec převedený na velká písmena.
- Příklad:
upper('bah')vrátíBAH
Xor
-
TrueVyhodnotí, zda je právě jeden parametrTrue - Minimální parametry: 2. Maximální parametry: 2
- Převádí parametry na logické hodnoty k účelům vyhodnocení.
- Příklad:
xor(True, False)(vrátí hodnotu True)
Funkce kontroly stavu úlohy
Následující funkce kontroly stavu můžete použít jako výrazy v podmínkách, ale ne v definicích proměnných.
vždy
- Vždy se vyhodnotí jako
True(i když je zrušeno). Poznámka: Kritická chyba může stále bránit spuštění úlohy. Pokud se například nepodařilo získat zdroje.
zrušený
- Vyhodnotí se na
True, jestli byl datový tok zrušen.
selhalo
- Pro krok, který odpovídá
eq(variables['Agent.JobStatus'], 'Failed'). - Pro práci:
- Bez uvedení argumentů se vyhodnotí
Truepouze v případě, že jakákoli předchozí úloha v grafu závislostí neuspěla. - Vyhodnocuje se na
True, pokud jeden z těchto úloh selhal a názvy úloh jsou zadány jako argumenty.
- Bez uvedení argumentů se vyhodnotí
uspěl
- V případě kroku, který odpovídá
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues') - Při práci s úlohami použijte
dependsOn, chcete-li vyhodnotit, zda byla předchozí úloha úspěšná. Úlohy jsou navržené tak, aby běžely paralelně, zatímco fáze běží postupně. - Pro práci:
- Vyhodnocuje se k
Truepouze tehdy, když nemá argumenty a všechny předchozí úlohy v grafu závislostí byly zcela nebo částečně úspěšné. - Pokud názvy úloh použijeme jako argumenty, vyhodnotí se na
True, jestliže všechny tyto úlohy byly úspěšné nebo částečně úspěšné. - Vyhodnotí se jako
False, pokud je potrubí zrušeno.
- Vyhodnocuje se k
úspěšnýneboNeúspěšný
V případě kroku, který odpovídá
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed')Pro práci:
- Bez argumentů se hodnotí jako
Truebez ohledu na to, zda nějaké úlohy v grafu závislostí uspěly nebo selhaly. - Při použití názvů úloh jako argumentů se vyhodnotí
True, jestli některé z těchto úloh proběhly úspěšně nebo selhaly. - Místo toho můžete chtít použít
not(canceled()), když v grafu závislostí existují předchozí přeskočené úlohy.
To je podobné
always(), kromě toho, že seFalsevyhodnotí, když je kanál zrušen.- Bez argumentů se hodnotí jako
Podmíněné vložení
Pomocí klauzulí if, elseif a else můžete podmíněně přiřadit hodnoty proměnných nebo nastavit vstupy pro úkoly. Podmíněně můžete spustit krok, když je splněna podmínka.
Můžete použít if k podmíněnému přiřazení proměnných hodnot nebo nastavení vstupů pro úkoly. Podmíněně můžete spustit krok, když je splněna podmínka.
Klauzule elseif a else klauzule jsou dostupné od Azure DevOps 2022 a nejsou k dispozici pro Azure DevOps Server 2020 a starší verze Azure DevOps.
Podmíněné podmínky fungují jenom při použití syntaxe šablony. Přečtěte si další informace o syntaxi proměnných.
U šablon můžete při přidávání sekvence nebo mapování použít podmíněné vložení. Přečtěte si další informace o podmíněném vkládání v šablonách.
Podmíněné přiřazení proměnné
variables:
${{ if eq(variables['Build.SourceBranchName'], 'main') }}: # only works if you have a main branch
stageName: prod
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo ${{variables.stageName}}
Podmíněné nastavení vstupu úkolu
pool:
vmImage: 'ubuntu-latest'
steps:
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)'
${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
artifact: 'prod'
${{ else }}:
artifact: 'dev'
publishLocation: 'pipeline'
Podmíněné provedení kroku
Pokud neexistuje žádná proměnná sada nebo hodnota foo neodpovídá if podmínkám, else příkaz se spustí. Tady hodnota foo vrátí hodnotu true v podmínce elseif .
variables:
- name: foo
value: contoso # triggers elseif condition
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "start"
- ${{ if eq(variables.foo, 'adaptum') }}:
- script: echo "this is adaptum"
- ${{ elseif eq(variables.foo, 'contoso') }}: # true
- script: echo "this is contoso"
- ${{ else }}:
- script: echo "the value is not adaptum or contoso"
Každé klíčové slovo
Klíčové slovo each můžete použít pro iteraci parametrů s typem objektu.
parameters:
- name: listOfStrings
type: object
default:
- one
- two
steps:
- ${{ each value in parameters.listOfStrings }}:
- script: echo ${{ value }}
Kromě toho můžete iterovat vnořenými prvky v rámci objektu.
parameters:
- name: listOfFruits
type: object
default:
- fruitName: 'apple'
colors: ['red','green']
- fruitName: 'lemon'
colors: ['yellow']
steps:
- ${{ each fruit in parameters.listOfFruits }} :
- ${{ each fruitColor in fruit.colors}} :
- script: echo ${{ fruit.fruitName}} ${{ fruitColor }}
Závislosti
Výrazy můžou použít kontext závislostí k odkazování na předchozí úlohy nebo fáze. Pomocí závislostí můžete:
- Odkaz na stav předchozí úlohy
- Odkaz na stav předchozí fáze
- Odkaz na výstupní proměnné v předchozí úloze ve stejné fázi
- Odkazovat na výstupní proměnné v předchozí fázi jedné fáze
- Odkazovat na výstupní proměnné úlohy z předchozí fáze v následující fázi.
Kontext se volá dependencies pro úlohy a fáze a funguje podobně jako proměnné.
Pokud odkazujete na výstupní proměnnou z úlohy v jiné fázi, stageDependencies se nazývá kontext.
Pokud máte problémy s výstupními proměnnými s uvozovkami (' nebo ") v nich, prohlédněte si tohoto průvodce odstraňováním potíží.
Přehled syntaxe závislostí
Syntaxe odkazování na výstupní proměnné se závislostmi se liší v závislosti na okolnostech. Tady je přehled nejběžnějších scénářů. Někdy může docházet i k tomu, že alternativní syntaxe funguje.
Typ
Popis
závislost mezi fázemi (různé fáze)
Odkazování na výstupní proměnnou z předchozí fáze v úloze, která je v jiné fázi v rámci podmínky v stages.
- Syntaxe:
and(succeeded(), eq(stageDependencies.<stage-name>.outputs['<job-name>.<step-name>.<variable-name>'], 'true')) - Příklad:
and(succeeded(), eq(stageDependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
závislost mezi úlohami (stejná fáze)
Odkazujte na výstupní proměnnou v jiné úloze v rámci stejné fáze v stages.
- Syntaxe:
and(succeeded(), eq(dependencies.<job-name>.outputs['<step-name>.<variable-name>'], 'true')) - Příklad:
and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
Závislost úlohy na fázích (různé fáze)
Odkaz na výstupní proměnnou v jiné fázi v objektu job.
- Syntaxe:
eq(stageDependencies.<stage-name>.<job-name>.outputs['<step-name>.<variable-name>'], 'true') - Příklad:
eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
Závislost mezi fázemi (úloha nasazení)
Odkaz na výstupní proměnnou v úloze nasazení v jiném kroku v stages.
- Syntaxe:
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<deployment-job-name>.<step-name>.<variable-name>'], 'true') - Příklad:
eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
Závislost mezi etapami (úloha nasazení s prostředkem)
Odkazujte na výstupní proměnnou v úloze nasazení, která zahrnuje prostředek v jiné fázi v stages.
- Syntaxe:
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<Deploy_resource-name>.<step-name>.<variable-name>'], 'true') - Příklad:
eq(dependencies.build.outputs['build_job.Deploy_winVM.setRunTests.runTests'], 'true')
V úlohách nasazení existují také různé syntaxe pro výstupní proměnné v závislosti na strategii nasazení. Další informace najdete v tématu Úlohy nasazení.
Závislosti mezi fázemi
Objekt dependencies je strukturovaně mapou, která přiřazuje názvy úloh a fází k results a outputs.
Vyjádřeno jako JSON by vypadalo takto:
"dependencies": {
"<STAGE_NAME>" : {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"jobName.stepName.variableName": "value"
}
},
"...": {
// another stage
}
}
Poznámka:
Následující příklady používají standardní syntaxi pipeline. Pokud používáte kanály nasazení, syntaxe proměnných i podmíněných proměnných se bude lišit. Informace o konkrétní syntaxi, která se má použít, najdete v tématu Úlohy pro nasazení.
Pomocí této formy dependencies můžete mapovat proměnné nebo kontrolovat podmínky na úrovni fáze.
V tomto příkladu existují dvě fáze, A a B. Fáze A má podmínku false a v důsledku toho se nikdy nespustí. Fáze B se spustí, pokud je Succeededvýsledek fáze A , SucceededWithIssuesnebo Skipped. Fáze B běží, protože fáze A byla vynechána.
stages:
- stage: A
condition: false
jobs:
- job: A1
steps:
- script: echo Job A1
- stage: B
condition: in(dependencies.A.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
jobs:
- job: B1
steps:
- script: echo Job B1
Fáze můžou také používat výstupní proměnné z jiné fáze.
V tomto příkladu existují také dvě fáze. Fáze A obsahuje úlohu A1, která nastaví výstupní proměnnou shouldrun na true. Fáze B se spustí, když shouldrun je true. Protože je shouldruntrue, běží fáze B.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependsOn: A
jobs:
- job: B1
steps:
- script: echo hello from Stage B
Poznámka:
Ve výchozím nastavení každá fáze v pipeline závisí na předchozí fázi v souboru YAML.
Pokud potřebujete odkazovat na fázi, která není bezprostředně před aktuální fází, můžete tuto automatickou výchozí hodnotu přepsat přidáním dependsOn oddílu do fáze.
Závislosti mezi úlohami v rámci jedné fáze
Na úrovni úlohy v jedné fázi data dependencies neobsahují informace na úrovni fáze.
"dependencies": {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value1"
}
},
"...": {
// another job
}
}
V tomto příkladu existují tři úlohy (a, b a a c). Práce a bude vždy přeskočena kvůli condition: false.
Úloha b se spouští, protože neexistují žádné přidružené podmínky.
Úloha c se spustí, protože všechny její závislosti buď se vykonají úspěšně (úloha b), nebo jsou přeskočeny (úloha a).
jobs:
- job: a
condition: false
steps:
- script: echo Job a
- job: b
steps:
- script: echo Job b
- job: c
dependsOn:
- a
- b
condition: |
and
(
in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
)
steps:
- script: echo Job c
V tomto příkladu úloha B závisí na výstupní proměnné z úlohy A.
jobs:
- job: A
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- job: B
condition: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
dependsOn: A
steps:
- script: echo hello from B
Závislosti úloh napříč fázemi
Na úrovni úlohy můžete také odkazovat na výstupy z úlohy v předchozí fázi.
To vyžaduje použití stageDependencies kontextu.
"stageDependencies": {
"<STAGE_NAME>" : {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value"
}
},
"...": {
// another job
}
},
"...": {
// another stage
}
}
V tomto příkladu se úloha B1 spustí, pokud je úloha A1 vynechána. Úloha B2 zkontroluje hodnotu výstupní proměnné z úlohy A1 a určí, jestli se má spustit.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
dependsOn: A
jobs:
- job: B1
condition: in(stageDependencies.A.A1.result, 'Skipped') # change condition to `Succeeded and stage will be skipped`
steps:
- script: echo hello from Job B1
- job: B2
condition: eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
steps:
- script: echo hello from Job B2
Pokud úloha závisí na proměnné definované úlohou nasazení v jiné fázi, syntaxe se liší. V následujícím příkladu se úloha run_tests spustí, pokud úloha nasazení build_job nastaví runTests na true. Všimněte si, že klíč použitý pro outputs slovník je build_job.setRunTests.runTests.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
jobs:
- job: run_tests
condition: eq(stageDependencies.build.build_job.outputs['build_job.setRunTests.runTests'], 'true')
steps:
...
Výstupní proměnné úlohy nasazení
Pokud fáze závisí na proměnné definované úlohou nasazení v jiné fázi, syntaxe se liší. V následujícím příkladu fáze test závisí na nasazení build_job nastavení shouldTest na true. Všimněte si, že v condition fázi test se build_job objeví dvakrát.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: Production
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
jobs:
- job: A
steps:
- script: echo Hello from job A
V předchozím příkladu podmínka odkazuje na prostředí, nikoli na prostředek prostředí. Pokud chcete odkazovat na prostředek prostředí, budete muset přidat název prostředku prostředí do podmínky závislostí. V následujícím příkladu podmínka odkazuje na prostředek virtuálního počítače v prostředí s názvem vmtest.
stages:
- stage: build
jobs:
- deployment: build_job
environment:
name: vmtest
resourceName: winVM2
resourceType: VirtualMachine
strategy:
runOnce:
deploy:
steps:
- task: PowerShell@2
name: setRunTests
inputs:
targetType: inline
pwsh: true
script: |
$runTests = "true"
echo "setting runTests: $runTests"
echo "##vso[task.setvariable variable=runTests;isOutput=true]$runTests"
- stage: test
dependsOn:
- 'build'
condition: eq(dependencies.build.outputs['build_job.Deploy_winVM2.setRunTests.runTests'], 'true')
jobs:
- job: A
steps:
- script: echo Hello from job A
Filtrovaná pole
Pokud pracujete s kolekcí položek, můžete pomocí syntaxe použít * filtrované pole. Filtrované pole vrátí všechny objekty/prvky bez ohledu na jejich názvy.
Jako příklad zvažte pole objektů pojmenovaných foo. Chceme získat pole hodnot vlastnosti v každém objektu id v naší matici.
[
{ "id": 1, "a": "avalue1"},
{ "id": 2, "a": "avalue2"},
{ "id": 3, "a": "avalue3"}
]
Mohli bychom udělat toto:
foo.*.id
Tím systému řeknete, aby pracoval s foo jako s filtrovaným polem a poté vybral vlastnost id.
To by se vrátilo:
[ 1, 2, 3 ]
Přetypování
Hodnoty ve výrazu mohou být převedeny z jednoho typu na jiný, protože se výraz vyhodnotí. Při vyhodnocení výrazu se parametry převedou na příslušný datový typ a pak jsou opět převedeny na řetězce.
Například v tomto YAML se hodnoty True a False jsou převedeny na 1 a 0 při vyhodnocení výrazu.
Funkce lt() se vrátí True , když je levý parametr menší než pravý parametr.
variables:
firstEval: $[lt(False, True)] # 0 vs. 1, True
secondEval: $[lt(True, False)] # 1 vs. 0, False
steps:
- script: echo $(firstEval)
- script: echo $(secondEval)
Když výraz použijete eq() k vyhodnocení ekvivalence, hodnoty se implicitně převedou na čísla (false na 0 a true na 1).
variables:
trueAsNumber: $[eq('true', true)] # 1 vs. 1, True
falseAsNumber: $[eq('false', true)] # 0 vs. 1, False
steps:
- script: echo $(trueAsNumber)
- script: echo $(falseAsNumber)
V tomto dalším příkladu se hodnoty variables.emptyString a prázdný řetězec vyhodnotí jako prázdné řetězce.
Funkce coalesce() vyhodnotí parametry v pořadí a vrátí první hodnotu, která se nerovná hodnotě null nebo prázdný řetězec.
variables:
coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]
steps:
- script: echo $(coalesceLiteral) # outputs literal value
Níže jsou uvedena podrobná pravidla převodu.
| Od / Do | logický | Nula | Číslo | Řetězec | Verze |
|---|---|---|---|---|---|
| Booleova logika | - | - | Ano | Ano | - |
| Nula | Ano | - | Ano | Ano | - |
| Počet | Ano | - | - | Ano | Částečná |
| Řetězec | Ano | Částečná | Částečná | - | Částečná |
| Verze | Ano | - | - | Ano | - |
logický
Na číslo:
-
False→0 -
True→1
Do řetězce:
-
False→'False' -
True→'True'
Nula
- Na logickou hodnotu:
False - Na číslo:
0 - Na řetězec:
''(prázdný řetězec)
Číslo
- Na Boolean:
0→False, všechna ostatní čísla →True - K verzi: Musí být větší než nula a musí obsahovat desetinné číslo, které není nula. Musí být menší než Int32.MaxValue (včetně desetinné části).
- Na řetězec: Převede číslo na řetězec bez oddělovače tisíců a bez oddělovače desetinných míst.
Řetězec
- Převod na logickou hodnotu:
''(prázdný řetězec) →False, jakýkoli jiný řetězec →True - Na hodnotu null:
''(prázdný řetězec) →Null, jakýkoli jiný řetězec není konvertibilní. - Číslování:
''(prázdný řetězec) → 0, v opačném případě se použije funkce C#Int32.TryParses využitím InvariantCulture a podle následujících pravidel: AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | AllowTrailingWhite. PokudTryParsedojde k chybě, pak nelze převést. - Pro verzi: spouští C#
Version.TryParse. Musí obsahovat minimálně Hlavní a Vedlejší komponentu. PokudTryParsedojde k chybě, pak nelze převést.
Verze
- Na logickou hodnotu:
True - Řetězec: Major.Minor nebo Major.Minor.Build nebo Major.Minor.Build.Revision.
časté otázky
Chci udělat něco, co například programovací výrazy nepodporují. Jaké možnosti mám pro rozšíření funkcí Pipelines?
Můžete přizpůsobit svou Pipeline pomocí skriptu, který obsahuje výraz. Tento fragment kódu například vezme proměnnou BUILD_BUILDNUMBER a rozdělí ji pomocí bashe. Tento skript vypíše dvě nové proměnné, $MAJOR_RUN a $MINOR_RUN, pro hlavní a vedlejší čísla spuštění.
Dvě proměnné se pak použijí k vytvoření dvou proměnných v rámci pipeline, $major a $minor pomocí task.setvariable. Tyto proměnné jsou k dispozici pro podřízené kroky. Pokud chcete sdílet proměnné mezi kanály, podívejte se na skupiny proměnných.
steps:
- bash: |
MAJOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f1)
echo "This is the major run number: $MAJOR_RUN"
echo "##vso[task.setvariable variable=major]$MAJOR_RUN"
MINOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f2)
echo "This is the minor run number: $MINOR_RUN"
echo "##vso[task.setvariable variable=minor]$MINOR_RUN"
- bash: echo "My pipeline variable for major run is $(major)"
- bash: echo "My pipeline variable for minor run is $(minor)"