Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

파이프라인을 작성할 때 문자열, 부울 또는 숫자 값을 지정해야 하는 여러 위치에서 식을 사용할 수 있습니다. 식의 가장 일반적인 사용은 작업 또는 단계가 실행되어야 하는지 여부를 결정하는 조건 입니다.

# 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> }})에서는 액세스 권한이 parameters 있고 정적으로 정의됩니다 variables. 런타임 식($[ <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 }}

부울

TrueFalse 울 리터럴 식입니다.

Null

Null은 사전 누락에서 반환되는 특수 리터럴 식입니다(예: (variables['noSuch']). Null은 식의 출력일 수 있지만 식 내에서 직접 호출할 수는 없습니다.

Number

'-', '.' 또는 '0'에서 '9'로 시작합니다.

String

따옴표로 묶어야 합니다. 예: '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-Z0-9 거나 _

실행 컨텍스트에 따라 다양한 변수를 사용할 수 있습니다.

  • YAML을 사용하여 파이프라인을 만드는 경우 파이프라인 변수를 사용할 수 있습니다.
  • 클래식 편집기를 사용하여 빌드 파이프라인을 만드는 경우 빌드 변수를 사용할 수 있습니다.
  • 클래식 편집기를 사용하여 릴리스 파이프라인을 만드는 경우 릴리스 변수를 사용할 수 있습니다.

변수는 항상 문자열입니다. 형식화된 값을 사용하려면 매개 변수 를 대신 사용해야 합니다.

참고

변수 탭 UI를 통해 이러한 변수를 설정할 때 클래식 및 YAML 파이프라인 모두에 대한 식과 함께 변수를 사용하는 데는 제한이 있습니다. 식으로 정의된 변수는 두 식이 모두 제대로 평가된다는 보장이 없으므로 값이 있는 다른 변수에 의존해서는 안 됩니다. 예를 들어 값이 변수 a$[ <expression> ] 의 일부로 사용되는 변수 b가 있습니다. 변수 처리 순서가 보장 b 되지 않으므로 변수 평가 후 변수 a 값이 잘못되었을 수 있습니다.

설명된 생성은 YAML 파이프라인에서 변수 키워드를 통해 변수를 설정하는 동안에만 허용됩니다. 처리 후 올바른 값을 가져오기 위해 처리해야 하는 순서대로 변수를 배치해야 합니다.

Functions

다음 기본 제공 함수는 식에서 사용할 수 있습니다.

  • 모든 매개 변수가 True 있는지 평가합니다. True
  • 최소 매개 변수: 2. 최대 매개 변수: N
  • 평가를 위해 매개 변수를 부울로 캐스팅합니다.
  • 첫 번째 후 단락 False
  • 예: and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))

coalesce

  • 매개 변수를 순서대로 평가하고 null 또는 빈 문자열과 같지 않은 값을 반환합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: N
  • 예: coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')

contains

  • 왼쪽 매개 변수 String에 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. prefixseed을 참조하세요.
  • 접두사는 문자열 식입니다. 접두사 고유 값마다 별도의 카운터 값이 추적됩니다. UTF-16 prefix 문자를 사용해야 합니다.
  • 초기값은 카운터의 시작 값입니다.

파이프라인의 각 실행에서 하나씩 자동으로 증가되는 카운터를 만들 수 있습니다. 카운터를 정의할 때 a 및 a prefixseed를 제공합니다. 이를 보여 주는 예제는 다음과 같습니다.

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.startTimesystem.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

  • 왼쪽 매개 변수 문자열이 True 오른쪽 매개 변수로 끝나는지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 평가를 위해 매개 변수를 문자열로 캐스팅
  • 서수 대/소문자 비교 수행
  • 예: endsWith('ABCDE', 'DE') (True 반환)

eq

  • 매개 변수가 같은지 평가합니다.True
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환이 실패하면 반환 False 합니다.
  • 문자열에 대한 서수 무시 대/소문자 비교
  • 예: eq(variables.letters, 'ABC')

format

  • 후행 매개 변수를 평가하고 선행 매개 변수 문자열에 삽입합니다.
  • 최소 매개 변수: 1. 최대 매개 변수: N
  • 예: format('Hello {0} {1}', 'John', 'Doe')
  • .NET 사용자 지정 날짜 및 시간 형식 지정자를 사용하여 날짜 서식 지정(yyyy, , yy, MMM, dd, d, HH,H, mmm, fsffssffff, ) K
  • 예: 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

  • 매개 변수가 TrueFalse
  • 최소 매개 변수: 1. 최대 매개 변수: 1
  • 평가를 위해 값을 부울로 변환합니다.
  • 예: not(eq(1, 2)) (True 반환)

notIn

  • 왼쪽 매개 변수가 True 오른쪽 매개 변수와 같지 않은지 평가합니다.
  • 최소 매개 변수: 1. 최대 매개 변수: N
  • 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 같음 비교는 변환이 False 실패하면 평가됩니다.
  • 문자열에 대한 서수 무시 대/소문자 비교
  • 첫 번째 일치 후 단락
  • 예: notIn('D', 'A', 'B', 'C') (True 반환)

또는

  • 매개 변수가 있는지 평가합니다.TrueTrue
  • 최소 매개 변수: 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)

분할

  • 지정된 구분 문자에 따라 문자열을 부분 문자열로 분할합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 첫 번째 매개 변수는 분할할 문자열입니다.
  • 두 번째 매개 변수는 구분 문자입니다.
  • 부분 문자열 배열을 반환합니다. 구분 문자가 연속적으로 또는 문자열의 끝에 표시되면 배열에 빈 문자열이 포함됩니다.
  • 예제:
    variables:
    - name: environments
      value: prod1,prod2 
    steps:  
      - ${{ each env in split(variables.environments, ',')}}:
        - script: ./deploy.sh --environment ${{ env }}
    

startswith

  • 왼쪽 매개 변수 문자열이 True 오른쪽 매개 변수로 시작하는지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 평가를 위해 매개 변수를 String으로 캐스팅합니다.
  • 서수 무시 대/소문자 비교 수행
  • 예: startsWith('ABCDE', 'AB') (True 반환)

upper

  • 문자열 또는 변수 값을 모든 대문자로 변환합니다.
  • 최소 매개 변수: 1. 최대 매개 변수 1
  • 문자열에 해당하는 대문자를 반환합니다.
  • 예: upper('bah') 반환 BAH

xor

  • 정확히 하나의 매개 변수가 있는지 평가합니다.TrueTrue
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 평가를 위해 매개 변수를 부울로 캐스팅합니다.
  • 예: xor(True, False) (True 반환)

작업 상태 검사 함수

다음 상태 검사 함수를 조건의 식으로 사용할 수 있지만 변수 정의에서는 사용할 수 없습니다.

always

  • 항상 (취소된 경우에도) 평가 True 됩니다. 참고: 심각한 오류로 인해 작업이 실행되지 않을 수 있습니다. 예를 들어 원본을 가져오지 못한 경우입니다.

취소됨

  • 파이프라인이 True 취소되었는지 평가합니다.

실패

  • 단계의 경우 .eq(variables['Agent.JobStatus'], 'Failed')
  • 작업의 경우:
    • 인수가 없으면 True 종속성 그래프의 이전 작업이 실패한 경우에만 계산됩니다.
    • 작업 이름을 인수로 사용하면 해당 작업이 실패한 경우에만 계산 True 됩니다.

성공

  • 단계의 경우 in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues')
  • dependsOn 작업으로 작업할 때 사용하며 이전 작업이 성공했는지 여부를 평가하려고 합니다. 작업은 단계가 순차적으로 실행되는 동안 병렬로 실행되도록 설계되었습니다.
  • 작업의 경우:
    • 인수가 없으면 True 종속성 그래프의 모든 이전 작업이 성공했거나 부분적으로 성공한 경우에만 계산됩니다.
    • 작업 이름을 인수로 사용하여 모든 작업이 성공했는지 또는 부분적으로 성공했는지 평가 True 합니다.
    • 파이프라인이 False 취소되었는지 평가합니다.

succeededOrFailed

  • 단계의 경우 in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed')

  • 작업의 경우:

    • 인수가 없으므로 종속성 그래프의 작업이 성공했는지 또는 실패했는지 여부에 관계없이 계산 True 됩니다.
    • 작업 이름을 인수로 사용하여 해당 작업의 성공 또는 실패 여부를 평가 True 합니다.

    이는 파이프라인이 취소될 때 평가 False 되는 것을 제외하고는 비슷합니다always().

조건부 삽입

, elseifelse 절을 사용하여 if조건부로 변수 값을 할당하거나 작업에 대한 입력을 설정할 수 있습니다. 조건이 충족되면 단계를 조건부로 실행할 수도 있습니다.

변수 값을 조건부로 할당하거나 작업에 대한 입력을 설정하는 데 사용할 if 수 있습니다. 조건이 충족되면 단계를 조건부로 실행할 수도 있습니다.

조건문은 템플릿 구문을 사용하는 경우에만 작동합니다. 변수 구문에 대해 자세히 알아봅니다.

템플릿의 경우 시퀀스 또는 매핑을 추가할 때 조건부 삽입을 사용할 수 있습니다. 템플릿의 조건부 삽입에 대해 자세히 알아봅니다.

조건부 변수 할당

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"

::moniker-end

Each 키워드

키워드를 사용하여 개체 형식의 each 매개 변수를 반복할 수 있습니다.

parameters:
- name: listOfStrings
  type: object
  default:
  - one
  - two

steps:
- ${{ each value in parameters.listOfStrings }}:
  - script: echo ${{ value }}

종속성

식은 종속성 컨텍스트를 사용하여 이전 작업 또는 단계를 참조할 수 있습니다. 종속성을 사용하여 다음을 수행할 수 있습니다.

  • 이전 작업의 작업 상태 참조
  • 이전 단계의 스테이지 상태 참조
  • 동일한 단계에서 이전 작업의 출력 변수 참조
  • 단계의 이전 단계에서 출력 변수 참조
  • 다음 단계의 이전 단계에서 작업의 출력 변수 참조

컨텍스트는 작업 및 스테이지에 대해 호출 dependencies 되며 변수와 매우 유사하게 작동합니다. 작업 내에서 다른 단계의 작업에서 출력 변수를 참조하는 경우 컨텍스트가 호출 stageDependencies됩니다.

출력 변수에 따옴표 문자(' 또는 ")가 있는 문제가 발생하는 경우 이 문제 해결 가이드를 참조하세요.

단계별 종속성 단계

구조적으로 dependencies 개체는 작업 및 단계 이름의 results 맵입니다 outputs. JSON으로 표현되면 다음과 같습니다.

"dependencies": {
  "<STAGE_NAME>" : {
    "result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
    "outputs": {
        "jobName.stepName.variableName": "value"
    }
  },
  "...": {
    // another stage
  }
}

이 형식을 dependencies 사용하여 변수에 매핑하거나 단계 수준에서 조건을 확인합니다. 이 예제에서 B단계는 스테이지 A가 성공했는지 건너뛰는지 여부를 실행합니다.

참고

다음 예제에서는 표준 파이프라인 구문을 사용합니다. 배포 파이프라인을 사용하는 경우 변수 구문과 조건부 변수 구문이 모두 다릅니다. 사용할 특정 구문에 대한 자세한 내용은 배포 작업을 참조하세요.

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

스테이지는 다른 단계의 출력 변수를 사용할 수도 있습니다. 이 예제에서 스테이지 B는 스테이지 A의 변수에 따라 달라집니다.

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가 실행됩니다.

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의 출력 변수 값을 확인하여 실행 여부를 결정합니다.

trigger: none

pool:
  vmImage: 'ubuntu-latest'

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

작업이 다른 단계의 배포 작업에서 정의한 변수에 따라 달라지면 구문이 다릅니다. 다음 예제에서는 배포 작업이 .로 true설정된 runTests 경우 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:
        ...

작업 출력에 따라 스테이징

빌드 후에 변경이 필요하지 않은 경우 특정 조건에서 파이프라인의 단계를 건너뛰는 것이 좋습니다. 예를 들어 Terraform 계획을 사용하는 경우 승인을 트리거하고 계획에 변경 내용이 포함된 경우에만 적용하려고 합니다.

단계에서 이 조건을 사용하는 경우 변수가 아닌 stageDependencies변수를 dependencies 사용해야 합니다.

다음 예제는 단계의 단계에서 변수(Terraform Plan의 실제 정보 사용)를 설정한 다음 변수에 특정 값이 있는 경우에만 두 번째 단계를 호출하는 간단한 스크립트입니다.

stages:
- stage: plan_dev
  jobs:
  - job: terraform_plan_dev
    steps:
    - bash: echo '##vso[task.setvariable variable=terraform_plan_exitcode;isOutput=true]2'
      name: terraform_plan
- stage: apply_dev
  dependsOn: plan_dev
  condition: eq(dependencies.plan_dev.outputs['terraform_plan_dev.terraform_plan.terraform_plan_exitcode'], '2')
  jobs:
  - job: part_b
    steps:
    - bash: echo "BA"

스테이지가 다른 단계의 배포 작업에서 정의한 변수에 따라 달라지면 구문이 다릅니다. 다음 예제에서 단계는 test 배포 build_job 설정 shouldTesttrue에 따라 달라집니다. 스테이지 build_job 에서 conditiontest 두 번 나타납니다.

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:
    ...

필터링된 배열

항목 컬렉션에서 작동하는 경우 구문을 사용하여 * 필터링된 배열을 적용할 수 있습니다. 필터링된 배열은 이름에 관계없이 모든 개체/요소를 반환합니다.

예를 들어 이름이 지정된 foo개체의 배열을 고려합니다. 배열의 각 개체에 있는 속성 값의 id 배열을 가져옵니다.

[
    { "id": 1, "a": "avalue1"},
    { "id": 2, "a": "avalue2"},
    { "id": 3, "a": "avalue3"}
]

다음을 수행할 수 있습니다.

foo.*.id

그러면 시스템에서 필터링된 배열로 작동 foo 한 다음 속성을 선택하도록 지시합니다 id .

그러면 다음이 반환될 것입니다.

[ 1, 2, 3 ]

형식 캐스팅

식의 값은 식이 계산될 때 한 형식에서 다른 형식으로 변환될 수 있습니다. 식이 계산되면 매개 변수가 관련 데이터 형식으로 병합된 다음 다시 문자열로 바꿔집니다.

예를 들어 이 YAML에서 값 TrueFalse 식이 계산될 때 변환 10 됩니다. 왼쪽 매개 변수가 오른쪽 매개 변수보다 작으면 함수 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)

이 예제에서 값 variables.emptyString 과 빈 문자열은 모두 빈 문자열로 평가됩니다. 함수 coalesce() 는 매개 변수를 순서대로 평가하고 null 또는 빈 문자열과 같지 않은 첫 번째 값을 반환합니다.

variables:
  coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]

steps:
- script: echo $(coalesceLiteral) # outputs literal value

자세한 변환 규칙은 아래에 자세히 나와 있습니다.

From/To 부울 Null 숫자 String 버전
Boolean - - Yes -
Null - Yes -
Number - - 부분
String 부분 Partial - Partial
Version - - -

부울

번호를 매기려면:

  • False0
  • True1

문자열로:

  • False'False'
  • True'True'

Null

  • 부울: False
  • 번호를 매기려면: 0
  • 문자열로: '' (빈 문자열)

Number

  • 부울: 0False, 다른 숫자는 → True
  • 버전: 0보다 커야 하며 0이 아닌 10진수를 포함해야 합니다. Int32.MaxValue(10진수 구성 요소)보다 작아야 합니다.
  • 문자열로: 숫자를 천 단위 구분 기호가 없고 소수 구분 기호가 없는 문자열로 변환합니다.

String

  • 부울: '' (빈 문자열) → 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)"