다음을 통해 공유


표현

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

중요

Azure DevOps 콘텐츠 버전 선택기에서 버전을 선택합니다.

플랫폼 및 버전에 해당하는 이 문서의 버전을 선택합니다. 버전 선택기가 목차 위에 있습니다. 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> }})에서는 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은 사전에서 누락될 때 반환되는 특수 리터럴 식입니다(예: (variables['noSuch'])). Null은 식의 출력일 수 있지만 식 내에서 직접 호출할 수는 없습니다.

숫자

'-', '.' 또는 '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 또는 _ 따라오는

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

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

참고

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

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

함수

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

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

합치다

  • 매개 변수를 순서대로 계산하고(왼쪽에서 오른쪽) null 또는 빈 문자열과 같지 않은 첫 번째 값을 반환합니다.
  • 매개 변수 값이 모두 null이거나 빈 문자열이면 값이 반환되지 않습니다.
  • 최소 매개 변수: 2. 최대 매개 변수: N
  • 예: coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')

포함하다

  • 왼쪽 매개 변수 문자열에 True 오른쪽 매개 변수가 포함되어 있는지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 평가를 위해 매개 변수를 String으로 캐스팅
  • 대소문자를 구분하지 않고 순서 비교 수행
  • 예: contains('ABCDE', 'BCD') (True를 반환합니다.)

값포함

  • 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"
    ]
  }
}

계산대

  • 이 함수는 변수를 정의하는 식에서만 사용할 수 있습니다. 단계, 작업 또는 스테이지에 대한 조건의 일부로 사용할 수 없습니다.
  • 파이프라인의 각 실행에 따라 증가하는 숫자를 평가합니다.
  • 매개 변수: 2. prefixseed.
  • 접두사는 문자열 식입니다. 접두사 고유 값마다 별도의 카운터 값이 추적됩니다. prefix은 UTF-16 문자를 사용해야 합니다.
  • 시드는 카운터의 시작 값입니다.

파이프라인의 각 실행에서 하나씩 자동으로 증가되는 카운터를 만들 수 있습니다. 카운터를 정의할 때 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)]

카운터는 파이프라인의 범위 내에 있습니다. 즉, 해당 파이프라인의 각 실행에 대해 해당 값이 증가합니다. 프로젝트 범위의 카운터가 없습니다.

끝나는지 확인

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

방정식

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

형식

  • 후행 매개 변수를 평가하고 선행 매개 변수 문자열에 삽입합니다.
  • 최소 매개 변수: 1. 최대 매개 변수: N
  • 예: format('Hello {0} {1}', 'John', 'Doe')
  • 날짜 서식 지정에 .NET 사용자 지정 날짜 및 시간 형식 지정자를 사용합니다(, , , yyyyyy, MMM, dd, dHH, Hm, mmsss, ) fffffffK
  • 예: format('{0:yyyyMMdd}', pipeline.startTime) 이 경우 pipeline.startTime 특별한 날짜 시간 개체 변수입니다.
  • 중괄호를 두 배로 늘려 이스케이프합니다. 예: format('literal left brace {{ and literal right brace }}')

  • 왼쪽 매개 변수가 True 오른쪽 매개 변수보다 크거나 같은지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 오류가 발생합니다.
  • 문자열의 대소문자를 무시한 순서 비교
  • 예: ge(5, 5) (True를 반환합니다.)

지티

  • 왼쪽 매개 변수가 True 오른쪽 매개 변수보다 큰지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 오류가 발생합니다.
  • 문자열의 대소문자를 무시한 순서 비교
  • 예: gt(5, 2) (True를 반환합니다.)

안에

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

IIF는

  • 첫 번째 매개 변수가 계산되면 두 번째 매개 변수를 True반환하고, 그렇지 않으면 세 번째 매개 변수를 반환합니다.
  • 최소 매개 변수: 1. 최대 매개 변수: 3
  • 첫 번째 매개 변수는 조건이어야 합니다.
  • 예: iif(eq(variables['Build.Reason'], 'PullRequest'), 'ManagedDevOpsPool', 'Azure Pipelines') PR에 대한 응답으로 파이프라인이 실행될 때 'ManagedDevOpsPool'을 반환합니다.

참여하다

  • 오른쪽 매개 변수 배열의 모든 요소를 왼쪽 매개 변수 문자열로 구분하여 연결합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 배열의 각 요소는 문자열로 변환됩니다. 복합 개체는 빈 문자열로 변환됩니다.
  • 올바른 매개 변수가 배열이 아닌 경우 결과는 문자열로 변환된 올바른 매개 변수입니다.

이 예제에서는 배열의 각 항목 사이에 세미콜론이 추가됩니다. 매개 변수 형식이 개체입니다.

parameters:
- name: myArray
  type: object
  default:
    - FOO
    - BAR
    - ZOO

variables:
   A: ${{ join(';',parameters.myArray) }}

steps:
  - script: echo $A # outputs FOO;BAR;ZOO

  • 왼쪽 매개 변수가 True 오른쪽 매개 변수보다 작거나 같은지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 오류가 발생합니다.
  • 문자열의 대소문자를 무시한 순서 비교
  • 예: le(2, 2) (True를 반환합니다.)

길이

  • 시스템에서 제공되거나 매개 변수에서 가져온 문자열 또는 배열의 길이를 반환합니다.
  • 최소 매개 변수: 1. 최대 매개 변수 1
  • 예: length('fabrikam') 8을 반환합니다.

낮추다 / 아래의 / 더 낮은

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

엘티

  • 왼쪽 매개 변수가 True 오른쪽 매개 변수보다 작은지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2
  • 오른쪽 매개 변수를 왼쪽 매개 변수 형식과 일치하도록 변환합니다. 변환에 실패하면 오류가 발생합니다.
  • 문자열의 대소문자를 무시한 순서 비교
  • 예: lt(2, 5) (True를 반환합니다.)

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

아니요

  • 매개 변수가 True인 경우 False을 평가합니다.
  • 최소 매개 변수: 1. 최대 매개 변수: 1
  • 값을 평가하기 위해 참/거짓으로 변환합니다.
  • 예: not(eq(1, 2)) (True를 반환합니다.)

포함되지 않음

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

또는

  • True 매개 변수가 True 있는지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: N
  • 평가를 위해 매개 변수를 부울로 캐스팅합니다.
  • 첫 번째 True 후에 단락 회로가 발생합니다.
  • 예: or(eq(1, 1), eq(2, 3)) (True 반환, 단락 회로임)

교체하다

  • 현재 인스턴스에 있는 문자열의 모든 인스턴스가 다른 문자열로 대체되는 새 문자열을 반환합니다.
  • 최소 매개 변수: 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 }}
    
  • 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 }}
    

시작하는 것으로 시작

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

다듬다

  • 앞뒤 공백을 제거한 매개 변수를 반환합니다.
  • 최소 매개 변수: 1. 최대 매개 변수: 1
  • 예: trim(' variable ') 'variable'를 반환합니다.

위쪽

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

엑스오알

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

작업 상태 검사 함수

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

항상

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

취소됨

  • True는 파이프라인이 취소되었을 때 평가됩니다.

실패

  • 한 걸음은 eq(variables['Agent.JobStatus'], 'Failed')와 동일합니다.
  • 작업의 경우:
    • 인수가 없으면 종속성 그래프에서 이전 작업 중 하나라도 실패한 경우에만 True로 평가됩니다.
    • 작업 이름을 인수로 사용하는 경우 해당 작업이 실패한 경우에만 평가 True 됩니다.

성공했다

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

성공하거나 실패함

  • in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed')와 같은 단계입니다.

  • 작업의 경우:

    • 인수가 없을 때, 종속성 그래프의 작업 성공 여부와 상관없이 평가는 True로 됩니다.
    • 작업 이름을 인수로 사용하여 해당 작업의 성공 또는 실패 여부를 평가 True 합니다.
    • 종속성 그래프 이전에 건너뛴 작업이 있는 경우 대신 사용할 not(canceled()) 수 있습니다.

    파이프라인이 취소될 때 always()을 평가한다는 점을 제외하면 False과 같습니다.

조건부 삽입

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

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

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

조건부로 변수 할당

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 값이 if 조건과 일치하지 않으면 else 문이 실행됩니다. 여기서 foo의 값은 elseif 조건에서 true를 반환합니다.

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합니다.

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

종속성 구문 개요

종속성이 있는 출력 변수를 참조하는 구문은 상황에 따라 달라집니다. 다음은 가장 일반적인 시나리오에 대한 개요입니다. 대체 구문도 작동하는 경우가 있을 수 있습니다.

유형

설명

단계별 종속성 (다른 단계)

서로 다른 단계의 작업에서 조건 내의 이전 단계로부터 출력 변수를 참조합니다 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 개체는 작업 및 단계 이름을 resultsoutputs로 매핑하는 맵입니다. JSON으로 표현되는 모양은 다음과 같습니다.

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

참고

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

이 형식을 dependencies 사용하여 변수에 매핑하거나 단계 수준에서 조건을 확인합니다.

이 예제에는 A와 B라는 두 단계가 있습니다. 스테이지 A에는 조건이 false 있으며 결과적으로 실행되지 않습니다. 스테이지 A의 결과가 Succeeded, SucceededWithIssues, 또는 Skipped일 경우에 스테이지 B가 실행됩니다. 스테이지 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에는 출력 변수 shouldruntrue를 .로 설정하는 작업 A1이 포함됩니다. shouldruntrue일 때 단계 B가 실행됩니다. shouldrun 이기 때문에 B단계가 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가 실행됩니다. 작업 c는 모든 종속성이 완료되었거나(작업 b) 건너뛰었기 때문에(작업 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

작업이 다른 단계의 배포 작업에서 정의한 변수에 따라 달라지면 구문이 다릅니다. 다음 예제에서 run_testsbuild_job로 설정한 배포 작업이 있을 때, 작업 runTests가 실행됩니다. 사전에 사용된 키는 outputsbuild_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 설정 shouldTesttrue에 따라 달라집니다. condition 단계의 test에서 build_job가 두 번 나타나는 것을 주목하세요.

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에서 값 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)

동등성을 평가할 때 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

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

출발/도착 불리언 없음 숫자 문자열 버전
불리언 - - -
- -
숫자 - - 부분
문자열 부분 부분 - 부분
버전 - - -

불리언

번호 매기기:

  • False0
  • True1

문자열로 변환:

  • False'False'
  • True'True'

없음

  • 불리언: False
  • 번호 매기기: 0
  • 문자열로: '' (빈 문자열)

숫자

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

문자열

  • 부울로 변환: '' (빈 문자열) → False, 그 외의 모든 문자열 → True
  • null로: '' (빈 문자열) → Null, 변환할 수 없는 다른 문자열의 경우
  • 번호: '' (빈 문자열) → 0, 그렇지 않으면 Int32.TryParseC#InvariantCulture을 사용하여 실행하고 다음 규칙을 적용합니다: AllowDecimalPoint | AllowLeadingSign | AllowLeadingWhite | AllowThousands | AllowTrailingWhite. 실패하면 TryParse 변환할 수 없습니다.
  • 버전으로: C#을 실행합니다 Version.TryParse. 주 구성 요소와 부 구성 요소를 최소한 포함해야 합니다. 실패하면 TryParse 변환할 수 없습니다.

버전

  • 불리언: True
  • 문자열 변환: Major.Minor 또는 Major.Minor.Build 또는 Major.Minor.Build.Revision

자주 묻는 질문(FAQ)

표현식에서 지원되지 않는 작업을 하고 싶습니다. 파이프라인 기능을 확장하기 위한 옵션은 무엇인가요?

식을 포함하는 스크립트를 사용하여 파이프라인을 사용자 지정할 수 있습니다. 예를 들어 이 코드 조각은 변수를 BUILD_BUILDNUMBER 가져와 Bash로 분할합니다. 이 스크립트는 주요 실행 번호와 부 실행 번호에 해당하는 두 개의 새 변수 $MAJOR_RUN$MINOR_RUN를 출력합니다. 두 개의 변수를 사용하여 $major$minor 의 두 개의 파이프라인 변수를 생성하고 이를 task.setvariable을 사용하여 설정합니다. 이러한 변수는 다운스트림 단계에서 사용할 수 있습니다. 파이프라인 간에 변수를 공유하려면 변수 그룹을 참조하세요.

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)"