CLI do Copilot vem com o servidor MCP do GitHub, que dá a ele acesso direto às execuções de fluxos de trabalho do GitHub Actions, aos logs de jobs e aos status das verificações. Combinado com o acesso aos seus arquivos locais, ele pode buscar detalhes de falha de CI, correlacionar-os ao seu código e propor correções do terminal.
Cenário de exemplo 1: testes são aprovados localmente, mas falham na CI
Você tem um teste que passa no computador local, mas falha na CI. Você pode pedir CLI do Copilot para investigar essa falha de teste diretamente.
Neste exemplo, o código que está sendo testado define um serviço de ordem simples (order.py) e há um teste correspondente que verifica se um pedido foi criado hoje (test_order_service.py).
Prompt de exemplo
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
Resposta de exemplo
Observação
A resposta a seguir é um exemplo. Respostas do Bate-papo do Copilot são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.
CLI do Copilot usa o servidor MCP do GitHub para buscar as execuções de fluxo de trabalho mais recentes na ramificação atual, identifica a tarefa com falha e obtém os logs correspondentes. Ele encontra a seguinte falha:
___ 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
Depois de ler os dois arquivos locais, CLI do Copilot observe que as datas têm exatamente um dia de diferença e identificam isso como um problema de limite de fuso horário. O executor de CI usa UTC enquanto seu computador local usa um fuso horário diferente. Quando o teste é executado perto da meia-noite, date.today() retorna datas diferentes em cada ambiente.
CLI do Copilot sugere padronizar como today é calculado injetando uma dependência de relógio ou fixando o fuso horário:
from datetime import timezone, datetime
def get_today():
return datetime.now(timezone.utc).date()
Ele aplica a correção a order.py e test_order_service.py, atualizando todas as referências para usar o novo auxiliar get_today().
Após a correção, você pode verificar as alterações e executar os testes localmente:
- Execute
/diffpara examinar exatamente o que CLI do Copilot mudou. - Execute
!pytest test_order_service.pypara confirmar que os testes são aprovados localmente. - Faça o push da correção e deixe a CI rodar novamente.
Cenário de exemplo 2: falhas de teste intermitentes com condições de corrida
Às vezes, um teste é aprovado e às vezes falha no mesmo computador. Você quer CLI do Copilot comparar logs de execuções bem-sucedidas e com falha para identificar a causa.
Neste exemplo, o código em teste usa um trabalho em segundo plano em order_service.py para atualizar o status de uma ordem assíncronamente, e um teste em test_order_service.py afirma que o status final é "processed".
Exemplo de prompt para condições de corrida
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
Resposta de exemplo para condições de corrida
Observação
A resposta a seguir é um exemplo. Respostas do Bate-papo do Copilot são não determinísticas, portanto, você pode obter uma resposta diferente da mostrada aqui.
CLI do Copilot usa o servidor MCP do GitHub para listar execuções recentes de workflow na branch atual, identifica uma execução bem-sucedida e uma com falha, e recupera os logs de ambas. Ele os compara:
Execução bem-sucedida:
[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
Falha na execução:
[DEBUG] Created order #1234
[DEBUG] Background job started for order #1234
[DEBUG] Checking order status
[DEBUG] Order #1234 status: pending
CLI do Copilot indica que, na execução bem-sucedida, o processo em segundo plano foi concluído antes da verificação de status, enquanto, na execução com falha, o status foi verificado enquanto o processo ainda estava em execução. Ele identifica isso como uma condição de corrida porque o teste não aguarda até a tarefa em segundo plano terminar.
CLI do Copilot sugere adicionar um mecanismo de espera explícito antes de afirmar e propor uma correção usando um auxiliar de sondagem:
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"
)