Uso de tipos de & plantilla
Las plantillas permiten definir contenido reutilizable, lógica y parámetros. Las plantillas funcionan de dos maneras. Puede insertar contenido reutilizable con una plantilla o puede usar una plantilla para controlar lo que se permite en una canalización. El segundo enfoque es útil para crear canalizaciones seguras con plantillas.
Si se usa una plantilla para incluir contenido, funciona como una directiva include en muchos lenguajes de programación. El contenido de un archivo se inserta en otro archivo. Cuando una plantilla controla lo que se permite en una canalización, la plantilla define la lógica que debe seguir otro archivo.
Use plantillas para definir la lógica una vez y volver a usarla varias veces. Combinan el contenido de varios archivos YAML en una sola canalización. Puede pasar parámetros a una plantilla desde la canalización primaria.
Parámetros
Puede especificar parámetros y sus tipos de datos en una plantilla y pasar esos parámetros a una canalización. También puede usar parámetros fuera de las plantillas. Solo puede usar literales para los valores predeterminados de parámetro.
Pasar parámetros
Los parámetros deben contener un nombre y un tipo de datos. En azure-pipelines.yml , cuando el parámetro se establece en un valor yesNo booleano, la compilación se realiza correctamente. Cuando yesNo se establece en una cadena como , se produce un error en la apples compilación.
# 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
Parámetros para seleccionar una plantilla en tiempo de ejecución
Puede llamar a plantillas diferentes desde un YAML de canalización en función de una condición. En este ejemplo, experimental.yml yaml se ejecutará cuando el parámetro experimentalTemplate sea true.
#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
Tipos de datos de parámetros
| Tipo de datos | Notas |
|---|---|
string |
string |
number |
puede restringirse a ; de lo contrario, se acepta cualquier values: cadena de tipo número. |
boolean |
true o false |
object |
cualquier estructura YAML |
step |
un solo paso |
stepList |
secuencia de pasos |
job |
un único trabajo |
jobList |
secuencia de trabajos |
deployment |
un único trabajo de implementación |
deploymentList |
secuencia de trabajos de implementación |
stage |
una sola fase |
stageList |
secuencia de fases |
Los tipos de datos step, stepList, job, jobList, deployment, deploymentList, stage y stageList usan el formato de esquema YAML estándar. En este ejemplo se incluyen string, number, boolean, object, step y 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 }}
Puede recorrer en iteración un objeto e imprimir cada cadena del objeto.
parameters:
- name: listOfStrings
type: object
default:
- one
- two
steps:
- ${{ each value in parameters.listOfStrings }}:
- script: echo ${{ value }}
Extensión desde una plantilla
Para aumentar la seguridad, puede aplicar que una canalización se extienda desde una plantilla determinada. El archivo start.yml define el parámetro , que se usa en la canalización buildStepsazure-pipelines.yml .
En , si se pasa un elemento con un paso de script, se rechaza y start.yml se produce un error en la buildStep compilación de la canalización.
Al extender desde una plantilla, puede aumentar la seguridad agregando una aprobación de plantilla necesaria.
# 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: vs2017-win2016
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"
Extensión desde una plantilla con recursos
También puede usar para extends extender desde una plantilla de la canalización de Azure que contiene recursos.
# 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"
Inserción de una plantilla
Puede copiar contenido de un YAML y reutilizarlo en otro YAML. Copiar contenido de un YAML a otro le ahorra tener que incluir manualmente la misma lógica en varios lugares. La include-npm-steps.yml plantilla de archivo contiene pasos que se reutilizan en azure-pipelines.yml .
Los archivos de plantilla deben existir en el sistema de archivos al principio de una ejecución de canalización. No se puede hacer referencia a plantillas en un artefacto.
# 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
Reutilización de pasos
Puede insertar una plantilla para reutilizar uno o varios pasos en varios trabajos. Además de los pasos de la plantilla, cada trabajo puede definir más pasos.
# 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.
Reutilización de trabajos
Al igual que los pasos, los trabajos se pueden reutilizar con plantillas.
# 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
Cuando trabaje con varios trabajos, recuerde quitar el nombre del trabajo en el archivo de plantilla para evitar conflictos.
# 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
Reutilización de fases
Las fases también se pueden reutilizar con plantillas.
# 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
Plantillas de trabajo, fase y paso con parámetros
# 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
Cuando consuma la plantilla en la canalización, especifique valores para los parámetros de plantilla.
# 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'
También puede usar parámetros con plantillas de paso o fase. Por ejemplo, pasos con parámetros:
# 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
Cuando consuma la plantilla en la canalización, especifique valores para los parámetros de plantilla.
# File: azure-pipelines.yml
steps:
- script: npm install
- template: templates/steps-with-params.yml # Template reference
parameters:
runExtendedTests: 'true'
Nota
Los parámetros escalares sin un tipo especificado se tratan como cadenas.
Por ejemplo, eq(true, parameters['myparam']) devolverá , incluso si el parámetro es la palabra , si no se ha hecho truemyparamfalsemyparam explícitamente boolean .
Las cadenas no vacías se convierten true a en un contexto booleano.
Esa expresión se podría reescribir para comparar explícitamente cadenas: .
Los parámetros no se limitan a cadenas escalares.
Vea la lista de tipos de datos.
Por ejemplo, con el object tipo :
# 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 }}
Reutilización de variables
Las variables se pueden definir en un YAML e incluirse en otra plantilla. Esto podría ser útil si desea almacenar todas las variables en un archivo. Si usa una plantilla para incluir variables en una canalización, la plantilla incluida solo se puede usar para definir variables. Puede usar pasos y una lógica más compleja al extender desde una plantilla. Use parámetros en lugar de variables cuando desee restringir el tipo.
En este ejemplo, la variable favoriteVeggie se incluye en 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 }}.
Rutas de acceso de plantilla de referencia
Las rutas de acceso de plantilla deben ser relativas al archivo que realiza la inclusión. Este es un ejemplo de jerarquía anidada.
|
+-- fileA.yml
|
+-- dir1/
|
+-- fileB.yml
|
+-- dir2/
|
+-- fileC.yml
A continuación, fileA.yml en puede hacer referencia a y de esta fileB.ymlfileC.yml forma.
steps:
- template: dir1/fileB.yml
- template: dir1/dir2/fileC.yml
Si fileC.yml es el punto de partida, puede incluir y de esta fileA.ymlfileB.yml forma.
steps:
- template: ../../fileA.yml
- template: ../fileB.yml
Cuando fileB.yml es el punto de partida, puede incluir y de esta fileA.ymlfileC.yml forma.
steps:
- template: ../fileA.yml
- template: dir2/fileC.yml
Uso de otros repositorios
Puede mantener las plantillas en otros repositorios. Por ejemplo, supongamos que tiene una canalización principal que quiere que usen todas las canalizaciones de la aplicación. Puede colocar la plantilla en un repositorio principal y, a continuación, hacer referencia a ella desde cada uno de los repositorios de la aplicación:
# 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
Ahora puede reutilizar esta plantilla en varias canalizaciones.
Use la resources especificación para proporcionar la ubicación del repositorio principal.
Cuando haga referencia al repositorio principal, use @ y el nombre que le agregó en 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'
Para type: github , es como en los ejemplos name<identity>/<repo> anteriores.
Para type: git (Azure Repos), name es <project>/<repo> .
Si ese proyecto está en una organización Azure DevOps independiente, deberá configurar una conexión de servicio de tipo con acceso al proyecto e incluirla en YAML:
resources:
repositories:
- repository: templates
name: Contoso/BuildTemplates
endpoint: myServiceConnection # Azure DevOps service connection
jobs:
- template: common.yml@templates
Los repositorios se resuelven solo una vez, cuando se inicia la canalización. Después de eso, se usa el mismo recurso mientras dure la canalización. Solo se usan los archivos de plantilla. Una vez que las plantillas se expanden por completo, la canalización final se ejecuta como si se hubiera definido completamente en el repositorio de origen. Esto significa que no puede usar scripts del repositorio de plantillas en la canalización.
Si desea usar una versión determinada y fija de la plantilla, asegúrese de anclar a ref .
son refs ramas ( refs/heads/<name> ) o etiquetas ( refs/tags/<name> ).
Si desea anclar una confirmación específica, cree primero una etiqueta que apunte a esa confirmación y, a continuación, anclarla a esa etiqueta.
Nota
Si no ref se especifica ningún , la canalización tendrá como valor predeterminado el uso de refs/heads/master .
También puede usar para hacer referencia al repositorio donde se encontró @self la canalización principal.
Esto es conveniente para su uso en plantillas si desea volver a hacer referencia al contenido en el repositorio de la canalización extends de extensión.
Por ejemplo:
# 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: []
Expresiones de plantilla
Use expresiones de plantilla para especificar cómo se resuelven dinámicamente los valores durante la inicialización de la canalización.
Ajuste la expresión de plantilla dentro de esta sintaxis: ${{ }} .
Las expresiones de plantilla pueden expandir los parámetros de plantilla y también las variables.
Puede usar parámetros para influir en cómo se expande una plantilla.
El parameters objeto funciona como el objeto parameters una expresión. Solo se pueden usar variables predefinidas en expresiones de plantilla.
Nota
Las expresiones solo se expanden stages para , , y jobsstepscontainers (dentro de resources ).
Por ejemplo, no puede usar una expresión dentro trigger de o un recurso como repositories .
Además, en Azure DevOps 2020 RTW, no puede usar expresiones de plantilla dentro de containers .
Por ejemplo, defina una plantilla:
# 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
A continuación, haga referencia a la plantilla y pásese el parámetro solution opcional:
# File: azure-pipelines.yml
steps:
- template: steps/msbuild.yml
parameters:
solution: my.sln
Contexto
Dentro de una expresión de plantilla, tiene acceso al parameters contexto que contiene los valores de los parámetros pasados.
Además, tiene acceso al contexto que contiene todas las variables especificadas en el archivo YAML más muchas de las variables predefinidas (anotadas en cada variables variable de ese tema). variables
Lo más importante es que no tiene variables en tiempo de ejecución como las almacenadas en la canalización o dadas al iniciar una ejecución.
La expansión de plantillas se produce muy pronto en la ejecución,por lo que esas variables no están disponibles.
Parámetros obligatorios
Puede agregar un paso de validación al principio de la plantilla para comprobar los parámetros que necesita.
Este es un ejemplo que comprueba el parámetro mediante Bash (que le permite solution trabajar en cualquier plataforma):
# 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 }}
Para mostrar que se produce un error en la plantilla si falta el parámetro necesario:
# 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
Funciones de expresión de plantilla
Puede usar funciones generales en las plantillas. También puede usar algunas funciones de expresión de plantilla.
format
- Reemplazo de token de cadena simple
- Parámetros mínimos: 2. Parámetros máximos: N
- Ejemplo:
${{ format('{0} Build', parameters.os) }}→'Windows Build'
coalesce
- Se evalúa como el primer argumento de cadena no vacío y no nulo
- Parámetros mínimos: 2. Parámetros máximos: N
- Ejemplo:
parameters:
- name: 'restoreProjects'
default: ''
type: string
- name: 'buildProjects'
default: ''
type: string
steps:
- script: echo ${{ coalesce(parameters.foo, parameters.bar, 'Nothing to see') }}
Inserción
Puede usar expresiones de plantilla para modificar la estructura de una canalización de YAML. Por ejemplo, para insertar en una secuencia:
# 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
Cuando se inserta una matriz en una matriz, la matriz anidada se aplana.
Para insertar en una asignación, use la propiedad especial ${{ 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
Inserción condicional
Si desea insertar condicionalmente en una secuencia o una asignación en una plantilla, use inserciones y evaluación de expresiones. También puede usar instrucciones if fuera de las if siempre que use la sintaxis de plantilla.
Por ejemplo, para insertar en una secuencia en una plantilla:
# 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
Por ejemplo, para insertar en una asignación en una plantilla:
# 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
También puede usar la inserción condicional para las variables. En este ejemplo, start siempre imprime y solo imprime cuando la variable es igual a this is a testfootest .
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
Inserción iterativa
La each directiva permite la inserción iterativa basada en una secuencia YAML (matriz) o asignación (pares clave-valor).
Por ejemplo, puede encapsular los pasos de cada trabajo con otros pasos previos y posteriores:
# 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!
También puede manipular las propiedades de lo que está iterando. Por ejemplo, para agregar más dependencias:
# 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.
Escape de un valor
Si necesita escapar un valor que literalmente contiene ${{ , envolver el valor en una cadena de expresión. Por ejemplo, ${{ 'my${{value' }} o ${{ 'my${{value with a '' single quote too' }}.
Límites impuestos
Las plantillas y las expresiones de plantilla pueden provocar un crecimiento exponencial del tamaño y la complejidad de una canalización. Para ayudar a evitar el crecimiento en desuso, Azure Pipelines impone los límites siguientes:
- No se pueden incluir más de 100 archivos YAML independientes (directa o indirectamente)
- No más de 20 niveles de anidamiento de plantillas (plantillas incluidas otras plantillas)
- No se consumen más de 10 megabytes de memoria al analizar el YAML (en la práctica, suele estar entre 600 KB y 2 MB de YAML en disco, dependiendo de las características específicas usadas).
Parámetros de plantilla
Puede pasar parámetros a plantillas.
La parameters sección define qué parámetros están disponibles en la plantilla y sus valores predeterminados.
Las plantillas se expanden justo antes de que se ejecute la canalización para que los valores rodeados por se reemplace por los parámetros que recibe de la ${{ }} canalización de entrada. Como resultado, solo se pueden usar variables predefinidas en los parámetros.
Para usar parámetros en varias canalizaciones, vea cómo crear un grupo de variables.
Plantillas de trabajo, fase y paso con parámetros
# 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
Cuando consuma la plantilla en la canalización, especifique valores para los parámetros de plantilla.
# 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'
También puede usar parámetros con plantillas de paso o fase. Por ejemplo, pasos con parámetros:
# 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
Cuando consuma la plantilla en la canalización, especifique valores para los parámetros de plantilla.
# File: azure-pipelines.yml
steps:
- script: npm install
- template: templates/steps-with-params.yml # Template reference
parameters:
runExtendedTests: 'true'
Nota
Los parámetros escalares siempre se tratan como cadenas.
Por ejemplo, eq(parameters['myparam'], true) casi siempre devolverá , incluso si el parámetro es la palabra truemyparamfalse .
Las cadenas no vacías se convierten true a en un contexto booleano.
Esa expresión se podría reescribir para comparar explícitamente cadenas: .
Los parámetros no se limitan a cadenas escalares. Siempre que el lugar donde se expanda el parámetro espere una asignación, el parámetro puede ser una asignación. Del mismo modo, se pueden pasar secuencias donde se esperan secuencias. Por ejemplo:
# 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 }}
Uso de otros repositorios
Puede mantener las plantillas en otros repositorios. Por ejemplo, supongamos que tiene una canalización principal que quiere que usen todas las canalizaciones de aplicaciones. Puede colocar la plantilla en un repositorio principal y, a continuación, hacer referencia a ella desde cada uno de los repositorios de aplicaciones:
# 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
Ahora puede reutilizar esta plantilla en varias canalizaciones.
Use la resources especificación para proporcionar la ubicación del repositorio principal.
Cuando haga referencia al repositorio principal, use @ y el nombre que le agregó en 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'
Para type: github , es como en los ejemplos name<identity>/<repo> anteriores.
Para type: git (Azure Repos), name es <project>/<repo> .
El proyecto debe estar en la misma organización; No se admiten referencias entre organizaciones.
Los repositorios se resuelven solo una vez, cuando se inicia la canalización. Después, se usa el mismo recurso durante la canalización. Solo se usan los archivos de plantilla. Una vez que las plantillas se expanden por completo, la canalización final se ejecuta como si se hubiera definido completamente en el repositorio de origen. Esto significa que no puede usar scripts del repositorio de plantillas en la canalización.
Si desea usar una versión determinada y fija de la plantilla, asegúrese de anclar a una referencia. Las referencias son ramas ( refs/heads/<name> ) o etiquetas ( refs/tags/<name> ).
Si desea anclar una confirmación específica, cree primero una etiqueta que apunte a esa confirmación y, a continuación, anclar a esa etiqueta.
Expresiones
Use expresiones de plantilla para especificar cómo se resuelven dinámicamente los valores durante la inicialización de la canalización.
Ajuste la expresión de plantilla dentro de esta sintaxis: ${{ }} .
Las expresiones de plantilla pueden expandir parámetros de plantilla y también variables.
Puede usar parámetros para influir en cómo se expande una plantilla.
El parameters objeto funciona como el objeto parameters una expresión.
Por ejemplo, defina una plantilla:
# 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
A continuación, haga referencia a la plantilla y pásala el parámetro solution opcional:
# File: azure-pipelines.yml
steps:
- template: steps/msbuild.yml
parameters:
solution: my.sln
Contexto
Dentro de una expresión de plantilla, tiene acceso al parameters contexto , que contiene los valores de los parámetros pasados.
Además, tiene acceso al contexto , que contiene todas las variables especificadas en el archivo YAML más variables las variables del variables.
Lo importante es que no tiene variables en tiempo de ejecución como las almacenadas en la canalización o dadas al iniciar una ejecución.
La expansión de plantillas se produce al principio de laejecución, por lo que esas variables no están disponibles.
Parámetros obligatorios
Puede agregar un paso de validación al principio de la plantilla para comprobar los parámetros que necesita.
Este es un ejemplo que comprueba el parámetro mediante Bash (que le permite solution trabajar en cualquier plataforma):
# 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 }}
Para mostrar que se produce un error en la plantilla si falta el parámetro necesario:
# 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
Funciones de expresión de plantilla
Puede usar funciones generales en las plantillas. También puede usar algunas funciones de expresión de plantilla.
format
- Reemplazo de token de cadena simple
- Parámetros mínimos: 2. Parámetros máximos: N
- Ejemplo:
${{ format('{0} Build', parameters.os) }}→'Windows Build'
coalesce
- Se evalúa como el primer argumento de cadena no vacío y no nulo
- Parámetros mínimos: 2. Parámetros máximos: N
- Ejemplo:
parameters:
restoreProjects: ''
buildProjects: ''
steps:
- script: echo ${{ coalesce(parameters.foo, parameters.bar, 'Nothing to see') }}
Inserción
Puede usar expresiones de plantilla para modificar la estructura de una canalización de YAML. Por ejemplo, para insertar en una secuencia:
# 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
Cuando se inserta una matriz en una matriz, la matriz anidada se aplana.
Para insertar en una asignación, use la propiedad especial ${{ 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
Inserción condicional
Si desea insertar condicionalmente en una secuencia o una asignación, use inserciones y evaluación de expresiones.
Por ejemplo, para insertar en una secuencia:
# 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
Por ejemplo, para insertar en una asignación:
# 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
Inserción iterativa
La each directiva permite la inserción iterativa basada en una secuencia YAML (matriz) o asignación (pares clave-valor).
Por ejemplo, puede ajustar los pasos de cada trabajo con pasos adicionales previos y posteriores:
# 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!
También puede manipular las propiedades de todo lo que se está iterando. Por ejemplo, para agregar más dependencias:
# 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.
Escapar
Si necesita escapar un valor que contiene literalmente , ajuste ${{ el valor en una cadena de expresión. Por ejemplo, ${{ 'my${{value' }} o ${{ 'my${{value with a '' single quote too' }}.
Límites
Las plantillas y las expresiones de plantilla pueden provocar un crecimiento exponencial del tamaño y la complejidad de una canalización. Para ayudar a evitar el crecimiento desmesado, Azure Pipelines impone los límites siguientes:
- No se pueden incluir más de 50 archivos YAML independientes (directa o indirectamente)
- No se consumen más de 10 megabytes de memoria al analizar el YAML (en la práctica, suele estar entre 600 KB y 2 MB de YAML en disco, dependiendo de las características específicas usadas).
- No se permiten más de 2000 caracteres por expresión de plantilla