Pular para o conteúdo
Development

Adicionando o Dependabot ao Greenhouse (e a pegadinha do workspace Rust que ele revelou)

Por Victor Da Luz
rustdependabotcidev-loggreenhouse

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

Development

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.

Ler
Development

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.

Ler

Você também pode achar útil

Proton

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 mais
NordPass

NordPass

Gerenciador de senhas da equipe por trás da NordVPN, com um plano gratuito.

Como afiliado da NordPass, ganho com compras qualificadas.

Saiba mais
Proton

Proton 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