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
Um gate que nunca roda não é um gate
Um teste de contrato de IPC, um smoke test de release, uma auditoria com 18 avisos inesperados, e um teste de contraste quebrado o tempo todo sem rodar.
Duas notas que ninguém nunca viu
O Greenhouse salvava fielmente uma nota de captura e uma de transição, sem mostrar nenhuma: faltava o campo a uma, a outra tinha um comando sem uso.
Duas estatísticas, duas definições de "capturado"
A sequência de dias e o badge calculavam o mesmo conceito de duas formas diferentes, e importações estavam silenciosamente creditando ideias de seis meses atrás como o ato criativo de hoje.
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