Expresiones
Azure Pipelines | TFS 2018 | TFS 2017.3
Nota
En Microsoft Team Foundation Server (TFS) 2018 y versiones anteriores, las canalizaciones de compilación y versión se denominan definiciones, las ejecuciones se denominan compilaciones, las conexiones de servicio se denominan puntos de conexión de servicio, las fases se denominan entornos y los trabajos se denominan fases.
Las expresiones se pueden usar en muchos lugares donde es necesario especificar un valor de cadena, booleano o número al crear una canalización. El uso más común de expresiones es en condiciones para determinar si se debe ejecutar un trabajo o un paso.
# Expressions are used to define conditions for a step, job, or stage
steps:
- task: ...
condition: <expression>
Otro uso común de expresiones es definir variables.
Las expresiones se pueden evaluar en tiempo de compilación o en tiempo de ejecución.
Las expresiones de tiempo de compilación se pueden usar en cualquier lugar; Las expresiones en tiempo de ejecución se pueden usar en variables y condiciones. Las expresiones en tiempo de ejecución están pensadas como una manera de calcular el contenido de las variables y el estado (ejemplo: condition ).
# Two examples of expressions used to define variables
# The first one, a, is evaluated when the YAML file is compiled into a plan.
# The second one, b, is evaluated at runtime.
# Note the syntax ${{}} for compile time and $[] for runtime expressions.
variables:
a: ${{ <expression> }}
b: $[ <expression> ]
La diferencia entre las sintaxis de expresiones en tiempo de ejecución y de tiempo de compilación es principalmente qué contexto está disponible.
En una expresión en tiempo de compilación ( ), tiene acceso a ${{ <expression> }}parameters y definido variables estáticamente.
En una expresión en tiempo de ejecución ( $[ <expression> ] ), tiene acceso a más variables parámetros, pero sin parámetros.
En este ejemplo, una expresión en tiempo de ejecución establece el valor de $(isMain) . Una variable estática en una expresión de compilación establece el valor de $(compileVar) .
variables:
staticVar: 'my value' # static variable
compileVar: ${{ variables.staticVar }} # compile time expression
isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] # runtime expression
steps:
- script: |
echo ${{variables.staticVar}} # outputs my value
echo $(compileVar) # outputs my value
echo $(isMain) # outputs True
Una expresión puede ser un literal, una referencia a una variable, una referencia a una dependencia, una función o una combinación anidada válida de estos.
Literales
Como parte de una expresión, puede usar literales booleanos, null, number, string o version.
# Examples
variables:
someBoolean: ${{ true }} # case insensitive, so True or TRUE also works
someNumber: ${{ -1.2 }}
someString: ${{ 'a b c' }}
someVersion: ${{ 1.2.3 }}
Boolean
True y False son expresiones literales booleanas.
Null
Null es una expresión literal especial que se devuelve de un error de diccionario, por ejemplo, ( variables['noSuch'] ). Null puede ser la salida de una expresión, pero no se puede llamar directamente dentro de una expresión.
Número
Comienza con "-", "." o "0" a "9".
String
Debe estar entre comillas únicas. Por ejemplo: 'this is a string'.
Para expresar una comilla simple literal, escálela con una comilla simple.
Por ejemplo: 'It''s OK if they''re using contractions.'.
Puede usar un carácter de canalización ( | ) para cadenas multilínea.
myKey: |
one
two
three
Version
Número de versión con hasta cuatro segmentos.
Debe comenzar con un número y contener dos o tres caracteres de punto ( . ).
Por ejemplo: 1.2.3.4.
Variables
Como parte de una expresión, puede acceder a las variables mediante una de estas dos sintaxis:
- Sintaxis de índice:
variables['MyVar'] - Sintaxis de desreferencia de propiedad:
variables.MyVar
Para usar la sintaxis de desreferencia de propiedad, el nombre de propiedad debe:
- Empezar con
a-Zo_ - Estar seguido de
a-Z0-9o_
En función del contexto de ejecución, hay diferentes variables disponibles.
- Si crea canalizaciones mediante YAML, las variables de canalización estarán disponibles.
- Si crea canalizaciones de compilación mediante el editor clásico, las variables de compilación estarán disponibles.
- Si crea canalizaciones de versión mediante el editor clásico, las variables de versión estarán disponibles.
Las variables siempre son cadenas. Si desea usar valores con tipo, debe usar parámetros en su lugar.
Nota
Hay una limitación para usar variables con expresiones para canalizaciones clásicas y YAML al configurar dichas variables a través de la interfaz de usuario de la pestaña variables. Las variables que se definen como expresiones no deben depender de otra variable con expresión en valor, ya que no se garantiza que ambas expresiones se evalúen correctamente. Por ejemplo, tenemos una variable a cuyo valor se usa como parte del valor de la variable $[ <expression> ]b . Puesto que no se garantiza el orden de procesamiento de las variables, la variable b podría tener un valor incorrecto de variable después de la a evaluación.
Las construcciones descritas solo se permiten al configurar variables a través de la palabra clave variables en la canalización de YAML. Es necesario colocar las variables en el orden en que se deben procesar para obtener los valores correctos después del procesamiento.
Funciones
Las siguientes funciones integradas se pueden usar en expresiones.
y
- Se evalúa como
Truesi todos los parámetros sonTrue - Parámetros mínimos: 2. Parámetros máximos: N
- Convierte parámetros en booleanos para la evaluación
- Cortocircuitos después de la primera
False - Ejemplo:
and(eq(variables.letters, 'ABC'), eq(variables.numbers, 123))
coalesce
- Evalúa los parámetros en orden y devuelve el valor que no es igual a null o empty-string.
- Parámetros mínimos: 2. Parámetros máximos: N
- Ejemplo:
coalesce(variables.couldBeNull, variables.couldAlsoBeNull, 'literal so it always works')
contiene
- Evalúa si
Trueel parámetro izquierdo String contiene el parámetro right - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte parámetros en Cadena para su evaluación
- Realiza la comparación ordinal de casos ordinales
- Ejemplo:
contains('ABCDE', 'BCD')(devuelve True)
containsValue
- Evalúa si
Trueel parámetro izquierdo es una matriz y cualquier elemento es igual al parámetro derecho. También evalúaTruesi el parámetro izquierdo es un objeto y el valor de cualquier propiedad es igual al parámetro derecho. - Parámetros mínimos: 2. Parámetros máximos: 2
- Si el parámetro izquierdo es una matriz, convierta cada elemento para que coincida con el tipo del parámetro derecho. Si el parámetro izquierdo es un objeto , convierta el valor de cada propiedad para que coincida con el tipo del parámetro derecho. La comparación de igualdad de cada elemento específico se evalúa
Falsesi se produce un error en la conversión. - Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Cortocircuitos después de la primera coincidencia
Nota
No hay ninguna sintaxis literal en una canalización de YAML para especificar una matriz. Esta función es de uso limitado en canalizaciones generales. Está pensado para su uso en el contexto del decorador de canalización con matrices proporcionadas por el sistema, como la lista de pasos.
convertToJson
- Tome un objeto complejo y lo genera como JSON.
- Parámetros mínimos: 1. Parámetros máximos: 1.
parameters:
- name: listOfValues
type: object
default:
this_is:
a_complex: object
with:
- one
- two
steps:
- script: |
echo "${{ convertToJson(parameters.listOfValues) }}"
# Example output
{
this_is: {
a_complex: object,
with: [
one,
two
]
}
}
counter
- Esta función solo se puede usar en una expresión que define una variable. No se puede usar como parte de una condición para un paso, trabajo o fase.
- Evalúa un número que se incrementa con cada ejecución de una canalización.
- Parámetros: 2.
prefixyseed. - Prefix es una expresión de cadena. Se realiza un seguimiento de un valor independiente del contador para cada valor único de prefijo. debe
prefixusar caracteres UTF-16. - Seed es el valor inicial del contador.
Puede crear un contador que se incremente automáticamente en uno en cada ejecución de la canalización. Al definir un contador, se proporciona un prefix y seed un . Este es un ejemplo que muestra esto.
variables:
major: 1
# define minor as a counter with the prefix as variable major, and seed as 100.
minor: $[counter(variables['major'], 100)]
steps:
- bash: echo $(minor)
El valor de minor en el ejemplo anterior en la primera ejecución de la canalización será 100. En la segunda ejecución será 101, siempre que el valor major de sea todavía 1.
Si edita el archivo YAML y actualiza el valor de la variable para que sea 2, en la siguiente ejecución de la canalización, el valor de será majorminor 100. Las ejecuciones posteriores incrementarán el contador a 101, 102, 103, ...
Más adelante, si edita el archivo YAML y vuelve a establecer el valor de en 1, el valor del contador se reanuda donde lo dejó para major ese prefijo. En este ejemplo, se reanuda en 102.
Este es otro ejemplo de cómo establecer una variable para que actúe como un contador que comienza en 100, se incrementa en 1 para cada ejecución y se restablece a 100 cada día.
Nota
pipeline.startTime no está disponible fuera de las expresiones. pipeline.startTime da system.pipelineStartTime formato a un objeto de fecha y hora para que esté disponible para trabajar con expresiones.
La zona horaria predeterminada para pipeline.startTime es UTC. Puede cambiar la zona horaria de su organización.
jobs:
- job:
variables:
a: $[counter(format('{0:yyyyMMdd}', pipeline.startTime), 100)]
steps:
- bash: echo $(a)
Este es un ejemplo de tener un contador que mantiene un valor independiente para las ejecuciones de PR y CI.
variables:
patch: $[counter(variables['build.reason'], 0)]
Los contadores tienen como ámbito una canalización. En otras palabras, su valor se incrementa para cada ejecución de esa canalización. No hay contadores de ámbito de proyecto.
endsWith
- Evalúa si
Trueel parámetro izquierdo String termina con el parámetro right - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte parámetros en String para su evaluación
- Realiza la comparación ordinal entre mayúsculas y minúsculas
- Ejemplo:
endsWith('ABCDE', 'DE')(devuelve True)
eq
- Evalúa si
Truelos parámetros son iguales - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte el parámetro derecho para que coincida con el tipo de parámetro izquierdo. Devuelve si
Falsese produce un error en la conversión. - Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Ejemplo:
eq(variables.letters, 'ABC')
format
- Evalúa los parámetros finales y los inserta en la cadena de parámetro inicial.
- Parámetros mínimos: 1. Parámetros máximos: N
- Ejemplo:
format('Hello {0} {1}', 'John', 'Doe') - Usa especificadores de formato de fecha y hora personalizados de .NET para el formato de fecha ( , , , , , , , ,
yy, , ,MMMddd,HHHmmmsssfffffffK) - Ejemplo:
format('{0:yyyyMMdd}', pipeline.startTime). En este casopipeline.startTimees una variable de objeto de fecha y hora especial. - Escape entre llaves. Por ejemplo:
format('literal left brace {{ and literal right brace }}')
ge
- Evalúa si
Trueel parámetro izquierdo es mayor o igual que el parámetro derecho. - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte el parámetro derecho para que coincida con el tipo de parámetro izquierdo. Errores si se produce un error en la conversión.
- Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Ejemplo:
ge(5, 5)(devuelve True)
gt
- Evalúa si
Trueel parámetro left es mayor que el parámetro derecho. - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte el parámetro derecho para que coincida con el tipo de parámetro izquierdo. Errores si se produce un error en la conversión.
- Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Ejemplo:
gt(5, 2)(devuelve True)
in
- Evalúa si
Trueel parámetro left es igual a cualquier parámetro derecho. - Parámetros mínimos: 1. Parámetros máximos: N
- Convierte los parámetros de la derecha para que coincidan con el tipo de parámetro izquierdo. La comparación de igualdad se evalúa
Falsesi se produce un error en la conversión. - Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Cortocircuitos después de la primera coincidencia
- Ejemplo:
in('B', 'A', 'B', 'C')(devuelve True)
join
- Concatena todos los elementos de la matriz de parámetros de la derecha, separados por la cadena de parámetro izquierdo.
- Parámetros mínimos: 2. Parámetros máximos: 2
- Cada elemento de la matriz se convierte en una cadena. Los objetos complejos se convierten en una cadena vacía.
- Si el parámetro correcto no es una matriz, el resultado es el parámetro correcto convertido en una cadena.
En este ejemplo, se agrega un punto y coma entre cada elemento de la matriz. El tipo de parámetro es un objeto .
parameters:
- name: myArray
type: object
default:
- FOO
- BAR
- ZOO
variables:
A: ${{ join(';',parameters.myArray) }}
steps:
- script: echo $A # outputs FOO;BAR;ZOO
le
- Evalúa si
Trueel parámetro izquierdo es menor o igual que el parámetro derecho. - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte el parámetro derecho para que coincida con el tipo de parámetro izquierdo. Errores si se produce un error en la conversión.
- Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Ejemplo:
le(2, 2)(devuelve True)
length
- Devuelve la longitud de una cadena o una matriz, ya sea una que procede del sistema o que procede de un parámetro.
- Parámetros mínimos: 1. Parámetros máximos 1
- Ejemplo:
length('fabrikam')devuelve 8
lower
- Convierte un valor de cadena o variable en todos los caracteres en minúsculas.
- Parámetros mínimos: 1. Parámetros máximos 1
- Devuelve el equivalente en minúsculas de una cadena.
- Ejemplo:
lower('FOO')devuelvefoo
lt
- Evalúa si
Trueel parámetro left es menor que el parámetro derecho. - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte el parámetro derecho para que coincida con el tipo de parámetro izquierdo. Errores si se produce un error en la conversión.
- Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Ejemplo:
lt(2, 5)(devuelve True)
ne
- Evalúa si
Truelos parámetros no son iguales - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte el parámetro derecho para que coincida con el tipo de parámetro izquierdo. Devuelve si
Truese produce un error en la conversión. - Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Ejemplo:
ne(1, 2)(devuelve True)
not
- Evalúa si
Trueel parámetro esFalse - Parámetros mínimos: 1. Parámetros máximos: 1
- Convierte el valor en booleano para la evaluación.
- Ejemplo:
not(eq(1, 2))(devuelve True)
notIn
- Evalúa si
Trueel parámetro left no es igual a ningún parámetro derecho. - Parámetros mínimos: 1. Parámetros máximos: N
- Convierte los parámetros de la derecha para que coincidan con el tipo de parámetro izquierdo. La comparación de igualdad se evalúa
Falsesi se produce un error en la conversión. - Comparación ordinal entre mayúsculas y minúsculas para cadenas
- Cortocircuitos después de la primera coincidencia
- Ejemplo:
notIn('D', 'A', 'B', 'C')(devuelve True)
o bien
- Evalúa si
Truealgún parámetro esTrue - Parámetros mínimos: 2. Parámetros máximos: N
- Convierte parámetros a booleanos para la evaluación
- Cortocircuitos después de la primera
True - Ejemplo:
or(eq(1, 1), eq(2, 3))(devuelve True, cortocircuitos)
replace
- Devuelve una nueva cadena en la que todas las instancias de una cadena de la instancia actual se reemplazan por otra cadena.
- Parámetros mínimos: 3. Parámetros máximos: 3
replace(a, b, c): devuelve un , con todas las instancias de b reemplazadas por c- Ejemplo:
replace('https://www.tinfoilsecurity.com/saml/consume','https://www.tinfoilsecurity.com','http://server')(devuelvehttp://server/saml/consume)
startsWith
- Evalúa si
Truela cadena del parámetro izquierdo comienza por el parámetro right. - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte parámetros en String para su evaluación
- Realiza la comparación ordinal entre mayúsculas y minúsculas
- Ejemplo:
startsWith('ABCDE', 'AB')(devuelve True)
upper
- Convierte un valor de cadena o variable en todos los caracteres en mayúsculas
- Parámetros mínimos: 1. Parámetros máximos 1
- Devuelve el equivalente en mayúsculas de una cadena.
- Ejemplo:
upper('bah')devuelveBAH
xor
- Evalúa si
Trueexactamente un parámetro esTrue - Parámetros mínimos: 2. Parámetros máximos: 2
- Convierte parámetros a booleanos para la evaluación
- Ejemplo:
xor(True, False)(devuelve True)
Funciones de comprobación del estado del trabajo
Puede usar las siguientes funciones de comprobación de estado como expresiones en condiciones, pero no en definiciones de variables.
Siempre
- Siempre se evalúa como
True(incluso cuando se cancela). Nota: Un error crítico puede impedir que se ejecute una tarea. Por ejemplo, si se ha podido obtener orígenes.
Cancelado
- Se evalúa como
Truesi se canceló la canalización.
con errores
- Para un paso, equivalente a
eq(variables['Agent.JobStatus'], 'Failed'). - Para un trabajo:
- Sin argumentos, se evalúa como
Truesolo si se ha fallado algún trabajo anterior en el gráfico de dependencias. - Con los nombres de trabajo como argumentos, solo se evalúa
Truecomo si alguno de esos trabajos genera un error.
- Sin argumentos, se evalúa como
Correcto
- Para un paso, equivalente a
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues') - Para un trabajo:
- Sin argumentos, se evalúa como solo si todos los trabajos anteriores del gráfico de dependencias se han hecho correctamente o
Trueparcialmente. - Si el trabajo anterior se ha hecho correctamente, pero se ha fallado aún más una dependencia ascendente,
succeeded('previousJobName')devolverá true. Si solo usadependsOn: previousJobName, se producirá un error porque todas las dependencias ascendentes no se han realizado correctamente. Para evaluar solo el trabajo anterior, usesucceeded('previousJobName')en una condición. - Con los nombres de trabajo como argumentos, se evalúa como si todos esos trabajos se han hecho correctamente o
Trueparcialmente. - Se evalúa como
Falsesi se cancela la canalización.
- Sin argumentos, se evalúa como solo si todos los trabajos anteriores del gráfico de dependencias se han hecho correctamente o
succeededOrFailed
Para un paso, equivalente a
in(variables['Agent.JobStatus'], 'Succeeded', 'SucceededWithIssues', 'Failed')Para un trabajo:
- Sin argumentos, se evalúa como independientemente de si los trabajos del gráfico de dependencias se
Truehan hecho correctamente o no. - Con los nombres de trabajo como argumentos, se evalúa si alguno de esos trabajos se
Trueha hecho correctamente o no.
Esto es como
always(), salvo que se evaluará cuando seFalsecancele la canalización.- Sin argumentos, se evalúa como independientemente de si los trabajos del gráfico de dependencias se
Inserción condicional
Puede usar las ifelseif cláusulas , y else para asignar condicionalmente valores de variable o establecer entradas para las tareas. También puede ejecutar condicionalmente un paso cuando se cumple una condición.
Los condicionales solo funcionan cuando se usa la sintaxis de plantilla. Obtenga más información sobre la sintaxis de variables.
Para las plantillas, puede usar la inserción condicional al agregar una secuencia o asignación. Obtenga más información sobre la inserción condicional en plantillas.
Asignación condicional de una variable
variables:
${{ if eq(variables['Build.SourceBranchName'], 'main') }}: # only works if you have a main branch
stageName: prod
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo ${{variables.stageName}}
Establecer condicionalmente una entrada de tarea
pool:
vmImage: 'ubuntu-latest'
steps:
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)'
${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
artifact: 'prod'
${{ else }}:
artifact: 'dev'
publishLocation: 'pipeline'
Ejecución condicional de un paso
variables:
- name: foo
value: fabrikam # triggers else condition
pool:
vmImage: 'ubuntu-latest'
steps:
- script: echo "start"
- ${{ if eq(variables.foo, 'adaptum') }}:
- script: echo "this is adaptum"
- ${{ elseif eq(variables.foo, 'contoso') }}:
- script: echo "this is contoso"
- ${{ else }}:
- script: echo "the value is not adaptum or contoso"
Each (palabra clave)
Puede usar la palabra each clave para recorrer en bucle los parámetros con el tipo de objeto .
parameters:
- name: listOfStrings
type: object
default:
- one
- two
steps:
- ${{ each value in parameters.listOfStrings }}:
- script: echo ${{ value }}
Dependencias
Las expresiones pueden usar el contexto de dependencias para hacer referencia a trabajos o fases anteriores. Puede usar dependencias para:
- Hacer referencia al estado del trabajo de un trabajo anterior
- Hacer referencia al estado de la fase de una fase anterior
- Referencia a variables de salida del trabajo anterior en la misma fase
- Referencia a variables de salida de la fase anterior en una fase
- Referencia a variables de salida en un trabajo de una fase anterior de la siguiente fase
Se llama al contexto dependencies para trabajos y fases y funciona de forma muy parecido a las variables.
Dentro de un trabajo, si hace referencia a una variable de salida de un trabajo en otra fase, el contexto se denomina stageDependencies .
Si tiene problemas con las variables de salida que tienen caracteres de comillas ( o '" ) en ellas, consulte esta guía de '
Dependencias de fase a fase
Estructuralmente, el objeto es una asignación de nombres de trabajos dependencies y fases a y resultsoutputs .
Expresado como JSON, tendría el siguiente aspecto:
"dependencies": {
"<STAGE_NAME>" : {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"jobName.stepName.variableName": "value"
}
},
"...": {
// another stage
}
}
Use esta forma de para dependencies asignar variables o comprobar condiciones en un nivel de fase.
En este ejemplo, la fase B se ejecuta si la fase A se ha realizado correctamente o se ha omitido.
Nota
En los ejemplos siguientes se usa la sintaxis de canalización estándar. Si usa canalizaciones de implementación, la sintaxis de variables y variables condicionales variará. Para obtener información sobre la sintaxis específica que se debe usar, vea Trabajos de implementación.
stages:
- stage: A
condition: false
jobs:
- job: A1
steps:
- script: echo Job A1
- stage: B
condition: in(dependencies.A.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
jobs:
- job: B1
steps:
- script: echo Job B1
Las fases también pueden usar variables de salida de otra fase. En este ejemplo, la fase B depende de una variable de la fase A.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
condition: and(succeeded(), eq(dependencies.A.outputs['A1.printvar.shouldrun'], 'true'))
dependsOn: A
jobs:
- job: B1
steps:
- script: echo hello from Stage B
Nota
De forma predeterminada, cada fase de una canalización depende de la que hay justo antes de ella en el archivo YAML.
Si necesita hacer referencia a una fase que no es inmediatamente anterior a la actual, puede invalidar este valor predeterminado automático agregando una sección a dependsOn la fase.
Dependencias de trabajo a trabajo dentro de una fase
En el nivel de trabajo dentro de una sola fase, los dependencies datos no contienen información de nivel de fase.
"dependencies": {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value1"
}
},
"...": {
// another job
}
}
En este ejemplo, el trabajo A siempre se omitirá y se ejecutará el trabajo B. Se ejecutará el trabajo C, ya que todas sus dependencias se ejecutan correctamente o se omiten.
jobs:
- job: a
condition: false
steps:
- script: echo Job A
- job: b
steps:
- script: echo Job B
- job: c
dependsOn:
- a
- b
condition: |
and
(
in(dependencies.a.result, 'Succeeded', 'SucceededWithIssues', 'Skipped'),
in(dependencies.b.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
)
steps:
- script: echo Job C
En este ejemplo, el trabajo B depende de una variable de salida del trabajo A.
jobs:
- job: A
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- job: B
condition: and(succeeded(), eq(dependencies.A.outputs['printvar.shouldrun'], 'true'))
dependsOn: A
steps:
- script: echo hello from B
Dependencias de trabajo a trabajo entre fases
En el nivel de trabajo, también puede hacer referencia a las salidas de un trabajo en una fase anterior.
Esto requiere el uso del stageDependencies contexto.
"stageDependencies": {
"<STAGE_NAME>" : {
"<JOB_NAME>": {
"result": "Succeeded|SucceededWithIssues|Skipped|Failed|Canceled",
"outputs": {
"stepName.variableName": "value"
}
},
"...": {
// another job
}
},
"...": {
// another stage
}
}
En este ejemplo, el trabajo B1 ejecutará si el trabajo A1 se ha realizado correctamente o se ha omitido. El trabajo B2 comprobará el valor de la variable de salida del trabajo A1 para determinar si se debe ejecutar.
trigger: none
pool:
vmImage: 'ubuntu-latest'
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
# or on Windows:
# - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
name: printvar
- stage: B
dependsOn: A
jobs:
- job: B1
condition: in(stageDependencies.A.A1.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
steps:
- script: echo hello from Job B1
- job: B2
condition: eq(stageDependencies.A.A1.outputs['printvar.shouldrun'], 'true')
steps:
- script: echo hello from Job B2
Fase en función de la salida del trabajo
Si no se requiere ningún cambio después de una compilación, es posible que desee omitir una fase de una canalización en determinadas condiciones. Un ejemplo es cuando se usa el plan de Terraform y se quiere desencadenar la aprobación y aplicar solo cuando el plan contiene cambios.
Cuando se usa esta condición en una fase, debe usar la dependencies variable , no stageDependencies .
El ejemplo siguiente es un script simple que establece una variable (use la información real del plan de Terraform) en un paso de una fase y, a continuación, invoca la segunda fase solo si la variable tiene un valor específico.
stages:
- stage: plan_dev
jobs:
- job: terraform_plan_dev
steps:
- bash: echo '##vso[task.setvariable variable=terraform_plan_exitcode;isOutput=true]2'
name: terraform_plan
- stage: apply_dev
dependsOn: plan_dev
condition: eq(dependencies.plan_dev.outputs['terraform_plan_dev.terraform_plan.terraform_plan_exitcode'], '2')
jobs:
- job: part_b
steps:
- bash: echo "BA"
Matrices filtradas
Al funcionar en una colección de elementos, puede usar la * sintaxis para aplicar una matriz filtrada. Una matriz filtrada devuelve todos los objetos o elementos independientemente de sus nombres.
Por ejemplo, considere una matriz de objetos denominada foo . Queremos obtener una matriz de los valores de la id propiedad en cada objeto de la matriz.
[
{ "id": 1, "a": "avalue1"},
{ "id": 2, "a": "avalue2"},
{ "id": 3, "a": "avalue3"}
]
Podríamos hacer lo siguiente:
foo.*.id
Esto indica al sistema que funcione como foo una matriz filtrada y, a continuación, seleccione la id propiedad .
Esto devolvería:
[ 1, 2, 3 ]
Conversión de tipos
Los valores de una expresión se pueden convertir de un tipo a otro a medida que se evalúa la expresión. Cuando se evalúa una expresión, los parámetros se convierten en el tipo de datos pertinente y, a continuación, se convierten en cadenas.
Por ejemplo, en este YAML, los valores y TrueFalse se convierten en y cuando 1 se evalúa la 0 expresión.
La función lt() devuelve cuando el parámetro izquierdo es menor que el parámetro True derecho.
variables:
firstEval: $[lt(False, True)] # 0 vs. 1, True
secondEval: $[lt(True, False)] # 1 vs. 0, False
steps:
- script: echo $(firstEval)
- script: echo $(secondEval)
En este ejemplo, los valores y variables.emptyString la cadena vacía se evalúan como cadenas vacías.
La función evalúa los parámetros en orden y devuelve el primer valor que coalesce() no es igual a null o empty-string.
variables:
coalesceLiteral: $[coalesce(variables.emptyString, '', 'literal value')]
steps:
- script: echo $(coalesceLiteral) # outputs literal value
A continuación se enumeran las reglas de conversión detalladas.
| From / To | Boolean | Null | Number | String | Version |
|---|---|---|---|---|---|
| Boolean | - | - | Sí | Sí | - |
| Null | Sí | - | Sí | Sí | - |
| Number | Sí | - | - | Sí | Parcial |
| String | Sí | Parcial | Parcial | - | Parcial |
| Versión | Sí | - | - | Sí | - |
Boolean
Para numerar:
False→0True→1
Para la cadena:
False→'False'True→'True'
Null
- A booleano:
False - Para numerar:
0 - To string:
''(la cadena vacía)
Número
- Para booleano:
0→ , cualquier otro númeroFalse→True - Para la versión: debe ser mayor que cero y debe contener un decimal distinto de cero. Debe ser menor que Int32.MaxValue (componente decimal también).
- En cadena: convierte el número en una cadena sin separador de miles ni separador decimal.
String
- Para booleano:
''(la cadena vacía) →False, cualquier otra cadena →True - Para null:
''(la cadena vacía) →Null, cualquier otra cadena no convertible - Para numerar: (la cadena vacía) → 0; de lo contrario, ejecuta C# mediante InvariantCulture y las reglas
''Int32.TryParsesiguientes: AllowDecimalPoint |''AllowLeadingSign | AllowLeadingWhite | AllowThousands | AllowTrailingWhite. SiTryParsese produce un error, no se puede convertir. - Para la versión: ejecuta el de
Version.TryParseC#. Debe contener como mínimo los componentes Principal y Menor. SiTryParsese produce un error, no se puede convertir.
Version
- A booleano:
True - Para la cadena: Major.Minor, Major.Minor.Build o Major.Minor.Build.Revision.
Preguntas más frecuentes
Quiero hacer algo que no sea compatible con las expresiones. ¿Qué opciones tengo para ampliar Pipelines funcionalidad?
Puede personalizar la canalización con un script que incluya una expresión. Por ejemplo, este fragmento de código BUILD_BUILDNUMBER toma la variable y la divide con Bash. Este script genera dos nuevas variables, $MAJOR_RUN y , para los números de ejecución principales y $MINOR_RUN menores.
A continuación, las dos variables se usan para crear dos variables de canalización y $major$minor con $major. Estas variables están disponibles para los pasos de nivel inferior. Para compartir variables entre canalizaciones, vea Grupos de variables.
steps:
- bash: |
MAJOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f1)
echo "This is the major run number: $MAJOR_RUN"
echo "##vso[task.setvariable variable=major]$MAJOR_RUN"
MINOR_RUN=$(echo $BUILD_BUILDNUMBER | cut -d '.' -f2)
echo "This is the minor run number: $MINOR_RUN"
echo "##vso[task.setvariable variable=minor]$MINOR_RUN"
- bash: echo "My pipeline variable for major run is $(major)"
- bash: echo "My pipeline variable for minor run is $(minor)"