Marcio Cunha

Build bloqueado en GitHub Actions? Cómo cancelar jobs presos

Pipeline congelada consumiendo minutos de tu cuota de CI? Aprende a interrumpir ejecuciones trabadas en GitHub Actions usando la interfaz web y la terminal.

Marcio Cunha•4 min
También disponible en:PortuguêsEnglish
Resumen
  • Los procesos congelados en entornos de integración continua desperdician valiosos minutos de franquicia técnica
  • La interfaz web de GitHub ofrece un botón nativo de cancelación para interrumpir flujos en marcha
  • La herramienta de línea de comandos oficial gh CLI permite finalizar ejecuciones de forma automatizada
  • Problemas como bucles infinitos en pruebas suelen ser la causa raíz oculta de tareas retenidas en la cola
  • Buenas prácticas de tiempo límite evitan que los scripts queden colgados indefinidamente consumiendo recursos

Qué sucede cuando un build se congela en el pipeline

Cualquier persona que trabaje con desarrollo de software ha experimentado la frustración de ver un pipeline de integración continua —el sistema automatizado que prueba y empaqueta el código— quedarse atascado en un paso específico. En GitHub Actions, esta situación ocurre cuando un script entra en un bucle infinito, espera una respuesta de red que nunca llega o choca con problemas de concurrencia. Cuando esto pasa, el cronómetro sigue corriendo, consumiendo minutos valiosos de tu cuota y bloqueando otros despliegues importantes.

Identificar el síntoma desde el principio evita agotar los recursos contratados y reduce el estrés del equipo de ingeniería. En escenarios críticos de producción donde el despliegue falla por problemas de infraestructura, mantener un pipeline congelado impide que correcciones urgentes lleguen a los servidores. Por eso, saber actuar con rapidez para interrumpir el proceso es una habilidad fundamental para cualquier desarrollador.

Cómo detener ejecuciones congeladas mediante la interfaz web

La forma más directa de lidiar con un job atascado es utilizando el panel gráfico de GitHub. Accede al repositorio de tu proyecto, haz clic en la pestaña 'Actions' en el menú superior y localiza la ejecución marcada con el icono amarillo de carga. Al abrir los detalles de la ejecución, encontrarás un botón rojo llamado 'Cancel workflow' en la esquina superior derecha de la pantalla.

Al hacer clic en este botón, GitHub envía una señal de interrupción a los servidores virtuales que ejecutan tu código, conocidos como runners. Vale la pena señalar que la finalización no es instantánea: el sistema tarda unos segundos en forzar la parada de los procesos activos y liberar los recursos asignados. Si la interfaz web está lenta o presenta fallas, existe una alternativa por terminal que suele ser mucho más rápida y eficiente para los ingenieros.

Usando la línea de comandos para cancelar jobs rebeldes

Para quienes prefieren trabajar directamente en la terminal, la herramienta oficial de línea de comandos de GitHub, llamada gh CLI, es una aliada poderosa. Con ella, es posible listar y cancelar ejecuciones sin abrir el navegador, agilizando el flujo de trabajo diario. Primero, asegúrate de estar autenticado ejecutando el comando de inicio de sesión en tu terminal preferida.

Para encontrar el número de identificación de la ejecución problemática, puedes ejecutar un listado rápido de los flujos activos. Luego, simplemente dispara el comando de cancelación indicando el código específico de la tarea congelada. Este enfoque programático es excelente cuando se integran rutinas de limpieza o cuando pipelines lentos en otras plataformas de CI exigen intervenciones masivas mediante scripts automatizados.

gh run list --status in_progress
gh run cancel <RUN_ID>

Qué hacer cuando la cancelación normal no funciona

En casos más tercos, hacer clic en el botón de cancelar o ejecutar el comando en la CLI puede no dar resultados inmediatos. Esto suele suceder porque el script en ejecución está atrapado en una llamada de sistema bloqueante, como una prueba de integración esperando una base de datos que no responde o un comando de compilación trabado en un bloqueo mutuo. Cuando el runner no responde a la señal de término enviada por GitHub, la plataforma entra en un estado de espera prolongada.

En estas situaciones extremas, la única salida es esperar el tiempo límite predeterminado configurado en tu archivo de flujo o forzar el cierre del runner si estás albergando tus propios servidores de CI (self-hosted runners). Si el problema involucra falta de recursos físicos en la máquina ejecutora, vale la pena verificar si el disco se llenó durante la ejecución de las pruebas, impidiendo que el sistema operativo escriba registros temporales y finalice las operaciones pendientes.

Estrategias para prevenir futuros bloqueos

La prevención siempre es mejor que la cura, y configurar límites de tiempo explícitos en cada paso de tu archivo YAML es la mejor defensa contra builds infinitos. De forma predeterminada, GitHub Actions termina los jobs después de seis horas, pero dejar un script corriendo tanto tiempo es un desperdicio financiero inaceptable. Agregar la directiva 'timeout-minutes' garantiza que cualquier paso que supere el tiempo esperado sea abortado automáticamente.

Más allá de los límites de tiempo, vale la pena revisar regularmente tus scripts de prueba y rutinas de instalación de dependencias para asegurar que ningún comando dependa de entradas manuales o conexiones de red inestables sin manejo de errores. Con estas salvaguardas activas, tu equipo gana previsibilidad, evita sorpresas en la factura mensual y mantiene el flujo de desarrollo ágil y seguro.