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
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
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:
- Ejecute
/diffpara revisar exactamente lo que CLI de Copilot cambió. - Ejecute
!pytest test_order_service.pypara confirmar que las pruebas se superan localmente. - 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
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
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"
)