Adicionando o Dependabot ao Greenhouse (e a pegadinha do workspace Rust que ele revelou)
Uma revisão de repositório no Greenhouse (meu app desktop em Tauri para gerenciar projetos criativos) sinalizou algo que eu vinha adiando: não existia nenhum escaneamento de dependências. Nenhum cargo-audit, nenhum npm-audit, nada vigiando crates ou pacotes com vulnerabilidades conhecidas. Num projeto recente isso é fácil de ignorar até deixar de ser.
Por que essa abordagem
O Dependabot do GitHub cobre isso sem adicionar um job de CI. O banco de dados de advisories dele já inclui o RustSec, então um arquivo de configuração faz o que eu de outra forma precisaria de um workflow separado de cargo-audit para fazer. Ele também atualiza as versões fixadas das GitHub Actions no meu arquivo de CI, que eu nunca lembro de atualizar sozinho.
Agrupei atualizações minor e patch por ecossistema, então recebo mais ou menos um PR por semana em vez de uma dúzia. As majors ainda chegam individualmente, já que são as únicas que realmente vale a pena ler antes de dar merge.
Implementação
A configuração em si é curta:
version: 2
updates:
- package-ecosystem: cargo
directory: /
schedule: { interval: weekly }
groups: { cargo-minor: { update-types: [minor, patch] } }
- package-ecosystem: npm
directory: /
schedule: { interval: weekly }
groups: { npm-minor: { update-types: [minor, patch] } }
- package-ecosystem: github-actions
directory: /
schedule: { interval: weekly }
Pegadinha
O plano original apontava a entrada do cargo para /src-tauri, já que é lá que mora o Cargo.toml da crate do Tauri. Isso está errado para esse repositório. O Cargo.toml raiz do Greenhouse é um workspace virtual ([workspace] members = ["src-tauri"], sem [package] próprio), e nesse layout o Cargo.lock mora na raiz do workspace, não dentro do diretório da crate membro. O atualizador de cargo do Dependabot precisa do diretório que realmente guarda o lockfile contra o qual ele resolve, então tem que ser /. Mesmo assim ele continua rastreando as dependências do src-tauri sem problema, já que o Dependabot percorre todos os membros do workspace a partir da raiz.
Fácil de passar batido se você está guiando pelo padrão de onde o código “de verdade” mora, em vez de onde o lockfile está.
Resultados
Um arquivo novo, .github/dependabot.yml, nenhuma outra mudança de código ou de CI. Confirmei que ele faz parse com yq e verifiquei que os três diretórios apontam para manifests reais antes de dar merge. A validação completa só acontece quando o GitHub roda ele depois do push, já que não existe forma local de fazer um dry-run do Dependabot.
Também registrei essa pegadinha da raiz do workspace como uma nota de padrão na minha base de conhecimento, já que ela vai me morder de novo na próxima vez que eu adicionar o Dependabot a um projeto de workspace Rust.
Leitura relacionada
O scan que se ofereceu para importar a si mesmo
Um scanner de importação que encontrou a própria estrutura interna do app, e depois voltou a oferecer uma pasta que tinha acabado de importar, duas versões da mesma conversa que faltava entre camadas.
Lendo changelogs antes de atualizar três dependências desatualizadas
Um crate de YAML arquivado, nove versões menores de deriva no rusqlite, e uma major duplicada do thiserror. O trabalho foi a leitura, não a escrita.
A pasta que ficou parada
Uma revisão de código encontrou um invariante que a feature de adotar/importar do Greenhouse quebrava silenciosamente, e a correção que tornou tudo chato de novo.
Você também pode achar útil
Proton Drive
Armazenamento em nuvem criptografado, da equipe por trás do Proton Mail.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba maisNordPass
Gerenciador de senhas da equipe por trás da NordVPN, com um plano gratuito.
Como afiliado da NordPass, ganho com compras qualificadas.
Saiba maisProton VPN
VPN comercial com filtragem NetShield e interruptor de desligamento automático.
Como parceiro da Proton, ganho com compras qualificadas dos serviços de privacidade e segurança da Proton (Pass, Mail, VPN, Drive).
Saiba mais