• github
  • automatización

Vuelve a ejecutar automáticamente tu flujo de trabajo de GitHub después de un fallo

A veces, tu flujo de trabajo de GitHub Actions falla por razones aleatorias. Veamos cómo puedes volver a ejecutarlo automáticamente para ahorrarte tiempo.

Gao
Gao
Founder

Introducción

Nos encantan las GitHub Actions. Son poderosas y ofrecen un nivel gratuito generoso.

A medida que nuestro proyecto crece, hemos añadido cada vez más pruebas de integración para ejecutarlas en nuestro flujo de trabajo de GitHub Actions. Al igual que otros proyectos geniales, ejecutamos nuestras pruebas para cada solicitud de incorporación de cambios, push y lanzamiento.

Sin embargo, debido a la naturaleza de las pruebas de integración, a veces nuestro flujo de trabajo falla por razones aleatorias. Podría ser un problema de red, un fallo del navegador, u otras razones que son difíciles de reproducir.

Cuando el flujo de trabajo falla, tenemos que volver a ejecutarlo manualmente. Al principio no es un gran problema, pero sigue siendo molesto para desarrolladores de alta eficiencia como nosotros.

Cómo funciona

En el momento de escribir esto, GitHub Actions no proporciona una forma incorporada de volver a ejecutar automáticamente un flujo de trabajo fallido. Así que vamos a desglosarlo y ver cómo podemos lograrlo.

Cuando un flujo de trabajo NO está en ejecución y ha fallado, puedes volver a ejecutarlo manualmente haciendo clic en el botón "Re-run jobs". Esto abrirá un menú desplegable y tiene una opción agradable "Re-run failed jobs" para omitir los trabajos exitosos.

Así que la idea es simple:

  1. Necesitamos detectar cuando un flujo de trabajo ha fallado.
  2. Necesitamos activar la acción de reejecución DESPUÉS de que el flujo de trabajo concluya.

Aparentemente, no podemos hacer esto en el mismo flujo de trabajo porque un flujo de trabajo no puede hacer nada cuando no está en ejecución. Entonces necesitamos otro flujo de trabajo para monitorear el estado del flujo de trabajo anterior y activar la acción de reejecución. Esto se puede ilustrar de la siguiente manera:

Actualiza tus flujos de trabajo

Crea un nuevo archivo de flujo de trabajo en tu repositorio, por ejemplo, .github/workflows/rerun.yml:

Gracias a la CLI de GitHub, podemos fácilmente ver el estado de un flujo de trabajo y volver a ejecutarlo con dos comandos simples:

  • gh run watch para ver el estado de un flujo de trabajo (documentación aquí).
  • gh run rerun para volver a ejecutar un flujo de trabajo. La bandera --failed solo volverá a ejecutar los trabajos fallidos (documentación aquí).

Todo lo que necesitas hacer es proporcionar el run_id del flujo de trabajo fallido, lo cual se puede hacer utilizando el contexto github.run_id. Por ejemplo, puedes activar el flujo de trabajo de reejecución agregando el siguiente paso a tu flujo de trabajo original:

La condición if: failure() solo activará el paso cuando el trabajo haya fallado. La condición fromJSON(github.run_attempt) < 3 solo volverá a ejecutar los dos primeros intentos. Puedes ajustar el número según tus necesidades.

Este paso utiliza el comando gh workflow run para activar el flujo de trabajo de reejecución. Consulta la documentación para obtener más detalles.

Bono: Ejecuta el flujo de trabajo de reejecución desde la rama que falló

Si deseas volver a ejecutar el flujo de trabajo de reejecución desde la rama que falló, en lugar de la rama predeterminada, puedes usar el siguiente comando:

El contexto github.head_ref se usará si es una solicitud de incorporación de cambios, de lo contrario, se usará github.ref_name.

Créditos

La idea de este enfoque proviene originalmente de este comentario en la discusión de GitHub.