템플릿 식
템플릿 식을 사용하여 파이프라인 초기화 중에 값을 동적으로 확인하는 방법을 지정합니다.
다음 구문 ${{ }}
내에서 템플릿 식을 래핑합니다.
템플릿 식은 템플릿 매개 변수 및 변수를 확장할 수 있습니다.
매개 변수를 사용하여 템플릿이 확장되는 방식에 영향을 줄 수 있습니다.
개체는 parameters
식의 variables
개체 처럼 작동합니다. 템플릿 식에는 미리 정의된 변수만 사용할 수 있습니다.
참고 항목
식은 ,jobs
, steps
및 containers
(내부resources
)에 stages
대해서만 확장됩니다.
예를 들어 내부 trigger
식이나 리소스(예: repositories
.)를 사용할 수 없습니다.
또한 Azure DevOps 2020 RTW에서는 내부에서 containers
템플릿 식을 사용할 수 없습니다.
예를 들어 템플릿을 정의합니다.
# File: steps/msbuild.yml
parameters:
- name: 'solution'
default: '**/*.sln'
type: string
steps:
- task: msbuild@1
inputs:
solution: ${{ parameters['solution'] }} # index syntax
- task: vstest@2
inputs:
solution: ${{ parameters.solution }} # property dereference syntax
그런 다음 템플릿을 참조하고 선택적 solution
매개 변수를 전달합니다.
# File: azure-pipelines.yml
steps:
- template: steps/msbuild.yml
parameters:
solution: my.sln
Context
템플릿 식 내에서 전달된 매개 변수 값을 포함하는 컨텍스트에 액세스할 수 parameters
있습니다.
또한 YAML 파일에 지정된 모든 변수와 미리 정의된 많은 변수가 포함된 컨텍스트에 액세스할 수 variables
있습니다(해당 문서의 각 변수에 기록됨).
중요한 것은 파이프라인에 저장되거나 실행을 시작할 때 지정된 것과 같은 런타임 변수가 없다는 것입니다.
템플릿 확장은 실행 초기에 수행되므로 해당 변수를 사용할 수 없습니다.
템플릿 식 함수
템플릿에서 일반 함수를 사용할 수 있습니다. 몇 가지 템플릿 식 함수를 사용할 수도 있습니다.
format
- 간단한 문자열 토큰 바꾸기
- 최소 매개 변수: 2. 최대 매개 변수: N
- 예:
${{ format('{0} Build', parameters.os) }}
→'Windows Build'
coalesce
- 비어있지 않은 null이 아닌 첫 번째 문자열 인수로 계산됩니다.
- 최소 매개 변수: 2. 최대 매개 변수: N
- 예시:
parameters:
- name: 'restoreProjects'
default: ''
type: string
- name: 'buildProjects'
default: ''
type: string
steps:
- script: echo ${{ coalesce(parameters.foo, parameters.bar, 'Nothing to see') }}
삽입
템플릿 식을 사용하여 YAML 파이프라인의 구조를 변경할 수 있습니다. 예를 들어 시퀀스에 삽입하려면 다음을 수행합니다.
# File: jobs/build.yml
parameters:
- name: 'preBuild'
type: stepList
default: []
- name: 'preTest'
type: stepList
default: []
- name: 'preSign'
type: stepList
default: []
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
steps:
- script: cred-scan
- ${{ parameters.preBuild }}
- task: msbuild@1
- ${{ parameters.preTest }}
- task: vstest@2
- ${{ parameters.preSign }}
- script: sign
# File: .vsts.ci.yml
jobs:
- template: jobs/build.yml
parameters:
preBuild:
- script: echo hello from pre-build
preTest:
- script: echo hello from pre-test
배열이 배열에 삽입되면 중첩된 배열이 평면화됩니다.
매핑에 삽입하려면 특수 속성을 ${{ insert }}
사용합니다.
# Default values
parameters:
- name: 'additionalVariables'
type: object
default: {}
jobs:
- job: build
variables:
configuration: debug
arch: x86
${{ insert }}: ${{ parameters.additionalVariables }}
steps:
- task: msbuild@1
- task: vstest@2
jobs:
- template: jobs/build.yml
parameters:
additionalVariables:
TEST_SUITE: L0,L1
조건부 삽입
템플릿에서 시퀀스 또는 매핑에 조건부로 삽입하려면 삽입 및 식 평가를 사용합니다. 템플릿 구문을 사용하는 한 템플릿 외부에서 문을 사용할 if
수도 있습니다.
예를 들어 템플릿의 시퀀스에 삽입하려면 다음을 수행합니다.
# File: steps/build.yml
parameters:
- name: 'toolset'
default: msbuild
type: string
values:
- msbuild
- dotnet
steps:
# msbuild
- ${{ if eq(parameters.toolset, 'msbuild') }}:
- task: msbuild@1
- task: vstest@2
# dotnet
- ${{ if eq(parameters.toolset, 'dotnet') }}:
- task: dotnet@1
inputs:
command: build
- task: dotnet@1
inputs:
command: test
# File: azure-pipelines.yml
steps:
- template: steps/build.yml
parameters:
toolset: dotnet
예를 들어 템플릿의 매핑에 삽입하려면 다음을 수행합니다.
# File: steps/build.yml
parameters:
- name: 'debug'
type: boolean
default: false
steps:
- script: tool
env:
${{ if eq(parameters.debug, true) }}:
TOOL_DEBUG: true
TOOL_DEBUG_DIR: _dbg
steps:
- template: steps/build.yml
parameters:
debug: true
변수에 조건부 삽입을 사용할 수도 있습니다. 이 예제 start
에서는 항상 변수가 같은 경우에만 foo
인쇄됩니다 this is a test
test
.
variables:
- name: foo
value: test
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "start" # always runs
- ${{ if eq(variables.foo, 'test') }}:
- script: echo "this is a test" # runs when foo=test
다른 변수의 값에 따라 변수를 설정할 수도 있습니다. 다음 파이프라인 myVar
에서는 값을 설정하는 conditionalVar
데 사용됩니다.
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
variables:
- name: myVar
value: 'baz'
- name: conditionalVar
${{ if eq(variables['myVar'], 'foo') }}:
value: 'bar'
${{ elseif eq(variables['myVar'], 'baz') }}:
value: 'qux'
${{ else }}:
value: 'default'
steps:
- script: echo "start" # always runs
- ${{ if eq(variables.conditionalVar, 'bar') }}:
- script: echo "the value of myVar is set in the if condition" # runs when myVar=foo
- ${{ if eq(variables.conditionalVar, 'qux') }}:
- script: echo "the value of myVar is set in the elseif condition" # runs when myVar=baz
반복적 삽입
지시문은 each
YAML 시퀀스(배열) 또는 매핑(키-값 쌍)을 기반으로 반복 삽입을 허용합니다.
예를 들어 각 작업의 단계를 다른 사전 및 사후 단계로 래핑할 수 있습니다.
# job.yml
parameters:
- name: 'jobs'
type: jobList
default: []
jobs:
- ${{ each job in parameters.jobs }}: # Each job
- ${{ each pair in job }}: # Insert all properties other than "steps"
${{ if ne(pair.key, 'steps') }}:
${{ pair.key }}: ${{ pair.value }}
steps: # Wrap the steps
- task: SetupMyBuildTools@1 # Pre steps
- ${{ job.steps }} # Users steps
- task: PublishMyTelemetry@1 # Post steps
condition: always()
# azure-pipelines.yml
jobs:
- template: job.yml
parameters:
jobs:
- job: A
steps:
- script: echo This will get sandwiched between SetupMyBuildTools and PublishMyTelemetry.
- job: B
steps:
- script: echo So will this!
반복하는 항목의 속성을 조작할 수도 있습니다. 예를 들어 종속성을 더 추가하려면 다음을 수행합니다.
# job.yml
parameters:
- name: 'jobs'
type: jobList
default: []
jobs:
- job: SomeSpecialTool # Run your special tool in its own job first
steps:
- task: RunSpecialTool@1
- ${{ each job in parameters.jobs }}: # Then do each job
- ${{ each pair in job }}: # Insert all properties other than "dependsOn"
${{ if ne(pair.key, 'dependsOn') }}:
${{ pair.key }}: ${{ pair.value }}
dependsOn: # Inject dependency
- SomeSpecialTool
- ${{ if job.dependsOn }}:
- ${{ job.dependsOn }}
# azure-pipelines.yml
jobs:
- template: job.yml
parameters:
jobs:
- job: A
steps:
- script: echo This job depends on SomeSpecialTool, even though it's not explicitly shown here.
- job: B
dependsOn:
- A
steps:
- script: echo This job depends on both Job A and on SomeSpecialTool.
값 이스케이프
문자 그대로 포함된 값을 이스케이프해야 하는 경우 식 문자열에 값을 래핑합니다 ${{
. 예를 들어 ${{ 'my${{value' }}
또는 ${{ 'my${{value with a '' single quote too' }}
와 같습니다.