Rework dependency updates: Dependabot for CVEs, Renovate for everything else

Offen
#400 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
49/100
Issue-Typ
Feature
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
github-actions, python, yaml

Rechercherichtung

Start with the listed files: template/pyproject.toml.jinja, pyproject.toml, renovate.json, template/renovate.json.jinja, periodic.yml, and the two dependency docs. Check the open questions about Renovate version and permissions, then trace how periodic.yml is rendered and how its test matrix runs. Done means the cooldown, Renovate settings, weekly unlocked job, failure issue handling, and docs match the proposal.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Rework dependency updates: Renovate only, no automerge, 3-day cooldown, weekly unlocked tests

Problem

  • We use an uncomfortable mix of Renovate and Dependabot, with no clear split of responsibilities.
  • Renovate's lockFileMaintenance automerges, which people dislike, and it fills git history with lockfile commits.
  • Nothing tells us when an upstream release will break downstream users who install unlocked.
  • There's no cooldown on new releases, which leaves us exposed to supply-chain attacks via freshly published packages.
  • Until recently, Renovate only fixed CVEs in direct dependencies, so CVEs in transitive dependencies in uv.lock sat unfixed (see python-zocalo#319 for an example of the manual catch-up).

Goals

  1. CI runs against the lockfile, so upstream releases don't break unrelated PRs.
  2. A periodic unlocked run tells us what upstream changes would break downstream users.
  3. Nothing resolves releases newer than 3 days: not lock refreshes, not local upgrades, not unlocked runs.
  4. CVEs are patched as soon as the fix release is 3 days old, including in transitive dependencies. Urgent fixes can bypass the cooldown per package.

Proposal

Area Current Proposed
CI Runs locked (uv run --locked) Unchanged
Release cooldown None exclude-newer = "3 days" in pyproject.toml, matched by Renovate minimumReleaseAge: "3 days". Applies to every resolution: lock refreshes, local uv lock --upgrade, and the unlocked job
CVE alerts Dependabot alerts (enabled in settings) Unchanged. Used only as the alert source; no Dependabot PRs, no settings changes
CVE fixes Renovate vulnerabilityAlerts (via config:recommended), direct dependencies only Unchanged config, and now covers transitive deps in uv.lock (Renovate ≥ 44.221.0, renovatebot/renovate#47482). Security PRs open immediately, ignoring schedule and grouping. If the fix is under 3 days old, the PR fails to lock until the window passes; for urgent cases, add exclude-newer-package to bypass
Lockfile refresh Renovate lockFileMaintenance, automerged On demand only: a Dependency Dashboard checkbox, never automerged. Obeys the cooldown via pyproject.toml
Upstream breakage Nothing Weekly unlocked test job in periodic.yml; opens/updates an issue on failure
Actions / pre-commit bumps Renovate, minor/patch grouped Renovate, all grouped into a weekly PR, no automerge
Template-managed deps downstream Ignored in template/renovate.json.jinja Unchanged
Copier updates Renovate copier manager Unchanged
Automerge On for lock maintenance, via the renovate-approve app Off everywhere; renovate-approve no longer needed

Renovate is the only bot. Dependabot is used only as the source of alerts on GitHub. On internal GitLab, Renovate's osvVulnerabilityAlerts plays the same role, and also covers uv transitive deps. So the setup is consistent across both.

Renovate doesn't apply minimumReleaseAge to lockFileMaintenance; it just runs uv lock --upgrade. That's why the cooldown has to live in pyproject.toml rather than only in Renovate config.

Implementation (outline)

  • template/pyproject.toml.jinja (and the template's own pyproject.toml): add exclude-newer = "3 days" under [tool.uv].
  • renovate.json / template/renovate.json.jinja:
    • set automerge: false
    • add a weekly schedule
    • set minimumReleaseAge: "3 days"
    • set lockFileMaintenance.dependencyDashboardApproval: true
    • group actions/pre-commit updates
    • keep the existing template-managed ignores and the default vulnerabilityAlerts
  • periodic.yml:
    • add a weekly job that runs tests with --upgrade instead of --locked, across the supported Python matrix (the cooldown comes from pyproject.toml)
    • open or update a single issue on failure
    • render periodic.yml unconditionally, since it's currently gated on sphinx, and make the linkcheck job conditional instead
  • Docs:
    • rewrite renovate.md to remove automerge and the renovate-approve app, and to describe the dashboard lock refresh and security PRs
    • document the cooldown in lock-requirements.md, including how to bypass it for an urgent fix with exclude-newer-package = { <pkg> = false }, to be removed after merge

Open questions

  • Is the Mend-hosted Renovate app on ≥ 44.221.0, and does it have read access to Dependabot alerts? Both are needed for transitive CVE fixes.
  • Verify on a test repo that Renovate opens a fix PR for a transitive-only vulnerable package in uv.lock, and that a fix under 3 days old succeeds on a later run once the window passes. The transitive feature only landed on 2026-11-05.
  • Should the weekly periodic job also run pip-audit against the locked environment, as a safety net while the transitive support beds in?
  • Does dependencyDashboardApproval behave as expected for lockFileMaintenance on our Renovate version?
  • Should repos that build and deploy images from the lock keep a scheduled (e.g. monthly) lock refresh in their own Renovate config?
  • Align the cooldown window with python-zocalo, which uses the same pattern with 7 days.
Vorherrschende Sprache
Jinja
Sterne
25
Forks
10
Ø Merge
1 T. 8 Std.
Gemergte PRs (30 T.)
4

Entwicklungsumgebung

In Codespaces öffnen

Startet den Dev-Container des Projekts im Browser, mit Ihrem eigenen GitHub-Konto.

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus DiamondLightSource/python-copier-template

Alle Issues in DiamondLightSource/python-copier-template

Ähnliche Issues

Weitere Issues zu Build System

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.