Skip to main content

Diagnóstico de fallos en las pruebas de CI

Use CLI de Copilot para extraer registros de CI, correlacionar los errores con el código local y corregir problemas sin salir del terminal.

CLI de Copilot incluye el servidor MCP de GitHub, lo que le da acceso directo a las ejecuciones de flujos de trabajo de Acciones de GitHub, los registros de los trabajos y los estados de las comprobaciones. Junto con el acceso a los archivos locales, puede capturar los detalles del error de CI, correlacionarlos con el código y proponer correcciones desde el terminal.

Ejemplo de escenario 1: Las pruebas pasan localmente, pero fallan en CI

Tienes una prueba que pasa en tu equipo local, pero falla en CI. Puede pedir que CLI de Copilot investigue este error de prueba directamente.

En este ejemplo, el código que se está probando define un servicio de pedido simple (order.py) y hay una prueba correspondiente que comprueba si se creó un pedido hoy (test_order_service.py).

Mensaje de ejemplo

Copilot prompt
My CI is failing on this branch. Can you pull the latest workflow run 
logs, figure out what is failing, and help me fix it? The relevant files 
are @order.py and @test_order_service.py

Respuesta de ejemplo

Nota:

La respuesta siguiente es un ejemplo. Las respuestas de Chat de Copiloto no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.

CLI de Copilot usa el servidor MCP de GitHub para capturar las ejecuciones de flujo de trabajo más recientes en la rama actual, identifica el trabajo con errores y recupera sus registros. Encuentra el siguiente error:

___ TestOrderService.test_order_created_today ___
>       assert order["created_date"] == date.today()
E       AssertionError: assert datetime.date(2024, 1, 15) == datetime.date(2024, 1, 16)

test_order_service.py:45: AssertionError

Después de leer ambos archivos locales, CLI de Copilot observa que las fechas están exactamente separadas un día e identifica esto como un problema de límite de zona horaria. El ejecutor de CI usa UTC mientras la máquina local usa una zona horaria diferente. Cuando la prueba se ejecuta cerca de medianoche, date.today() devuelve fechas diferentes en cada entorno.

CLI de Copilot sugiere la estandarización de cómo today se calcula insertando una dependencia de reloj o anclando la zona horaria:

from datetime import timezone, datetime

def get_today():
    return datetime.now(timezone.utc).date()

Aplica la corrección a order.py y test_order_service.py, actualizando todas las referencias para que usen el nuevo asistente get_today().

Después de la corrección, puede comprobar los cambios y ejecutar las pruebas localmente:

  1. Ejecute /diff para revisar exactamente lo que CLI de Copilot cambió.
  2. Ejecute !pytest test_order_service.py para confirmar que las pruebas se superan localmente.
  3. Inserte la corrección y deje que ci vuelva a ejecutarse.

Escenario de ejemplo 2: Errores de prueba intermitentes con condiciones de carrera

A veces se supera una prueba y, a veces, se produce un error en la misma máquina. Le conviene CLI de Copilot comparar los registros de las ejecuciones correctas y fallidas para identificar la causa.

En este ejemplo, el código sometido a prueba usa un trabajo en segundo plano en order_service.py para actualizar el estado de un pedido de forma asincrónica y una prueba en test_order_service.py afirma que el estado final es "processed".

Ejemplo de indicador para condiciones de carrera

Copilot prompt
This test passes sometimes and fails sometimes. Can you pull the logs 
from the last passing and failing CI runs for test_order_processed 
on this branch, compare them, and figure out what is going wrong? 
Relevant files: @order_service.py @test_order_service.py

Respuesta de ejemplo para condiciones de carrera

Nota:

La respuesta siguiente es un ejemplo. Las respuestas de Chat de Copiloto no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.

CLI de Copilot usa el servidor MCP de GitHub para enumerar las ejecuciones recientes del flujo de trabajo en la rama actual, identifica una ejecución correcta y otra fallida, y recupera los registros de ambas. Los compara:

Paso de ejecución:

[DEBUG] Created order #1234
[DEBUG] Background job started for order #1234
[DEBUG] Background job completed (52ms)
[DEBUG] Checking order status
[DEBUG] Order #1234 status: processed

Ejecución con errores:

[DEBUG] Created order #1234
[DEBUG] Background job started for order #1234
[DEBUG] Checking order status
[DEBUG] Order #1234 status: pending

CLI de Copilot observa que, en la ejecución correcta, el trabajo en segundo plano se completó antes de la verificación del estado, mientras que en la ejecución fallida, el estado se comprobó mientras el trabajo aún estaba en ejecución. Identifica esto como una condición de carrera porque la prueba no espera a que finalice el trabajo en segundo plano.

CLI de Copilot sugiere agregar un mecanismo de espera explícito antes de la aserción y propone una corrección mediante un asistente de sondeo:

import time

def wait_for_status(order_id, expected, timeout=5):
    start = time.time()
    while time.time() - start < timeout:
        order = get_order(order_id)
        if order.status == expected:
            return order
        time.sleep(0.1)
    raise TimeoutError(
        f"Order {order_id} did not reach '{expected}' within {timeout}s"
    )

Lectura adicional

CLI de GitHub Copilot