versions-renovate
npx skills add https://github.com/ionfury/homelab --skill versions-renovate
Agent 安装分布
Skill 文档
Versions and Renovate Management
This skill covers adding and maintaining version entries in kubernetes/platform/versions.env and configuring Renovate to automatically update them.
How Version Updates Flow
Renovate detects new version --> Updates versions.env in a PR
--> PR merges --> OCI artifact built --> integration cluster deploys
--> Flux substitutes ${var} into HelmRelease specs
--> Tuppr reads Talos/K8s versions for rolling upgrades
Every entry in versions.env needs a # renovate: annotation on the line above it. Renovate’s custom regex manager in .github/renovate.json5 parses these annotations to determine how to check for updates.
Annotation Syntax
# renovate: datasource=<source> depName=<name> [packageName=<pkg>] [extractVersion=<regex>] [registryUrl=<url>] [versioning=<scheme>]
variable_name=<value>
Key ordering is fixed: datasource, depName, packageName, extractVersion, registryUrl, versioning. Rearranging keys causes Renovate to silently skip the entry.
| Field | Required | Purpose |
|---|---|---|
datasource |
Yes | Where Renovate looks for versions (helm, docker, github-releases, github-tags) |
depName |
Yes | Human-readable name shown in Renovate PRs |
packageName |
No | Registry-specific lookup path (OCI registries, GitHub repos) |
extractVersion |
No | Regex to transform upstream version (e.g., strip v prefix) |
registryUrl |
No | HTTP Helm repository URL (not for OCI) |
versioning |
No | Version scheme override for non-semver (e.g., loose) |
Adding a New Version Entry
Step 1: Select Datasource
What kind of dependency?
|
+-- Helm chart from HTTP registry --> datasource=helm + registryUrl=<url>
+-- Helm chart from OCI registry --> datasource=docker + packageName=<full-path>
+-- GitHub release (Talos, Flux) --> datasource=github-releases + packageName=<org/repo>
+-- GitHub tag (no release object) --> datasource=github-tags + packageName=<org/repo>
Step 2: Write the Annotation
HTTP Helm registry — use registryUrl, depName is the chart name:
# renovate: datasource=helm depName=grafana registryUrl=https://grafana.github.io/helm-charts
grafana_version=10.5.15
OCI Helm registry — use packageName with the full image path (no oci:// prefix):
# renovate: datasource=docker depName=app-template packageName=ghcr.io/bjw-s-labs/helm/app-template
app_template_version=4.6.2
GitHub releases — use packageName as org/repo:
# renovate: datasource=github-releases depName=talos packageName=siderolabs/talos
talos_version=v1.12.2
GitHub tags — same pattern, different datasource:
# renovate: datasource=github-tags depName=kubernetes packageName=kubernetes/kubernetes extractVersion=^v(?<version>.*)$
kubernetes_version=1.35.0
Step 3: Handle Version Prefix
If the upstream releases as v1.0.0 but your stored value omits the v, add extractVersion:
# renovate: datasource=helm depName=cert-manager extractVersion=^v(?<version>.*)$ registryUrl=https://charts.jetstack.io
cert_manager_version=1.19.3
Real examples from the codebase:
- Talos: stores
v1.12.2(keepsv) — no extractVersion needed - Cilium: stores
1.18.6(stripsv) — extractVersion required - Cert-manager: stores
1.19.3(stripsv) — extractVersion required
Step 4: Handle Non-Semver Versions
For versions that don’t follow semver, add versioning=loose:
# renovate: datasource=docker depName=cloudnative-vectorchord packageName=ghcr.io/tensorchord/cloudnative-vectorchord versioning=loose
vectorchord_version=18.1-1.0.0
Step 5: Add Package Rule (if needed)
If the dependency should be grouped or has special automerge needs, add to .github/renovate.json5:
{
"matchDepNames": ["my-chart", "related-chart"],
"groupName": "my stack"
}
Step 6: Validate
task renovate:validate
YAML Container Image Annotations
For container image tags hardcoded in Helm values files (not in versions.env), annotate directly in the YAML. The custom regex manager matches these patterns.
Tag field pattern:
image:
repository: ghcr.io/kashalls/kromgo
# renovate: datasource=docker depName=ghcr.io/kashalls/kromgo
tag: v0.7.5
Inline image:tag pattern:
initContainers:
# renovate: datasource=docker depName=ghcr.io/home-operations/postgres-init
image: ghcr.io/home-operations/postgres-init:18
When to use which:
- versions.env: Helm chart versions (Flux-substituted into HelmRelease specs)
- YAML annotations: Container image tags in values files (sidecars, init containers)
Package Rules
Package rules in .github/renovate.json5 control grouping and automerge. By default, minor/patch updates automerge after 3 days (.renovate/automerge.json5).
Existing Groups
| Group | Dependencies | Automerge |
|---|---|---|
| infrastructure versions | talos, kubernetes, cilium, gateway-api, flux | Never |
| grafana stack | grafana, loki, alloy | Default |
| prometheus stack | kube-prometheus-stack, prometheus-operator-crds | Default |
| istio mesh | base, cert-manager-istio-csr | Default |
| mittwald utilities | kubernetes-replicator, kubernetes-secret-generator | Default |
| authelia stack | authelia, lldap | Default |
| hardware monitoring exporters | prometheus-snmp-exporter, prometheus-ipmi-exporter, prometheus-smartctl-exporter | Default |
When to add a rule:
- Multiple related charts that should update together (grouping)
- Infrastructure-critical dependencies that must not automerge
- The
matchDepNamesvalues must match thedepNamein the annotation
Debugging
Dependency Not Being Updated
- Check key order: Must be
datasource depName [packageName] [extractVersion] [registryUrl] [versioning] - Run
task renovate:validate: Catches config syntax errors - Check dependency dashboard: Look for the dep in the Renovate dashboard issue on GitHub
- Verify datasource: Ensure registry URL or package name is correct and accessible
- Check ignorePaths: Confirm the file isn’t excluded in
renovate.json5
Wrong Version Detected
- extractVersion mismatch: Regex doesn’t match upstream tag format
- Wrong datasource:
helmvsdockervsgithub-releasesproduce different version lists - Non-semver: Missing
versioning=loosecauses Renovate to skip
Common Mistakes
| Mistake | Symptom | Fix |
|---|---|---|
| Wrong key order | Silently ignored | Follow exact order above |
oci:// prefix in packageName |
Can’t find package | Remove oci:// prefix |
Missing extractVersion |
Version has unwanted v |
Add extractVersion=^v(?<version>.*)$ |
datasource=helm for OCI |
Can’t find chart | Use datasource=docker |
Missing versioning=loose |
Skips non-semver versions | Add versioning=loose |
| Annotation not on line above | Regex doesn’t match | Must be immediately above key=value |