¿Cómo obtener la rama actual dentro de Github Actions?
Estoy creando imágenes de Docker con Github Actions y quiero etiquetar imágenes con el nombre de la rama.
Encontré la GITHUB_REF
variable, pero da como resultado refs/heads/feature-branch-1
y solo necesito feature-branch-1
.
Agregué un paso separado para extraer el nombre de la rama de $GITHUB_HEAD_REF
/ $GITHUB_REF
¹ (pr y push) y lo configuré en la salida del paso:
- name: Extract branch name
shell: bash
run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT
id: extract_branch
después de eso, puedo usarlo en los siguientes pasos con steps.<step_id>.outputs.branch
:
- name: Push to ECR
id: ecr
uses: jwalton/gh-ecr-push@master
with:
access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
region: us-west-2
image: eng:${{ steps.extract_branch.outputs.branch }}
¹ $GITHUB_HEAD_REF
en pull_request
(pr) y $GITHUB_REF
en push
. Descripción:
Variable | Descripción |
---|---|
GITHUB_HEAD_REF |
La referencia principal o la rama de origen de la solicitud de extracción en una ejecución de flujo de trabajo. Esta propiedad solo se establece cuando el evento que desencadena la ejecución de un flujo de trabajo es pull_request o pull_request_target . Por ejemplo, feature-branch-1 . ( fuente ) |
GITHUB_REF |
La referencia completamente formada de la rama o etiqueta que desencadenó la ejecución del flujo de trabajo. Para los flujos de trabajo activados por push , esta es la referencia de rama o etiqueta que se envió. Para los flujos de trabajo activados por pull_request , esta es la rama de combinación de solicitud de extracción. Para los flujos de trabajo activados por release , esta es la etiqueta de versión creada. Para otros desencadenadores, esta es la referencia de rama o etiqueta que desencadenó la ejecución del flujo de trabajo. Esto solo se configura si hay una rama o etiqueta disponible para el tipo de evento. La referencia proporcionada está completamente formada, lo que significa que para las ramas el formato es refs/heads/<branch_name> , para las solicitudes de extracción es refs/pull/<pr_number>/merge y para las etiquetas es refs/tags/<tag_name> . Por ejemplo, refs/heads/feature-branch-1 . ( fuente ) |
Descripción completa de estas y todas las demás variables de entorno predeterminadas: aprenda las acciones de Gihtub ( copia archivada ).
¿ Está buscando el contexto de acción de Microsoft Github llamado github
? Vea la respuesta de ysfaran y/o la respuesta de Dusan Plavak .
Creo GITHUB_REF
que es la única variable de entorno que incluye el nombre de la rama.
Si el nombre de su rama no contiene a /
(por ejemplo deploy/abc
), puede extraer solo el nombre de la rama del resto de esa cadena de esta manera:
${GITHUB_REF##*/}
Ejemplo:
$ GITHUB_REF=refs/heads/feature-branch-1
$ echo ${GITHUB_REF##*/}
feature-branch-1
Actualización: se agregó un ejemplo de flujo de trabajo completo.
Flujo de trabajo
name: CI
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Git checkout
uses: actions/checkout@v1
- name: Branch name
run: echo running on branch ${GITHUB_REF##*/}
- name: Build
run: docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
Fuente: https://github.com/tedmiston/x/blob/master/.github/workflows/workflow.yml
Salida de muestra: rama maestra
Run docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
shell: /bin/bash -e {0}
Sending build context to Docker daemon 146.9kB
Step 1/1 : FROM alpine
latest: Pulling from library/alpine
9d48c3bd43c5: Pulling fs layer
9d48c3bd43c5: Verifying Checksum
9d48c3bd43c5: Download complete
9d48c3bd43c5: Pull complete
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
---> 961769676411
Successfully built 961769676411
Successfully tagged tedmiston/tag-example:master
Registro: https://github.com/tedmiston/x/commit/cdcc58a908e41d3d90c39ab3bf6fef1ad2c4238a/checks#step:4:16
Salida de muestra: rama no maestra
Run docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
docker build -t tedmiston/tag-example:${GITHUB_REF##*/} .
shell: /bin/bash -e {0}
Sending build context to Docker daemon 144.9kB
Step 1/1 : FROM alpine
latest: Pulling from library/alpine
9d48c3bd43c5: Pulling fs layer
9d48c3bd43c5: Verifying Checksum
9d48c3bd43c5: Download complete
9d48c3bd43c5: Pull complete
Digest: sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
Status: Downloaded newer image for alpine:latest
---> 961769676411
Successfully built 961769676411
Successfully tagged tedmiston/tag-example:branch-name-test
Registro: https://github.com/tedmiston/x/commit/4e8d31259f861aaa2c30375756fc081c3659bddf/checks#step:4:16
Consulte esta respuesta para obtener más información sobre la sintaxis de expansión de parámetros.
Como referencia, la página Entornos virtuales para acciones de GitHub enumera todas las variables de entorno disponibles en el entorno de ejecución.
TL;DR
Esto funciona para todos los activadores que pueda especificar en on
(por ejemplo, push
o pull_request
):
env:
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
Explicación
El truco es que github.head_ref
solo se establece cuando el flujo de trabajo fue activado por a pull_request
y contiene el valor de la rama fuente del PR. github.ref_name
solo se usará si el flujo de trabajo no fue activado por a pull_request
y también solo contiene el nombre de la rama.
Documentación de GitHub
Explicación detallada de los documentos oficiales de GitHub :
github.ref_name
string
El nombre de referencia corto de la rama o etiqueta que desencadenó la ejecución del flujo de trabajo. Este valor coincide con el nombre de la rama o etiqueta que se muestra en GitHub. Por ejemplo, característica-rama-1.
github.head_ref
string
El head_ref o rama fuente de la solicitud de extracción en una ejecución de flujo de trabajo. Esta propiedad solo está disponible cuando el evento que desencadena la ejecución de un flujo de trabajo es pull_request o pull_request_target.
Tenga en cuenta que si está ejecutando su acción de GitHub en el activador de solicitud de extracción, la GITHUB_REF
variable contendrá algo así, refs/pull/421/merge
si intenta poner git push
ese nombre, lo más probable es que falle.
Sin embargo, lo que puedes usar son referencias en el contexto de GitHub en tu YAML. Algo como:${{ github.head_ref }}
https://help.github.com/en/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#github-context