Bagikan melalui


Parameter template

Anda dapat menentukan parameter dan jenis datanya dalam templat dan mereferensikan parameter tersebut dalam alur. Dengan templateContext, Anda juga dapat meneruskan properti ke tahapan, langkah, dan pekerjaan yang digunakan sebagai parameter dalam templat.

Anda juga dapat menggunakan parameter di luar templat. Anda hanya dapat menggunakan literal untuk nilai default parameter. Pelajari selengkapnya tentang parameter dalam skema YAML.

Parameter Passing

Parameter harus berisi nama dan jenis data. Dalam azure-pipelines.yml, ketika parameter yesNo diatur ke nilai boolean, build berhasil. Ketika yesNo diatur ke string seperti apples, build gagal.

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

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

Menggunakan templateContext untuk meneruskan properti ke templat

Anda dapat menggunakan templateContext untuk meneruskan lebih banyak properti ke tahapan, langkah, dan pekerjaan yang digunakan sebagai parameter dalam templat. Secara khusus, Anda dapat menentukan templateContext dalam jobListjenis data parameter , , deploymentListatau stageList .

Anda dapat menggunakan templateContext untuk mempermudah penyiapan lingkungan saat memproses setiap pekerjaan. Dengan menggabungkan pekerjaan dan objek properti lingkungannya bersama-sama, templateContext dapat membantu Anda memiliki YAML yang lebih mudah dirawat dan lebih mudah dipahami.

Dalam contoh ini, parameter testSet di testing-template.yml memiliki jenis jobListdata . Templat testing-template.yml membuat variabel testJob baru menggunakan setiap kata kunci. Templat kemudian mereferensikan testJob.templateContext.expectedHTTPResponseCode, yang akan diatur dan diteruskan azure-pipeline.yml ke templat.

Saat kode respons adalah 200, templat membuat permintaan REST. Ketika kode respons adalah 500, templat menghasilkan semua variabel lingkungan untuk penelusuran kesalahan.

templateContext dapat berisi properti.

#testing-template.yml

parameters: 
- name: testSet
  type: jobList

jobs:
- ${{ each testJob in parameters.testSet }}:  # Iterate over each job in the 'testSet' parameter
  - ${{ if eq(testJob.templateContext.expectedHTTPResponseCode, 200) }}: # Check if the HTTP response is 200
    - job:
      steps: 
      - powershell: 'Invoke-RestMethod -Uri https://blogs.msdn.microsoft.com/powershell/feed/ | Format-Table -Property Title, pubDate'
      - ${{ testJob.steps }}    
  - ${{ if eq(testJob.templateContext.expectedHTTPResponseCode, 500) }}: # Check if the HTTP response is 500
    - job:
      steps:
      - powershell: 'Get-ChildItem -Path Env:\' # Run a PowerShell script to list environment variables
      - ${{ testJob.steps }} # Include additional steps from the 'testJob' object
#azure-pipeline.yml

trigger: none

pool:
  vmImage: ubuntu-latest

extends:
  template: testing-template.yml 
  parameters:
    testSet:  # Define the 'testSet' parameter to pass to the template
    - job: positive_test # Define a job named 'positive_test'
      templateContext:
        expectedHTTPResponseCode: 200 # Set the expected HTTP response code to 200 for this job
      steps:
      - script: echo "Run positive test" 
    - job: negative_test # Define a job named 'negative_test'
      templateContext:
        expectedHTTPResponseCode: 500 # Set the expected HTTP response code to 500 for this job
      steps:
      - script: echo "Run negative test" 

Parameter untuk memilih templat saat runtime

Anda dapat memanggil templat yang berbeda dari YAML alur tergantung pada kondisi. Dalam contoh ini, experimental.yml YAML berjalan ketika parameter experimentalTemplate benar.

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

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

Jenis data parameter

Jenis Data Catatan
string string
number dapat dibatasi untuk values:, jika tidak, string seperti angka apa pun diterima
boolean true atau false
object struktur YAML apa pun
step satu langkah
stepList urutan langkah-langkah
job satu pekerjaan
jobList urutan pekerjaan
deployment satu pekerjaan penyebaran
deploymentList urutan pekerjaan penyebaran
stage satu tahap
stageList urutan tahapan

Langkah, stepList, pekerjaan, jobList, penyebaran, deploymentList, tahap, dan jenis data stageList semuanya menggunakan format skema YAML standar. Contoh ini mencakup string, angka, boolean, objek, langkah, dan stepList.

parameters:
- name: myString  # Define a parameter named 'myString'
  type: string  # The parameter type is string
  default: a string  # Default value is 'a string'

- name: myMultiString  # Define a parameter named 'myMultiString'
  type: string  # The parameter type is string
  default: default  # Default value is 'default'
  values:  # Allowed values for 'myMultiString'
  - default  
  - ubuntu  

- name: myNumber  # Define a parameter named 'myNumber'
  type: number  # The parameter type is number
  default: 2  # Default value is 2
  values:  # Allowed values for 'myNumber'
  - 1  
  - 2  
  - 4  
  - 8  
  - 16  

- name: myBoolean  # Define a parameter named 'myBoolean'
  type: boolean  # The parameter type is boolean
  default: true  # Default value is true

- name: myObject  # Define a parameter named 'myObject'
  type: object  # The parameter type is object
  default:  # Default value is an object with nested properties
    foo: FOO  # Property 'foo' with value 'FOO'
    bar: BAR  # Property 'bar' with value 'BAR'
    things:  # Property 'things' is a list
    - one  
    - two  
    - three  
    nested:  # Property 'nested' is an object
      one: apple  # Property 'one' with value 'apple'
      two: pear  # Property 'two' with value 'pear'
      count: 3  # Property 'count' with value 3

- name: myStep  # Define a parameter named 'myStep'
  type: step  # The parameter type is step
  default:  # Default value is a step
    script: echo my step 

- name: mySteplist  # Define a parameter named 'mySteplist'
  type: stepList  # The parameter type is stepList
  default:  # Default value is a list of steps
    - script: echo step one  
    - script: echo step two  

trigger: none  

jobs: 
- job: stepList  # Define a job named 'stepList'
  steps: ${{ parameters.mySteplist }}  # Use the steps from the 'mySteplist' parameter

- job: myStep  # Define a job named 'myStep'
  steps:
    - ${{ parameters.myStep }}  # Use the step from the 'myStep' parameter

Anda dapat melakukan iterasi melalui objek dan mencetak setiap string dalam objek.

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

steps:
- ${{ each value in parameters.listOfStrings }}: # Iterate over each value in the 'listOfStrings' parameter
  - script: echo ${{ value }} # Output the current value in the iteration

Selain itu, Anda dapat melakukan iterasi melalui elemen berlapis dalam objek.

parameters:
- name: listOfFruits
  type: object
  default:
  - fruitName: 'apple'
    colors: ['red','green']
  - fruitName: 'lemon'
    colors: ['yellow'] 

steps:
- ${{ each fruit in parameters.listOfFruits }} : # Iterate over each fruit in the 'listOfFruits'
  - ${{ each fruitColor in fruit.colors}} : # Iterate over each color in the current fruit's colors
    - script: echo ${{ fruit.fruitName}} ${{ fruitColor }} # Echo the current fruit's name and color

Anda juga dapat langsung mereferensikan kunci objek dan nilai yang sesuai.

parameters:
  - name: myObject
    type: object
    default:
      key1: 'value1'
      key2: 'value2'
      key3: 'value3'

jobs:
- job: ExampleJob
  displayName: 'Example object parameter job'
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: |
      echo "Keys in myObject:"
      echo "Key1: ${{ parameters.myObject.key1 }}"
      echo "Key2: ${{ parameters.myObject.key2 }}"
      echo "Key3: ${{ parameters.myObject.key3 }}"
    displayName: 'Display object keys and values'

Parameter yang diperlukan

Anda dapat menambahkan langkah validasi di awal templat Anda untuk memeriksa parameter yang Anda butuhkan.

Berikut adalah contoh yang memeriksa solution parameter menggunakan 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 }}

Untuk menunjukkan bahwa templat gagal jika tidak memiliki parameter yang diperlukan:

# 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

Anda dapat meneruskan parameter ke templat. Bagian menentukan parameters parameter apa yang tersedia dalam templat dan nilai defaultnya. Templat diperluas tepat sebelum alur berjalan sehingga nilai yang dikelilingi oleh digantikan ${{ }} oleh parameter yang diterimanya dari alur penutup. Akibatnya, hanya variabel yang telah ditentukan sebelumnya yang dapat digunakan dalam parameter.

Untuk menggunakan parameter di beberapa alur, lihat cara membuat grup variabel.

Templat pekerjaan, tahap, dan langkah dengan parameter

# 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

Saat Anda menggunakan templat di alur Anda, tentukan nilai untuk parameter templat.

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

Anda juga dapat menggunakan parameter dengan templat langkah atau tahap. Misalnya, langkah-langkah dengan parameter:

# 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

Saat Anda menggunakan templat di alur Anda, tentukan nilai untuk parameter templat.

# File: azure-pipelines.yml

steps:
- script: npm install

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

Catatan

Parameter skalar selalu diperlakukan sebagai string. Misalnya, eq(parameters['myparam'], true) hampir selalu mengembalikan true, bahkan jika myparam parameternya adalah kata false. String yang tidak kosong dilemparkan ke true dalam konteks Boolean. Ekspresi tersebut dapat ditulis ulang untuk membandingkan string secara eksplisit: eq(parameters['myparam'], 'true').

Parameter tidak terbatas pada string skalar. Selama tempat di mana parameter diperluas mengharapkan pemetaan, parameter dapat menjadi pemetaan. Demikian juga, urutan dapat diteruskan di mana urutan diharapkan. Contohnya:

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