¿Cómo puedo obtener la confirmación anterior antes de enviar o fusionar en el flujo de trabajo de GitHub Action?

4 minutos de lectura

Avatar de usuario de Rich McCluskey
Rico McCluskey

Estoy usando Nx por el apoyo de monorepo en un nuevo proyecto. Uno de los beneficios de Nx es que puede determinar qué aplicaciones en el monorepo se ven afectadas por una variedad de cambios (empezar a confirmar, finalizar la confirmación). Entonces, si tiene un montón de aplicaciones, solo tiene que compilar, probar e implementar las aplicaciones que realmente se ven afectadas por los cambios en lugar de todo el monorepo.

Me gustaría configurar un flujo de trabajo de GitHub Action para implementar solo las aplicaciones afectadas al enviar o fusionar para dominar. Sin embargo, tengo problemas para averiguar cómo obtener el “compromiso de inicio” para el rango de cambios. En otras palabras, ¿cómo obtengo el hash de confirmación de la última implementación?

GitHub proporciona una variable env GITHUB_SHA pero ese es el compromiso que activó el flujo de trabajo (es decir, el “compromiso final”). también proporciona GITHUB_BASE_REF pero eso solo funciona en flujos de trabajo que se ejecutan desde un repositorio bifurcado en comparación con el repositorio principal.

CircleCI tiene pipeline.git.base_revision para este propósito. ¿Las acciones de GitHub tienen algo similar?

avatar de usuario de peterevans
peterevans

Para eventos de solicitud de extracción, la referencia y el sha para la base se pueden encontrar en el contexto de github de la siguiente manera.

${{ github.event.pull_request.base.ref }}
${{ github.event.pull_request.base.sha }}

Para eventos push hay base_ref y before parámetros

${{ github.event.base_ref }}
${{ github.event.before }}

before es el último git sha empujado al origen en la rama base_ref. Tenga en cuenta que si esta es la primera confirmación en una nueva rama, base_ref y before tendrá valores nulos/predeterminados como se muestra a continuación.

##[debug]  "event": {
##[debug]    "after": "727f7aec97c394083d769029e5f619e9b094a235",
##[debug]    "base_ref": null,
##[debug]    "before": "0000000000000000000000000000000000000000",
...

Por cierto, puede volcar el contexto de github y verificar los parámetros disponibles agregando este paso a su flujo de trabajo:

      - name: Dump GitHub context
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
        run: echo "$GITHUB_CONTEXT"

  • ¡Gracias por el consejo útil sobre cómo volcar el contexto de github! Probé eso y, curiosamente, tenía un valor para github.event.before en empujar a maestro. Incluso intenté presionar dos confirmaciones a la vez y el valor anterior fue correcto. No estoy seguro de por qué eso no funcionó para ti, ¡pero esto es exactamente lo que estaba buscando!

    – Rich McCluskey

    18 de mayo de 2020 a las 4:21

  • @RichMcCluskey Me alegro de que haya encontrado una solución. No estoy seguro de por qué before no tenía un valor cuando probé. He actualizado la respuesta ligeramente para cualquiera que encuentre esto en el futuro.

    – peterevans

    18 de mayo de 2020 a las 5:24

  • Seguimiento… Me di cuenta de que al primer impulso de una nueva rama le faltará el before cometer como se muestra en su ejemplo. Supongo que tiene sentido ya que la sucursal es nueva y no existía antes. En ese caso, solo puedo comparar con el maestro para encontrar el rango de confirmaciones.

    – Rich McCluskey

    18 mayo 2020 a las 16:47

  • @RohitReddyAbbadi Creo que, de forma predeterminada, los flujos de trabajo de GitHub solo clonan parcialmente el repositorio en la confirmación HEAD, por lo que es posible que primero deba buscar en su flujo de trabajo

    – Rich McCluskey

    3 de junio de 2020 a las 17:43


  • @RohitReddyAbbadi Intenta agregar fetch-depth: 0 a actions/checkout. Eso recupera todo el historial de etiquetas y ramas. Ver aquí

    – peterevans

    3 jun 2020 a las 23:00

GitHub proporciona GITHUB_BASE_REF y el github.base_ref contexto que contienen la rama base.

Si está interesado en la última revisión de esa rama, puede ejecutar git rev-parse $GITHUB_BASE_REF para encontrarlo. Si está interesado en el punto en el que se bifurcaron las ramas, puede ejecutar git merge-base $GITHUB_BASE_REF $GITHUB_SHA para encontrarlo.

Tenga en cuenta que es posible interrumpir otros proyectos con cambios de API incompatibles y similares sin realizar ningún cambio de código en ellos, por lo que, si bien será más rápido probar solo las aplicaciones que han cambiado, es posible que al hacerlo se produzca una interrupción inesperada.

  • FYI, Nx determina qué proyectos reconstruir mediante la comprensión de las dependencias importadas a ellos y mediante la configuración para decir qué depende de qué si no hay una importación directa de código. No se basa solo en dónde están los cambios 🙂

    – Rich McCluskey

    18 de mayo de 2020 a las 2:02

  • Desafortunadamente, esta respuesta no funciona. Los doctores dicen que GITHUB_BASE_REF y github.base_ref solo están configurados para repositorios bifurcados. El mío no está bifurcado. También lo probé y verifiqué que los documentos son correctos.

    – Rich McCluskey

    18 de mayo de 2020 a las 2:18

¿Ha sido útil esta solución?