다음을 통해 공유


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

Important

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> }}에서는 정적으로 정의된 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

TrueFalse 울 리터럴 식입니다.

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 거나 _

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

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

참고 항목

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

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

함수

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

  • 모든 매개 변수가 TrueTrue
  • 최소 매개 변수: 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. prefixseed.
  • 접두사는 문자열 식입니다. 접두사 고유 값마다 별도의 카운터 값이 추적됩니다. 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, MMM, ddd, HH, Hm, ssmm, fffs, ) Kffffyyyy
  • 예: 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)

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

  • 매개 변수가 정확히 하나인지 평가합니다.TrueTrue
  • 최소 매개 변수: 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().

조건부 삽입

elseifelse 절을 사용하여 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는 SucceededSucceededWithIssues스테이지 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에서 값은 FalseTrue 이 계산될 때 변환 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 대/true1소문자)로 변환됩니다.

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

번호 매기기:

  • False0
  • True1

문자열로:

  • False'False'
  • True'True'

Null

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

number

  • 부울: 0False, 다른 숫자 → 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)"