식
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Important
플랫폼 및 버전에 해당하는 이 문서의 버전을 선택합니다. 버전 선택기가 목차 위에 있습니다. Azure DevOps 플랫폼 및 버전을 조회합니다.
식은 파이프라인을 작성할 때 문자열, 부울 또는 숫자 값을 지정해야 하는 여러 위치에서 사용할 수 있습니다. 식이 배열을 반환하면 일반 인덱싱 규칙이 적용되고 인덱스가 .로 0
시작됩니다.
식의 가장 일반적인 사용은 작업 또는 단계를 실행할지 여부를 결정하는 조건 입니다.
# Expressions are used to define conditions for a step, job, or stage
steps:
- task: ...
condition: <expression>
식의 또 다른 일반적인 사용은 변수를 정의하는 것입니다.
컴파일 시 또는 런타임에 식을 평가할 수 있습니다.
컴파일 시간 식은 어디서나 사용할 수 있습니다. 런타임 식은 변수 및 조건에서 사용할 수 있습니다. 런타임 식은 변수 및 상태의 내용을 계산하는 방법으로 사용됩니다(예: 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> ]
런타임과 컴파일 시간 식 구문의 차이점은 주로 사용 가능한 컨텍스트입니다.
컴파일 시간 식()${{ <expression> }}
에서는 정적으로 정의된 variables
액세스 권한이 parameters
있습니다.
런타임 식($[ <expression> ]
)에서는 매개 변수를 제외한 더 많은 variables
항목에 액세스할 수 있습니다.
이 예제에서 런타임 식은 의 값을 $(isMain)
설정합니다. 컴파일 식의 정적 변수는 의 값을 $(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
식은 리터럴, 변수에 대한 참조, 종속성에 대한 참조, 함수 또는 이러한 중첩된 유효한 조합일 수 있습니다.
리터럴
식의 일부로 부울, null, 숫자, 문자열 또는 버전 리터럴을 사용할 수 있습니다.
# Examples
variables:
someBoolean: ${{ true }} # case insensitive, so True or TRUE also works
someNumber: ${{ -1.2 }}
someString: ${{ 'a b c' }}
someVersion: ${{ 1.2.3 }}
Boolean
True
부 False
울 리터럴 식입니다.
Null
Null은 사전 누락에서 반환되는 특수 리터럴 식입니다(예: (variables['noSuch']
). Null은 식의 출력일 수 있지만 식 내에서 직접 호출할 수는 없습니다.
number
'-', '.' 또는 '0'에서 '9'로 시작합니다.
문자열
작은따옴표로 묶어야 합니다. 예: 'this is a string'
리터럴 작은따옴표를 표현하려면 작은따옴표로 이스케이프합니다.
예: 'It''s OK if they''re using contractions.'
여러 줄 문자열에 파이프 문자(|
)를 사용할 수 있습니다.
myKey: |
one
two
three
버전
최대 4개의 세그먼트가 있는 버전 번호입니다.
숫자로 시작하고 2~3개의 마침표(.
) 문자를 포함해야 합니다.
예: 1.2.3.4
변수
식의 일부로 다음 두 구문 중 하나를 사용하여 변수에 액세스할 수 있습니다.
- 인덱스 구문:
variables['MyVar']
- 속성 역참조 구문:
variables.MyVar
속성 역참조 구문을 사용하려면 속성 이름이 다음을 만족해야 합니다.
- 시작 또는
a-Z
_
- 다음에 오
a-Z
0-9
거나_
실행 컨텍스트에 따라 다양한 변수를 사용할 수 있습니다.
- YAML 을 사용하여 파이프라인을 만드는 경우 파이프라인 변수를 사용할 수 있습니다.
- 클래식 편집 기를 사용하여 빌드 파이프라인을 만드는 경우 빌드 변수를 사용할 수 있습니다.
- 클래식 편집 기를 사용하여 릴리스 파이프라인을 만드는 경우 릴리스 변수를 사용할 수 있습니다.
변수는 항상 문자열입니다. 형식화된 값을 사용하려면 매개 변수를 대신 사용해야 합니다.
참고 항목
변수 탭 UI를 통해 이러한 변수를 설정할 때 클래식 및 YAML 파이프라인 모두에 대한 식과 함께 변수를 사용하는 데는 제한이 있습니다. 식으로 정의된 변수는 두 식이 모두 제대로 평가된다는 보장이 없기 때문에 값이 있는 식이 있는 다른 변수에 의존해서는 안 됩니다. 예를 들어 해당 값이 변수 a
값 $[ <expression> ]
의 일부로 사용되는 변수가 있습니다 b
. 변수 처리 순서가 보장 b
되지 않으므로 변수는 평가 후 잘못된 변수 a
값을 가질 수 있습니다.
설명된 생성은 YAML 파이프라인에서 변수 키워드를 통해 변수를 설정하는 동안에만 허용됩니다. 처리 후 올바른 값을 가져오기 위해 처리해야 하는 순서대로 변수를 배치해야 합니다.
함수
식에서 사용할 수 있는 기본 제공 함수는 다음과 같습니다.
및
- 모든 매개 변수가
True
True
- 최소 매개 변수: 2. 최대 매개 변수: N
- 평가를 위해 매개 변수를 부울로 캐스팅합니다.
- 첫 번째 후 단락
False
- 예:
and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))
coalesce
- 매개 변수를 순서대로 계산하고(왼쪽에서 오른쪽) null 또는 빈 문자열과 같지 않은 첫 번째 값을 반환합니다.
- 매개 변수 값이 모두 null이거나 빈 문자열이면 값이 반환되지 않습니다.
- 최소 매개 변수: 2. 최대 매개 변수: N
- 예:
coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')
contains
- 왼쪽 매개 변수 문자열에
True
오른쪽 매개 변수가 포함되어 있는지 평가합니다. - 최소 매개 변수: 2. 최대 매개 변수: 2
- 평가를 위해 매개 변수를 String으로 캐스팅
- 서수 무시 대/소문자 비교 수행
- 예:
contains('ABCDE', 'BCD')
(True를 반환합니다.)
containsValue
True
왼쪽 매개 변수가 배열이고 항목이 오른쪽 매개 변수와 같은지 평가합니다. 또한 왼쪽 매개 변수가 개체이고 속성 값이 오른쪽 매개 변수와 같은지 평가True
합니다.- 최소 매개 변수: 2. 최대 매개 변수: 2
- 왼쪽 매개 변수가 배열인 경우 각 항목을 오른쪽 매개 변수의 형식과 일치하도록 변환합니다. 왼쪽 매개 변수가 개체인 경우 각 속성의 값을 오른쪽 매개 변수의 형식과 일치하도록 변환합니다. 각 특정 항목에 대한 같음 비교는
False
변환이 실패하면 평가됩니다. - 문자열에 대한 서수 무시 대/소문자 비교
- 첫 번째 경기 후 단락
참고 항목
배열을 지정하기 위한 YAML 파이프라인에는 리터럴 구문이 없습니다. 이 함수는 일반 파이프라인에서만 사용할 수 있습니다. 단계 목록과 같은 시스템 제공 배열과 함께 파이프라인 데코레이터 컨텍스트에서 사용하기 위한 것입니다.
식을 사용하여 containsValue
개체에서 일치하는 값을 찾을 수 있습니다. 다음은 일치 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"
convertToJson
- 복잡한 개체를 가져와 JSON으로 출력합니다.
- 최소 매개 변수: 1. 최대 매개 변수: 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) }}
스크립트 출력:
{
"this_is": {
"a_complex": "object",
"with": [
"one",
"two"
]
}
}
counter
- 이 함수는 변수를 정의하는 식에서만 사용할 수 있습니다. 단계, 작업 또는 스테이지에 대한 조건의 일부로 사용할 수 없습니다.
- 파이프라인의 각 실행에 따라 증가하는 숫자를 평가합니다.
- 매개 변수: 2.
prefix
및seed
. - 접두사는 문자열 식입니다. 접두사 고유 값마다 별도의 카운터 값이 추적됩니다. UTF-16
prefix
자를 사용해야 합니다. - 초기값은 카운터의 시작 값입니다.
파이프라인의 각 실행에서 하나씩 자동으로 증가되는 카운터를 만들 수 있습니다. 카운터를 정의할 때 a 및 a prefix
seed
를 제공합니다. 이를 보여 주는 예제는 다음과 같습니다.
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)
파이프라인의 minor
첫 번째 실행에서 위의 예제의 값은 100입니다. 두 번째 실행에서는 값 major
이 여전히 1인 경우 101입니다.
YAML 파일을 편집하고 변수 major
값을 2로 업데이트하는 경우 파이프라인의 다음 실행에서 값 minor
은 100이 됩니다. 후속 실행은 카운터를 101, 102, 103, ...
나중에 YAML 파일을 편집하고 값을 major
다시 1로 설정하면 카운터 값이 해당 접두사에 대해 중단된 위치에서 다시 시작됩니다. 이 예제에서는 102에서 다시 시작합니다.
다음은 100에서 시작하여 매 실행마다 1씩 증가하며 매일 100으로 다시 설정되는 카운터 역할을 하도록 변수를 설정하는 또 다른 예입니다.
참고 항목
pipeline.startTime
은 식 외부에서 사용할 수 없습니다. pipeline.startTime
형식을 system.pipelineStartTime
날짜 및 시간 개체로 지정하여 식으로 작업할 수 있도록 합니다.
기본 표준 시간대 pipeline.startTime
는 UTC입니다. 조직의 표준 시간대를 변경할 수 있습니다.
jobs:
- job:
variables:
a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
steps:
- bash: echo $(a)
다음은 PR 및 CI 실행에 대해 별도의 값을 유지하는 카운터를 사용하는 예제입니다.
variables:
patch: $[counter(variables['build.reason'], 0)]
카운터는 파이프라인으로 범위가 지정됩니다. 즉, 해당 파이프라인의 각 실행에 대해 해당 값이 증가합니다. 프로젝트 범위 카운터가 없습니다.
endsWith
- 왼쪽 매개 변수 String이
True
오른쪽 매개 변수로 끝나는지 평가합니다. - 최소 매개 변수: 2. 최대 매개 변수: 2
- 평가를 위해 매개 변수를 String으로 캐스팅
- 서수 무시 대/소문자 비교 수행
- 예:
endsWith('ABCDE', 'DE')
(True를 반환합니다.)
eq
- 매개 변수가 같은지 평가합니다.
True
- 최소 매개 변수: 2. 최대 매개 변수: 2
- 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 반환
False
합니다. - 문자열에 대한 서수 무시 대/소문자 비교
- 예:
eq(variables.letters, 'ABC')
format
- 후행 매개 변수를 평가하고 선행 매개 변수 문자열에 삽입합니다.
- 최소 매개 변수: 1. 최대 매개 변수: N
- 예:
format('Hello {0} {1}', 'John', 'Doe')
- 날짜 서식 지정에 .NET 사용자 지정 날짜 및 시간 형식 지정자를 사용합니다(, ,
yy
,M
MM
,d
dd
,HH
,H
m
,ss
mm
,ff
f
s
, )K
ffff
yyyy
- 예:
format('{0:yyyyMMdd}', pipeline.startTime)
이 경우pipeline.startTime
특별한 날짜 시간 개체 변수입니다. - 중괄호를 두 배로 늘려 이스케이프합니다. 예:
format('literal left brace {{ and literal right brace }}')
ge
- 왼쪽 매개 변수가
True
오른쪽 매개 변수보다 크거나 같은지 평가합니다. - 최소 매개 변수: 2. 최대 매개 변수: 2
- 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 오류가 발생합니다.
- 문자열에 대한 서수 무시 대/소문자 비교
- 예:
ge(5, 5)
(True를 반환합니다.)
gt
- 왼쪽 매개 변수가
True
오른쪽 매개 변수보다 큰지 평가합니다. - 최소 매개 변수: 2. 최대 매개 변수: 2
- 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 오류가 발생합니다.
- 문자열에 대한 서수 무시 대/소문자 비교
- 예:
gt(5, 2)
(True를 반환합니다.)
in
- 왼쪽 매개 변수가
True
오른쪽 매개 변수와 같은지 평가합니다. - 최소 매개 변수: 1. 최대 매개 변수: N
- 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 같음 비교는 변환이
False
실패하면 평가됩니다. - 문자열에 대한 서수 무시 대/소문자 비교
- 첫 번째 경기 후 단락
- 예:
in('B', 'A', 'B', 'C')
(True를 반환합니다.)
join
- 오른쪽 매개 변수 배열의 모든 요소를 왼쪽 매개 변수 문자열로 구분하여 연결합니다.
- 최소 매개 변수: 2. 최대 매개 변수: 2
- 배열의 각 요소는 문자열로 변환됩니다. 복합 개체는 빈 문자열로 변환됩니다.
- 올바른 매개 변수가 배열이 아닌 경우 결과는 문자열로 변환된 올바른 매개 변수입니다.
이 예제에서는 배열의 각 항목 사이에 세미콜론이 추가됩니다. 매개 변수 형식이 개체입니다.
parameters:
- name: myArray
type: object
default:
- FOO
- BAR
- ZOO
variables:
A: ${{ join(';',parameters.myArray) }}
steps:
- script: echo $A # outputs FOO;BAR;ZOO
le
- 왼쪽 매개 변수가
True
오른쪽 매개 변수보다 작거나 같은지 평가합니다. - 최소 매개 변수: 2. 최대 매개 변수: 2
- 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 오류가 발생합니다.
- 문자열에 대한 서수 무시 대/소문자 비교
- 예:
le(2, 2)
(True를 반환합니다.)
length
- 시스템에서 제공되거나 매개 변수에서 가져온 문자열 또는 배열의 길이를 반환합니다.
- 최소 매개 변수: 1. 최대 매개 변수 1
- 예:
length('fabrikam')
8을 반환합니다.
lower
- 문자열 또는 변수 값을 모든 소문자로 변환합니다.
- 최소 매개 변수: 1. 최대 매개 변수 1
- 문자열에 해당하는 소문자를 반환합니다.
- 예제:
lower('FOO')
반환foo
lt
- 왼쪽 매개 변수가
True
오른쪽 매개 변수보다 작은지 평가합니다. - 최소 매개 변수: 2. 최대 매개 변수: 2
- 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 오류가 발생합니다.
- 문자열에 대한 서수 무시 대/소문자 비교
- 예:
lt(2, 5)
(True를 반환합니다.)
ne
- 매개 변수가
True
같지 않은지 평가합니다. - 최소 매개 변수: 2. 최대 매개 변수: 2
- 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 반환
True
합니다. - 문자열에 대한 서수 무시 대/소문자 비교
- 예:
ne(1, 2)
(True를 반환합니다.)
not
- 매개 변수가
True
False
- 최소 매개 변수: 1. 최대 매개 변수: 1
- 평가를 위해 값을 부울로 변환합니다.
- 예:
not(eq(1, 2))
(True를 반환합니다.)
notIn
- 왼쪽 매개 변수가
True
오른쪽 매개 변수와 같지 않은지 평가합니다. - 최소 매개 변수: 1. 최대 매개 변수: N
- 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 같음 비교는 변환이
False
실패하면 평가됩니다. - 문자열에 대한 서수 무시 대/소문자 비교
- 첫 번째 경기 후 단락
- 예:
notIn('D', 'A', 'B', 'C')
(True를 반환합니다.)
또는
- 매개 변수가 있는지 평가합니다.
True
True
- 최소 매개 변수: 2. 최대 매개 변수: N
- 평가를 위해 매개 변수를 부울로 캐스팅합니다.
- 첫 번째 후 단락
True
- 예:
or(eq(1, 1), eq(2, 3))
(True, 단락 반환)
replace
- 현재 인스턴스에 있는 문자열의 모든 인스턴스가 다른 문자열로 대체되는 새 문자열을 반환합니다.
- 최소 매개 변수: 3. 최대 매개 변수: 3
replace(a, b, c)
: b의 모든 인스턴스가 c로 대체된 a를 반환합니다.- 예:
replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server')
(반환http://server/saml/consume
)
split
- 지정된 구분 문자에 따라 문자열을 부분 문자열로 분할합니다.
- 최소 매개 변수: 2. 최대 매개 변수: 2
- 첫 번째 매개 변수는 분할할 문자열입니다.
- 두 번째 매개 변수는 구분 문자입니다.
- 부분 문자열의 배열을 반환합니다. 구분 문자가 연속적으로 또는 문자열 끝에 표시되면 배열에 빈 문자열이 포함됩니다.
- 예:
variables: - name: environments value: prod1,prod2 steps: - ${{ each env in split(variables.environments, ',')}}: - script: ./deploy.sh --environment ${{ env }}
- replace()와 함께 split()를 사용하는 예:
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 }}
startsWith
- 왼쪽 매개 변수 문자열이
True
오른쪽 매개 변수로 시작하는지 평가합니다. - 최소 매개 변수: 2. 최대 매개 변수: 2
- 평가를 위해 매개 변수를 String으로 캐스팅
- 서수 무시 대/소문자 비교 수행
- 예:
startsWith('ABCDE', 'AB')
(True를 반환합니다.)
upper
- 문자열 또는 변수 값을 모든 대문자로 변환합니다.
- 최소 매개 변수: 1. 최대 매개 변수 1
- 문자열에 해당하는 대문자를 반환합니다.
- 예제:
upper('bah')
반환BAH
xor
- 매개 변수가 정확히 하나인지 평가합니다.
True
True
- 최소 매개 변수: 2. 최대 매개 변수: 2
- 평가를 위해 매개 변수를 부울로 캐스팅합니다.
- 예:
xor(True, False)
(True를 반환합니다.)
작업 상태 검사 함수
다음 상태 검사 함수를 조건의 식으로 사용할 수 있지만 변수 정의에는 사용할 수 없습니다.
항상
- 항상 계산됩니다
True
(취소된 경우에도). 참고: 심각한 오류로 인해 작업이 실행되지 않을 수 있습니다. 예를 들어 원본을 가져오지 못한 경우입니다.
취소됨
- 파이프라인이
True
취소되었는지 평가합니다.
실패
- 단계의 경우와 동일합니다
eq(variables['Agent.JobStatus'], 'Failed')
. - 작업의 경우:
- 인수가 없으면
True
종속성 그래프 이전 작업이 실패한 경우에만 계산됩니다. - 작업 이름을 인수로 사용하는 경우 해당 작업이 실패한 경우에만 평가
True
됩니다.
- 인수가 없으면
succeeded
- 단계의 경우와 동일합니다.
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues')
dependsOn
작업으로 작업할 때 사용하며 이전 작업이 성공했는지 여부를 평가하려고 합니다. 작업은 단계가 순차적으로 실행되는 동안 병렬로 실행되도록 설계되었습니다.- 작업의 경우:
- 인수가 없으면 종속성 그래프 모든 이전 작업이 성공했거나 부분적으로 성공한 경우에만 계산
True
됩니다. - 작업 이름을 인수로 사용하여 모든 작업이 성공했는지 또는 부분적으로 성공했는지 평가
True
합니다. - 파이프라인이
False
취소되었는지 평가합니다.
- 인수가 없으면 종속성 그래프 모든 이전 작업이 성공했거나 부분적으로 성공한 경우에만 계산
succeededOrFailed
단계의 경우와 동일합니다.
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed')
작업의 경우:
- 인수가 없으므로 종속성 그래프 작업이 성공했는지 또는 실패했는지 여부에 관계없이 평가
True
됩니다. - 작업 이름을 인수로 사용하여 해당 작업의 성공 또는 실패 여부를 평가
True
합니다. - 종속성 그래프 이전에 건너뛴 작업이 있는 경우 대신 사용할
not(canceled())
수 있습니다.
파이프라인이 취소될 때 평가
False
되는 것을 제외하고는 다음과 같습니다always()
.- 인수가 없으므로 종속성 그래프 작업이 성공했는지 또는 실패했는지 여부에 관계없이 평가
조건부 삽입
및 elseif
else
절을 사용하여 if
조건부로 변수 값을 할당하거나 작업에 대한 입력을 설정할 수 있습니다. 조건이 충족되면 단계를 조건부로 실행할 수도 있습니다.
변수 값을 조건부로 할당하거나 작업에 대한 입력을 설정하는 데 사용할 if
수 있습니다. 조건이 충족되면 단계를 조건부로 실행할 수도 있습니다.
및 else
절은 elseif
Azure DevOps 2022부터 사용할 수 있으며 Azure DevOps Server 2020 및 이전 버전의 Azure DevOps에서는 사용할 수 없습니다.
조건문은 템플릿 구문을 사용하는 경우에만 작동합니다. 변수 구문에 대해 자세히 알아봅니다.
템플릿의 경우 시퀀스 또는 매핑을 추가할 때 조건부 삽입을 사용할 수 있습니다. 템플릿의 조건부 삽입에 대해 자세히 알아봅니다.
조건부로 변수 할당
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}}
조건부로 작업 입력 설정
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'
조건부로 단계 실행
변수 집합이 없거나 값 foo
이 조건 else
과 일치하지 if
않으면 문이 실행됩니다. 여기서 조건의 foo
반환 값은 true입니다 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"
각 키워드
키워드를 each
사용하여 개체 형식의 매개 변수를 반복할 수 있습니다.
parameters:
- name: listOfStrings
type: object
default:
- one
- two
steps:
- ${{ each value in parameters.listOfStrings }}:
- script: echo ${{ value }}
또한 개체 내의 중첩된 요소를 반복할 수 있습니다.
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 }}
종속성
식은 종속성 컨텍스트를 사용하여 이전 작업 또는 단계를 참조할 수 있습니다. 종속성을 사용하여 다음을 수행할 수 있습니다.
- 이전 작업의 작업 상태 참조
- 이전 단계의 스테이지 상태 참조
- 동일한 단계에서 이전 작업의 출력 변수 참조
- 단계의 이전 단계에서 출력 변수 참조
- 다음 단계의 이전 단계에서 작업의 출력 변수 참조
컨텍스트는 작업 및 단계에 대해 호출 dependencies
되며 변수와 매우 유사하게 작동합니다.
다른 단계의 작업에서 출력 변수를 참조하는 경우 컨텍스트를 호출 stageDependencies
합니다.
출력 변수에 따옴표 문자('
또는"
)가 있는 문제가 발생하는 경우 이 문제 해결 가이드를 참조하세요.
종속성 구문 개요
종속성이 있는 출력 변수를 참조하는 구문은 상황에 따라 달라집니다. 다음은 가장 일반적인 시나리오에 대한 개요입니다. 대체 구문도 작동하는 경우가 있을 수 있습니다.
Type
설명
스테이지에서 스테이지 종속성 (다른 단계)
의 조건에 있는 다른 단계의 작업에서 이전 단계의 출력 변수를 참조합니다 stages
.
- 구문:
and(succeeded(), eq(stageDependencies.<stage-name>.outputs['<job-name>.<step-name>.<variable-name>'], 'true'))
- 예:
and(succeeded(), eq(stageDependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
작업-작업 종속성 (동일한 단계)
의 동일한 단계에서 다른 작업의 출력 변수를 참조합니다 stages
.
- 구문:
and(succeeded(), eq(dependencies.<job-name>.outputs['<step-name>.<variable-name>'], 'true'))
- 예:
and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
종속성을 스테이징하는 작업(다른 단계)
의 다른 단계에서 출력 변수를 참조합니다 job
.
- 구문:
eq(stageDependencies.<stage-name>.<job-name>.outputs['<step-name>.<variable-name>'], 'true')
- 예:
eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
단계별 종속성 (배포 작업)
의 다른 단계에서 배포 작업의 출력 변수를 참조합니다 stages
.
- 구문:
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<deployment-job-name>.<step-name>.<variable-name>'], 'true')
- 예:
eq(dependencies.build.outputs['build_job.build_job.setRunTests.runTests'], 'true')
단계별 종속성 (리소스를 사용하는 배포 작업)
의 다른 단계에 있는 리소스를 포함하는 배포 작업에서 출력 변수를 참조합니다 stages
.
- 구문:
eq(dependencies.<stage-name>.outputs['<deployment-job-name>.<Deploy_resource-name>.<step-name>.<variable-name>'], 'true')
- 예:
eq(dependencies.build.outputs['build_job.Deploy_winVM.setRunTests.runTests'], 'true')
배포 전략에 따라 배포 작업에서 출력 변수에 대한 구문도 다릅니다. 자세한 내용은 배포 작업을 참조 하세요.
스테이징-스테이징 종속성
구조적으로 dependencies
개체는 작업 및 단계 이름의 results
맵입니다 outputs
.
JSON으로 표현되는 모양은 다음과 같습니다.
"dependencies": {
"<STAGE_NAME>" : {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"jobName.stepName.variableName": "value"
}
},
"...": {
// another stage
}
}
참고 항목
다음 예제에서는 표준 파이프라인 구문을 사용합니다. 배포 파이프라인을 사용하는 경우 변수 및 조건부 변수 구문이 모두 다릅니다. 사용할 특정 구문에 대한 자세한 내용은 배포 작업을 참조 하세요.
이 형식을 dependencies
사용하여 변수에 매핑하거나 단계 수준에서 조건을 확인합니다.
이 예제에는 A와 B라는 두 단계가 있습니다. 스테이지 A에는 조건이 false
있으며 결과적으로 실행되지 않습니다. 스테이지 B는 Succeeded
SucceededWithIssues
스테이지 A의 결과가 < a0/a0> 또는 Skipped
.인 경우 실행됩니다. 스테이지 A를 건너뛰었으므로 B단계가 실행됩니다.
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
스테이지는 다른 단계의 출력 변수를 사용할 수도 있습니다.
이 예제에는 두 단계도 있습니다. 스테이지 A에는 출력 변수 shouldrun
true
를 .로 설정하는 작업 A1이 포함됩니다. 단계 B는 있는 true
경우 shouldrun
실행됩니다. 왜냐하면 B단계가 실행되고 있기 때문 shouldrun
입니다 true
.
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
참고 항목
기본적으로 파이프라인의 각 단계는 YAML 파일에서 바로 앞에 있는 단계에 따라 달라집니다.
현재 스테이지 바로 앞에 있지 않은 스테이지를 참조해야 하는 경우 스테이지에 섹션을 추가하여 이 자동 기본값을 dependsOn
재정의할 수 있습니다.
한 단계 내의 작업 간 종속성
단일 단계 내의 작업 수준에서 데이터에는 dependencies
단계 수준 정보가 포함되지 않습니다.
"dependencies": {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value1"
}
},
"...": {
// another job
}
}
이 예제에는 세 가지 작업(a, b 및 c)이 있습니다. 작업 A는 항상 condition: false
.
연결된 조건이 없으므로 작업 b가 실행됩니다.
모든 종속성이 성공하거나(작업 b) 건너뛰기 때문에 작업 c가 실행됩니다(작업 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
이 예제에서 작업 B는 작업 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
단계 간 작업 종속성
작업 수준에서 이전 단계의 작업에서 출력을 참조할 수도 있습니다.
이를 위해서는 컨텍스트를 stageDependencies
사용해야 합니다.
"stageDependencies": {
"<STAGE_NAME>" : {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value"
}
},
"...": {
// another job
}
},
"...": {
// another stage
}
}
이 예제에서는 작업 A1을 건너뛰면 작업 B1이 실행됩니다. 작업 B2는 작업 A1의 출력 변수 값을 확인하여 실행해야 하는지 여부를 확인합니다.
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
작업이 다른 단계의 배포 작업에서 정의한 변수에 따라 달라지면 구문이 다릅니다. 다음 예제에서는 배포 작업이 .로 설정된 runTests
true
경우 build_job
작업이 run_tests
실행됩니다. 사전에 사용되는 키는 outputs
.입니다 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:
...
배포 작업 출력 변수
스테이지가 다른 단계의 배포 작업에서 정의한 변수에 따라 달라지면 구문이 다릅니다. 다음 예제에서 단계는 test
배포 build_job
설정 shouldTest
true
에 따라 달라집니다. 스테이지 build_job
에서 condition
test
두 번 나타납니다.
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
위의 예제에서 조건은 환경 리소스가 아닌 환경을 참조합니다. 환경 리소스를 참조하려면 종속성 조건에 환경 리소스 이름을 추가해야 합니다. 다음 예제에서 조건은 명명 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
필터링된 배열
항목 컬렉션에서 작업하는 경우 구문을 사용하여 *
필터링된 배열을 적용할 수 있습니다. 필터링된 배열은 이름에 관계없이 모든 개체/요소를 반환합니다.
예를 들어 이름이 지정된 foo
개체의 배열을 고려해 보세요. 배열의 각 개체에 있는 속성 값의 id
배열을 가져옵니다.
[
{ "id": 1, "a": "avalue1"},
{ "id": 2, "a": "avalue2"},
{ "id": 3, "a": "avalue3"}
]
다음을 수행할 수 있습니다.
foo.*.id
그러면 시스템에서 필터링된 배열로 작동 foo
한 다음 속성을 선택하도록 지시합니다 id
.
그러면 다음이 반환될 것입니다.
[ 1, 2, 3 ]
형식 캐스팅
식의 값은 식이 계산될 때 한 형식에서 다른 형식으로 변환될 수 있습니다. 식이 평가되면 매개 변수가 관련 데이터 형식으로 병합된 다음 다시 문자열로 바꿉니다.
예를 들어 이 YAML에서 값은 False
식 True
이 계산될 때 변환 1
0
됩니다.
왼쪽 매개 변수가 오른쪽 매개 변수보다 작으면 함수 lt()
가 반환 True
됩니다.
variables:
firstEval: $[lt(False, True)] # 0 vs. 1, True
secondEval: $[lt(True, False)] # 1 vs. 0, False
steps:
- script: echo $(firstEval)
- script: echo $(secondEval)
식을 사용하여 eq()
동등성을 계산하는 경우 값은 암시적으로 숫자(false
0
대/true
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)
다음 예제에서는 값 variables.emptyString
과 빈 문자열이 모두 빈 문자열로 평가됩니다.
함수 coalesce()
는 매개 변수를 순서대로 평가하고 null 또는 빈 문자열과 같지 않은 첫 번째 값을 반환합니다.
variables:
coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]
steps:
- script: echo $(coalesceLiteral) # outputs literal value
자세한 변환 규칙은 아래에 자세히 나와 있습니다.
From/To | Boolean | Null | number | 문자열 | 버전 |
---|---|---|---|---|---|
부울 | - | - | 예 | 예 | - |
Null | 예 | - | 예 | 예 | - |
숫자 | 예 | - | - | 예 | 부분 |
String | 예 | 부분 | 부분 | - | 부분 |
버전 | 예 | - | - | 예 | - |
Boolean
번호 매기기:
False
→0
True
→1
문자열로:
False
→'False'
True
→'True'
Null
- 부울:
False
- 번호 매기기:
0
- 문자열로:
''
(빈 문자열)
number
- 부울:
0
→False
, 다른 숫자 →True
- 버전: 0보다 커야 하며 0이 아닌 소수를 포함해야 합니다. Int32.MaxValue(10진수 구성 요소)보다 작아야 합니다.
- 문자열로: 숫자를 천 단위 구분 기호가 없고 소수 구분 기호가 없는 문자열로 변환합니다.
문자열
- 부울:
''
(빈 문자열) →False
, 다른 문자열은 →True
- null:
''
(빈 문자열) →Null
, 변환할 수 없는 다른 문자열 - 번호:
''
(빈 문자열) → 0, 그렇지 않으면 InvariantCulture 및 다음 규칙을 사용하여 C#Int32.TryParse
을 실행합니다. AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | AllowTrailingWhite. 실패하면TryParse
변환할 수 없습니다. - 버전: C#을 실행합니다
Version.TryParse
. 주 구성 요소와 부 구성 요소를 최소한 포함해야 합니다. 실패하면TryParse
변환할 수 없습니다.
버전
- 부울:
True
- 문자열: Major.Minor 또는 Major.Minor.Build 또는 Major.Minor.Build.Revision
FAQ
식에서 지원되지 않는 작업을 수행하려고 합니다. 파이프라인 기능을 확장하기 위한 옵션은 무엇인가요?
식을 포함하는 스크립트를 사용하여 파이프라인을 사용자 지정할 수 있습니다. 예를 들어 이 코드 조각은 변수를 BUILD_BUILDNUMBER
가져와 Bash로 분할합니다. 이 스크립트는 주 및 $MINOR_RUN
부 실행 번호에 대해 두 개의 새 변수 $MAJOR_RUN
를 출력합니다.
그런 다음 두 개의 변수를 사용하여 task.setvariable과 $minor
함께 두 개의 파이프라인 변수 $major
를 만듭니다. 이러한 변수는 다운스트림 단계에서 사용할 수 있습니다. 파이프라인 간에 변수를 공유하려면 변수 그룹을 참조하세요.
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)"