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.
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:
-
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 doGITHUB_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.
-
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. -
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 otest_cmd
definido. Você deve definir o valor dessa variável no arquivo.aider.conf.yml
ou então usar o parâmetro--test-cmd
. -
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.
-
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 }}
A integração direta do Aider com o SonarQube não é uma funcionalidade nativa do Aider.
O que pode ser feito:
-
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 }}
-
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".
-
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.