Skip to main content
Frecuentemente publicamos actualizaciones de nuestra documentación. Es posible que la traducción de esta página esté en curso. Para conocer la información más actual, visita la documentación en inglés. Si existe un problema con las traducciones en esta página, por favor infórmanos.

Esta versión de GitHub Enterprise se discontinuó el 2022-06-03. No se realizarán lanzamientos de patch, ni siquiera para problemas de seguridad críticos. Para obtener un mejor desempeño, más seguridad y nuevas características, actualiza a la última versión de GitHub Enterprise. Para obtener ayuda con la actualización, contacta al soporte de GitHub Enterprise.

Expresiones

Puedes evaluar las expresiones en los flujos de trabajo y acciones.

Nota: Los ejecutores hospedados en GitHub no son compatibles con GitHub Enterprise Server actualmente. Puedes encontrar más información sobre el soporte que se tiene planeado en el futuro en el Itinerario público de GitHub.

Acerca de las expresiones

Puedes utilizar expresiones para configurar variables de ambiente con programación en los archivos de flujo de trabajo y contextos de acceso. Una expresión puede ser cualquier combinación de valores literales, referencias a un contexto o funciones. Puedes combinar valores literales, referencias de contexto y funciones usando operadores. Para obtener más información sobre los contextos, consulta la sección "Contextos".

Las expresiones se utilizan comúnmente con la palabra clave condicional if en un archivo de flujo de trabajo para determinar si un paso debe ejecutar. Cuando un condicional if es true, se ejecutará el paso.

Debes usar una sintaxis específica para decirle a GitHub que evalúe una expresión en lugar de tratarla como una cadena.

${{ <expression> }}

Podrías omitir la sintaxis de expresión cuando utilizas expresiones en un condicional if (${{ }}) ya que GitHub evalúa automáticamente el condicional if como una expresión. Para obtener más información acerca de los condicionales if, consulta la sección "sintaxis de flujo de trabajo para GitHub Actions".

Advertencia: Cuando crees flujos de trabajo y acciones siempre debes considerar si tu código podría ejecutar entradas no confiables de atacantes potenciales. Se tratará a algunos contextos como una entrada no confiable, ya que un atacante podrían insertar su propio contenido malintencionado. Para obtener más información, consulta la sección "Entenderel riesgo de las inyecciones de scripts".

Expresión de ejemplo en un condicional if

steps:
  - uses: actions/hello-world-javascript-action@v1.1
    if: ${{ <expression> }}

Ejemplo de parámetros en una variable de entorno

env:
  MY_ENV_VAR: ${{ <expression> }}

Literales

Como parte de una expresión, puedes usar tipos de datos boolean, null, number o string.

Tipo de datosValor literal
booleanverdadero o falso
nullnull
numberCualquier formato de número compatible con JSON.
secuenciaNo necesitas meter secuencias entre ${{ y }}. Sin embargo, en caso de que lo hagas, debes utilizar comillas simples (') al rededor de la secuencia. ra utilizar una comilla simple literal, escápala utilizando una comilla simple adicional (''). Si envuelves las comillas dobles (") se mostrará un error.

Ejemplo

env:
  myNull: ${{ null }}
  myBoolean: ${{ false }}
  myIntegerNumber: ${{ 711 }}
  myFloatNumber: ${{ -9.2 }}
  myHexNumber: ${{ 0xff }}
  myExponentialNumber: ${{ -2.99e-2 }}
  myString: Mona the Octocat
  myStringInBraces: ${{ 'It''s open source!' }}

Operadores

OperadorDescripción
( )Agrupación lógica
[ ]Índice
.Desreferencia de propiedad
!No
<Menor que
<Menor o igual
>Mayor que
>=Mayor o igual
==Igual
!=No es igual
&&Y
||O

GitHub realiza comparaciones de igualdad flexible.

  • Si los tipos no coinciden, GitHub fuerza el tipo a un número. GitHub fusiona los tipos de datos con un número usando estas conversiones:

    TipoResultado
    Nulo0
    Booleanoverdadero devuelve 1
    falso devuelve 0
    SecuenciaAnalizado desde cualquier formato de número JSON legal, de lo contrario, NaN.
    Nota: La cadena vacía arroja 0.
    ArregloNaN
    ObjetoNaN
  • Una comparación de un NaN con otro NaN no genera true. Para obtener más información, consulta "Documentos de Mozilla NaN".

  • GitHub ignora las mayúsculas y minúsculas al comparar cadenas.

  • Los objetos y matrices solo se consideran iguales cuando son la misma instancia.

Funciones

GitHub ofrece un conjunto de funciones integradas que puedes usar en expresiones. Algunas funciones fusionan valores en una cadena para realizar las comparaciones. GitHub fusiona los tipos de datos con una cadena usando estas conversiones:

TipoResultado
Nulo''
Booleano'verdadero' o 'falso'
NumberFormato decimal, exponencial para grandes números
ArregloLas matrices no se convierten en cadenas
ObjetoLos objetos no se convierten en cadenas

contains

contiene (buscar, elemento)

Arroja true si search contiene item. Si search es una matriz, esta función arroja true si el item es un elemento de la matriz. Si search es una cadena, esta función arroja true si el item es una subcadena de search. Esta función no distingue mayúsculas de minúsculas. Fusiona valores en una cadena.

Ejemplo usando una matriz

contains(github.event.issue.labels.*.name, 'bug') devuelve la información de si la propuesta que está relacionada al evento tiene una etiqueta de "bug" o no.

Ejemplo usando una cadena

contains('Hello world', 'llo') devuelve verdadero.

startsWith

startsWith( searchString, searchValue )

Arroja true cuando searchString empieza con searchValue. Esta función no distingue mayúsculas de minúsculas. Fusiona valores en una cadena.

Ejemplo

startsWith('Hello world', 'He') regresa a verdadero.

endsWith

endsWith( searchString, searchValue )

Arroja true si searchString termina con searchValue. Esta función no distingue mayúsculas de minúsculas. Fusiona valores en una cadena.

Ejemplo

endsWith('Hello world', 'He') devuelve verdadero.

format

format( string, replaceValue0, replaceValue1, ..., replaceValueN)

Reemplaza valores en la string, con la variable replaceValueN. Las variables en la string se especifican con la sintaxis {N}, donde N es un entero. Debes especificar al menos un replaceValue y una string. No existe un máximo para el número de variables (replaceValueN) que puedes usar. Escapar las llaves utilizando llaves dobles.

Ejemplo

format('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')

Devuelve 'Hello Mona the Octocat'.

Ejemplo de evasión de llaves

format('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')

Devuelve '{Hello Mona the Octocat!}'.

join

join( array, optionalSeparator )

El valor para array puede ser una matriz o una cadena. Todos los valores en array se concatenan en una cadena. Si proporcionas optionalSeparator, se inserta entre los valores concatenados. De lo contrario, se usa el separador predeterminado ,. Fusiona valores en una cadena.

Ejemplo

join(github.event.issue.labels.*.name, ', ') puede devolver 'bug, help wanted'

toJSON

toJSON(value)

Arroja una representación JSON con formato mejorado de value. Puedes usar esta función para depurar la información suministrada en contextos.

Ejemplo

toJSON(job) puede devolver { "status": "Success" }

fromJSON

fromJSON(value)

Devuelve un objeto de JSON o un tipo de datos de JSON para value. Puedes utilizar esta función para proporcionar un objeto JSON como una expresión evaluada o para convertir variables de ambiente desde una secuencia.

Ejemplo de devolver un objeto JSON

Este flujo de trabajo configura una matriz de JSON en un job, y lo pasa al siguiente job utilizando un resultado y fromJSON.

name: build
on: push
jobs:
  job1:
    runs-on: ubuntu-latest
    outputs:
      matrix: ${{ steps.set-matrix.outputs.matrix }}
    steps:
      - id: set-matrix
        run: echo "::set-output name=matrix::{\"include\":[{\"project\":\"foo\",\"config\":\"Debug\"},{\"project\":\"bar\",\"config\":\"Release\"}]}"
  job2:
    needs: job1
    runs-on: ubuntu-latest
    strategy:
      matrix: ${{fromJSON(needs.job1.outputs.matrix)}}
    steps:
      - run: build

Ejemplo de devolver un tipo de datos JSON

Este flujo de trabajo utiliza fromJSON para convertir las variables de ambiente de una secuencia a un número entero o Booleano.

name: print
on: push
env: 
  continue: true
  time: 3
jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - continue-on-error: ${{ fromJSON(env.continue) }}
        timeout-minutes: ${{ fromJSON(env.time) }}
        run: echo ...

hashFiles

hashFiles(path)

Arroja un solo hash para el conjunto de archivos que coincide con el patrón de path. Puedes proporcionar un patrón de path o path múltiples se parados por comas. El path está relacionado con el directorio GITHUB_WORKSPACE y solo puede incluir archivos dentro del directorio GITHUB_WORKSPACE. Esta función calcula un hash SHA-256 individual para cada archivo coincidente, y luego usa esos hashes para calcular un hash SHA-256 final para el conjunto de archivos. Si el patrón path no empata con ningún archivo, esto devolverá una secuencia vacía. Para más información sobre SHA-256, consulta "SHA-2".

Puedes usar caracteres de coincidencia de patrones para encontrar nombres de archivos. La coincidencia de patrones no distingue mayúsculas de minúsculas en Windows. Para obtener más información acerca de los caracteres compatibles con los patrones, consulta "Sintaxis de flujo de trabajo para GitHub Actions".

Ejemplo con un solo patrón

Encuentra cualquier archivo package-lock.json en el repositorio.

hashFiles('**/package-lock.json')

Ejemplo con patrones múltiples

Crea un hash para cualquier archivo de package-lock.json y de Gemfile.lock en el repositorio.

hashFiles('**/package-lock.json', '**/Gemfile.lock')

Funciones de verificación

Puedes usar las siguientes funciones de verificación de estado como expresiones en condicionales if (si). Se aplicará una verificación de estado predeterminado de success() a menos de que incluyas una de estas funciones. Para obtener más información sobre los condicionales if, consulta la sección "Sintaxis de flujo de trabajo para GitHub Actions".

success

Arroja true cuando no falló ni se canceló ninguno de los pasos anteriores.

Ejemplo

steps:
  ...
  - name: The job has succeeded
    if: ${{ success() }}

always

Ocasiona que el paso siempre se ejecute y devuelve true, aún cuando se cancela. No se ejecutará un trabajo o paso cuando una falla crítica impida que la tarea se ejecute. Por ejemplo, si fallaron las fuentes.

Ejemplo

if: ${{ always() }}

cancelled

Devuelve verdadero si se canceló el flujo de trabajo.

Ejemplo

if: ${{ cancelled() }}

failure

Arroja true cuando falla cualquiera de los pasos anteriores de un trabajo. Si tienes una cadena de jobs dependientes, failure() devolverá el valor true en caso de que cualquier job ascendiente falle.

Ejemplo

steps:
  ...
  - name: The job has failed
    if: ${{ failure() }}

falla con las condiciones

Puedes incluir condiciones adicionales para que un paso se ejecute después de una falla, pero aún debes incluir failure() para omitir la verificación de estado predeterminada de success() que se aplica automáticamente a las condiciones if que no contienen una función de verificación de estado.

Ejemplo
steps:
  ...
  - name: Failing step
    id: demo
    run: exit 1
  - name: The demo step has failed
    if: ${{ failure() && steps.demo.conclusion == 'failure' }}

Filtros de objetos

Puedes usar la sintaxis * para aplicar un filtro y seleccionar los elementos coincidentes en una recopilación.

Por ejemplo, considera una matriz de objetos llamada fruits.

[
  { "name": "apple", "quantity": 1 },
  { "name": "orange", "quantity": 2 },
  { "name": "pear", "quantity": 1 }
]

El filtro fruits.*.name devuelve la matriz [ "apple", "orange", "pear" ].

También puedes utilizar la sintaxis * en un objeto. Por ejemplo, supón que tienes un objeto que se llama vegetables.


{
  "scallions":
  {
    "colors": ["green", "white", "red"],
    "ediblePortions": ["roots", "stalks"],
  },
  "beets":
  {
    "colors": ["purple", "red", "gold", "white", "pink"],
    "ediblePortions": ["roots", "stems", "leaves"],
  },
  "artichokes":
  {
    "colors": ["green", "purple", "red", "black"],
    "ediblePortions": ["hearts", "stems", "leaves"],
  },
}

El filtro vegetables.*.ediblePortions puede evaluarse como:


[
  ["roots", "stalks"],
  ["hearts", "stems", "leaves"],
  ["roots", "stems", "leaves"],
]

Ya que los objetos no preservan el orden, el orden de salida no se puede garantizar.