GitHub·7 min read·

Dependabot in Practice: Keeping Dependency Updates Boring

Turn Dependabot from a noise generator into a calm upgrade pipeline with scheduled, grouped, label-aware PRs that reviewers can ship quickly.

NB

Netbay Infrastructure Team

Netbay Engineering

On this page

Dependabot is two features sharing one name. Version updates open pull requests whenever your manifests or lockfiles move behind your back. Security updates and alerts watch the dependency graph and raise the alarm — and open fix PRs — when a pinned dependency acquires a known advisory. Both jobs share one goal: they should be boring. The moment updates start scaring people, the update PRs start being closed unmerged, and your supply chain quietly rots again.

Config anatomy

Everything lives in a single dependabot.yml at the root of the repository, under a version-2 header. The unit of configuration is a manifest directory: one entry per package ecosystem you want updated.

yaml
# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: npm
    directory: /
    schedule:
      interval: weekly
      day: monday
      time: '03:00'
    open-pull-requests-limit: 10
    reviewers:
      - netbay/platform-eng
    assignees:
      - rishi
      - meera
    labels:
      - dependencies
      - priority/low
    commit-message:
      prefix: "chore(deps):"
    ignore:
      - dependency-name: electron
        update-types: ['version-update:semver-major']
    groups:
      runtime:
        patterns: ['express', 'fastify']
        update-types: ['patch', 'minor']
  - package-ecosystem: docker
    directory: /deploy
    schedule:
      interval: monthly
  - package-ecosystem: github-actions
    directory: /
    schedule:
      interval: weekly

Three decisions here matter more than the rest. First, "ignore" with a major-update rule stops a breaking upgrade from being *proposed* until you are ready — voluntary, on your calendar. Second, the "groups" key collapses many PRs into coherent batches. Third, updating github-actions itself is free hygiene: your own automation becomes a dependency you keep current. The same file can schedule the docker and the actions ecosystems side by side, each entry carrying its own cadence — a useful knob when one manifest tracks conservative tools and another tracks a bleeding-edge toolkit.

Groups are the whole game

Dependabot's default of one PR per dependency produces walls of green. Grouping turns that wall into a handful. Group by cohesion, not alphabetically: everything runtime-related in one group, every dev tool in another, and let patch-and-minor versions ride together while majors stay loud. A long-lived PR that says "runtime deps patch+minor" is reviewable reasoning about *risk*, whereas fifty tiny PRs each demand the same judgement fifty times.

Make merges cheap

A noisy Dependabot feed is usually a CI problem wearing a Dependabot costume. If every update PR takes an hour of checks and a slow human review, the queue backs up and updates go stale. Compress the loop:

  • Let the update branches be recognizable and tag them early, so reviewer queues sort them correctly.
  • Keep a small review SLA for dependency PRs; they are the highest volume, lowest complexity work in your queue.
  • Automate merges only once criteria are explicit — label dependencies, green checks, and a batched group qualify.

A small loop makes that routine:

bash
# auto-merge every open dependabot PR whose merge state is CLEAN
gh pr list --author 'app/dependabot' --state open   --json number --jq '.[].number' | while read -r pr; do
  state=$(gh pr view "$pr" --json mergeStateStatus --jq .mergeStateStatus)
  if [ "$state" = CLEAN ]; then
    gh pr merge "$pr" --squash --auto --delete-branch
  fi
done

"mergeStateStatus" returns CLEAN only when all required checks passed and there are no conflicts — so the script is enforcement, not a loophole.

dependabot loop advisory manifest scan weekly schedule update PR grouped + labelled CI + review merged security update path emergency PR not waiting for a slot scheduled, grouped, label-aware boring is the feature

Security updates are a different clock

Do not let the version-update schedule govern security. Dependabot alerts are near-real-time: an advisory that touches your dependency graph raises an alert on its own clock, and enabling security updates turns that alert into a fix PR immediately. Give that path a faster review SLA than the weekly feed — automatic scrutiny for known-exploitable flaws, then a real human confirms the fix and the bump lands. The alert stream is also where you measure supply-chain risk honestly: if critical alerts routinely sit for weeks, your configuration is working and your process is not.

The daily review loop

Every Dependabot PR deserves a thirty-second peek, not a deep audit: glance at the changelog if it is a major, confirm the lockfile delta is what you expect, and let CI plus the tests you already own do the proving. Make one deliberate exception: never merge a dependency pull request whose lockfile diff is unexpectedly large, because a bot-generated change that surprises you is exactly how an unintended dependency arrives silently. Batch-major updates, and your own roadmap — deliberately ignored majors are fine as long as the ignore is a decision with a date attached.

Takeaway: Dependabot pays off the day updating stops being an event. Schedule sensibly, group aggressively, merge cheap green batches — and keep security on a faster clock. The bots, mirrors, and scheduled jobs you run to close the loop all need a dependable Linux box, which is exactly what a Lucknow DC01 VPS from Netbay is — live in under 60 seconds at netbayhosts.in.

Keep reading

Follow along on a real VPS

Deploy Linux in under 60 seconds

These guides are written against Ubuntu, Debian, and RHEL-family images — the same ones on NetBay.

Deploy an instance