Acerca de los comandos de flujo
Las acciones pueden comunicarse con la máquina del ejecutor para establecer variables de entorno, valores de salida utilizados por otras acciones, agregar mensajes de depuración a los registros de salida y otras tareas.
La mayoría de los comandos de flujo de trabajo usan el comando echo
en un formato específico, mientras que otros se pueden invocar escribiendo en un archivo. Para más información, vea "Archivos de entorno".
Ejemplo de un comando de flujo de trabajo
echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
echo "::workflow-command parameter1={data},parameter2={data}::{command value}"
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"
Write-Output "::workflow-command parameter1={data},parameter2={data}::{command value}"
Note
Los nombres de parámetros y comandos de flujo de trabajo no distinguen mayúsculas de minúsculas.
Warning
Si utilizas el símbolo del sistema, omite los caracteres de comillas dobles ("
) al usar comandos de flujo de trabajo.
Utilizar comandos de flujo de trabajo para acceder a las funciones de toolkit
En actions/toolkit se incluye una serie de funciones que se pueden ejecutar como comandos de flujo de trabajo. Use la sintaxis ::
para ejecutar los comandos de flujo de trabajo dentro del archivo YAML; estos comandos se envían al ejecutor por medio de stdout
.
Por ejemplo, en lugar de usar código para crear una anotación de error, como se muestra a continuación:
core.error('Missing semicolon', {file: 'app.js', startLine: 1})
core.error('Missing semicolon', {file: 'app.js', startLine: 1})
Ejemplo: Crear una anotación de un error
Puedes usar el comando error
en tu flujo de trabajo para crear la misma anotación de error:
- name: Create annotation for build error run: echo "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error
run: echo "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error run: Write-Output "::error file=app.js,line=1::Missing semicolon"
- name: Create annotation for build error
run: Write-Output "::error file=app.js,line=1::Missing semicolon"
La siguiente tabla muestra qué funciones del toolkit se encuentran disponibles dentro de un flujo de trabajo:
Funcion del Toolkit | Comando equivalente del flujo de trabajo |
---|---|
core.addPath | Accesible mediante el archivo de entorno GITHUB_PATH |
core.debug | debug |
core.notice | notice |
core.error | error |
core.endGroup | endgroup |
core.exportVariable | Accesible mediante el archivo de entorno GITHUB_ENV |
core.getInput | Accesible mediante la variable de entorno INPUT_{NAME} |
core.getState | Accesible mediante la variable de entorno STATE_{NAME} |
core.isDebug | Accesible mediante la variable de entorno RUNNER_DEBUG |
core.summary | Accesible mediante el archivo de entorno GITHUB_STEP_SUMMARY |
core.saveState | Accesible mediante el archivo de entorno GITHUB_STATE |
core.setCommandEcho | echo |
core.setFailed | Se usa como acceso directo para ::error y exit 1 |
core.setOutput | Accesible mediante el archivo de entorno GITHUB_OUTPUT |
core.setSecret | add-mask |
core.startGroup | group |
core.warning | warning |
Agregar un mensaje de depuración
Imprime un mensaje de depuración en el registro. Debe crear un secreto denominado ACTIONS_STEP_DEBUG
con el valor true
para ver los mensajes de depuración establecidos por este comando en el registro. Para obtener más información, vea «Habilitación del registro de depuración».
::debug::{message}
::debug::{message}
Ejemplo: Configurar un mensaje de depuración
echo "::debug::Set the Octocat variable"
echo "::debug::Set the Octocat variable"
Write-Output "::debug::Set the Octocat variable"
Write-Output "::debug::Set the Octocat variable"
Configurar un mensaje de aviso
Crea un mensaje de aviso e imprime el mensaje en la bitácora. Este mensaje creará una anotación, la cual puede asociar el mensaje con un archivo particular de tu repositorio. Opcionalmente, tu mensaje puede especificar una posición dentro del archivo.
::notice file={name},line={line},endLine={endLine},title={title}::{message}
::notice file={name},line={line},endLine={endLine},title={title}::{message}
Parámetro | Valor | Obligatorio | Valor predeterminado |
---|---|---|---|
title | Título personalizado | No | Ninguno |
file | Nombre de archivo | No | .github |
col | Número de columna, a partir de 1 | No | Ninguno |
endColumn | Número de columna final | No | Ninguno |
line | Número de línea, a partir de 1 | No | 1 |
endLine | Número de línea final | No | 1 |
Ejemplo: configurar un mensaje de notificación
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
echo "::notice file=app.js,line=1,col=5,endColumn=7::Missing semicolon"
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::notice file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Configurar un mensaje de advertencia
Crea un mensaje de advertencia e imprime el mensaje en el registro. Este mensaje creará una anotación, la cual puede asociar el mensaje con un archivo particular de tu repositorio. Opcionalmente, tu mensaje puede especificar una posición dentro del archivo.
::warning file={name},line={line},endLine={endLine},title={title}::{message}
::warning file={name},line={line},endLine={endLine},title={title}::{message}
Parámetro | Valor | Obligatorio | Valor predeterminado |
---|---|---|---|
title | Título personalizado | No | Ninguno |
file | Nombre de archivo | No | .github |
col | Número de columna, a partir de 1 | No | Ninguno |
endColumn | Número de columna final | No | Ninguno |
line | Número de línea, a partir de 1 | No | 1 |
endLine | Número de línea final | No | 1 |
Ejemplo: Configurar un mensaje de advertencia
echo "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
echo "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::warning file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Configurar un mensaje de error
Crea un mensaje de error e imprime el mensaje en el registro. Este mensaje creará una anotación, la cual puede asociar el mensaje con un archivo particular de tu repositorio. Opcionalmente, tu mensaje puede especificar una posición dentro del archivo.
::error file={name},line={line},endLine={endLine},title={title}::{message}
::error file={name},line={line},endLine={endLine},title={title}::{message}
Parámetro | Valor | Obligatorio | Valor predeterminado |
---|---|---|---|
title | Título personalizado | No | Ninguno |
file | Nombre de archivo | No | .github |
col | Número de columna, a partir de 1 | No | Ninguno |
endColumn | Número de columna final | No | Ninguno |
line | Número de línea, a partir de 1 | No | 1 |
endLine | Número de línea final | No | 1 |
Ejemplo: Configurar un mensaje de error
echo "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
echo "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Write-Output "::error file=app.js,line=1,col=5,endColumn=7,title=YOUR-TITLE::Missing semicolon"
Agrupar líneas de las bitácoras
Crea un grupo expansible en la bitácora. Para crear un grupo, use el comando group
y especifique title
. Todo lo que imprima en el registro entre los comandos group
y endgroup
se anida dentro de una entrada expandible en el registro.
::group::{title} ::endgroup::
::group::{title}
::endgroup::
Ejemplo: Agrupar líneas de bitácoras
jobs: bash-example: runs-on: ubuntu-latest steps: - name: Group of log lines run: | echo "::group::My title" echo "Inside group" echo "::endgroup::"
jobs:
bash-example:
runs-on: ubuntu-latest
steps:
- name: Group of log lines
run: |
echo "::group::My title"
echo "Inside group"
echo "::endgroup::"
jobs: powershell-example: runs-on: windows-latest steps: - name: Group of log lines run: | Write-Output "::group::My title" Write-Output "Inside group" Write-Output "::endgroup::"
jobs:
powershell-example:
runs-on: windows-latest
steps:
- name: Group of log lines
run: |
Write-Output "::group::My title"
Write-Output "Inside group"
Write-Output "::endgroup::"
Enmascaramiento de un valor en un registro
::add-mask::{value}
::add-mask::{value}
El enmascaramiento de un valor impide que una cadena o variable se imprima en el registro. Cada palabra enmascarada separada por un espacio en blanco se reemplaza con el carácter *
. Puede usar una variable de entorno o una cadena para el valor value
de la máscara. Al enmascarar un valor, se trata como un secreto y se oculta en el ejecutor. Por ejemplo, después de enmascarar un valor, no podrá establecerlo como salida.
Ejemplo: Enmascarar una secuencia
Al imprimir "Mona The Octocat"
en el registro, verá "***"
.
echo "::add-mask::Mona The Octocat"
echo "::add-mask::Mona The Octocat"
Write-Output "::add-mask::Mona The Octocat"
Write-Output "::add-mask::Mona The Octocat"
Warning
Asegúrate de registrar el secreto con "add-mask" antes de generarlo en los registros de compilación o usarlo en cualquier otro comando de flujo de trabajo.
Ejemplo: Enmascarar una variable de ambiente
Al imprimir la variable MY_NAME
o el valor "Mona The Octocat"
en el registro, verá "***"
en lugar de "Mona The Octocat"
.
jobs: bash-example: runs-on: ubuntu-latest env: MY_NAME: "Mona The Octocat" steps: - name: bash-version run: echo "::add-mask::$MY_NAME"
jobs:
bash-example:
runs-on: ubuntu-latest
env:
MY_NAME: "Mona The Octocat"
steps:
- name: bash-version
run: echo "::add-mask::$MY_NAME"
jobs: powershell-example: runs-on: windows-latest env: MY_NAME: "Mona The Octocat" steps: - name: powershell-version run: Write-Output "::add-mask::$env:MY_NAME"
jobs:
powershell-example:
runs-on: windows-latest
env:
MY_NAME: "Mona The Octocat"
steps:
- name: powershell-version
run: Write-Output "::add-mask::$env:MY_NAME"
Ejemplo: Enmascaramiento de una salida generada dentro de un único trabajo
Si no necesitas pasar el secreto de un trabajo a otro, puedes hacer lo siguiente:
- Generar el secreto (sin producir una salida).
- Enmascararlo con
add-mask
. - Usar
GITHUB_OUTPUT
para que el secreto esté disponible para otros pasos dentro del trabajo.
on: push jobs: generate-a-secret-output: runs-on: ubuntu-latest steps: - id: sets-a-secret name: Generate, mask, and output a secret run: | the_secret=$((RANDOM)) echo "::add-mask::$the_secret" echo "secret-number=$the_secret" >> "$GITHUB_OUTPUT" - name: Use that secret output (protected by a mask) run: | echo "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push
jobs:
generate-a-secret-output:
runs-on: ubuntu-latest
steps:
- id: sets-a-secret
name: Generate, mask, and output a secret
run: |
the_secret=$((RANDOM))
echo "::add-mask::$the_secret"
echo "secret-number=$the_secret" >> "$GITHUB_OUTPUT"
- name: Use that secret output (protected by a mask)
run: |
echo "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push jobs: generate-a-secret-output: runs-on: ubuntu-latest steps: - id: sets-a-secret name: Generate, mask, and output a secret shell: pwsh run: | Set-Variable -Name TheSecret -Value (Get-Random) Write-Output "::add-mask::$TheSecret" "secret-number=$TheSecret" >> $env:GITHUB_OUTPUT - name: Use that secret output (protected by a mask) shell: pwsh run: | Write-Output "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
on: push
jobs:
generate-a-secret-output:
runs-on: ubuntu-latest
steps:
- id: sets-a-secret
name: Generate, mask, and output a secret
shell: pwsh
run: |
Set-Variable -Name TheSecret -Value (Get-Random)
Write-Output "::add-mask::$TheSecret"
"secret-number=$TheSecret" >> $env:GITHUB_OUTPUT
- name: Use that secret output (protected by a mask)
shell: pwsh
run: |
Write-Output "the secret number is ${{ steps.sets-a-secret.outputs.secret-number }}"
Ejemplo: Enmascaramiento y paso de un secreto entre trabajos o flujos de trabajo
Si quieres pasar un secreto enmascarado entre trabajos o flujos de trabajo, debes almacenar el secreto en un almacén y, luego, recuperarlo en el trabajo o flujo de trabajo subsiguiente.
Configurar
- Configura un almacén de secretos para almacenar el secreto que generarás durante el flujo de trabajo. Por ejemplo, Vault.
- Genera una clave para leer y escribir en ese almacén de secretos. Almacena la clave como secreto de repositorio. En el siguiente flujo de trabajo de ejemplo, el nombre del secreto es
SECRET_STORE_CREDENTIALS
. Para obtener más información, vea «Uso de secretos en Acciones de GitHub».
Flujo de trabajo
Note
Este flujo de trabajo usa un almacén de secretos imaginario, secret-store
, que tiene los comandos imaginarios store-secret
y retrieve-secret
. some/secret-store@ 27b31702a0e7fc50959f5ad993c78deac1bdfc29
es una acción imaginaria que instala la aplicación secret-store
y la configura para conectarse a un objeto instance
con credentials
.
on: push jobs: secret-generator: runs-on: ubuntu-latest outputs: handle: ${{ steps.generate-secret.outputs.handle }} steps: - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: generate secret id: generate-secret shell: bash run: | GENERATED_SECRET=$((RANDOM)) echo "::add-mask::$GENERATED_SECRET" SECRET_HANDLE=$(secret-store store-secret "$GENERATED_SECRET") echo "handle=$SECRET_HANDLE" >> "$GITHUB_OUTPUT" secret-consumer: runs-on: macos-latest needs: secret-generator steps: - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: use secret shell: bash run: | SECRET_HANDLE="${{ needs.secret-generator.outputs.handle }}" RETRIEVED_SECRET=$(secret-store retrieve-secret "$SECRET_HANDLE") echo "::add-mask::$RETRIEVED_SECRET" echo "We retrieved our masked secret: $RETRIEVED_SECRET"
on: push
jobs:
secret-generator:
runs-on: ubuntu-latest
outputs:
handle: ${{ steps.generate-secret.outputs.handle }}
steps:
- uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: generate secret
id: generate-secret
shell: bash
run: |
GENERATED_SECRET=$((RANDOM))
echo "::add-mask::$GENERATED_SECRET"
SECRET_HANDLE=$(secret-store store-secret "$GENERATED_SECRET")
echo "handle=$SECRET_HANDLE" >> "$GITHUB_OUTPUT"
secret-consumer:
runs-on: macos-latest
needs: secret-generator
steps:
- uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: use secret
shell: bash
run: |
SECRET_HANDLE="${{ needs.secret-generator.outputs.handle }}"
RETRIEVED_SECRET=$(secret-store retrieve-secret "$SECRET_HANDLE")
echo "::add-mask::$RETRIEVED_SECRET"
echo "We retrieved our masked secret: $RETRIEVED_SECRET"
on: push jobs: secret-generator: runs-on: ubuntu-latest steps: - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: generate secret shell: pwsh run: | Set-Variable -Name Generated_Secret -Value (Get-Random) Write-Output "::add-mask::$Generated_Secret" Set-Variable -Name Secret_Handle -Value (Store-Secret "$Generated_Secret") "handle=$Secret_Handle" >> $env:GITHUB_OUTPUT secret-consumer: runs-on: macos-latest needs: secret-generator steps: - uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }} instance: ${{ secrets.SECRET_STORE_INSTANCE }} - name: use secret shell: pwsh run: | Set-Variable -Name Secret_Handle -Value "${{ needs.secret-generator.outputs.handle }}" Set-Variable -Name Retrieved_Secret -Value (Retrieve-Secret "$Secret_Handle") echo "::add-mask::$Retrieved_Secret" echo "We retrieved our masked secret: $Retrieved_Secret"
on: push
jobs:
secret-generator:
runs-on: ubuntu-latest
steps:
- uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: generate secret
shell: pwsh
run: |
Set-Variable -Name Generated_Secret -Value (Get-Random)
Write-Output "::add-mask::$Generated_Secret"
Set-Variable -Name Secret_Handle -Value (Store-Secret "$Generated_Secret")
"handle=$Secret_Handle" >> $env:GITHUB_OUTPUT
secret-consumer:
runs-on: macos-latest
needs: secret-generator
steps:
- uses: some/secret-store@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
credentials: ${{ secrets.SECRET_STORE_CREDENTIALS }}
instance: ${{ secrets.SECRET_STORE_INSTANCE }}
- name: use secret
shell: pwsh
run: |
Set-Variable -Name Secret_Handle -Value "${{ needs.secret-generator.outputs.handle }}"
Set-Variable -Name Retrieved_Secret -Value (Retrieve-Secret "$Secret_Handle")
echo "::add-mask::$Retrieved_Secret"
echo "We retrieved our masked secret: $Retrieved_Secret"
Detener e iniciar comandos de flujo de trabajo
Deja de procesar cualquier comando de flujo de trabajo. Este comando especial te permite registrar lo que sea sin ejecutar accidentalmente un comando de flujo de trabajo. Por ejemplo, podrías dejar de registrar para producir un script completo que tenga comentarios.
::stop-commands::{endtoken}
::stop-commands::{endtoken}
Para detener el procesamiento de los comandos de flujo de trabajo, pase un token único a stop-commands
. Para resumir los comandos de flujo de trabajo de procesamiento, pasa el mismo token que utilizaste para detener los comandos de flujo de trabajo.
Warning
Asegúrate de que el token que usas se genera aleatoriamente y es único para cada ejecución.
::{endtoken}::
::{endtoken}::
Ejemplo: Parar e iniciar comandos de flujos de trabajo
jobs: workflow-command-job: runs-on: ubuntu-latest steps: - name: Disable workflow commands run: | echo '::warning:: This is a warning message, to demonstrate that commands are being processed.' stopMarker=$(uuidgen) echo "::stop-commands::$stopMarker" echo '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.' echo "::$stopMarker::" echo '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs:
workflow-command-job:
runs-on: ubuntu-latest
steps:
- name: Disable workflow commands
run: |
echo '::warning:: This is a warning message, to demonstrate that commands are being processed.'
stopMarker=$(uuidgen)
echo "::stop-commands::$stopMarker"
echo '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
echo "::$stopMarker::"
echo '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs: workflow-command-job: runs-on: windows-latest steps: - name: Disable workflow commands run: | Write-Output '::warning:: This is a warning message, to demonstrate that commands are being processed.' $stopMarker = New-Guid Write-Output "::stop-commands::$stopMarker" Write-Output '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.' Write-Output "::$stopMarker::" Write-Output '::warning:: This is a warning again, because stop-commands has been turned off.'
jobs:
workflow-command-job:
runs-on: windows-latest
steps:
- name: Disable workflow commands
run: |
Write-Output '::warning:: This is a warning message, to demonstrate that commands are being processed.'
$stopMarker = New-Guid
Write-Output "::stop-commands::$stopMarker"
Write-Output '::warning:: This will NOT be rendered as a warning, because stop-commands has been invoked.'
Write-Output "::$stopMarker::"
Write-Output '::warning:: This is a warning again, because stop-commands has been turned off.'
Enviar valores a las acciones pre y post
Puede crear variables de entorno a fin de compartirlas con las acciones pre:
o post:
del flujo de trabajo escribiendo al archivo ubicado en GITHUB_STATE
. Por ejemplo, puede crear un archivo con la acción pre:
, pasar la ubicación del archivo a la acción main:
y, después, usar la acción post:
para eliminar el archivo. Como alternativa, podría crear un archivo con la acción main:
, pasar la ubicación del archivo a la acción post:
y también usar la acción post:
para eliminar el archivo.
Si tiene varias acciones pre:
o post:
, solo puede acceder al valor guardado en la acción donde se ha escrito a GITHUB_STATE
. Para más información sobre la acción post:
, consulta "Sintaxis de metadatos para Acciones de GitHub".
El archivo GITHUB_STATE
solo está disponible dentro de una acción. El valor guardado se almacena como un valor de entorno con el prefijo STATE_
.
En este ejemplo se usa JavaScript para escribir al archivo GITHUB_STATE
. La variable de entorno resultante se denomina STATE_processID
con el valor de 12345
:
import * as fs from 'fs' import * as os from 'os' fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, { encoding: 'utf8' })
import * as fs from 'fs'
import * as os from 'os'
fs.appendFileSync(process.env.GITHUB_STATE, `processID=12345${os.EOL}`, {
encoding: 'utf8'
})
Después, la variable STATE_processID
está disponible exclusivamente para el script de limpieza que se ejecuta en la acción main
. Este ejemplo se ejecuta en main
y usa JavaScript para mostrar el valor asignado a la variable de entorno STATE_processID
:
console.log("The running PID from the main action is: " + process.env.STATE_processID);
console.log("The running PID from the main action is: " + process.env.STATE_processID);
Archivos de ambiente
Durante la ejecución de un flujo de trabajo, el ejecutor genera archivos temporales que pueden utilizarse para llevar a cabo ciertas acciones. Se puede acceder a la ruta de acceso a estos archivos y editarse mediante las variables de entorno predeterminadas de GitHub. Consulte "Almacenamiento de información en variables". Necesitarás utilizar codificación UTF-8 cuando escribas en estos archivos para garantizar el procesamiento adecuado de los comandos. Se pueden escribir varios comandos en el mismo archivo, separados por líneas nuevas.
Para usar variables de entorno en una acción de GitHub, cree o modifique archivos .env
mediante comandos específicos de Acciones de GitHub.
A continuación, se indica cómo puede hacerlo.
name: Example Workflow for Environment Files on: push jobs: set_and_use_env_vars: runs-on: ubuntu-latest steps: - name: Set environment variable run: echo "MY_ENV_VAR=myValue" >> $GITHUB_ENV - name: Use environment variable run: | echo "The value of MY_ENV_VAR is $MY_ENV_VAR"
name: Example Workflow for Environment Files
on: push
jobs:
set_and_use_env_vars:
runs-on: ubuntu-latest
steps:
- name: Set environment variable
run: echo "MY_ENV_VAR=myValue" >> $GITHUB_ENV
- name: Use environment variable
run: |
echo "The value of MY_ENV_VAR is $MY_ENV_VAR"
Otro ejemplo sería usarlo para almacenar metadatos como marcas de tiempo de compilación, confirmar SHA o nombres de artefacto:
steps: - name: Store build timestamp run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV - name: Deploy using stored timestamp run: echo "Deploying at $BUILD_TIME"
steps:
- name: Store build timestamp
run: echo "BUILD_TIME=$(date +'%T')" >> $GITHUB_ENV
- name: Deploy using stored timestamp
run: echo "Deploying at $BUILD_TIME"
Note
En las versiones 5.1 y posteriores de PowerShell (shell: powershell
) no se usa UTF-8 de forma predeterminada, por lo que debes especificar la codificación UTF-8. Por ejemplo:
jobs: legacy-powershell-example: runs-on: windows-latest steps: - shell: powershell run: | "mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
jobs:
legacy-powershell-example:
runs-on: windows-latest
steps:
- shell: powershell
run: |
"mypath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
En las versiones 6 y superiores de PowerShell Core (shell: pwsh
) se usa UTF-8 de forma predeterminada. Por ejemplo:
jobs: powershell-core-example: runs-on: windows-latest steps: - shell: pwsh run: | "mypath" >> $env:GITHUB_PATH
jobs:
powershell-core-example:
runs-on: windows-latest
steps:
- shell: pwsh
run: |
"mypath" >> $env:GITHUB_PATH
Configuración de una variable de entorno
Note
Para evitar problemas, se recomienda tratar las variables de entorno como que distinguen mayúsculas de minúsculas, independientemente del comportamiento del sistema operativo y del shell que utilices.
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
echo "{environment_variable_name}={value}" >> "$GITHUB_ENV"
-
Utilizar PowerShell versión 6 y superior:
PowerShell "{environment_variable_name}={value}" >> $env:GITHUB_ENV
"{environment_variable_name}={value}" >> $env:GITHUB_ENV
-
Utilizar PowerShell versión 5.1 e inferior:
PowerShell "{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"{environment_variable_name}={value}" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
Puede hacer que una variable de entorno esté disponible en cualquier paso posterior de un trabajo de un flujo de trabajo si define o actualiza la variable de entorno, y lo escribe en el archivo de entorno GITHUB_ENV
. El paso que crea o actualiza la variable de ambiente no tiene acceso al valor nuevo, pero todos los pasos subsecuentes en un job tendrán acceso.
No se puede sobrescribir el valor de las variables de entorno predeterminadas GITHUB_*
y RUNNER_*
. Actualmente, se puede sobrescribir el valor de la variable CI
. Sin embargo, no se garantiza que sea posible siempre. Para obtener más información sobre cómo establecer variables de entorno, consulta "AUTOTITLE".
Note
Debido a las restricciones de seguridad, GITHUB_ENV
no se puede usar para establecer la variable de entorno NODE_OPTIONS
.
Ejemplo de escritura de una variable de entorno en GITHUB_ENV
steps: - name: Set the value id: step_one run: | echo "action_state=yellow" >> "$GITHUB_ENV" - name: Use the value id: step_two run: | printf '%s\n' "$action_state" # This will output 'yellow'
steps:
- name: Set the value
id: step_one
run: |
echo "action_state=yellow" >> "$GITHUB_ENV"
- name: Use the value
id: step_two
run: |
printf '%s\n' "$action_state" # This will output 'yellow'
steps: - name: Set the value id: step_one run: | "action_state=yellow" >> $env:GITHUB_ENV - name: Use the value id: step_two run: | Write-Output "$env:action_state" # This will output 'yellow'
steps:
- name: Set the value
id: step_one
run: |
"action_state=yellow" >> $env:GITHUB_ENV
- name: Use the value
id: step_two
run: |
Write-Output "$env:action_state" # This will output 'yellow'
Secuencias de línea múltiple
Para las secuencias de lìnea mùltiple, puedes utilizar un delimitador con la siguiente sintaxis.
{name}<<{delimiter} {value} {delimiter}
{name}<<{delimiter}
{value}
{delimiter}
Warning
Asegúrate de que el delimitador que está usando no se producirá en una línea propia dentro del valor. Si el valor es completamente arbitrario, no debe usar este formato. Escriba el valor en un archivo en su lugar.
Ejemplo de una cadena de varias líneas
En este ejemplo se usa EOF
como delimitador y se establece la variable de entorno JSON_RESPONSE
en el valor de la respuesta curl
.
steps: - name: Set the value in bash id: step_one run: | { echo 'JSON_RESPONSE<<EOF' curl https://example.com echo EOF } >> "$GITHUB_ENV"
steps:
- name: Set the value in bash
id: step_one
run: |
{
echo 'JSON_RESPONSE<<EOF'
curl https://example.com
echo EOF
} >> "$GITHUB_ENV"
steps: - name: Set the value in pwsh id: step_one run: | $EOF = (New-Guid).Guid "JSON_RESPONSE<<$EOF" >> $env:GITHUB_ENV (Invoke-WebRequest -Uri "https://example.com").Content >> $env:GITHUB_ENV "$EOF" >> $env:GITHUB_ENV shell: pwsh
steps:
- name: Set the value in pwsh
id: step_one
run: |
$EOF = (New-Guid).Guid
"JSON_RESPONSE<<$EOF" >> $env:GITHUB_ENV
(Invoke-WebRequest -Uri "https://example.com").Content >> $env:GITHUB_ENV
"$EOF" >> $env:GITHUB_ENV
shell: pwsh
Configurar un parámetro de salida
Establece el parámetro de salida de un paso. Ten en cuenta en el paso hay que definir un id
para recuperar el valor de salida posteriormente. Puede establecer valores de salida de varias líneas con la misma técnica que se usa en la sección "Cadenas multilínea" para definir variables de entorno de varias líneas.
echo "{name}={value}" >> "$GITHUB_OUTPUT"
echo "{name}={value}" >> "$GITHUB_OUTPUT"
"{name}=value" >> $env:GITHUB_OUTPUT
"{name}=value" >> $env:GITHUB_OUTPUT
Ejemplo de configuración de un parámetro de salida
En este ejemplo se muestra cómo establecer el parámetro de salida SELECTED_COLOR
y recuperarlo posteriormente:
- name: Set color id: color-selector run: echo "SELECTED_COLOR=green" >> "$GITHUB_OUTPUT" - name: Get color env: SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }} run: echo "The selected color is $SELECTED_COLOR"
- name: Set color
id: color-selector
run: echo "SELECTED_COLOR=green" >> "$GITHUB_OUTPUT"
- name: Get color
env:
SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
run: echo "The selected color is $SELECTED_COLOR"
En este ejemplo se muestra cómo establecer el parámetro de salida SELECTED_COLOR
y recuperarlo posteriormente:
- name: Set color id: color-selector run: | "SELECTED_COLOR=green" >> $env:GITHUB_OUTPUT - name: Get color env: SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }} run: Write-Output "The selected color is $env:SELECTED_COLOR"
- name: Set color
id: color-selector
run: |
"SELECTED_COLOR=green" >> $env:GITHUB_OUTPUT
- name: Get color
env:
SELECTED_COLOR: ${{ steps.color-selector.outputs.SELECTED_COLOR }}
run: Write-Output "The selected color is $env:SELECTED_COLOR"
Adición de un resumen de trabajos
echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
echo "{markdown content}" >> $GITHUB_STEP_SUMMARY
"{markdown content}" >> $env:GITHUB_STEP_SUMMARY
"{markdown content}" >> $env:GITHUB_STEP_SUMMARY
Puedes establecer Markdown personalizado para cada trabajo de modo que se muestre en la página de resumen de una ejecución de flujo de trabajo. Puedes usar resúmenes de trabajos para mostrar y agrupar contenido único, como resúmenes de resultados de pruebas, de modo que alguien que vea el resultado de una ejecución de flujo de trabajo no necesite ir a los registros para ver información importante relacionada con la ejecución, como errores.
Los resúmenes de trabajos admiten Markdown de tipo GitHub y puedes agregar el contenido de Markdown para un paso al archivo de entorno GITHUB_STEP_SUMMARY
. GITHUB_STEP_SUMMARY
es único para cada paso de un trabajo. Para obtener más información sobre el archivo por paso al que hace referencia GITHUB_STEP_SUMMARY
, consulta "Archivos de entorno".
Cuando un trabajo finaliza, los resúmenes de todos los pasos de un trabajo se agrupan en un único resumen de trabajo y se muestran en la página resumen de ejecución del flujo de trabajo. Si varios trabajos generan resúmenes, estos se ordenan según la hora de finalización del trabajo.
Ejemplo de adición de un resumen del trabajo
echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
echo "### Hello world! :rocket:" >> $GITHUB_STEP_SUMMARY
"### Hello world! :rocket:" >> $env:GITHUB_STEP_SUMMARY
"### Hello world! :rocket:" >> $env:GITHUB_STEP_SUMMARY
Contenido de Markdown multilínea
En el caso de contenido de Markdown multilínea, puedes usar >>
para anexar continuamente contenido al paso actual. Con cada operación de anexión, se agrega automáticamente un carácter de nueva línea.
Ejemplo de contenido de Markdown multilínea
- name: Generate list using Markdown
run: |
echo "This is the lead in sentence for the list" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY # this is a blank line
echo "- Lets add a bullet point" >> $GITHUB_STEP_SUMMARY
echo "- Lets add a second bullet point" >> $GITHUB_STEP_SUMMARY
echo "- How about a third one?" >> $GITHUB_STEP_SUMMARY
- name: Generate list using Markdown
run: |
"This is the lead in sentence for the list" >> $env:GITHUB_STEP_SUMMARY
"" >> $env:GITHUB_STEP_SUMMARY # this is a blank line
"- Lets add a bullet point" >> $env:GITHUB_STEP_SUMMARY
"- Lets add a second bullet point" >> $env:GITHUB_STEP_SUMMARY
"- How about a third one?" >> $env:GITHUB_STEP_SUMMARY
Sobrescritura de resúmenes de trabajos
Para borrar todo el contenido del paso actual, puede usar >
para sobrescribir cualquier contenido en Bash o eliminar -Append
en PowerShell
Ejemplo de sobrescribir resúmenes de trabajos
- name: Overwrite Markdown
run: |
echo "Adding some Markdown content" >> $GITHUB_STEP_SUMMARY
echo "There was an error, we need to clear the previous Markdown with some new content." > $GITHUB_STEP_SUMMARY
- name: Overwrite Markdown
run: |
"Adding some Markdown content" >> $env:GITHUB_STEP_SUMMARY
"There was an error, we need to clear the previous Markdown with some new content." >> $env:GITHUB_STEP_SUMMARY
Eliminación de resúmenes de trabajos
Para quitar completamente un resumen del paso actual, se puede eliminar el archivo al que hace referencia GITHUB_STEP_SUMMARY
.
Ejemplo de eliminación de resúmenes de trabajos
- name: Delete all summary content
run: |
echo "Adding Markdown content that we want to remove before the step ends" >> $GITHUB_STEP_SUMMARY
rm $GITHUB_STEP_SUMMARY
- name: Delete all summary content
run: |
"Adding Markdown content that we want to remove before the step ends" >> $env:GITHUB_STEP_SUMMARY
Remove-Item $env:GITHUB_STEP_SUMMARY
Una vez que se ha completado un paso, se cargan los resúmenes de trabajo y los pasos posteriores no pueden modificar el contenido de Markdown cargado anteriormente. Los resúmenes enmascaran automáticamente los secretos que podrían haberse agregado de forma accidental. Si un resumen de trabajo contiene información confidencial que se debe eliminar, puedes eliminar toda la ejecución del flujo de trabajo para quitar todos sus resúmenes de trabajo. Para más información, consulta "Borrar una ejecución de flujo de trabajo".
Aislamiento y límites de pasos
Los resúmenes de trabajo están aislados entre los pasos y cada paso está restringido a un tamaño máximo de 1 MiB. Se aplica aislamiento entre los pasos para que el Markdown que podría tener un formato incorrecto en un paso no pueda interrumpir la representación de Markdown para los pasos posteriores. Si se agrega más de 1 MiB de contenido a un paso, se producirá un error en la carga del paso y se creará una anotación de error. Los errores de carga de resúmenes de trabajos no afectan al estado general de un paso o un trabajo. Se muestra un máximo de 20 resúmenes de trabajos de los pasos por trabajo.
Agregar una ruta de sistema
Antepone un directorio a la variable del sistema PATH
y hace que esté disponible automáticamente para todas las acciones posteriores en el trabajo actual; la acción que está actualmente en ejecución no puede acceder a la variable de ruta actualizada. A fin de ver las rutas definidas actualmente para el trabajo, puede usar echo "$PATH"
en un paso o una acción.
Ejemplo de adición de una ruta de acceso del sistema
En este ejemplo se muestra cómo agregar el directorio de usuario $HOME/.local/bin
a PATH
:
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
En este ejemplo se muestra cómo agregar el directorio de usuario $env:HOMEPATH/.local/bin
a PATH
:
"$env:HOMEPATH/.local/bin" | Out-File -FilePath "$env:GITHUB_PATH" -Append
"$env:HOMEPATH/.local/bin" | Out-File -FilePath "$env:GITHUB_PATH" -Append