변수 정의
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
변수를 통해 파이프라인의 다양한 부분으로 데이터의 키 비트를 편리하게 가져올 수 있습니다. 가장 일반적인 변수 사용은 파이프라인에서 사용할 수 있는 값을 정의하는 것입니다. 모든 변수는 문자열이며 변경할 수 있습니다. 변수 값은 파이프라인의 실행마다 또는 작업마다 변경될 수 있습니다.
이름이 같은 여러 위치에서 동일한 변수를 정의하는 경우 가장 로컬로 범위가 지정된 변수가 우선합니다. 따라서 작업 수준에서 정의된 변수는 단계 수준에서 설정된 변수를 재정의할 수 있습니다. 단계 수준에서 정의된 변수는 파이프라인 루트 수준에서 설정된 변수를 재정의합니다. 파이프라인 루트 수준에서 설정된 변수는 파이프라인 설정 UI에서 설정된 변수를 재정의합니다. 작업, 단계 및 루트 수준에서 정의된 변수를 사용하는 방법에 대한 자세한 내용은 변수 범위를 참조하세요.
식과 함께 변수를 사용하여 값을 조건부로 할당하고 파이프라인을 추가로 사용자 지정할 수 있습니다.
변수는 런타임 매개 변수와 다릅니다. 런타임 매개 변수는 템플릿 구문 분석 중에 입력되고 사용 가능합니다.
사용자 정의 변수
변수를 정의할 때 다른 구문(매크로, 템플릿 식 또는 런타임)을 사용할 수 있으며 사용하는 구문에 따라 파이프라인에서 변수가 렌더링되는 위치가 결정됩니다.
YAML 파이프라인에서는 루트, 단계 및 작업 수준에서 변수를 설정할 수 있습니다. UI에서 YAML 파이프라인 외부에서 변수를 지정할 수도 있습니다. UI에서 변수를 설정하면 해당 변수를 암호화하고 비밀로 설정할 수 있습니다.
사용자 정의 변수는 읽기 전용으로 설정할 수 있습니다. 변수에 대한 명명 제한이 있습니다(예: 변수 이름 시작 시 사용할 secret
수 없습니다).
변수 그룹을 사용하여 여러 파이프라인에서 변수를 사용할 수 있도록 할 수 있습니다.
템플릿을 사용하여 여러 파이프라인에서 사용되는 한 파일에 변수를 정의합니다.
사용자 정의 여러 줄 변수
Azure DevOps는 여러 줄 변수를 지원하지만 몇 가지 제한 사항이 있습니다.
파이프라인 작업과 같은 다운스트림 구성 요소는 변수 값을 올바르게 처리하지 못할 수 있습니다.
Azure DevOps는 사용자 정의 변수 값을 변경하지 않습니다. 변수 값은 여러 줄 변수로 전달되기 전에 올바르게 서식을 지정해야 합니다. 변수의 서식을 지정할 때 특수 문자를 사용하지 말고, 제한된 이름을 사용하지 말고, 에이전트의 운영 체제에서 작동하는 줄 끝 형식을 사용해야 합니다.
여러 줄 변수는 운영 체제에 따라 다르게 동작합니다. 이를 방지하려면 대상 운영 체제에 대해 여러 줄 변수의 서식을 올바르게 지정해야 합니다.
지원되지 않는 서식을 제공하더라도 Azure DevOps는 변수 값을 변경하지 않습니다.
시스템 변수
Azure Pipelines에는 사용자 정의 변수 외에도 미리 정의된 값이 있는 시스템 변수가 있습니다. 예를 들어 미리 정의된 변수 Build.BuildId 는 각 빌드의 ID를 제공하며 다른 파이프라인 실행을 식별하는 데 사용할 수 있습니다. 고유한 값이 Build.BuildId
필요한 경우 스크립트 또는 태스크에서 변수를 사용할 수 있습니다.
YAML 또는 클래식 빌드 파이프라인을 사용하는 경우 시스템 변수의 포괄적인 목록은 미리 정의된 변수를 참조하세요.
클래식 릴리스 파이프라인을 사용하는 경우 릴리스 변수를 참조 하세요.
파이프라인을 실행할 때 시스템 변수는 현재 값으로 설정됩니다. 일부 변수는 자동으로 설정됩니다. 파이프라인 작성자 또는 최종 사용자는 파이프라인이 실행되기 전에 시스템 변수의 값을 변경합니다.
시스템 변수는 읽기 전용입니다.
환경 변수
환경 변수는 사용 중인 운영 체제에 따라 다릅니다. 플랫폼별 방식으로 파이프라인에 삽입됩니다. 형식은 환경 변수가 특정 스크립팅 플랫폼에 대한 형식을 지정하는 방법에 해당합니다.
UNIX 시스템(macOS 및 Linux)에서 환경 변수의 형식은 $NAME
입니다. Windows에서 형식은 일괄 처리의 경우 %NAME%
, PowerShell의 경우 $env:NAME
입니다.
시스템 및 사용자 정의 변수도 플랫폼에 대한 환경 변수로 삽입됩니다. 변수가 환경 변수로 변환되면 변수 이름이 대문자가 되고 마침표가 밑줄로 바뀝니다. 예를 들어 변수 이름은 any.variable
변수 이름이 $ANY_VARIABLE
됩니다.
환경 변수에 대한 변수 명명 제한이 있습니다(예: 변수 이름의 시작 부분에는 사용할 secret
수 없습니다).
변수 이름 제한
사용자 정의 및 환경 변수는 문자, 숫자 .
및 _
문자로 구성됩니다. 시스템에서 예약한 변수 접두사를 사용하지 마세요. 다음과 같습니다. endpoint
, input
, secret
path
및 securefile
. 대문자화에 관계없이 이러한 문자열 중 하나로 시작하는 변수는 작업 및 스크립트에서 사용할 수 없습니다.
변수 구문 이해
Azure Pipelines는 매크로, 템플릿 식 및 런타임 식의 세 가지 변수 참조 방법을 지원합니다. 각 구문을 다른 용도로 사용할 수 있으며 각 구문에는 몇 가지 제한 사항이 있습니다.
파이프라인에서 템플릿 식 변수()는${{ variables.var }}
런타임이 시작되기 전에 컴파일 시간에 처리됩니다. 매크로 구문 변수($(var)
)는 태스크가 실행되기 전에 런타임 중에 처리됩니다. 런타임 식($[variables.var]
)도 런타임 중에 처리되지만 조건 및 식과 함께 사용됩니다. 런타임 식을 사용할 때 정의의 전체 오른쪽을 차지해야 합니다.
이 예제에서는 변수가 업데이트된 후에도 템플릿 식에 변수의 초기 값이 여전히 있음을 확인할 수 있습니다. 매크로 구문 변수 업데이트의 값입니다. 작업이 실행되기 전에 컴파일 시간에 모든 템플릿 식 변수가 처리되므로 템플릿 식 값은 변경되지 않습니다. 반면, 매크로 구문 변수는 각 태스크가 실행되기 전에 평가됩니다.
variables:
- name: one
value: initialValue
steps:
- script: |
echo ${{ variables.one }} # outputs initialValue
echo $(one)
displayName: First variable pass
- bash: echo "##vso[task.setvariable variable=one]secondValue"
displayName: Set new variable value
- script: |
echo ${{ variables.one }} # outputs initialValue
echo $(one) # outputs secondValue
displayName: Second variable pass
매크로 구문 변수
대부분의 설명서 예제는 매크로 구문($(var)
)을 사용합니다. 매크로 구문은 변수 값을 작업 입력 및 다른 변수로 보간하도록 설계되었습니다.
매크로 구문이 있는 변수는 런타임 중에 태스크가 실행되기 전에 처리됩니다. 런타임은 템플릿 확장 후에 발생합니다. 시스템에서 매크로 식이 발견되면 식을 변수의 내용으로 바꿉니다. 해당 이름으로 변수가 없으면 매크로 식이 변경되지 않습니다. 예를 들어 바꿀 $(var)
수 없는 경우 $(var)
아무것도 바꿀 수 없습니다.
매크로 구문 변수는 값 없이 그대로 유지됩니다. 빈 값은 $()
실행 중인 작업에 대한 의미일 수 있으며 에이전트에서 해당 값을 바꾸려고 가정하면 안 되므로 값이 없습니다. 예를 들어 Bash 태스크에서 변수 foo
를 참조하는 데 사용하는 $(foo)
경우 입력의 모든 $()
식을 태스크로 대체하면 Bash 스크립트가 중단됩니다.
매크로 변수는 키워드가 아닌 값에 사용되는 경우에만 확장됩니다. 값은 파이프라인 정의의 오른쪽에 표시됩니다. 유효한 key: $(value)
방법은 다음과 같습니다. 다음은 유효 $(key): value
하지 않습니다. 매크로 변수는 작업 이름을 인라인으로 표시하는 데 사용할 때 확장되지 않습니다. 대신 속성을 사용해야 displayName
합니다.
참고 항목
매크로 구문 변수는 , jobs
및 steps
.에 대해서만 stages
확장됩니다.
예를 들어 resource
a 또는 trigger
.
이 예제에서는 Bash, PowerShell 및 스크립트 태스크와 함께 매크로 구문을 사용합니다. 매크로 구문을 사용하여 변수를 호출하는 구문은 세 가지 모두에 대해 동일합니다.
variables:
- name: projectName
value: contoso
steps:
- bash: echo $(projectName)
- powershell: echo $(projectName)
- script: echo $(projectName)
템플릿 식 구문
템플릿 식 구문을 사용하여 템플릿 매개 변수와 변수(${{ variables.var }}
)를 모두 확장할 수 있습니다. 템플릿 변수는 컴파일 시간에 처리되고 런타임이 시작되기 전에 대체됩니다. 템플릿 식은 YAML의 일부를 템플릿으로 다시 사용할 수 있도록 설계되었습니다.
대체 값을 찾을 수 없는 경우 템플릿 변수가 빈 문자열에 자동으로 병합됩니다. 매크로 및 런타임 식과 달리 템플릿 식은 키(왼쪽) 또는 값(오른쪽)으로 나타날 수 있습니다. 유효한 ${{ variables.key }} : ${{ variables.value }}
방법은 다음과 같습니다.
런타임 식 구문
런타임 시$[variables.var]
확장되는 변수에 런타임 식 구문을 사용할 수 있습니다. 런타임 식 변수는 대체 값을 찾을 수 없을 때 빈 문자열에 자동으로 병합됩니다. 작업 조건에서 런타임 식을 사용하여 작업 또는 전체 단계의 조건부 실행을 지원합니다.
런타임 식 변수는 키워드가 아닌 값에 사용되는 경우에만 확장됩니다. 값은 파이프라인 정의의 오른쪽에 표시됩니다. 유효한 key: $[variables.value]
방법은 다음과 같습니다. 다음은 유효 $[variables.key]: value
하지 않습니다. 런타임 식은 키-값 쌍의 오른쪽 전체를 차지해야 합니다. 예를 들어 key: $[variables.value]
유효하지만 key: $[variables.value] foo
유효하지 않습니다.
구문 | 예시 | 언제 처리되나요? | 파이프라인 정의에서 확장되는 위치는 어디인가요? | 찾을 수 없는 경우 어떻게 렌더링되나요? |
---|---|---|---|---|
매크로 | $(var) |
태스크가 실행되기 전 런타임 | value(오른쪽) | 인쇄 $(var) |
템플릿 식 | ${{ variables.var }} |
컴파일 시간 | 키 또는 값(왼쪽 또는 오른쪽) | 빈 문자열 |
런타임 식 | $[variables.var] |
runtime | value(오른쪽) | 빈 문자열 |
어떤 구문을 사용해야 하나요?
작업에 대한 보안 문자열 또는 미리 정의된 변수 입력을 제공하는 경우 매크로 구문을 사용합니다.
조건 및 식을 사용하는 경우 런타임 식을 선택합니다. 그러나 빈 변수를 인쇄하지 않으려면 런타임 식을 사용하지 마세요(예: $[variables.var]
). 예를 들어 특정 값이 있거나 값이 없는 변수를 사용하는 조건부 논리가 있는 경우입니다. 이 경우 매크로 식을 사용해야 합니다.
일반적으로 템플릿 변수는 사용할 표준입니다. 템플릿 변수를 활용하여 파이프라인은 파이프라인 컴파일 시 파이프라인에 변수 값을 완전히 삽입합니다. 이는 파이프라인을 디버그하려고 할 때 유용합니다. 로그 파일을 다운로드하고 대체되는 완전히 확장된 값을 평가할 수 있습니다. 변수가 대체되므로 중요한 값에 템플릿 구문을 활용해서는 안 됩니다.
파이프라인에서 변수 설정
가장 일반적인 경우 변수를 설정하고 YAML 파일 내에서 사용합니다. 이를 통해 버전 제어 시스템에서 변수의 변경 내용을 추적할 수 있습니다. 파이프라인 설정 UI(클래식 탭 참조)에서 변수를 정의하고 YAML에서 참조할 수도 있습니다.
다음은 두 변수 configuration
platform
를 설정하고 나중에 단계에서 사용하는 방법을 보여 주는 예제입니다. YAML 문에서 변수를 사용하려면 변수를 래핑합니다 $()
. 변수는 YAML 문에서 정의하는 repository
데 사용할 수 없습니다.
# Set variables once
variables:
configuration: debug
platform: x64
steps:
# Use them once
- task: MSBuild@1
inputs:
solution: solution1.sln
configuration: $(configuration) # Use the variable
platform: $(platform)
# Use them again
- task: MSBuild@1
inputs:
solution: solution2.sln
configuration: $(configuration) # Use the variable
platform: $(platform)
변수 범위
YAML 파일에서 다양한 범위에서 변수를 설정할 수 있습니다.
- 루트 수준에서 파이프라인의 모든 작업에서 사용할 수 있도록 합니다.
- 스테이지 수준에서 특정 단계에서만 사용할 수 있도록 합니다.
- 작업 수준에서 특정 작업에서만 사용할 수 있도록 합니다.
YAML의 맨 위에 변수를 정의하면 이 변수는 파이프라인의 모든 작업 및 단계에서 사용할 수 있으며 전역 변수입니다. YAML에 정의된 전역 변수는 파이프라인 설정 UI에 표시되지 않습니다.
작업 수준의 변수는 루트 및 스테이지 수준에서 변수를 재정의합니다. 단계 수준의 변수는 루트 수준에서 변수를 재정의합니다.
variables:
global_variable: value # this is available to all jobs
jobs:
- job: job1
pool:
vmImage: 'ubuntu-latest'
variables:
job_variable1: value1 # this is only available in job1
steps:
- bash: echo $(global_variable)
- bash: echo $(job_variable1)
- bash: echo $JOB_VARIABLE1 # variables are available in the script environment too
- job: job2
pool:
vmImage: 'ubuntu-latest'
variables:
job_variable2: value2 # this is only available in job2
steps:
- bash: echo $(global_variable)
- bash: echo $(job_variable2)
- bash: echo $GLOBAL_VARIABLE
두 작업의 출력은 다음과 같습니다.
# job1
value
value1
value1
# job2
value
value2
value
변수 지정
앞의 예제 variables
에서는 키워드 뒤에 키-값 쌍 목록이 잇습니다.
키는 변수 이름이며 값은 변수 값입니다.
변수 또는 변수 그룹에 템플릿을 사용하려는 경우 유용한 또 다른 구문이 있습니다.
템플릿을 사용하면 변수를 한 YAML에 정의하고 다른 YAML 파일에 포함할 수 있습니다.
변수 그룹은 여러 파이프라인에서 사용할 수 있는 변수 집합입니다. 이를 통해 한 곳에서 다양한 단계에 공통적인 변수를 관리하고 구성할 수 있습니다.
파이프라인의 루트 수준에서 변수 템플릿 및 변수 그룹에 이 구문을 사용합니다.
이 대체 구문 variables
에서 키워드는 변수 지정자 목록을 사용합니다.
변수 지정자는 name
일반 변수, group
변수 그룹 및 template
변수 템플릿을 포함하기 위한 것입니다.
다음 예제에서는 세 가지 모두를 보여 줍니다.
variables:
# a regular variable
- name: myvariable
value: myvalue
# a variable group
- group: myvariablegroup
# a reference to a variable template
- template: myvariabletemplate.yml
템플릿을 사용한 변수 재사용에 대해 자세히 알아봅니다.
환경을 통해 변수에 액세스
환경 변수를 통해 스크립트에도 변수를 사용할 수 있습니다. 이러한 환경 변수를 사용하는 구문은 스크립팅 언어에 따라 달라집니다.
이름은 대문자로, 이 .
이름은 .으로 _
바뀝다. 프로세스 환경에 자동으로 삽입됩니다. 다음 몇 가지 예를 참조하세요.
- 일괄 처리 스크립트:
%VARIABLE_NAME%
- PowerShell 스크립트:
$env:VARIABLE_NAME
- Bash 스크립트:
$VARIABLE_NAME
Important
파일 경로를 포함하는 미리 정의된 변수는 에이전트 호스트 형식 및 셸 형식에 따라 적절한 스타일(Windows 스타일 C:\foo\ 및 Unix 스타일 /foo/)로 변환됩니다. Windows에서 bash 스크립트 작업을 실행하는 경우 파이프라인 변수 메서드 대신 이러한 변수에 액세스하기 위해 환경 변수 메서드를 사용하여 올바른 파일 경로 스타일을 만들어야 합니다.
비밀 변수 설정
팁
비밀 변수는 환경 변수로 자동으로 내보내지지 않습니다. 스크립트에서 비밀 변수를 사용하려면 환경 변수에 명시적으로 매핑합니다. 자세한 내용은 비밀 변수 설정을 참조 하세요.
YAML 파일에서 비밀 변수를 설정하지 마세요. 운영 체제는 실행 중인 프로세스에 대한 명령을 기록하는 경우가 많으며, 입력으로 전달한 비밀을 로그에 포함하지 않도록 할 수 있습니다. 스크립트의 환경을 사용하거나 블록 내의 변수를 variables
매핑하여 파이프라인에 비밀을 전달합니다.
참고 항목
Azure Pipelines는 파이프라인 로그에 데이터를 내보낸 경우 비밀을 마스킹하기 위해 노력하므로 비밀로 설정되지 않은 출력 및 로그에 마스킹된 추가 변수 및 데이터를 볼 수 있습니다.
파이프라인에 대한 파이프라인 설정 UI에서 비밀 변수를 설정해야 합니다. 이러한 변수는 설정된 파이프라인으로 범위가 지정됩니다. 변수 그룹에서 비밀 변수를 설정할 수도 있습니다.
웹 인터페이스에서 비밀을 설정하려면 다음 단계를 수행합니다.
- 파이프라인 페이지로 이동하여 적절한 파이프라인을 선택하고 편집을 선택합니다.
- 이 파이프라인에 대한 변수를 찾습니다.
- 변수를 추가하거나 업데이트합니다.
- 암호화된 방식으로 변수를 저장하려면 이 값을 비밀 로 유지하는 옵션을 선택합니다.
- 파이프라인 저장
비밀 변수는 2048비트 RSA 키를 사용하여 미사용 시 암호화됩니다. 비밀은 에이전트에서 사용할 작업 및 스크립트에 사용할 수 있습니다. 파이프라인을 변경할 수 있는 액세스 권한이 있는 사용자에 주의하세요.
Important
Azure Pipelines 출력에 표시되지 않도록 비밀을 마스킹하기 위해 노력하지만 여전히 예방 조치를 취해야 합니다. 비밀을 출력으로 에코하지 마세요. 일부 운영 체제는 명령줄 인수를 기록합니다. 명령줄에 비밀을 전달하지 마세요. 대신 비밀을 환경 변수에 매핑하는 것이 좋습니다.
우리는 비밀의 부분 문자열을 마스크하지 않습니다. 예를 들어 "abc123"이 비밀로 설정된 경우 "abc"는 로그에서 마스킹되지 않습니다. 이는 너무 세분화된 수준에서 비밀을 마스킹하여 로그를 읽을 수 없게 만드는 것을 방지하기 위한 것입니다. 이러한 이유로 비밀에는 구조화된 데이터가 포함되어서는 안 됩니다. 예를 들어 "{ "foo": "bar" }"이(가) 비밀로 설정된 경우 "bar"는 로그에서 마스킹되지 않습니다.
일반 변수와 달리 스크립트에 대한 환경 변수로 자동으로 암호가 해독되지는 않습니다. 비밀 변수를 명시적으로 매핑해야 합니다.
다음 예제에서는 PowerShell 및 Bash 스크립트에서 호출 mySecret
된 비밀 변수를 매핑하고 사용하는 방법을 보여 줍니다. 두 개의 전역 변수가 정의됩니다. GLOBAL_MYSECRET
에는 비밀 변수 mySecret
의 값이 할당되고 GLOBAL_MY_MAPPED_ENV_VAR
비밀이 아닌 변수 nonSecretVariable
의 값이 할당됩니다. 일반 파이프라인 변수와 달리 환경 변수는 호출 MYSECRET
되지 않습니다.
PowerShell 태스크는 변수를 인쇄하는 스크립트를 실행합니다.
$(mySecret)
: 비밀 변수에 대한 직접 참조이며 작동합니다.$env:MYSECRET
: 비밀 변수가 환경 변수에 자동으로 매핑되지 않으므로 작동하지 않는 환경 변수로 비밀 변수에 액세스하려고 시도합니다.$env:GLOBAL_MYSECRET
: 이 경우 전역 변수를 통해 비밀 변수에 액세스하려고 시도합니다. 이 변수는 이러한 방식으로 비밀 변수를 매핑할 수 없으므로 작동하지 않습니다.$env:GLOBAL_MY_MAPPED_ENV_VAR
: 작동하는 전역 변수를 통해 비밀이 아닌 변수에 액세스합니다.$env:MY_MAPPED_ENV_VAR
: 비밀 변수를 환경 변수에 매핑하는 데 권장되는 방법인 작업별 환경 변수를 통해 비밀 변수에 액세스합니다.
variables:
GLOBAL_MYSECRET: $(mySecret) # this will not work because the secret variable needs to be mapped as env
GLOBAL_MY_MAPPED_ENV_VAR: $(nonSecretVariable) # this works because it's not a secret.
steps:
- powershell: |
Write-Host "Using an input-macro works: $(mySecret)"
Write-Host "Using the env var directly does not work: $env:MYSECRET"
Write-Host "Using a global secret var mapped in the pipeline does not work either: $env:GLOBAL_MYSECRET"
Write-Host "Using a global non-secret var mapped in the pipeline works: $env:GLOBAL_MY_MAPPED_ENV_VAR"
Write-Host "Using the mapped env var for this task works and is recommended: $env:MY_MAPPED_ENV_VAR"
env:
MY_MAPPED_ENV_VAR: $(mySecret) # the recommended way to map to an env variable
- bash: |
echo "Using an input-macro works: $(mySecret)"
echo "Using the env var directly does not work: $MYSECRET"
echo "Using a global secret var mapped in the pipeline does not work either: $GLOBAL_MYSECRET"
echo "Using a global non-secret var mapped in the pipeline works: $GLOBAL_MY_MAPPED_ENV_VAR"
echo "Using the mapped env var for this task works and is recommended: $MY_MAPPED_ENV_VAR"
env:
MY_MAPPED_ENV_VAR: $(mySecret) # the recommended way to map to an env variable
이전 스크립트의 두 작업의 출력은 다음과 같습니다.
Using an input-macro works: ***
Using the env var directly does not work:
Using a global secret var mapped in the pipeline does not work either:
Using a global non-secret var mapped in the pipeline works: foo
Using the mapped env var for this task works and is recommended: ***
스크립트 외부에서 비밀 변수를 사용할 수도 있습니다. 예를 들어 정의를 사용하여 variables
비밀 변수를 작업에 매핑할 수 있습니다. 이 예제에서는 비밀 변수 $(vmsUser)
및 $(vmsAdminPass)
Azure 파일 복사 작업을 사용하는 방법을 보여 줍니다.
variables:
VMS_USER: $(vmsUser)
VMS_PASS: $(vmsAdminPass)
pool:
vmImage: 'ubuntu-latest'
steps:
- task: AzureFileCopy@4
inputs:
SourcePath: 'my/path'
azureSubscription: 'my-subscription'
Destination: 'AzureVMs'
storage: 'my-storage'
resourceGroup: 'my-rg'
vmsAdminUserName: $(VMS_USER)
vmsAdminPassword: $(VMS_PASS)
변수 그룹의 비밀 변수 참조
이 예제에서는 YAML 파일에서 변수 그룹을 참조하는 방법과 YAML 내에서 변수를 추가하는 방법을 보여 줍니다. 변수 그룹에 user
token
는 두 개의 변수가 사용됩니다. 변수는 token
비밀이며, YAML에서 참조할 수 있도록 환경 변수 $env:MY_MAPPED_TOKEN
에 매핑됩니다.
이 YAML은 릴리스 목록을 검색하기 위해 REST 호출을 수행하고 결과를 출력합니다.
variables:
- group: 'my-var-group' # variable group
- name: 'devopsAccount' # new variable defined in YAML
value: 'contoso'
- name: 'projectName' # new variable defined in YAML
value: 'contosoads'
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
# Encode the Personal Access Token (PAT)
# $env:USER is a normal variable in the variable group
# $env:MY_MAPPED_TOKEN is a mapped secret variable
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $env:USER,$env:MY_MAPPED_TOKEN)))
# Get a list of releases
$uri = "https://vsrm.dev.azure.com/$(devopsAccount)/$(projectName)/_apis/release/releases?api-version=5.1"
# Invoke the REST call
$result = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
# Output releases in JSON
Write-Host $result.value
env:
MY_MAPPED_TOKEN: $(token) # Maps the secret variable $(token) from my-var-group
Important
기본적으로 GitHub 리포지토리에서는 파이프라인과 연결된 비밀 변수를 포크의 끌어오기 요청 빌드에 사용할 수 없습니다. 자세한 내용은 포크의 기여를 참조 하세요.
파이프라인 간에 변수 공유
프로젝트의 여러 파이프라인에서 변수를 공유하려면 웹 인터페이스를 사용합니다. 라이브러리에서 변수 그룹을 사용합니다.
작업의 출력 변수 사용
일부 태스크는 다운스트림 단계, 작업 및 단계에서 사용할 수 있는 출력 변수를 정의합니다. YAML에서는 종속성을 사용하여 작업 및 단계에서 변수에 액세스할 수 있습니다.
다운스트림 태스크에서 행렬 작업을 참조하는 경우 다른 구문을 사용해야 합니다. 다중 작업 출력 변수 설정을 참조하세요. 또한 배포 작업의 변수에 다른 구문을 사용해야 합니다. 배포 작업의 출력 변수에 대한 지원을 참조 하세요.
일부 태스크는 출력 변수를 정의합니다. 이 변수는 동일한 단계 내의 다운스트림 단계 및 작업에서 사용할 수 있습니다. YAML에서 종속성을 사용하여 작업 전체의 변수에 액세스할 수 있습니다.
- 동일한 작업 내의 다른 작업에서 변수를 참조하려면 .를 사용합니다
TASK.VARIABLE
. - 다른 작업의 작업에서 변수를 참조하려면 .를 사용합니다
dependencies.JOB.outputs['TASK.VARIABLE']
.
참고 항목
기본적으로 파이프라인의 각 단계는 YAML 파일에서 바로 앞에 있는 단계에 따라 달라집니다. 현재 스테이지 바로 앞에 있지 않은 스테이지를 참조해야 하는 경우 스테이지에 섹션을 추가하여 이 자동 기본값을 dependsOn
재정의할 수 있습니다.
참고 항목
다음 예제에서는 표준 파이프라인 구문을 사용합니다. 배포 파이프라인을 사용하는 경우 변수 및 조건부 변수 구문이 모두 다릅니다. 사용할 특정 구문에 대한 자세한 내용은 배포 작업을 참조 하세요.
이러한 예제에서는 호출MyVar
된 출력 변수를 설정하는 작업이 MyTask
있다고 가정합니다.
식 - 종속성 구문에 대해 자세히 알아봅니다.
동일한 작업에서 출력 사용
steps:
- task: MyTask@1 # this step generates the output variable
name: ProduceVar # because we're going to depend on it, we need to name the step
- script: echo $(ProduceVar.MyVar) # this step uses the output variable
다른 작업에서 출력 사용
jobs:
- job: A
steps:
# assume that MyTask generates an output variable called "MyVar"
# (you would learn that from the task's documentation)
- task: MyTask@1
name: ProduceVar # because we're going to depend on it, we need to name the step
- job: B
dependsOn: A
variables:
# map the output variable from A into this job
varFromA: $[ dependencies.A.outputs['ProduceVar.MyVar'] ]
steps:
- script: echo $(varFromA) # this step uses the mapped-in variable
다른 스테이지에서 출력 사용
다른 단계의 출력을 사용하기 위해 변수를 참조하는 형식은 다음과 같습니다 stageDependencies.STAGE.JOB.outputs['TASK.VARIABLE']
. 작업 수준이 아닌 단계 수준에서는 이러한 변수를 조건에서 사용할 수 있습니다.
출력 변수는 다음 다운스트림 단계에서만 사용할 수 있습니다. 여러 단계에서 동일한 출력 변수를 사용하는 경우 조건을 사용합니다 dependsOn
.
stages:
- stage: One
jobs:
- job: A
steps:
- task: MyTask@1 # this step generates the output variable
name: ProduceVar # because we're going to depend on it, we need to name the step
- stage: Two
dependsOn:
- One
jobs:
- job: B
variables:
# map the output variable from A into this job
varFromA: $[ stageDependencies.One.A.outputs['ProduceVar.MyVar'] ]
steps:
- script: echo $(varFromA) # this step uses the mapped-in variable
- stage: Three
dependsOn:
- One
- Two
jobs:
- job: C
variables:
# map the output variable from A into this job
varFromA: $[ stageDependencies.One.A.outputs['ProduceVar.MyVar'] ]
steps:
- script: echo $(varFromA) # this step uses the mapped-in variable
파일 입력을 사용하여 단계 간에 변수를 전달할 수도 있습니다. 이렇게 하려면 작업 수준에서 두 번째 단계에서 변수를 정의한 다음 변수를 입력으로 env:
전달해야 합니다.
## script-a.sh
echo "##vso[task.setvariable variable=sauce;isOutput=true]crushed tomatoes"
## script-b.sh
echo 'Hello file version'
echo $skipMe
echo $StageSauce
## azure-pipelines.yml
stages:
- stage: one
jobs:
- job: A
steps:
- task: Bash@3
inputs:
filePath: 'script-a.sh'
name: setvar
- bash: |
echo "##vso[task.setvariable variable=skipsubsequent;isOutput=true]true"
name: skipstep
- stage: two
jobs:
- job: B
variables:
- name: StageSauce
value: $[ stageDependencies.one.A.outputs['setvar.sauce'] ]
- name: skipMe
value: $[ stageDependencies.one.A.outputs['skipstep.skipsubsequent'] ]
steps:
- task: Bash@3
inputs:
filePath: 'script-b.sh'
name: fileversion
env:
StageSauce: $(StageSauce) # predefined in variables section
skipMe: $(skipMe) # predefined in variables section
- task: Bash@3
inputs:
targetType: 'inline'
script: |
echo 'Hello inline version'
echo $(skipMe)
echo $(StageSauce)
이전 파이프라인의 단계 출력은 다음과 같습니다.
Hello inline version
true
crushed tomatoes
변수 나열
az pipelines variable list 명령을 사용하여 파이프라인의 모든 변수를 나열 할 수 있습니다. 시작하려면 Azure DevOps CLI 시작을 참조하세요.
az pipelines variable list [--org]
[--pipeline-id]
[--pipeline-name]
[--project]
매개 변수
- org: Azure DevOps 조직 URL. 를 사용하여
az devops configure -d organization=ORG_URL
기본 조직을 구성할 수 있습니다. 기본값으로 구성되지 않았거나git config
. 예:--org https://dev.azure.com/MyOrganizationName/
- pipeline-id: 파이프라인 이름이 제공되지 않는 경우 필요합니다. 파이프라인의 ID입니다.
- pipeline-name: pipeline-id가 제공되지 않은 경우 필수이지만 파이프라인 ID가 제공되면 무시됩니다. 파이프라인의 이름입니다.
- project: 프로젝트의 이름 또는 ID입니다. 를 사용하여
az devops configure -d project=NAME_OR_ID
기본 프로젝트를 구성할 수 있습니다. 기본값으로 구성되지 않았거나git config
.
예시
다음 명령은 ID 가 12 인 파이프라인의 모든 변수를 나열하고 결과를 테이블 형식으로 보여 줍니다.
az pipelines variable list --pipeline-id 12 --output table
Name Allow Override Is Secret Value
------------- ---------------- ----------- ------------
MyVariable False False platform
NextVariable False True platform
Configuration False False config.debug
스크립트에서 변수 설정
스크립트는 파이프라인의 후속 단계에서 나중에 사용되는 변수를 정의할 수 있습니다. 이 메서드에서 설정한 모든 변수는 문자열로 처리됩니다. 스크립트에서 변수를 설정하려면 명령 구문을 사용하고 stdout에 인쇄합니다.
스크립트에서 작업 범위 변수 설정
스크립트에서 변수를 설정하려면 로깅 명령을 사용합니다 task.setvariable
. 그러면 후속 작업에 대한 환경 변수가 업데이트됩니다. 후속 작업은 매크로 구문을 사용하고 작업에서 환경 변수로 새 변수에 액세스할 수 있습니다.
true이면 issecret
변수 값이 비밀로 저장되고 로그에서 마스킹됩니다. 비밀 변수에 대한 자세한 내용은 로깅 명령을 참조 하세요.
steps:
# Create a variable
- bash: |
echo "##vso[task.setvariable variable=sauce]crushed tomatoes" # remember to use double quotes
# Use the variable
# "$(sauce)" is replaced by the contents of the `sauce` variable by Azure Pipelines
# before handing the body of the script to the shell.
- bash: |
echo my pipeline variable is $(sauce)
후속 단계에서는 파이프라인 변수도 해당 환경에 추가됩니다. 정의된 단계에서는 변수를 사용할 수 없습니다.
steps:
# Create a variable
# Note that this does not update the environment of the current script.
- bash: |
echo "##vso[task.setvariable variable=sauce]crushed tomatoes"
# An environment variable called `SAUCE` has been added to all downstream steps
- bash: |
echo "my environment variable is $SAUCE"
- pwsh: |
Write-Host "my environment variable is $env:SAUCE"
이전 파이프라인의 출력입니다.
my environment variable is crushed tomatoes
my environment variable is crushed tomatoes
다중 작업 출력 변수 설정
이후 작업에서 변수를 사용할 수 있도록 하려면 .를 사용하여 isOutput=true
변수를 출력 변수로 표시해야 합니다. 그런 다음 구문을 사용하고 $[]
변수를 설정하는 단계 이름을 포함하여 향후 작업에 매핑할 수 있습니다. 다중 작업 출력 변수는 동일한 단계의 작업에 대해서만 작동합니다.
여러 단계의 작업에 변수를 전달하려면 스테이지 종속성 구문을 사용합니다.
참고 항목
기본적으로 파이프라인의 각 단계는 YAML 파일에서 바로 앞에 있는 단계에 따라 달라집니다. 따라서 각 단계에서는 이전 단계의 출력 변수를 사용할 수 있습니다. 추가 단계에 액세스하려면 종속성 그래프 변경해야 합니다. 예를 들어 3단계에서 1단계의 변수가 필요한 경우 1단계에서 명시적 종속성을 선언해야 합니다.
다중 작업 출력 변수를 만들 때 변수에 식을 할당해야 합니다. 이 YAML $[ dependencies.A.outputs['setvarStep.myOutputVar'] ]
에서 변수 $(myVarFromJobA)
에 할당됩니다.
jobs:
# Set an output variable from job A
- job: A
pool:
vmImage: 'windows-latest'
steps:
- powershell: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the value"
name: setvarStep
- script: echo $(setvarStep.myOutputVar)
name: echovar
# Map the variable into job B
- job: B
dependsOn: A
pool:
vmImage: 'ubuntu-latest'
variables:
myVarFromJobA: $[ dependencies.A.outputs['setvarStep.myOutputVar'] ] # map in the variable
# remember, expressions require single quotes
steps:
- script: echo $(myVarFromJobA)
name: echovar
이전 파이프라인의 출력입니다.
this is the value
this is the value
한 단계에서 다른 단계로 변수를 설정하는 경우 .를 사용합니다 stageDependencies
.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=myStageOutputVar;isOutput=true]this is a stage output var"
name: printvar
- stage: B
dependsOn: A
variables:
myVarfromStageA: $[ stageDependencies.A.A1.outputs['printvar.myStageOutputVar'] ]
jobs:
- job: B1
steps:
- script: echo $(myVarfromStageA)
행렬 또는 조각에서 변수를 설정하는 경우 다운스트림 작업에서 변수에 액세스할 때 변수를 참조하려면 다음을 포함해야 합니다.
- 작업의 이름입니다.
- 단계입니다.
jobs:
# Set an output variable from a job with a matrix
- job: A
pool:
vmImage: 'ubuntu-latest'
strategy:
maxParallel: 2
matrix:
debugJob:
configuration: debug
platform: x64
releaseJob:
configuration: release
platform: x64
steps:
- bash: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the $(configuration) value"
name: setvarStep
- bash: echo $(setvarStep.myOutputVar)
name: echovar
# Map the variable from the debug job
- job: B
dependsOn: A
pool:
vmImage: 'ubuntu-latest'
variables:
myVarFromJobADebug: $[ dependencies.A.outputs['debugJob.setvarStep.myOutputVar'] ]
steps:
- script: echo $(myVarFromJobADebug)
name: echovar
jobs:
# Set an output variable from a job with slicing
- job: A
pool:
vmImage: 'ubuntu-latest'
parallel: 2 # Two slices
steps:
- bash: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the slice $(system.jobPositionInPhase) value"
name: setvarStep
- script: echo $(setvarStep.myOutputVar)
name: echovar
# Map the variable from the job for the first slice
- job: B
dependsOn: A
pool:
vmImage: 'ubuntu-latest'
variables:
myVarFromJobsA1: $[ dependencies.A.outputs['job1.setvarStep.myOutputVar'] ]
steps:
- script: "echo $(myVarFromJobsA1)"
name: echovar
작업 이름을 배포 작업의 출력 변수에 접두사로 추가해야 합니다. 이 경우 작업 이름은 다음과 같습니다 A
.
jobs:
# Set an output variable from a deployment
- deployment: A
pool:
vmImage: 'ubuntu-latest'
environment: staging
strategy:
runOnce:
deploy:
steps:
- bash: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the deployment variable value"
name: setvarStep
- bash: echo $(setvarStep.myOutputVar)
name: echovar
# Map the variable from the job for the first slice
- job: B
dependsOn: A
pool:
vmImage: 'ubuntu-latest'
variables:
myVarFromDeploymentJob: $[ dependencies.A.outputs['A.setvarStep.myOutputVar'] ]
steps:
- bash: "echo $(myVarFromDeploymentJob)"
name: echovar
식을 사용하여 변수 설정
식을 사용하여 변수를 설정할 수 있습니다. 이전 작업에서 변수를 다른 작업의 출력으로 설정하는 한 가지 사례가 이미 발견되었습니다.
- job: B
dependsOn: A
variables:
myVarFromJobsA1: $[ dependencies.A.outputs['job1.setvarStep.myOutputVar'] ] # remember to use single quotes
변수를 설정하기 위해 지원되는 식을 사용할 수 있습니다. 다음은 100에서 시작하여 매 실행마다 1씩 증가하며 매일 100으로 다시 설정되는 카운터 역할을 하도록 변수를 설정하는 예제입니다.
jobs:
- job:
variables:
a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
steps:
- bash: echo $(a)
카운터, 종속성 및 기타 식에 대한 자세한 내용은 식을 참조 하세요.
단계에 대한 settable 변수 구성
단계 내에서 정의 settableVariables
하거나 변수를 설정할 수 없하도록 지정할 수 있습니다.
이 예제에서는 스크립트가 변수를 설정할 수 없습니다.
steps:
- script: echo This is a step
target:
settableVariables: none
이 예제에서 스크립트는 변수를 허용하지만 변수 sauce
secretSauce
는 허용하지 않습니다. 파이프라인 실행 페이지에 경고가 표시됩니다.
steps:
- bash: |
echo "##vso[task.setvariable variable=Sauce;]crushed tomatoes"
echo "##vso[task.setvariable variable=secretSauce;]crushed tomatoes with garlic"
target:
settableVariables:
- sauce
name: SetVars
- bash:
echo "Sauce is $(sauce)"
echo "secretSauce is $(secretSauce)"
name: OutputVars
큐 시간에 허용
YAML 파일 블록에 변수가 variables
나타나면 해당 값이 고정되며 큐 시간에 재정의할 수 없습니다. YAML 파일에서 변수를 정의하는 것이 가장 좋지만 이해가 되지 않는 경우가 있습니다. 예를 들어 비밀 변수를 정의하고 YAML에 변수를 노출하지 않을 수 있습니다. 또는 파이프라인을 실행하는 동안 변수 값을 수동으로 설정해야 할 수도 있습니다.
큐 시간 값을 정의하는 두 가지 옵션이 있습니다. UI에서 변수를 정의하고 사용자가 이 파이프라인을 실행할 때 이 값을 재정의하도록 허용하거나 런타임 매개 변수를 대신 사용할 수 있는 옵션을 선택할 수 있습니다. 변수가 비밀이 아닌 경우 런타임 매개 변수를 사용하는 것이 가장 좋습니다.
큐 시간에 변수를 설정하려면 파이프라인 내에 새 변수를 추가하고 재정의 옵션을 선택합니다.
큐 시간에 변수를 설정할 수 있도록 하려면 해당 변수가 파이프라인 또는 작업의 블록에도 variables
표시되지 않는지 확인합니다. YAML의 변수 블록과 UI 모두에서 변수를 정의하는 경우 YAML의 값에 우선 순위가 있습니다.
변수 확장
여러 범위에서 동일한 이름의 변수를 설정하는 경우 다음 우선 순위가 적용됩니다(가장 높은 우선 순위 먼저).
- YAML 파일에 설정된 작업 수준 변수
- YAML 파일에 설정된 단계 수준 변수
- YAML 파일에 설정된 파이프라인 수준 변수
- 큐 시간에 설정된 변수
- 파이프라인 설정 UI에 설정된 파이프라인 변수
다음 예제에서는 YAML 파일의 파이프라인 수준 및 작업 수준에서 동일한 변수 a
가 설정됩니다. 또한 변수 그룹 G
및 파이프라인 설정 UI의 변수로 설정됩니다.
variables:
a: 'pipeline yaml'
stages:
- stage: one
displayName: one
variables:
- name: a
value: 'stage yaml'
jobs:
- job: A
variables:
- name: a
value: 'job yaml'
steps:
- bash: echo $(a) # This will be 'job yaml'
동일한 범위에서 이름이 같은 변수를 설정하면 마지막 집합 값이 우선합니다.
stages:
- stage: one
displayName: Stage One
variables:
- name: a
value: alpha
- name: a
value: beta
jobs:
- job: I
displayName: Job I
variables:
- name: b
value: uno
- name: b
value: dos
steps:
- script: echo $(a) #outputs beta
- script: echo $(b) #outputs dos
참고 항목
YAML 파일에서 변수를 설정하는 경우 웹 편집기에서 큐 시간에 설정 가능한 변수로 정의하지 마세요. 현재는 큐 시간에 YAML 파일에 설정된 변수를 변경할 수 없습니다. 큐 시간에 변수를 설정할 수 있어야 하는 경우 YAML 파일에서 설정하지 마세요.
실행이 시작될 때 변수가 한 번 확장되고 각 단계가 시작될 때 다시 확장됩니다. 예시:
jobs:
- job: A
variables:
a: 10
steps:
- bash: |
echo $(a) # This will be 10
echo '##vso[task.setvariable variable=a]20'
echo $(a) # This will also be 10, since the expansion of $(a) happens before the step
- bash: echo $(a) # This will be 20, since the variables are expanded just before the step
앞의 예제에는 두 단계가 있습니다. 확장 $(a)
은 작업의 시작 부분에서 한 번, 두 단계의 시작 부분에서 한 번 발생합니다.
변수는 작업 시작 시 확장되므로 전략에서 사용할 수 없습니다. 다음 예제에서는 변수 a
를 사용하여 작업 매트릭스를 확장할 수 없습니다. 변수는 확장된 각 작업의 시작 부분에서만 사용할 수 있기 때문입니다.
jobs:
- job: A
variables:
a: 10
strategy:
matrix:
x:
some_variable: $(a) # This does not work
변수 a
가 이전 작업의 출력 변수인 경우 이후 작업에서 사용할 수 있습니다.
- job: A
steps:
- powershell: echo "##vso[task.setvariable variable=a;isOutput=true]10"
name: a_step
# Map the variable into job B
- job: B
dependsOn: A
variables:
some_variable: $[ dependencies.A.outputs['a_step.a'] ]
재귀 확장
에이전트에서 구문을 사용하여 $( )
참조되는 변수는 재귀적으로 확장됩니다.
예시:
variables:
myInner: someValue
myOuter: $(myInner)
steps:
- script: echo $(myOuter) # prints "someValue"
displayName: Variable is $(myOuter) # display name is "Variable is someValue"