Self-healing degli unit test con Copilot in GitHub

di Matteo Tumiati, in DevOps,

GitHub Copilot è estremamente potente e, insieme alla parte di Copilot agent, possiamo automatizzare molte operazioni all'interno del nostro flusso di lavoro, completamente in background, grazie, appunto, all'agent che lavorerà per noi. Un esempio pratico è quello di utilizzare Copilot per analizzare i risultati degli unit test che falliscono all'interno di un workflow di GitHub Actions, e, in caso di problemi, aprire automaticamente una issue, assegnarla all'agent di Copilot stesso, in modo che possa proporre una soluzione e creare una pull request con la fix in autonomia.

La prima cosa che dobbiamo fare è assicurarci di avere tutte le permission per poter lavorare sul repository e aprire una issue:

permissions:
  contents: read
  issues: write

Ora possiamo creare un workflow minimale che esegue gli unit test (con un framework tipo xUnit), di un progetto basato su .NET:

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Setup .NET
      uses: actions/setup-dotnet@v4

    - name: Run unit tests
      id: tests
      continue-on-error: true
      run: |
        mkdir -p test-results
        dotnet test --logger "trx;LogFileName=test-results.trx" --results-directory test-results | tee test-results/test-output.log

A questo punto, possiamo andare ad eseguire la nostra logica per validare l'output. Se gli unit test passano, non c'è bisogno di ulteriori azioni. In caso contrario, vogliamo creare un prompt per Copilot, in modo che possa analizzare l'output dei test, proporre una soluzione e, infine, creare una pull request automaticamente con la fix. Per fare ciò, possiamo usare la CLI di GitHub e aprire una issue, assegnandola proprio a Copilot.

- name: Validate test results
  if: steps.tests.outcome == 'failure'
  env:
    GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: |
    TEST_OUTPUT=$(sed 's/`/\\`/g' test-results/test-output.log | head -n 200)

    cat <<EOF > copilot-prompt.md
    ## Unit Test Failure Analysis

    Contesto:
    - Progetto: .NET
    - Framework test: xUnit
    - CI: GitHub Actions

    ### Azioni richieste:
    1. Analizza l'output dei test fornito
    2. Identifica la causa del fallimento
    3. Verifica altri test potenzialmente instabili o mal configurati
    4. Proponi una soluzione e crea una Pull Request con la fix

    ### Output Unit Test
    \`\`\`text
    $TEST_OUTPUT
    \`\`\`

    ### Richiesta
    Fornisci una spiegazione chiara del problema nella descrizione della pull request.
    EOF

    gh issue create --title "Unit test failure - Copilot analysis needed" --assignee "@copilot" --label "tests,ci,copilot" -F copilot-prompt.md

In questo modo avviene tutto in background e abbiamo creato un semplice, seppur efficace, sistema di self-healing per i nostri unit test. Quello che ci rimarrà da fare sarà solo revisionare la pull request creata da Copilot e, se tutto va bene, procedere con il merge della fix proposta.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi