Udostępnij przez


Wyrażenia szablonu

Użyj szablonowych wyrażeń w celu określenia, jak wartości są dynamicznie rozpoznawane podczas inicjowania potoku. Umieść wyrażenie szablonu w tej składni: ${{ }}.

Wyrażenia szablonu mogą rozszerzać parametry szablonu, a także zmienne. Możesz użyć parametrów, aby wpłynąć na sposób rozszerzenia szablonu. Obiekt parameters działa jak variables obiekt w wyrażeniu. W wyrażeniach szablonu można używać tylko wstępnie zdefiniowanych zmiennych.

Uwaga

Wyrażenia są rozszerzane tylko dla stages, jobs, steps i containers (wewnątrz resources). Nie można na przykład użyć wyrażenia wewnątrz trigger lub zasobu, takiego jak repositories. Ponadto w usłudze Azure DevOps 2020 RTW nie można używać wyrażeń szablonów wewnątrz elementu containers.

Można na przykład zdefiniować szablon:

# File: steps/vsbuild.yml

parameters:
- name: 'solution'
  default: '**/*.sln'
  type: string

steps:
- task: VSBuild@1
  inputs:
    solution: ${{ parameters['solution'] }}  # index syntax
- task: VSTest@3
  inputs:
    testSelector: 'testAssemblies' 
    testAssemblyVer2: ${{ parameters.solution }} # property dereference syntax
    searchFolder: '$(System.DefaultWorkingDirectory)' 

Następnie odwołujesz się do szablonu i przekazujesz mu opcjonalny parametr solution.

# File: azure-pipelines.yml

steps:
- template: steps/vsbuild.yml
  parameters:
    solution: my.sln

Kontekst

W wyrażeniu szablonu masz dostęp do kontekstu parameters, który zawiera wartości przekazanych parametrów. Ponadto masz dostęp do kontekstu zawierającego variables wszystkie zmienne określone w pliku YAML oraz wiele wstępnie zdefiniowanych zmiennych (zanotowanych na każdej zmiennej w tym artykule). Co ważne, nie ma zmiennych czasu wykonywania, takich jak te przechowywane w potoku lub podane podczas rozpoczynania sesji. Rozszerzenie szablonu odbywa się na wczesnym etapie uruchamiania, więc te zmienne nie są dostępne.

Funkcje wyrażeń szablonu

Funkcje ogólne można używać w szablonach. Możesz również użyć kilku funkcji wyrażeń szablonu.

formatowanie

  • Prosta zamiana tokenu ciągu
  • Minimalne parametry: 2. Maksymalna liczba parametrów: N
  • Przykład: ${{ format('{0} Build', parameters.os) }}'Windows Build'

połączyć

  • Zwraca pierwszy niepusty, niebędący null, argument typu string
  • Minimalne parametry: 2. Maksymalna liczba parametrów: N
  • Przykład:
parameters:
- name: 'customVersion'
  type: string
  default: ''
- name: 'defaultVersion'
  type: string
  default: '1.0.0'

steps:
- script: echo Version is ${{ coalesce(parameters.customVersion, parameters.defaultVersion) }}

Uwaga

Parametry tekstowe z default: '' (pustym ciągiem) zachowują się inaczej w zależności od sposobu wyzwalania potoku:

  • W edytorze potoków: potok można uruchomić bezpośrednio, a wartość domyślna pustego ciągu jest przestrzegana, co pozwala coalesce powrócić do następnej wartości.
  • W okienku Uruchamianie potoku: Usługa Azure DevOps wymaga podania niepustej wartości parametrów z pustymi wartościami domyślnymi ciągu, co uniemożliwia coalesce powrót.

Wstawianie

Za pomocą wyrażeń szablonu można zmienić strukturę potoku YAML. Na przykład, aby wstawić do sekwencji:

# 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: VSBuild@1
  - ${{ parameters.preTest }}
  - task: VSTest@3
  - ${{ 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

Kiedy tablica jest wstawiona do innej tablicy, zagnieżdżona tablica zostanie spłaszczona.

Aby wstawić element do mapowania, użyj specjalnej właściwości ${{ insert }}.

# Default values
parameters:
- name: 'additionalVariables'
  type: object
  default: {}

jobs:
- job: build
  variables:
    configuration: debug
    arch: x86
    ${{ insert }}: ${{ parameters.additionalVariables }}
  steps:
  - task: VSBuild@1
  - task: VSTest@3
jobs:
- template: jobs/build.yml
  parameters:
    additionalVariables:
      TEST_SUITE: L0,L1

Wstawianie warunkowe

Jeśli chcesz warunkowo wstawić do sekwencji lub mapowania w szablonie, użyj wstawiania i oceny wyrażeń. Można również używać if instrukcji poza szablonami, o ile używasz składni szablonu.

Aby na przykład wstawić do sekwencji w szablonie:

# File: steps/build.yml

parameters:
- name: 'toolset'
  default: vsbuild
  type: string
  values:
  - vsbuild
  - dotnet

steps:
# msbuild
- ${{ if eq(parameters.toolset, 'msbuild') }}:
  - task: VSBuild@1
  - task: VSTest@3

# dotnet
- ${{ if eq(parameters.toolset, 'dotnet') }}:
  - task: UseDotNet@2
    inputs:
      command: build
  - task: UseDotNet@2
    inputs:
      command: test
# File: azure-pipelines.yml

steps:
- template: steps/build.yml
  parameters:
    toolset: dotnet

Aby na przykład wstawić do mapowania w szablonie:

# 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

Można również użyć wstawiania warunkowego dla zmiennych. W tym przykładzie start zawsze drukuje, a this is a test drukuje tylko wtedy, gdy zmienna foo jest równa 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

Można również ustawić zmienne na podstawie wartości innych zmiennych. W poniższym potoku przetwarzania myVar służy do ustawienia wartości 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

Wstawienie iteracyjne

Dyrektywa each umożliwia iteracyjne wstawianie na podstawie sekwencji YAML (tablicy) lub mapowania (par klucz-wartość).

Można na przykład opakowować kroki poszczególnych zadań przy użyciu innych kroków wstępnych i po nich:

# 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!

Można również użyć stringList, aby zdefiniować i iterować przez parametry zawierające listę elementów.

Uwaga

Typ stringList danych nie jest dostępny w szablonach. Użyj typu danych object w szablonach zamiast tego.

parameters:
- name: regions
  type: stringList
  displayName: Regions
  values:
    - WUS
    - CUS
    - EUS
  default: 
    - WUS
    - EUS 

stages:
- ${{ each stage in parameters.regions}}:
  - stage: ${{stage}}
    displayName: Deploy to ${{stage}}
    jobs:
    - job:
      steps:
      - script: ./deploy ${{stage}}

Możesz również manipulować właściwościami elementów, które przetwarzasz w iteracji. Aby na przykład dodać więcej zależności:

# 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.

Ucieczka wartości

Jeśli musisz użyć wartości, która dosłownie zawiera ${{, otocz wartość ciągiem wyrażenia. Na przykład ${{ 'my${{value' }} lub ${{ 'my${{value with a '' single quote too' }}