Replace Dependabot with Renovate for cross-ecosystem dependency grouping#745
Conversation
Add renovate.json to manage cross-module and cross-ecosystem dependency updates. The configuration groups Kubernetes dependencies (k8s.io/*, controller-runtime, cert-manager) across all Go modules, enables independent updates for unrelated Go dependencies, tracks Python packages via UV/pip ecosystem, monitors Docker base images, groups GitHub Actions by organization, and configures auto-merge for safe patch-level updates. Includes comprehensive test suite validating all functional requirements against the configuration. Generated-By: Forge/20260604_150734_114805_76f08a38 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Both dependabot and Renovate were configured to manage the same ecosystems, which would produce competing PRs for every dependency update. Removing dependabot.yml leaves Renovate as the sole dependency management tool. Generated-By: Forge/20260604_150734_114805_76f08a38
The kubernetes groupName appeared in two separate rules with confusing interaction semantics. The first rule already sets automerge:false for all update types, making the second rule (which only covered minor/major) redundant. Generated-By: Forge/20260604_150734_114805_76f08a38
Docker image "patch" updates can include significant OS-layer changes that should not be auto-merged. Added an override rule that disables automerge for dockerfile and docker-compose managers. Generated-By: Forge/20260604_150734_114805_76f08a38
Verifies that the kubernetes group rule includes all three expected go.mod files so that removing a path would be caught by tests. Generated-By: Forge/20260604_150734_114805_76f08a38
…vate groupings Add three new package grouping rules to the Renovate configuration: - grpc-protobuf: groups grpcio, grpcio-tools, and protobuf Python packages for protocol compatibility - kubernetes-python: groups kubernetes and kubernetes-asyncio Python packages to keep sync and async clients aligned - golang-version: groups Go version directive updates across all go.mod files Includes 15 new tests covering all three grouping rules (existence, single-rule consolidation, package names, manager types, file coverage). Refs: jumpstarter-dev#732 Generated-By: Forge/20260604_155507_146627_86308ea7 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move kubernetes and golang-version rules after the patch automerge rule so their automerge:false correctly overrides the blanket patch automerge. Replace deprecated matchPackagePrefixes with matchPackageNames using glob patterns to avoid Renovate deprecation warnings. Generated-By: Forge/20260604_155507_146627_86308ea7
Add a test-config job to the lint workflow that runs pytest on tests/test_renovate_config.py when renovate.json or tests/ change. Without this, the config validation tests were never executed in CI. Generated-By: Forge/20260604_155507_146627_86308ea7
The plan previously stated dependabot.yml would remain for reference, but the implementation deletes it. Update the plan to match. Generated-By: Forge/20260604_155507_146627_86308ea7
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughThis PR removes Dependabot, adds a top-level Renovate configuration with custom managers and extensive packageRules, introduces ChangesRenovate Dependency Manager Migration
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested labels
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Add validate-renovate job to lint workflow using the official renovate-config-validator. Fix Python grpc group (replace unused grpcio-tools with grpcio-reflection). Add Go gRPC/protobuf group. Shorten all packageRule descriptions. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…e images, and dev tools Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…or e2e Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-version - Add go-deps-other group to catch ungrouped Go deps across all go.mod files - Fix golang-version rule matchDepTypes from "golang-version" (datasource) to "golang" (actual depType) - Track python/.python-version so Renovate can manage the Python runtime version Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Running this on a somewhat recent main would yield the following PRs: |
Prevents CI Go version from drifting when go.mod is updated. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
.github/workflows/lint.yaml (1)
106-113: 💤 Low valueConsider hardening checkout for consistency with security best practices.
Static analysis flags this checkout for missing
persist-credentials: falseand using an unpinned tag (@v4) instead of a commit hash. However, this is consistent with all other checkout actions in this workflow (lines 26, 50, 69, 82, 95, 118).Since this job only validates configuration and doesn't need git credentials after checkout, adding
persist-credentials: falsewould be a good security hygiene improvement. If you decide to address this, consider applying it workflow-wide for consistency.Optional: Add persist-credentials: false
validate-renovate: needs: changes if: needs.changes.outputs.renovate == 'true' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + persist-credentials: false - name: Validate Renovate config run: npx --yes --package renovate -- renovate-config-validator🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/lint.yaml around lines 106 - 113, The validate-renovate job's checkout step (the actions/checkout@v4 usage within the validate-renovate job) should set persist-credentials: false to avoid leaving Git credentials in the workspace after checkout; update the checkout step to include persist-credentials: false and, for consistency/security, consider applying the same change to the other checkout steps (and optionally pin actions/checkout to a specific commit SHA across the workflow if you want stronger immutability).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@python/.python-version`:
- Line 1: Remove the hardcoded "3.12" and instead read the canonical interpreter
version from python/.python-version and reuse it across devcontainer and e2e
scripts: update .devcontainer/devcontainer.json (postStartCommand) and the e2e
scripts (e2e/lib/install.sh, e2e/setup-e2e.sh, e2e/compat/setup.sh) to read the
version string from python/.python-version into a variable and use that variable
when installing or pinning Python so all places derive the version from the
single source of truth.
In `@renovate.json`:
- Around line 185-192: The "Auto-merge patch updates" rule currently sets
matchUpdateTypes: ["patch"] with automerge: true and is placed after the
kubernetes and docker-base-images rules so its later precedence overrides their
automerge: false; to fix, move the rule block containing matchUpdateTypes,
automerge and automergeType so it appears before the kubernetes and
docker-base-images rules or modify its scope (e.g., add matchPackageNames or
excludePackageNames) to explicitly exclude the kubernetes and docker-base-images
sets; keep the golang-version rule after this patch rule as-is.
---
Nitpick comments:
In @.github/workflows/lint.yaml:
- Around line 106-113: The validate-renovate job's checkout step (the
actions/checkout@v4 usage within the validate-renovate job) should set
persist-credentials: false to avoid leaving Git credentials in the workspace
after checkout; update the checkout step to include persist-credentials: false
and, for consistency/security, consider applying the same change to the other
checkout steps (and optionally pin actions/checkout to a specific commit SHA
across the workflow if you want stronger immutability).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 2690be36-76f6-4bdf-9365-84fc3c0f6f86
📒 Files selected for processing (4)
.github/dependabot.yml.github/workflows/lint.yamlpython/.python-versionrenovate.json
💤 Files with no reviewable changes (1)
- .github/dependabot.yml
- Add .go-version as single source of truth for Go toolchain version - Add custom regex manager to detect and update .go-version via Renovate - Group .go-version updates with go.mod directives in golang-version group - Point all CI workflows to .go-version instead of individual go.mod files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…-version - Add .py-version (3.12) as CI Python version reference without forcing it on developers - Add custom regex manager so Renovate can detect and update .py-version - Gitignore .python-version to prevent local dev tool interference - Untrack the previously committed python/.python-version Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace hardcoded Python versions and uv python pin commands with python-version-file pointing to .py-version across e2e, lint, and documentation workflows. python-tests keeps its multi-version matrix. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Pin ghcr.io/astral-sh/uv from latest to 0.4.4 in all Dockerfiles - Pin uv tool version from latest to 0.11.19 in lint and python-tests workflows - Pin registry.access.redhat.com/ubi9/ubi from latest to 9.5 - Pin mcr.microsoft.com/devcontainers/base from bookworm to 2.1.9-bookworm and update to current image path (was vscode/devcontainers/base) - Fix devcontainer Dockerfile to copy .py-version instead of removed python/.python-version Not pinnable (no semver tags available): - quay.io/devfile/base-developer-image:ubi9-latest - quay.io/jumpstarter-dev/jumpstarter-operator:latest Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Track ubi major version only (ubi9 -> ubi10). The regex matches ubi<major>-latest tags and ignores commit-hash tags. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Scans Dockerfiles, Containerfiles, and workflow files for :latest tags and version: latest inputs. Allowlists quay.io/jumpstarter-dev/ images since those are self-referencing project images, not external deps. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…sions" This reverts commit 30201c0.
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
renovate.json (1)
218-225:⚠️ Potential issue | 🟠 Major | 🏗️ Heavy liftFix automerge precedence for patch updates.
The patch automerge rule (lines 218-225) comes after both the
kubernetesrule (line 157,automerge: false) and thedocker-base-imagesrule (line 204,automerge: false). Due to Renovate's last-rule-wins precedence, this patch rule will override theirautomerge: falsesettings for patch-level updates, causing unintended auto-merges.Move this rule before the
kubernetesanddocker-base-imagesrules, or add exclusions to prevent it from applying to those dependency groups.📋 Suggested fix: Reorder rules to preserve automerge: false intent
Move the patch automerge rule to appear before line 139 (before the kubernetes rule), or add explicit exclusions:
}, + { + "description": "Auto-merge patch updates", + "matchUpdateTypes": [ + "patch" + ], + "automerge": true, + "automergeType": "pr" + }, { "description": "Group Go Kubernetes and controller dependencies",And remove the rule from its current position (lines 218-225).
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@renovate.json` around lines 218 - 225, The "Auto-merge patch updates" rule (the object with "matchUpdateTypes": ["patch"] and "automerge": true) is placed after the kubernetes rule and docker-base-images rule which both set "automerge": false, so Renovate's last-rule-wins causes unintended auto-merges; fix it by moving the patch automerge rule to appear before the kubernetes rule (the kubernetes rule that sets "automerge": false) and before the docker-base-images rule, or alternatively add explicit exclusions to the patch rule to omit the kubernetes and docker-base-images groups (e.g., exclude by their groupName or package names) so the patch rule cannot override their "automerge": false settings.
🧹 Nitpick comments (3)
.github/workflows/lint.yaml (1)
107-114: 💤 Low valueConsider pinning the renovate version for reproducibility.
The
npx --yes --package renovatecommand installs the latest version of renovate each time. Pinning to a specific version would make validation more deterministic and reproducible across runs.📌 Optional: pin renovate version
- name: Validate Renovate config - run: npx --yes --package renovate -- renovate-config-validator + run: npx --yes --package renovate@39 -- renovate-config-validator🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/lint.yaml around lines 107 - 114, The renovate validation step (job validate-renovate, step "Validate Renovate config") currently installs the latest Renovate via npx --package renovate; change this to pin a specific Renovate version (e.g. npx --yes --package renovate@<version> renovate-config-validator) so the validation is deterministic — update the run command to reference renovate@<semver> and document or bump the pinned version when Renovate upgrades are required..github/workflows/e2e.yaml (1)
148-150: ⚡ Quick winConsider pinning the uv version for consistency across workflows.
This workflow doesn't specify a
versionparameter forsetup-uv, whilelint.yamlandpython-tests.yamlpin to0.11.19. Pinning to a consistent version across all workflows would improve reproducibility.🔧 Suggested fix: pin uv version
- name: Install uv uses: astral-sh/setup-uv@v7 with: + version: "0.11.19" python-version-file: .py-versionApply the same change to the other
setup-uvsteps in this workflow at lines 191-193, 263-265, and 293-295.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/e2e.yaml around lines 148 - 150, Pin the astral-sh/setup-uv action to a specific version by adding a version input (e.g., version: "0.11.19") to the setup steps that use `uses: astral-sh/setup-uv@v7` so the workflow matches `lint.yaml` and `python-tests.yaml`; update all occurrences of the `uses: astral-sh/setup-uv@v7` step in this file (the ones that currently only supply `python-version-file`) to include the `version` field with the chosen pinned value for consistency and reproducibility..github/workflows/documentation.yaml (1)
51-52: ⚡ Quick winConsider aligning uv version with other workflows.
This workflow pins uv to
0.11.6, whilelint.yamlandpython-tests.yamluse0.11.19. Aligning to a single uv version across all workflows would improve consistency and reduce potential behavioral differences.🔧 Suggested fix: align uv version
- name: Install uv uses: astral-sh/setup-uv@803947b9bd8e9f986429fa0c5a41c367cd732b41 # v7.2.1 with: - version: "0.11.6" + version: "0.11.19" python-version-file: .py-versionApply the same change to the other
setup-uvsteps in this workflow at lines 87-88 and 108-109.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.github/workflows/documentation.yaml around lines 51 - 52, Update the pinned uv version in this workflow's setup step(s): find the steps named "setup-uv" (look for the step key or the action that uses setup-uv) and change the YAML key "version: \"0.11.6\"" to "version: \"0.11.19\"" for each occurrence in this file so it matches the uv version used in lint.yaml and python-tests.yaml.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.devcontainer/Dockerfile:
- Line 1: Replace mutable image tags with immutable sha256 digests for both base
and multi-stage source images: change the FROM reference to the
mcr.microsoft.com/devcontainers/base image to use its pinned digest instead of
:2.1.9-bookworm and replace the COPY --from=ghcr.io/astral-sh/uv:0.4.4 source
with that image's digest, ensuring reproducible builds; to find the correct
digests run a registry manifest/pull (e.g. docker pull <image:tag> then docker
inspect or use registry API) and update the Dockerfile image references to the
returned image@sha256:<digest> form.
In `@python/Dockerfile`:
- Line 14: The second COPY re-pulls the image instead of using the build-stage
alias; change the COPY source from the explicit image reference
"ghcr.io/astral-sh/uv:0.4.4" to the existing build stage alias "uv" so both COPY
instructions reference the same stage (i.e., use COPY --from=uv /uv /uvx /bin/),
ensuring no extra pull and consistent artifacts from the uv stage.
---
Duplicate comments:
In `@renovate.json`:
- Around line 218-225: The "Auto-merge patch updates" rule (the object with
"matchUpdateTypes": ["patch"] and "automerge": true) is placed after the
kubernetes rule and docker-base-images rule which both set "automerge": false,
so Renovate's last-rule-wins causes unintended auto-merges; fix it by moving the
patch automerge rule to appear before the kubernetes rule (the kubernetes rule
that sets "automerge": false) and before the docker-base-images rule, or
alternatively add explicit exclusions to the patch rule to omit the kubernetes
and docker-base-images groups (e.g., exclude by their groupName or package
names) so the patch rule cannot override their "automerge": false settings.
---
Nitpick comments:
In @.github/workflows/documentation.yaml:
- Around line 51-52: Update the pinned uv version in this workflow's setup
step(s): find the steps named "setup-uv" (look for the step key or the action
that uses setup-uv) and change the YAML key "version: \"0.11.6\"" to "version:
\"0.11.19\"" for each occurrence in this file so it matches the uv version used
in lint.yaml and python-tests.yaml.
In @.github/workflows/e2e.yaml:
- Around line 148-150: Pin the astral-sh/setup-uv action to a specific version
by adding a version input (e.g., version: "0.11.19") to the setup steps that use
`uses: astral-sh/setup-uv@v7` so the workflow matches `lint.yaml` and
`python-tests.yaml`; update all occurrences of the `uses: astral-sh/setup-uv@v7`
step in this file (the ones that currently only supply `python-version-file`) to
include the `version` field with the chosen pinned value for consistency and
reproducibility.
In @.github/workflows/lint.yaml:
- Around line 107-114: The renovate validation step (job validate-renovate, step
"Validate Renovate config") currently installs the latest Renovate via npx
--package renovate; change this to pin a specific Renovate version (e.g. npx
--yes --package renovate@<version> renovate-config-validator) so the validation
is deterministic — update the run command to reference renovate@<semver> and
document or bump the pinned version when Renovate upgrades are required.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: dfa18ab6-2e29-4bea-89ea-d015c6d1bf84
📒 Files selected for processing (14)
.devcontainer/Dockerfile.github/workflows/build-images.yaml.github/workflows/documentation.yaml.github/workflows/e2e.yaml.github/workflows/lint.yaml.github/workflows/python-tests.yaml.github/workflows/release-operator-installer.yaml.gitignore.go-version.py-versionpython/.devfile/Containerfilepython/.devfile/Containerfile.clientpython/Dockerfilerenovate.json
💤 Files with no reviewable changes (1)
- .py-version
✅ Files skipped from review due to trivial changes (4)
- .go-version
- .github/workflows/release-operator-installer.yaml
- python/.devfile/Containerfile
- .gitignore
Centralizes Python version in devcontainer postStartCommand, e2e setup scripts, and compat test scripts to read from .py-version, preventing drift when Renovate updates the version file. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The automerge patch rule was placed after kubernetes (automerge: false) and docker-base-images (automerge: false), causing last-match-wins to override their automerge: false with automerge: true on patch updates. Moving it earlier lets those rules correctly disable automerge. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace hardcoded Python and Go version requirements in README and installation docs with links to the version files, preventing the docs from becoming stale when versions are updated. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The previous hardcoded v1.11.3+ was stale (actual minimum is 1.33 based on k8s.io/client-go v0.33.0). Link to go.mod so the requirement stays current when Renovate updates k8s.io dependencies. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Renovate will now create PRs to pin container image digests and GitHub Action versions to SHA digests, ensuring reproducible builds and preventing silent tag mutations. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…n docs conf.py now reads requires-python from the core jumpstarter package's pyproject.toml, keeping the docs substitution in sync automatically. The installer prerequisites now show both the minimum version (from pyproject.toml) and the recommended development version (.py-version). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Read DEFAULT_SOURCE from install.sh into a {{stable_branch}} docs
substitution, replacing 6 hardcoded release-0.7 references with the
current value (release-0.8). The stable branch version is now defined
in one place (install.sh) and the docs stay current automatically.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
All versions (mostly containerimages) in python/docs yaml in md files can not be addressed by this PR, it requires that #704 lands where yaml is included from dedicated files which renovate can pick up. |
|
@mangelajo i have address your review feedback. if you are okay with this PR, i would go ahead and install the renovate app |
Explain why specific Python versions are tested (RHEL floor to Fedora ceiling) and clarify the distinction between .py-version (CI runtime pin) and requires-python (compatibility floor) in Renovate descriptions. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Follow-up: Python version matrix simplification The test matrix currently covers Python 3.11, 3.12, and 3.13. Once RHEL 9 support is dropped, this should be simplified:
This would drop RHEL 9 appstream users (3.11) but aligns with RHEL 10 as the minimum supported platform. The decision depends on when the project is ready to drop RHEL 9 support. |
|
@kirkbrauer is okay with this based on a chat with him. merging and adding renovate bot. |
- Pin `ghcr.io/astral-sh/uv` from `0.4.4` to `0.11.19` in all Dockerfiles and Containerfiles — the `0.4.4` tag pinned in #745 was an image format version containing an old uv binary without `uv build` support, breaking container builds. The registry publishes `0.11.x` tags matching the uv tool version (found via paginated tag listing). - Fix myst substitutions for `{{stable_branch}}` in docs tables — substitutions don't work inside markdown link URLs or backtick code spans, so pre-build them as complete substitution values in `conf.py`. ## Test plan - [x] Verify `python/Dockerfile` builds successfully - [x] Verify docs build with `make docs` (substitutions render correctly) - [x] Verify `make docs-linkcheck` passes (no broken `pkg.jumpstarter.dev` URLs) 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
.github/dependabot.ymlwithrenovate.jsonto solve cross-module dependency couplingMotivation
Dependabot treats each
(ecosystem, directory)pair independently, so it frequently proposes incompatible Kubernetes dependency bumps acrosscontroller/go.modandcontroller/deploy/operator/go.mod. Renovate'spackageRuleswithmatchFileNamessolves this by grouping them into a single PR.Test plan