다음을 통해 공유


표현

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.
  • 평가를 위해 매개변수를 Boolean 형식으로 변환합니다.
  • 첫 번째 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.
  • 평가를 위해 매개 변수를 문자열로 캐스팅합니다.
  • 순서 기반 대소문자 무시 비교를 수행합니다.
  • 예: 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"
    ]
  }
}

계산대

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

파이프라인이 실행 될 때마다 하나씩 자동으로 증가 하는 카운터를 만들 수 있습니다. 카운터를 정의할 때 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입니다. 두 번째 실행에서는 값이 1로 유지되는 한 값 major 은 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)]

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

끝나는지 확인

  • 왼쪽 매개 변수 String이 True 오른쪽 매개 변수로 끝나는지 평가합니다.
  • 최소 매개 변수: 2. 최대 매개 변수: 2.
  • 평가를 위해 매개 변수를 문자열로 캐스팅합니다.
  • 순서 기반 대소문자 무시 비교를 수행합니다.
  • 예: 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.
  • 평가를 위해 매개변수를 Boolean 형식으로 변환합니다.
  • 첫 번째 True 후에 단락 회로가 발생합니다.
  • 예: or(eq(1, 1), eq(2, 3)) (True 반환, 단락 회로임)

교체하다

  • 현재 인스턴스에 있는 문자열의 모든 인스턴스가 다른 문자열로 대체되는 새 문자열을 반환합니다.
  • 최소 매개 변수: 3. 최대 매개 변수: 3.
  • replace(a, b, c): 반환 a되며 모든 인스턴스가 b .로 바뀝 c니다.
  • 예: 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.
  • 평가를 위해 매개 변수를 문자열로 캐스팅합니다.
  • 순서 기반 대소문자 무시 비교를 수행합니다.
  • 예: startsWith('ABCDE', 'AB') (True를 반환합니다).

다듬다

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

위쪽

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

엑스오알

  • 매개 변수가 정확히 하나인지 평가합니다.TrueTrue
  • 최소 매개 변수: 2. 최대 매개 변수: 2.
  • 평가를 위해 매개변수를 Boolean 형식으로 변환합니다.
  • 예: 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에서는 식이 평가될 때 값 TrueFalse10으로 변환됩니다. 왼쪽 매개 변수가 오른쪽 매개 변수보다 작으면 함수 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 를 만듭니다. 이러한 변수는 다운스트림 단계에서 사용할 수 있습니다. 파이프라인 간에 변수를 공유하려면 변수 그룹을 참조하세요.

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