Dicas para manter dependências atualizadas automaticamente com Renovate

1. Introdução ao Renovate e seus benefícios

O Renovate é uma ferramenta open-source de automação de atualização de dependências que se destaca por sua flexibilidade e capacidade de configuração avançada. Diferentemente do Dependabot (nativo do GitHub) ou do Snyk (focado em segurança), o Renovate oferece suporte a mais de 50 ecossistemas de pacotes, incluindo npm, Docker, Maven, PyPI, NuGet e muito mais.

As principais vantagens de automatizar a atualização de dependências com Renovate incluem:

  • Redução de débito técnico: dependências desatualizadas acumulam correções de segurança e melhorias de performance
  • Consistência em larga escala: ideal para monorepos com centenas de pacotes ou organizações com dezenas de repositórios
  • Configuração compartilhável: permite definir regras globais que se aplicam a todos os projetos da equipe

Casos de uso ideais incluem equipes que mantêm múltiplos projetos simultaneamente, ambientes com requisitos rigorosos de segurança e projetos que utilizam gerenciadores de pacotes com lockfiles complexos.

2. Configuração inicial do Renovate

A instalação mais simples é através do GitHub App. Basta acessar o GitHub Marketplace, instalar o aplicativo e selecionar os repositórios desejados. Para GitLab, utilize o GitLab Bot oficial. Ambientes self-hosted exigem Docker ou Node.js.

Após a instalação, crie o arquivo renovate.json na raiz do repositório:

{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:base"
  ],
  "labels": ["dependencies", "renovate"],
  "schedule": ["after 10pm every weekday", "before 5am every weekday"],
  "timezone": "America/Sao_Paulo"
}

Este arquivo básico já ativa o Renovate, define labels personalizadas e agenda a execução para horários noturnos durante a semana. O extend config:base já inclui boas práticas recomendadas pela comunidade.

3. Estratégias de versionamento e agrupamento de PRs

Para evitar um dilúvio de Pull Requests, configure agrupamentos inteligentes. Dependências relacionadas, como pacotes do ecossistema React ou AWS SDK, devem ser atualizadas juntas:

{
  "packageRules": [
    {
      "matchPackagePrefixes": ["react", "react-dom", "@types/react"],
      "groupName": "React Core",
      "groupSlug": "react-core"
    },
    {
      "matchPackagePrefixes": ["@aws-sdk/"],
      "groupName": "AWS SDK",
      "groupSlug": "aws-sdk"
    },
    {
      "matchUpdateTypes": ["minor", "patch"],
      "matchCurrentVersion": ">=1.0.0",
      "automerge": true,
      "automergeType": "pr"
    }
  ]
}

No exemplo acima, todas as atualizações minor e patch de pacotes estáveis (>1.0.0) serão automaticamente mergeadas após aprovação dos testes. Pacotes do React e AWS SDK são agrupados em PRs únicos.

4. Automação com schedules e rate limiting

O controle de quando e quantos PRs o Renovate abre é crucial para não sobrecarregar a equipe:

{
  "schedule": ["after 10pm", "before 5am"],
  "timezone": "America/Sao_Paulo",
  "prConcurrentLimit": 5,
  "prHourlyLimit": 2,
  "branchConcurrentLimit": 10,
  "automergeSchedule": ["after 1am", "before 6am"]
}
  • prConcurrentLimit: máximo de 5 PRs abertos simultaneamente
  • prHourlyLimit: no máximo 2 PRs por hora
  • automergeSchedule: merge automático apenas durante a madrugada

Para dependências de baixo risco (testes passam, sem breaking changes), configure auto-merge condicional:

{
  "packageRules": [
    {
      "matchUpdateTypes": ["patch"],
      "automerge": true,
      "automergeType": "pr",
      "platformAutomerge": true
    }
  ]
}

5. Integração com pipelines de CI/CD

A integração com CI/CD garante que cada atualização seja validada automaticamente. Exemplo com GitHub Actions:

name: CI
on:
  pull_request:
    types: [opened, synchronize]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - run: npm test
      - run: npm run build

Adicione labels e assignees automáticos para revisão em equipe:

{
  "labels": ["dependencies", "automated"],
  "assignees": ["@time-devops"],
  "reviewers": ["@senior-dev"],
  "assignAutomerge": true
}

6. Tratamento de dependências problemáticas e lockfiles

Para lidar com breaking changes, configure prefixos e limites:

{
  "commitMessagePrefix": "chore(deps): ",
  "commitMessageAction": "Update",
  "prConcurrentLimit": 3,
  "major": {
    "commitMessagePrefix": "BREAKING CHANGE: ",
    "labels": ["breaking-change"]
  }
}

Para lockfiles, o Renovate gerencia automaticamente package-lock.json, yarn.lock e poetry.lock. Configure para evitar conflitos:

{
  "lockFileMaintenance": {
    "enabled": true,
    "schedule": ["before 5am on monday"]
  }
}

Para dependências pinned (versão fixa), use rangeStrategy:

{
  "rangeStrategy": "bump",
  "packageRules": [
    {
      "matchPackageNames": ["lodash"],
      "rangeStrategy": "pin"
    }
  ]
}

7. Monitoramento e boas práticas avançadas

Configure alertas para vulnerabilidades conhecidas (CVE):

{
  "vulnerabilityAlerts": {
    "enabled": true,
    "labels": ["security", "urgent"]
  },
  "prPriority": {
    "vulnerability": 10,
    "security": 5
  }
}

Para autenticação em registries privados (NPM privado, Docker Hub, Maven):

{
  "hostRules": [
    {
      "hostType": "npm",
      "matchHost": "registry.npmjs.org",
      "encrypted": {
        "token": "seu-token-criptografado"
      }
    },
    {
      "hostType": "docker",
      "matchHost": "ghcr.io",
      "username": "seu-usuario",
      "password": "seu-token"
    }
  ]
}

Revisão periódica do arquivo de configuração e logs:

{
  "onboarding": true,
  "onboardingConfig": {
    "$schema": "https://docs.renovatebot.com/renovate-schema.json",
    "extends": ["config:base"]
  },
  "logLevel": "debug"
}

Para monitoramento, utilize o dashboard do Renovate ou integre com ferramentas de observabilidade como Datadog ou Grafana.

Referências