다음을 통해 공유


템플릿 사용 참조

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

템플릿을 사용하면 YAML 파이프라인에서 재사용 가능한 콘텐츠, 논리 및 매개 변수를 정의할 수 있습니다. 템플릿을 효과적으로 사용하려면 Azure Pipelines의 주요 개념인 단계, 스텝, 작업을 기본적으로 이해해야 합니다.

템플릿을 사용하면 개발 속도를 높일 수 있습니다. 예를 들어 템플릿에 일련의 동일한 작업을 포함한 다음 YAML 파이프라인의 여러 단계에 템플릿을 여러 번 포함할 수 있습니다.

템플릿은 파이프라인을 보호하는 데도 도움이 될 수 있습니다. 템플릿이 파이프라인에서 허용되는 항목을 제어하는 경우 템플릿은 다른 파일이 따라야 하는 논리를 정의합니다. 예를 들어 실행할 수 있는 작업을 제한할 수 있습니다. 이 시나리오에서는 템플릿을 사용하여 누군가가 조직의 보안 정책을 위반하는 작업을 성공적으로 실행하지 못하도록 할 수 있습니다.

템플릿에는 포함 및 확장의 두 가지 유형이 있습니다.

  • 템플릿을 포함하면 템플릿을 사용하여 재사용 가능한 콘텐츠를 삽입할 수 있습니다. 템플릿을 사용하여 콘텐츠를 포함하는 경우 많은 프로그래밍 언어의 include 지시문처럼 작동합니다. 템플릿의 콘텐츠는 이를 포함하는 파이프라인 또는 템플릿에 삽입됩니다.
  • 확장 템플릿을 사용하면 파이프라인에서 허용되는 항목을 제어할 수 있습니다. 확장 템플릿이 파이프라인에서 허용되는 항목을 제어하는 경우 템플릿은 파이프라인이 따라야 하는 논리를 정의합니다. 예를 들어 확장 템플릿은 파이프라인을 확장하여 단계 또는 작업을 수행하는 컨텍스트에서 사용할 수 있습니다.

템플릿을 최대한 활용하려면 템플릿 식템플릿 매개 변수도 사용해야 합니다.

적용된 제한

템플릿과 템플릿 식은 파이프라인의 크기와 복잡성을 폭발적으로 증가시킬 수 있습니다. 가출 증가를 방지하기 위해 Azure Pipelines는 다음과 같은 제한을 적용합니다.

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

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

템플릿에서 확장

보안을 강화하기 위해 파이프라인이 특정 템플릿에서 확장되도록 적용할 수 있습니다. 이 파일 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:
    vmImage: windows-latest
  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') }}: 
            # Step is rejected by raising a YAML syntax error: Unexpected value 'CmdLine@2'
            '${{ pair.value }}': error         

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

extends:
  template: start.yml
  parameters:
    buildSteps:  
      - bash: echo Test #Passes
        displayName: succeed
      - bash: echo "Test"
        displayName: succeed
      # Step is rejected by raising a YAML syntax error: Unexpected value 'CmdLine@2'
      - task: CmdLine@2
        inputs:
          script: echo "Script Test"
      # Step is rejected by raising a YAML syntax error: Unexpected value 'CmdLine@2'
      - script: echo "Script Test"

리소스를 사용하여 템플릿에서 확장

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

# 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:
  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:
- main

pool:
  vmImage: 'ubuntu-latest'

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

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

다음 템플릿에서:

  • templates/npm-with-params.yml 는 두 매개 변수 name 를 정의하고 vmImage , 작업 이름에 대한 이름 매개 변수와 VM 이미지의 vmImage 매개 변수를 사용하여 작업을 만듭니다.
  • 파이프라인(azure-pipelines.yml)은 각각 운영 체제 및 VM 이미지 이름을 참조하는 서로 다른 매개 변수 값을 사용하여 템플릿을 세 번 참조합니다.
  • 빌드된 파이프라인은 다른 VM 이미지에서 실행되며 지정된 OS에 따라 이름이 지정됩니다. 각 작업은 npm 설치 및 npm 테스트 단계를 수행합니다.
# 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'

여러 매개 변수가 있는 스테이징 템플릿

다음 템플릿에서:

  • 템플릿은 stage-template.yml 네 개의 stageName매개 변수인 , jobName, vmImagescriptPath모든 형식 문자열을 정의합니다. 템플릿은 매개 변수를 사용하여 stageName 스테이지 이름을 설정하고, 작업을 jobName정의하며, 스크립트를 실행하는 단계를 포함합니다.
  • 파이프라인 azure-pipeline.yml은 매개 변수를 사용하여 단계 및 작업을 동적으로 정의하고 스크립트 build-script.sh를 실행하는 작업을 실행합니다.
# stage-template.yml

parameters:
  - name: stageName
    type: string
  - name: jobName
    type: string
  - name: vmImage
    type: string
  - name: scriptPath
    type: string

stages:
  - stage: ${{ parameters.stageName }}
    jobs:
      - job: ${{ parameters.jobName }}
        pool:
          vmImage: ${{ parameters.vmImage }}
        steps:
          - script: ./${{ parameters.scriptPath }}
# azure-pipelines.yml
trigger:
- main

stages:
- template: stage-template.yml
  parameters:
    stageName: 'BuildStage'
    jobName: 'BuildJob'
    scriptPath: 'build-script.sh' # replace with script in your repository
    vmImage: 'ubuntu-latest'

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

단계 또는 스테이지 템플릿에서 매개 변수를 사용할 수도 있습니다.

다음 템플릿에서:

  • 템플릿(templates/steps-with-params.yml)은 기본값이 false인 매개 runExtendedTests 변수를 정의합니다.
  • 파이프라인(azure-pipelines.yml)이 실행 npm test 되고 npm test --extended 매개 변수가 runExtendedTests true이기 때문입니다.
# 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 명시적으로 만들어false지지 않은 경우 myparam 반환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 }}.

매개 변수가 있는 변수 템플릿

템플릿을 사용하여 변수를 변수에 전달할 수 있습니다. 이 예제에서는 매개 변수를 DIRECTORY 변수에 전달합니다 RELEASE_COMMAND .

# File: templates/package-release-with-params.yml

parameters:
- name: DIRECTORY 
  type: string
  default: "." # defaults for any parameters that specified with "." (current directory)

variables:
- name: RELEASE_COMMAND
  value: grep version ${{ parameters.DIRECTORY }}/package.json | awk -F \" '{print $4}'  

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

# File: azure-pipelines.yml

variables: # Global variables
  - template: package-release-with-params.yml # Template reference
    parameters:
      DIRECTORY: "azure/checker"

pool:
  vmImage: 'ubuntu-latest'

stages:
- stage: Release_Stage 
  displayName: Release Version
  variables: # Stage variables
  - template: package-release-with-params.yml  # Template reference
    parameters:
      DIRECTORY: "azure/todo-list"
  jobs: 
  - job: A
    steps: 
    - bash: $(RELEASE_COMMAND) #output release command

템플릿에서 확장하고 변수와 함께 포함 템플릿 사용

한 가지 일반적인 시나리오는 개발, 테스트 및 프로덕션을 위한 단계가 있는 파이프라인을 갖는 것으로, 변수에 포함 템플릿과 단계 및 작업에 대한 확장 템플릿을 모두 사용합니다.

다음 예제 variables-template.yml 에서는 다음에 사용되는 azure-pipeline.yml가상 머신 변수 집합을 정의합니다.

# variables-template.yml

variables:
- name: devVmImage
  value: 'ubuntu-latest'
- name: testVmImage
  value: 'ubuntu-latest'
- name: prodVmImage
  value: 'ubuntu-latest'

다음 파일 stage-template.yml 은 세 개의 매개 변수(name, vmImage, steps) 및 이름이 지정된 Build작업을 사용하여 재사용 가능한 단계 구성을 정의합니다.

# stage-template.yml
parameters:
- name: name
  type: string
  default: ''
- name: vmImage
  type: string
  default: ''
- name: steps
  type: stepList
  default: []

stages:
- stage: ${{ parameters.name }}
  jobs:
  - job: Build
    pool:
      vmImage: ${{ parameters.vmImage }}
    steps: ${{ parameters.steps }}

다음 파이프라인 azure-pipelines.yml은 변수를 가져온 variables-template.yml다음 각 단계에 템플릿을 stage-template.yml 사용합니다. 각 단계(개발, 테스트, Prod)는 동일한 템플릿으로 정의되지만 매개 변수가 다르므로 여러 단계에서 일관성을 유지하면서 사용자 지정을 허용합니다. 'Prod' 단계에는 인증에 사용할 수 있는 항목의 예로 환경 변수가 포함됩니다. 매개 변수 정의에 대한 자세한 내용은 템플릿 매개 변수를 참조하세요.

# azure-pipelines.yml
trigger:
- main

variables:
- template: variables-template.yml

stages:
- template: stage-template.yml
  parameters:
    name: Dev
    vmImage: ${{ variables.devVmImage }}
    steps:
      - script: echo "Building in Dev"
- template: stage-template.yml
  parameters:
    name: Test
    vmImage: ${{ variables.testVmImage }}
    steps:
      - script: echo "Testing in Test"
- template: stage-template.yml
  parameters:
    name: Prod
    vmImage: ${{ variables.prodVmImage }}
    steps:
      - script: echo "Deploying to Prod"
        env:
          SYSTEM_ACCESSTOKEN: $(System.AccessToken)

참조 템플릿 경로

템플릿 경로는 리포지토리 내의 절대 경로이거나 포함을 수행하는 파일을 기준으로 할 수 있습니다.

절대 경로를 사용하려면 템플릿 경로가 .로 /시작해야 합니다. 다른 모든 경로는 상대 경로로 간주됩니다.

다음은 중첩 계층의 예입니다.

|
+-- 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.ymlfileB.yml 좋아할 수 있습니다.

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

시작 지점인 경우 fileB.yml 이를 포함하고 fileA.ymlfileC.yml 좋아할 수 있습니다.

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

fileB.yml 또는 이와 같은 절대 경로를 참조 fileA.yml 하고 fileC.yml 사용할 수 있습니다.

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

다른 리포지토리 사용

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

# Repo: Contoso/BuildTemplates
# File: common.yml
parameters:
- name: 'vmImage'
  default: 'ubuntu-22.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>입니다. (Azure Repos)의 경우 type: git 는 .입니다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/main사용합니다.

리포지토리 리소스에 대한 SHA 값을 사용하여 Git의 특정 커밋에 고정할 수도 있습니다. SHA 값은 커밋을 고유하게 식별하는 40자 체크섬 해시입니다.

resources:
  repositories:
    - repository: templates
      type: git
      name: Contoso/BuildTemplates
      ref: 1234567890abcdef1234567890abcdef12345678

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

FAQ

템플릿 내에서 어떻게 변수를 사용할 수 있나요?

변수를 기반으로 매개 변수의 값을 설정하는 것이 유용할 때가 있습니다. 매개 변수는 파이프라인 실행을 처리하는 초기에 확장되므로 모든 변수를 사용할 수 있는 것은 아닙니다. 템플릿에서 사용할 수 있는 미리 정의된 변수를 보려면 미리 정의된 변수 사용을 참조하세요.

이 예제에서는 미리 정의된 변수 Build.SourceBranch 이며 Build.Reason template.yml 조건에서 사용됩니다.

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

extends:
  template: template.yml
# File: template.yml
steps:
- script: echo Build.SourceBranch = $(Build.SourceBranch) # outputs refs/heads/main
- script: echo Build.Reason = $(Build.Reason) # outputs IndividualCI
- ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}: 
  - script: echo I run only if Build.SourceBranch = refs/heads/main 
- ${{ if eq(variables['Build.Reason'], 'IndividualCI') }}: 
  - script: echo I run only if Build.Reason = IndividualCI 
- script: echo I run after the conditions