Skip to content

Instantly share code, notes, and snippets.

@scovl
Created February 26, 2025 20:11
Show Gist options
  • Save scovl/0788e6d65b22a0c5803cb6fcc706e459 to your computer and use it in GitHub Desktop.
Save scovl/0788e6d65b22a0c5803cb6fcc706e459 to your computer and use it in GitHub Desktop.

Aider Case 03: Integração com GitHub Actions, Análise de PRs e SonarQube

Este documento explora as possibilidades de integração do Aider com o ecossistema de CI/CD do GitHub, com foco em GitHub Actions e SonarQube, para aprimorar a qualidade de código e automatizar tarefas de revisão.

Integração com GitHub Actions

O Aider pode ser integrado em fluxos de trabalho do GitHub Actions de diversas formas, potencializando a análise e a revisão automatizada de código. A chave é usar o Aider como uma etapa (step) dentro de um job do seu workflow. O workflow é definido em um arquivo YAML (geralmente em .github/workflows/).

Cenários de Uso Comuns:

  1. Análise de Pull Requests (PRs): O cenário mais comum é executar o Aider quando um novo PR é aberto ou atualizado. O Aider pode:

    • Analisar as mudanças de código (diffs) introduzidas pelo PR.
    • Gerar sugestões de melhorias, correções e refatorações, como comentários no PR.
    • Verificar se as alterações seguem as diretrizes de estilo e as melhores práticas.
    • Identificar código duplicado.
    name: Aider Code Review
    
    on:
      pull_request:
        types: [opened, synchronize, reopened]
    
    jobs:
      aider-review:
        runs-on: ubuntu-latest
        steps:
          - name: Checkout code
            uses: actions/checkout@v3
            with:
              fetch-depth: 0  # Importante para ter o histórico completo do Git
    
          - name: Set up Python
            uses: actions/setup-python@v4
            with:
              python-version: '3.10'  # Ou a versão que você usa
    
          - name: Install Aider
            run: pip install aider-chat
    
          - name: Run Aider
            run: |
              aider --model gpt-3.5-turbo-16k --yes --message "Revisa este PR, procurando problemas, e dando sugestões de refatoração para melhorá-lo. Foca nos arquivos modificados."
            env:
              OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} # Use um secret do GitHub
    
          - name: Commit eventual fix
            run: |
              git config --global user.name "Aider Bot"
              git config --global user.email "[email protected]"
              git add .
              git commit -m "chore: aprimoramentos sugeridos por Aider" || true
              git push
    
    • fetch-depth: 0: É crucial que o Aider tenha acesso ao histórico completo do Git para funcionar corretamente. fetch-depth: 0 garante isso. Sem isso, o Aider não terá o contexto necessário.
    • OPENAI_API_KEY: Use um secret do GitHub para armazenar sua chave da OpenAI. Nunca coloque a chave diretamente no arquivo YAML.
    • --yes: Em um ambiente de CI/CD, geralmente queremos que o Aider execute sem interrupção. O --yes confirma automaticamente todas as perguntas do Aider.
    • --message: Fornece uma instrução inicial clara para o Aider. O texto exato pode ser ajustado para suas necessidades.
    • Commits automáticos (opcional): O exemplo acima inclui etapas opcionais para que o Aider, caso faça alterações, faça o commit e push diretamente no branch do PR. Isso pode ser útil, mas requer cuidado. É importante configurar corretamente as permissões do token de acesso do GitHub Actions (GITHUB_TOKEN) para permitir isso. É altamente recomendável que você use um Personal Access Token (PAT) com escopo limitado em vez do GITHUB_TOKEN padrão para maior segurança.
    • Comandos personalizados: Você pode usar os comandos / do aider no --message para ações específicas, ex: /add <files> para especificar quais arquivos devem ser considerados.
  2. Análise em outros eventos: Você pode configurar o Aider para ser executado em outros eventos, como push em branches específicos (ex: main, develop), schedule (para execuções agendadas), etc.

  3. Execução de testes: O Aider pode ser usado para executar testes (ex: pytest, npm test) e, em caso de falha, tentar corrigir os problemas.

      - name: Run tests and fix with Aider
        run: |
          aider --yes --message "/test"

    Isso usa o comando /test do Aider, que por padrão executa o test_cmd definido. Você deve definir o valor dessa variável no arquivo .aider.conf.yml ou então usar o parâmetro --test-cmd.

  4. Geração de Documentação: Você pode usar o Aider para gerar ou atualizar a documentação do seu projeto com base no código.

  5. Integração com aiderignore: O arquivo .aiderignore permite que você especifique arquivos e diretórios que o Aider não deve considerar. Isso é importante para:

    • Excluir arquivos grandes que não são relevantes para a análise (ex: arquivos de mídia, dados de teste).
    • Evitar que o Aider modifique arquivos sensíveis (ex: arquivos de configuração com credenciais).
    • Melhorar o desempenho, focando nos arquivos importantes. O comportamento do aiderignore é consistente entre a linha de comando e o GitHub Actions.

Exemplo Completo (comentado):

name: Aider Code Review and Linting

on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  aider-review:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0  # Histórico completo do Git

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'

      - name: Install Aider and dependencies
        run: |
          pip install aider-chat
          pip install flake8  # Exemplo de linter

      - name: Run Aider Code Review
        run: |
          aider --model gpt-4o --yes --message "Revisa este PR e sugira melhorias. Seja conciso."
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

      - name: Run Linter (Flake8)
        run: |
          aider --model gpt-3.5-turbo --yes --message "/lint"  # Usa o linter configurado
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

Integração com SonarQube

A integração direta do Aider com o SonarQube não é uma funcionalidade nativa do Aider.

O que pode ser feito:

  1. Usar o Aider como um "pré-processador" para o SonarQube: Você pode usar o Aider em um workflow do GitHub Actions antes de executar a análise do SonarQube. O Aider pode identificar e corrigir problemas de código, potencialmente reduzindo o número de problemas detectados pelo SonarQube.

    # ... etapas de configuração do Aider (como no exemplo anterior) ...
    
    - name: Run Aider to fix potential issues
      run: |
        aider --model gpt-3.5-turbo --yes --message "Corrige quaisquer problemas de qualidade de código que você encontrar."
      env:
        OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
    
    - name: SonarQube Analysis
      uses: sonarsource/sonarqube-scan-action@master
      env:
        SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
        SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
  2. Usar o Aider para remediar problemas encontrados pelo SonarQube: Essa abordagem é mais complexa. Você precisaria:

    • Executar a análise do SonarQube.
    • Exportar os resultados da análise (idealmente em um formato estruturado, como JSON).
    • Criar um script (Python, por exemplo) que:
      • Leia o relatório do SonarQube.
      • Para cada problema encontrado, construa uma mensagem para o Aider, incluindo:
        • O arquivo afetado.
        • A linha de código problemática.
        • A descrição do problema (fornecida pelo SonarQube).
      • Use a API do Aider (ou chame o Aider via linha de comando) para enviar a mensagem e aplicar as correções.

    Esta abordagem requer um script intermediário e um bom entendimento da API do SonarQube e do formato de seus relatórios. Não é uma integração "plug-and-play".

  3. Usar o resultado do SonarQube como input no prompt do Aider: Você pode configurar um step na sua action para, após rodar o SonarQube, pegar o resultado dele e usar como input para o Aider, da seguinte forma:

      - name: SonarQube Analysis
          uses: sonarsource/sonarqube-scan-action@master
          env:
            SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
            SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
    
      - name: Get SonarQube issues (requires jq)
          id: get_issues
          run: |
            echo "::set-output name=issues::$(curl -s -u ${{ secrets.SONAR_TOKEN }}: ${SONAR_HOST_URL}/api/issues/search?componentKeys=my-project-key | jq '.issues | map(.message) | join("\\n")')"
    
      - name: Run Aider with SonarQube issues
          run: |
            aider --model gpt-4o --yes --message "Corrija os seguintes problemas reportados pelo SonarQube:\n${{ steps.get_issues.outputs.issues }}"
          env:
            OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

Neste caso, será necessário ajustar o prompt do Aider para que ele entenda os issues gerados pelo Sonar. Importante que, a depender do número de issues, o limite de tokens do modelo selecionado pode ser atingido.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment