템플릿 유형 및 사용량

템플릿을 사용하면 재사용 가능한 콘텐츠, 논리 및 매개 변수를 정의할 수 있습니다. 템플릿은 두 가지 방법으로 작동합니다. 템플릿을 사용하여 재사용 가능한 콘텐츠를 삽입하거나 템플릿을 사용하여 파이프라인에서 허용되는 내용을 제어할 수 있습니다. 두 번째 방법은 템플릿을 통해 보안 파이프라인을 빌드하는데 유용합니다.

템플릿을 사용하여 콘텐츠를 포함하는 경우 많은 프로그래밍 언어에서 include 지시문처럼 작동합니다. 한 파일의 콘텐츠가 다른 파일에 삽입됩니다. 템플릿이 파이프라인에서 허용되는 내용을 제어하는 경우 템플릿은 다른 파일이 따라야 하는 논리를 정의합니다.

템플릿을 사용하여 논리를 한 번 정의한 다음, 여러 번 다시 사용합니다. 템플릿은 여러 YAML 파일의 내용을 단일 파이프라인으로 결합합니다. 부모 파이프라인에서 템플릿에 매개 변수를 전달할 수 있습니다.

매개 변수

템플릿에서 매개 변수 및 해당 데이터 형식을 지정하고 해당 매개 변수를 파이프라인에 전달할 수 있습니다. 템플릿 외부에서 매개 변수를 사용할수도 있습니다. 매개 변수 기본값에는 리터럴만 사용할 수 있습니다.

매개 변수 전달

매개 변수는 이름 및 데이터 형식을 포함해야 합니다. 에서 azure-pipelines.yml 매개 yesNo 변수가 부울 값으로 설정되면 빌드가 성공합니다. yesNo가 와 같은 문자열로 설정되면 apples 빌드가 실패합니다.

# File: simple-param.yml
parameters:
- name: yesNo # name of the parameter; required
  type: boolean # data type of the parameter; required
  default: false

steps:
- script: echo ${{ parameters.yesNo }}
# File: azure-pipelines.yml
trigger:
- master

extends:
  template: simple-param.yml
  parameters:
      yesNo: false # set to a non-boolean value to have the build fail

런타임에 템플릿을 선택하는 매개 변수

조건에 따라 파이프라인 YAML에서 다른 템플릿을 호출할 수 있습니다. 이 예제에서는 experimental.yml 매개 변수가 true일 때 experimentalTemplate YAML이 실행됩니다.

#azure-pipeline.yml
parameters:
- name: experimentalTemplate
  displayName: 'Use experimental build process?'
  type: boolean
  default: false

steps:
- ${{ if eq(parameters.experimentalTemplate, true) }}:
  - template: experimental.yml
- ${{ if not(eq(parameters.experimentalTemplate, true)) }}:
  - template: stable.yml

매개 변수 데이터 형식

데이터 형식 참고
string 문자열
number 로 제한 될 수 있습니다. values: 그렇지 않으면 숫자와 비슷한 문자열이 모두 허용 됩니다.
boolean true 또는 false
object 모든 YAML 구조
step 단일 단계
stepList 일련의 단계
job 단일 작업
jobList 작업 순서
deployment 단일 배포 작업
deploymentList 배포 작업 시퀀스
stage 단일 단계
stageList 단계 시퀀스

Step, stepList, job, jobList, deployment, deploymentList, stage 및 stageList 데이터 형식은 모두 표준 YAML 스키마 형식을 사용 합니다. 이 예에는 문자열, 숫자, 부울, 개체, 단계 및 stepList 포함 됩니다.

parameters:
- name: myString
  type: string
  default: a string
- name: myMultiString
  type: string
  default: default
  values:
  - default
  - ubuntu
- name: myNumber
  type: number
  default: 2
  values:
  - 1
  - 2
  - 4
  - 8
  - 16
- name: myBoolean
  type: boolean
  default: true
- name: myObject
  type: object
  default:
    foo: FOO
    bar: BAR
    things:
    - one
    - two
    - three
    nested:
      one: apple
      two: pear
      count: 3
- name: myStep
  type: step
  default:
    script: echo my step
- name: mySteplist
  type: stepList
  default:
    - script: echo step one
    - script: echo step two

trigger: none

jobs: 
- job: stepList
  steps: ${{ parameters.mySteplist }}
- job: myStep
  steps:
    - ${{ parameters.myStep }}

개체를 반복하고 개체의 각 문자열을 인쇄할 수 있습니다.

parameters:
- name: listOfStrings
  type: object
  default:
  - one
  - two

steps:
- ${{ each value in parameters.listOfStrings }}:
  - script: echo ${{ value }}

템플릿에서 확장

보안을 강화하기 위해 파이프라인이 특정 템플릿에서 확장하도록 적용할 수 있습니다. 파일은 start.yml 매개 변수 를 buildSteps 정의한 다음, 파이프라인에서 azure-pipelines.yml 사용됩니다. 에서 start.yml 스크립트 buildStep 단계와 함께 가 전달되면 이 거부되고 파이프라인 빌드가 실패합니다. 템플릿에서 확장할 때 필요한 템플릿 승인을추가하여 보안을 강화할 수 있습니다.

# File: start.yml
parameters:
- name: buildSteps # the name of the parameter is buildSteps
  type: stepList # data type is StepList
  default: [] # default value of buildSteps
stages:
- stage: secure_buildstage
  pool: Hosted VS2017
  jobs:
  - job: secure_buildjob
    steps:
    - script: echo This happens before code 
      displayName: 'Base: Pre-build'
    - script: echo Building
      displayName: 'Base: Build'

    - ${{ each step in parameters.buildSteps }}:
      - ${{ each pair in step }}:
          ${{ if ne(pair.value, 'CmdLine@2') }}:
            ${{ pair.key }}: ${{ pair.value }}       
          ${{ if eq(pair.value, 'CmdLine@2') }}: 
            '${{ pair.value }}': error         

    - script: echo This happens after code
      displayName: 'Base: Signing'
# File: azure-pipelines.yml
trigger:
- master

extends:
  template: start.yml
  parameters:
    buildSteps:  
      - bash: echo Test #Passes
        displayName: succeed
      - bash: echo "Test"
        displayName: succeed
      - task: CmdLine@2
        displayName: Test 3 - Will Fail
        inputs:
          script: echo "Script Test"

리소스를 통해 템플릿에서 확장

를 사용하여 extends 리소스가 포함된 Azure 파이프라인의 템플릿에서 확장할 수도 있습니다.

# File: azure-pipelines.yml
trigger:
- none

extends:
  template: resource-template.yml
# File: resource-template.yml
resources:
  pipelines:
  - pipeline: my-pipeline 
    source: sourcePipeline

steps:
 - script: echo "Testing resource template"

템플릿 삽입

하나의 YAML에서 콘텐츠를 복사하고 다른 YAML에서 다시 사용할 수 있습니다. 한 YAML에서 다른 YAML로 콘텐츠를 복사하면 여러 위치에 동일한 논리를 수동으로 포함할 필요가 없어지게 됩니다. include-npm-steps.yml파일 템플릿에는 에서 다시 사용 되는 단계가 포함 azure-pipelines.yml 합니다.

템플릿 파일은 파이프라인 실행이 시작될 때 파일시스템에 있어야 합니다. 아티팩트에서 템플릿을 참조할 수 없습니다.

# File: templates/include-npm-steps.yml

steps:
- script: npm install
- script: yarn install
- script: npm run compile
# File: azure-pipelines.yml

jobs:
- job: Linux
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - template: templates/include-npm-steps.yml  # Template reference
- job: Windows
  pool:
    vmImage: 'windows-latest'
  steps:
  - template: templates/include-npm-steps.yml  # Template reference

단계 재사용

템플릿을 삽입하여 여러 작업에서 하나 이상의 단계를 다시 사용할 수 있습니다. 템플릿의 단계 외에도 각 작업은 더 많은 단계를 정의할 수 있습니다.

# File: templates/npm-steps.yml
steps:
- script: npm install
- script: npm test
# File: azure-pipelines.yml

jobs:
- job: Linux
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - template: templates/npm-steps.yml  # Template reference

- job: macOS
  pool:
    vmImage: 'macOS-latest'
  steps:
  - template: templates/npm-steps.yml  # Template reference

- job: Windows
  pool:
    vmImage: 'windows-latest'
  steps:
  - script: echo This script runs before the template's steps, only on Windows.
  - template: templates/npm-steps.yml  # Template reference
  - script: echo This step runs after the template's steps.

작업 재사용

단계와 마찬가지로 작업을 템플릿과 함께 다시 사용할 수 있습니다.

# File: templates/jobs.yml
jobs:
- job: Ubuntu
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - bash: echo "Hello Ubuntu"

- job: Windows
  pool:
    vmImage: 'windows-latest'
  steps:
  - bash: echo "Hello Windows"
# File: azure-pipelines.yml

jobs:
- template: templates/jobs.yml  # Template reference

여러 작업을 작업할 때 충돌을 방지하려면 템플릿 파일에서 작업 이름을 제거해야 합니다.

# File: templates/jobs.yml
jobs:
- job: 
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - bash: echo "Hello Ubuntu"

- job: Windows
  pool:
    vmImage: 'windows-latest'
  steps:
  - bash: echo "Hello Windows"
# File: azure-pipelines.yml

jobs:
- template: templates/jobs.yml  # Template reference
- template: templates/jobs.yml  # Template reference
- template: templates/jobs.yml  # Template reference

스테이지 재사용

스테이지를 템플릿과 함께 다시 사용할 수도 있습니다.

# File: templates/stages1.yml
stages:
- stage: Angular
  jobs:
  - job: angularinstall
    steps:
    - script: npm install angular
# File: templates/stages2.yml
stages:
- stage: Build
  jobs:
  - job: build
    steps:
    - script: npm run build
# File: azure-pipelines.yml
trigger:
- master

pool:
  vmImage: 'ubuntu-latest'

stages:
- stage: Install
  jobs: 
  - job: npminstall
    steps:
    - task: Npm@1
      inputs:
        command: 'install'
- template: templates/stages1.yml
- template: templates/stages2.yml

매개 변수가 있는 작업, 단계 및 단계 템플릿

# File: templates/npm-with-params.yml

parameters:
- name: name  # defaults for any parameters that aren't specified
  default: ''
- name: vmImage
  default: ''

jobs:
- job: ${{ parameters.name }}
  pool: 
    vmImage: ${{ parameters.vmImage }}
  steps:
  - script: npm install
  - script: npm test

파이프라인에서 템플릿을 사용하는 경우 템플릿 매개 변수의 값을 지정합니다.

# File: azure-pipelines.yml

jobs:
- template: templates/npm-with-params.yml  # Template reference
  parameters:
    name: Linux
    vmImage: 'ubuntu-latest'

- template: templates/npm-with-params.yml  # Template reference
  parameters:
    name: macOS
    vmImage: 'macOS-latest'

- template: templates/npm-with-params.yml  # Template reference
  parameters:
    name: Windows
    vmImage: 'windows-latest'

단계 또는 스테이지 템플릿에서 매개 변수를 사용할 수도 있습니다. 예를 들어 매개 변수가 있는 단계는 다음과 같습니다.

# File: templates/steps-with-params.yml

parameters:
- name: 'runExtendedTests'  # defaults for any parameters that aren't specified
  type: boolean
  default: false

steps:
- script: npm test
- ${{ if eq(parameters.runExtendedTests, true) }}:
  - script: npm test --extended

파이프라인에서 템플릿을 사용하는 경우 템플릿 매개 변수의 값을 지정합니다.

# File: azure-pipelines.yml

steps:
- script: npm install

- template: templates/steps-with-params.yml  # Template reference
  parameters:
    runExtendedTests: 'true'

참고

지정된 형식이 없는 스칼라 매개 변수는 문자열로 처리됩니다. 예를 들어 는 eq(true, parameters['myparam']) true 가 명시적으로 myparam 만들어지지 않은 경우 매개 변수가 단어인 경우에도 falsemyparam boolean 반환합니다. 비어있지 않은 문자열은 true 부울 컨텍스트에서 로 캐스팅됩니다. 문자열을 명시적으로 비교하도록 해당 식을 다시 작성할 수 eq(parameters['myparam'], 'true') 있습니다.

매개 변수는 스칼라 문자열로 제한되지 않습니다. 데이터 형식목록을 참조하세요. 예를 들어 형식을 사용하는 경우는 다음과 같습니다. object

# azure-pipelines.yml
jobs:
- template: process.yml
  parameters:
    pool:   # this parameter is called `pool`
      vmImage: ubuntu-latest  # and it's a mapping rather than a string


# process.yml
parameters:
- name: 'pool'
  type: object
  default: {}

jobs:
- job: build
  pool: ${{ parameters.pool }}

변수 재사용

변수는 하나의 YAML에서 정의되고 다른 템플릿에 포함될 수 있습니다. 모든 변수를 하나의 파일에 저장하려는 경우에 유용할 수 있습니다. 템플릿을 사용하여 파이프라인에 변수를 포함하는 경우 포함된 템플릿은 변수를 정의하는 데만 사용할 수 있습니다. 템플릿 에서 확장할때 단계 및 더 복잡한 논리를 사용할 수 있습니다. 형식을 제한하려는 경우 변수 대신 매개 변수를 사용합니다.

이 예제에서 favoriteVeggie 변수는 에 azure-pipelines.yml 포함됩니다.

# File: vars.yml
variables:
  favoriteVeggie: 'brussels sprouts'
# File: azure-pipelines.yml

variables:
- template: vars.yml  # Template reference

steps:
- script: echo My favorite vegetable is ${{ variables.favoriteVeggie }}.

참조 템플릿 경로

템플릿 경로는 포함을 수행하는 파일을 기준으로 해야 합니다. 다음은 중첩 계층의 예입니다.

|
+-- fileA.yml
|
+-- dir1/
     |
     +-- fileB.yml
     |
     +-- dir2/
          |
          +-- fileC.yml

그런 다음 에서 fileA.yml 및 를 다음과 같이 참조할 수 fileB.yml fileC.yml 있습니다.

steps:
- template: dir1/fileB.yml
- template: dir1/dir2/fileC.yml

fileC.yml가 시작점인 경우 다음과 같이 및 를 포함할 수 fileA.yml fileB.yml 있습니다.

steps:
- template: ../../fileA.yml
- template: ../fileB.yml

fileB.yml가 시작점인 경우 다음과 같이 및 를 포함할 수 fileA.yml fileC.yml 있습니다.

steps:
- template: ../fileA.yml
- template: dir2/fileC.yml

다른 리포지토리 사용

템플릿을 다른 리포지토리에 유지할 수 있습니다. 예를 들어 모든 앱 파이프라인을 사용하려는 핵심 파이프라인이 있다고 가정합니다. 템플릿을 핵심 리포지토리에 배치한 다음, 각 앱 리포지토리에서 참조할 수 있습니다.

# Repo: Contoso/BuildTemplates
# File: common.yml
parameters:
- name: 'vmImage'
  default: 'ubuntu 16.04'
  type: string

jobs:
- job: Build
  pool:
    vmImage: ${{ parameters.vmImage }}
  steps:
  - script: npm install
  - script: npm test

이제 여러 파이프라인에서 이 템플릿을 다시 사용할 수 있습니다. 사양을 사용하여 resources 핵심 리포지션의 위치를 제공합니다. 핵심 리포지전체를 참조하는 경우 @ 및 에서 지정한 이름을 resources 사용합니다.

# Repo: Contoso/LinuxProduct
# File: azure-pipelines.yml
resources:
  repositories:
    - repository: templates
      type: github
      name: Contoso/BuildTemplates

jobs:
- template: common.yml@templates  # Template reference
# Repo: Contoso/WindowsProduct
# File: azure-pipelines.yml
resources:
  repositories:
    - repository: templates
      type: github
      name: Contoso/BuildTemplates
      ref: refs/tags/v1.0 # optional ref to pin to

jobs:
- template: common.yml@templates  # Template reference
  parameters:
    vmImage: 'windows-latest'

의 경우 type: github name 는 위의 <identity>/<repo> 예제와 같습니다. type: git(Azure Repos)의 경우 name<project>/<repo> 입니다. 해당 프로젝트가 별도의 Azure DevOps 조직에 있는 경우 프로젝트에 액세스할 수 있는 형식의 서비스 연결을 Azure Repos/Team Foundation Server 구성하고 YAML에 포함해야 합니다.

resources:
  repositories:
  - repository: templates
    name: Contoso/BuildTemplates
    endpoint: myServiceConnection # Azure DevOps service connection
jobs:
- template: common.yml@templates

리포지토리는 파이프라인이 시작될 때 한 번만 확인됩니다. 그런 다음 파이프라인 기간 동안 동일한 리소스가 사용됩니다. 템플릿 파일만 사용됩니다. 템플릿이 완전히 확장되면 최종 파이프라인은 원본 리포지점에서 완전히 정의된 것처럼 실행됩니다. 즉, 파이프라인의 템플릿 리포지물에서 스크립트를 사용할 수 없습니다.

특정 고정 버전의 템플릿을 사용하려면 에 고정해야 ref 합니다. refs는 분기( refs/heads/<name> ) 또는 태그( refs/tags/<name> )입니다. 특정 커밋을 고정하려면 먼저 해당 커밋을 가리키는 태그를 만든 다음, 해당 태그에 고정합니다.

참고

ref 지정하지 않으면 파이프라인은 기본적으로 를 사용하게 refs/heads/master 됩니다.

를 사용하여 @self 기본 파이프라인이 발견된 리포지토리를 참조할 수도 있습니다. extends확장 파이프라인 리포지토리의 콘텐츠를 다시 참조하려는 경우 템플릿에서 사용하기에 편리합니다. 예:

# Repo: Contoso/Central
# File: template.yml
jobs:
- job: PreBuild
  steps: []

  # Template reference to the repo where this template was
  # included from - consumers of the template are expected
  # to provide a "BuildJobs.yml"
- template: BuildJobs.yml@self

- job: PostBuild
  steps: []
# Repo: Contoso/MyProduct
# File: azure-pipelines.yml
resources:
  repositories:
    - repository: templates
      type: git
      name: Contoso/Central

extends:
  template: template.yml@templates
# Repo: Contoso/MyProduct
# File: BuildJobs.yml
jobs:
- job: Build
  steps: []

템플릿 식

템플릿 식을 사용하여 파이프라인 초기화 중에 값을 동적으로 해결하는 방법을 지정합니다. 템플릿 식을 구문 안에 ${{ }} 래핑합니다.

템플릿 식은 템플릿 매개 변수 및 변수를 확장할 수 있습니다. 매개 변수를 사용하여 템플릿이 확장되는 방식에 영향을 줄 수 있습니다. parameters개체는 식의 variables 개체처럼 작동합니다. 미리 정의 된 변수만 템플릿 식에 사용할 수 있습니다.

참고

식은,, 및에 대해서만 확장 됩니다 stages jobs steps containers (내부 resources ). 예를 들어 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 전달 된 매개 변수의 값을 포함 하는 컨텍스트에 액세스할 수 있습니다. 또한 variables YAML 파일에 지정 된 모든 변수 및 미리 정의 된 많은 변수 (해당 항목의 각 변수에 명시 됨)를 포함 하는 컨텍스트에 액세스할 수 있습니다. 중요 한 것은 파이프라인에 저장 된 것과 같은 런타임 변수를 포함 하지 않거나 실행을 시작할 때 제공 되는 것입니다. 템플릿 확장 은 실행에서 매우 일찍발생 하므로 이러한 변수를 사용할 수 없습니다.

필수 매개 변수

템플릿의 시작 부분에 유효성 검사 단계를 추가 하 여 필요한 매개 변수를 확인할 수 있습니다.

다음은 solution Bash를 사용 하 여 매개 변수를 확인 하는 예제입니다 .이를 통해 모든 플랫폼에서 작업을 수행할 수 있습니다.

# File: steps/msbuild.yml

parameters:
- name: 'solution'
  default: ''
  type: string

steps:
- bash: |
    if [ -z "$SOLUTION" ]; then
      echo "##vso[task.logissue type=error;]Missing template parameter \"solution\""
      echo "##vso[task.complete result=Failed;]"
    fi
  env:
    SOLUTION: ${{ parameters.solution }}
  displayName: Check for required parameters
- task: msbuild@1
  inputs:
    solution: ${{ parameters.solution }}
- task: vstest@2
  inputs:
    solution: ${{ parameters.solution }}

필수 매개 변수가 없는 경우 템플릿이 실패 함을 보여 주기 위해 다음을 수행 합니다.

# File: azure-pipelines.yml

# This will fail since it doesn't set the "solution" parameter to anything,
# so the template will use its default of an empty string
steps:
- template: steps/msbuild.yml

템플릿 식 함수

템플릿에서 일반 함수 를 사용할 수 있습니다. 몇 가지 템플릿 식 함수를 사용할 수도 있습니다.

format

  • 단순 문자열 토큰 바꾸기
  • Min parameters: 2. 최대 매개 변수: N
  • 예: ${{ format('{0} Build', parameters.os) }}'Windows Build'

coalesce

  • 비어 있지 않은 첫 번째 문자열 인수를 계산 합니다.
  • Min parameters: 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 항상를 인쇄 하 고 this is a test foo 변수가과 같을 때만 인쇄 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

반복 삽입

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' }}와 같습니다.

적용 한도

템플릿 및 템플릿 식으로 인해 파이프라인의 크기 및 복잡성이 증가 합니다. 런어웨이 확장을 방지 하기 위해 Azure Pipelines는 다음과 같은 제한을 적용 합니다.

  • 100 개의 별도 YAML 파일을 직접 또는 간접적으로 포함할 수 없습니다.
  • 20 개가 넘는 템플릿 중첩 (다른 템플릿을 포함 하는 템플릿)
  • YAML을 구문 분석 하는 동안 사용 된 메모리가 10mb를 초과 하지 않습니다 (실제로는 사용 되는 특정 기능에 따라 일반적으로 600-디스크 YAML의-2mb 사이).

템플릿 매개 변수

템플릿에 매개 변수를 전달할 수 있습니다. parameters섹션에서는 템플릿에서 사용할 수 있는 매개 변수와 해당 기본값을 정의 합니다. 는로 묶은 값이 ${{ }} 바깥쪽 파이프라인에서 받는 매개 변수로 대체 되도록 파이프라인이 실행 되기 직전에 템플릿이 확장 됩니다. 따라서 매개 변수에는 미리 정의 된 변수만 사용할 수 있습니다.

여러 파이프라인에서 매개 변수를 사용 하려면 변수 그룹을 만드는 방법을 참조 하세요.

매개 변수가 있는 작업, 단계 및 단계 템플릿

# File: templates/npm-with-params.yml

parameters:
  name: ''  # defaults for any parameters that aren't specified
  vmImage: ''

jobs:
- job: ${{ parameters.name }}
  pool: 
    vmImage: ${{ parameters.vmImage }}
  steps:
  - script: npm install
  - script: npm test

파이프라인에서 템플릿을 사용 하는 경우 템플릿 매개 변수의 값을 지정 합니다.

# File: azure-pipelines.yml

jobs:
- template: templates/npm-with-params.yml  # Template reference
  parameters:
    name: Linux
    vmImage: 'ubuntu-latest'

- template: templates/npm-with-params.yml  # Template reference
  parameters:
    name: macOS
    vmImage: 'macOS-10.13'

- template: templates/npm-with-params.yml  # Template reference
  parameters:
    name: Windows
    vmImage: 'windows-latest'

또한 단계 또는 단계 템플릿에서 매개 변수를 사용할 수 있습니다. 예를 들어 매개 변수가 있는 단계는 다음과 같습니다.

# File: templates/steps-with-params.yml

parameters:
  runExtendedTests: 'false'  # defaults for any parameters that aren't specified

steps:
- script: npm test
- ${{ if eq(parameters.runExtendedTests, 'true') }}:
  - script: npm test --extended

파이프라인에서 템플릿을 사용 하는 경우 템플릿 매개 변수의 값을 지정 합니다.

# File: azure-pipelines.yml

steps:
- script: npm install

- template: templates/steps-with-params.yml  # Template reference
  parameters:
    runExtendedTests: 'true'

참고

스칼라 매개 변수는 항상 문자열로 처리 됩니다. 예를 들어는 eq(parameters['myparam'], true) true myparam 매개 변수가 단어 인 경우에도 거의 항상를 반환 합니다 false . 비어 있지 않은 문자열은 부울 컨텍스트에서로 캐스팅 됩니다 true . 해당 식을 다시 작성 하 여 문자열을 명시적으로 비교할 수 eq(parameters['myparam'], 'true') 있습니다.

매개 변수는 스칼라 문자열로 제한 되지 않습니다. 매개 변수를 확장 하는 위치에 매핑이 필요한 경우에는 매개 변수를 매핑할 수 있습니다. 마찬가지로 시퀀스가 예상 되는 위치에 시퀀스를 전달할 수도 있습니다. 예:

# azure-pipelines.yml
jobs:
- template: process.yml
  parameters:
    pool:   # this parameter is called `pool`
      vmImage: ubuntu-latest  # and it's a mapping rather than a string


# process.yml
parameters:
  pool: {}

jobs:
- job: build
  pool: ${{ parameters.pool }}

다른 리포지토리 사용

다른 리포지토리에 템플릿을 유지할 수 있습니다. 예를 들어 모든 앱 파이프라인에서 사용 하려는 핵심 파이프라인이 있다고 가정해 보겠습니다. 템플릿을 핵심 리포지토리에 넣은 다음 각 앱 리포지토리에서 참조할 수 있습니다.

# Repo: Contoso/BuildTemplates
# File: common.yml
parameters:
  vmImage: 'ubuntu 16.04'

jobs:
- job: Build
  pool:
    vmImage: ${{ parameters.vmImage }}
  steps:
  - script: npm install
  - script: npm test

이제 여러 파이프라인에서이 템플릿을 다시 사용할 수 있습니다. 사양을 사용 resources 하 여 핵심 리포지토리의 위치를 제공 합니다. 핵심 리포지토리를 참조 하는 경우 및 사용자가 @ 지정한 이름을 사용 resources 합니다.

# Repo: Contoso/LinuxProduct
# File: azure-pipelines.yml
resources:
  repositories:
    - repository: templates
      type: github
      name: Contoso/BuildTemplates

jobs:
- template: common.yml@templates  # Template reference
# Repo: Contoso/WindowsProduct
# File: azure-pipelines.yml
resources:
  repositories:
    - repository: templates
      type: github
      name: Contoso/BuildTemplates
      ref: refs/tags/v1.0 # optional ref to pin to

jobs:
- template: common.yml@templates  # Template reference
  parameters:
    vmImage: 'windows-latest'

type: github 경우 name<identity>/<repo> 위의 예제와 같습니다. type: git(Azure Repos)의 경우 name<project>/<repo> 입니다. 프로젝트는 같은 조직에 있어야 합니다. 조직 간 참조가 지원 되지 않습니다.

리포지토리는 파이프라인이 시작 될 때 한 번만 확인 됩니다. 그 후에는 동일한 리소스가 파이프라인 중에 사용 됩니다. 템플릿 파일만 사용 됩니다. 템플릿이 완전히 확장 된 후 최종 파이프라인은 원본 리포지토리에서 완전히 정의 된 것 처럼 실행 됩니다. 즉, 파이프라인에서 템플릿 리포지토리의 스크립트를 사용할 수 없습니다.

특정 고정 버전의 템플릿을 사용 하려는 경우에는 ref에 고정 해야 합니다. Refs는 분기 ( refs/heads/<name> ) 또는 태그 () 중 하나 refs/tags/<name> 입니다. 특정 커밋을 고정 하려면 먼저 해당 커밋을 가리키는 태그를 만든 다음 해당 태그에 고정 합니다.

파이프라인 초기화 중에 값을 동적으로 확인 하는 방법을 지정 하려면 템플릿 을 사용 합니다. 이 구문에서 템플릿 식을 래핑합니다 ${{ }} .

템플릿 식은 템플릿 매개 변수 및 변수도 확장할 수 있습니다. 매개 변수를 사용 하 여 템플릿을 확장 하는 방법에 영향을 줄 수 있습니다. parameters개체는 식의 variables 개체 처럼 작동 합니다.

예를 들어 템플릿을 정의 합니다.

# File: steps/msbuild.yml

parameters:
  solution: '**/*.sln'

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 전달 된 매개 변수의 값을 포함 하는 컨텍스트에 액세스할 수 있습니다. 또한 variables YAML 파일에 지정 된 모든 변수 및 시스템 변수를 포함 하는 컨텍스트에 액세스할 수 있습니다. 중요 한 것은 파이프라인에 저장 된 것과 같은 런타임 변수를 포함 하지 않거나 실행을 시작할 때 제공 되는 것입니다. 템플릿 확장 은 실행 초기에발생 하므로 이러한 변수를 사용할 수 없습니다.

필수 매개 변수

템플릿의 시작 부분에 유효성 검사 단계를 추가 하 여 필요한 매개 변수를 확인할 수 있습니다.

다음은 solution Bash를 사용 하 여 매개 변수를 확인 하는 예제입니다 .이를 통해 모든 플랫폼에서 작업을 수행할 수 있습니다.

# File: steps/msbuild.yml

parameters:
  solution: ''

steps:
- bash: |
    if [ -z "$SOLUTION" ]; then
      echo "##vso[task.logissue type=error;]Missing template parameter \"solution\""
      echo "##vso[task.complete result=Failed;]"
    fi
  env:
    SOLUTION: ${{ parameters.solution }}
  displayName: Check for required parameters
- task: msbuild@1
  inputs:
    solution: ${{ parameters.solution }}
- task: vstest@2
  inputs:
    solution: ${{ parameters.solution }}

필수 매개 변수가 없는 경우 템플릿이 실패 함을 보여 주기 위해 다음을 수행 합니다.

# File: azure-pipelines.yml

# This will fail since it doesn't set the "solution" parameter to anything,
# so the template will use its default of an empty string
steps:
- template: steps/msbuild.yml

템플릿 식 함수

템플릿에서 일반 함수 를 사용할 수 있습니다. 몇 가지 템플릿 식 함수를 사용할 수도 있습니다.

format

  • 단순 문자열 토큰 바꾸기
  • Min parameters: 2. 최대 매개 변수: N
  • 예: ${{ format('{0} Build', parameters.os) }}'Windows Build'

coalesce

  • 비어 있지 않은 첫 번째 문자열 인수를 계산 합니다.
  • Min parameters: 2. 최대 매개 변수: N
  • 예제:
parameters:
  restoreProjects: ''
  buildProjects: ''

steps:
- script: echo ${{ coalesce(parameters.foo, parameters.bar, 'Nothing to see') }}

놓아야

템플릿 식을 사용 하 여 YAML 파이프라인의 구조를 변경할 수 있습니다. 예를 들어 시퀀스에 삽입 하려면 다음을 수행 합니다.

# File: jobs/build.yml

parameters:
  preBuild: []
  preTest: []
  preSign: []

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:
  additionalVariables: {}

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

조건부 삽입

조건에 따라 시퀀스 또는 매핑을 삽입 하려면 삽입 및 식 계산을 사용 합니다.

예를 들어 시퀀스에 삽입 하려면 다음을 수행 합니다.

# File: steps/build.yml

parameters:
  toolset: msbuild

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:
  debug: 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

반복 삽입

each지시문을 사용 하면 YAML 시퀀스 (배열) 또는 매핑 (키-값 쌍)을 기반으로 반복 삽입을 수행할 수 있습니다.

예를 들어 추가 사전 및 사후 단계로 각 작업의 단계를 래핑할 수 있습니다.

# job.yml
parameters:
  jobs: []

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:
  jobs: []

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' }}와 같습니다.

제한

템플릿 및 템플릿 식으로 인해 파이프라인의 크기 및 복잡성이 증가 합니다. 런어웨이 확장을 방지 하기 위해 Azure Pipelines는 다음과 같은 제한을 적용 합니다.

  • 50 개의 별도 YAML 파일을 직접 또는 간접적으로 포함할 수 없습니다.
  • YAML을 구문 분석 하는 동안 사용 된 메모리가 10mb를 초과 하지 않습니다 (실제로는 사용 되는 특정 기능에 따라 일반적으로 600-디스크 YAML의-2mb 사이).
  • 템플릿 식 당 2000 자이 하만 사용할 수 있습니다.