From ba89c8fe9f85d3989758fea44a3f15349073dec0 Mon Sep 17 00:00:00 2001 From: Patrick Lee Scott Date: Sat, 29 Aug 2026 15:54:58 -0500 Subject: [PATCH 1/7] fix: automate tested dependency updates --- .github/workflows/on-pr.yaml | 2 +- functions/render/000-state-init.yaml.gotmpl | 4 +- renovate.json | 78 ++++++++++++++++++++- tests/test-render/main.k | 1 + upbound.yaml | 2 +- 5 files changed, 82 insertions(+), 5 deletions(-) diff --git a/.github/workflows/on-pr.yaml b/.github/workflows/on-pr.yaml index 8062b47..f03a2f4 100644 --- a/.github/workflows/on-pr.yaml +++ b/.github/workflows/on-pr.yaml @@ -10,7 +10,7 @@ on: - reopened - synchronize paths: - - ".github/workflows/on-pr.yaml" + - ".github/workflows/**" - ".gitops/**" - "apis/**" - "examples/**" diff --git a/functions/render/000-state-init.yaml.gotmpl b/functions/render/000-state-init.yaml.gotmpl index 366e284..666914b 100644 --- a/functions/render/000-state-init.yaml.gotmpl +++ b/functions/render/000-state-init.yaml.gotmpl @@ -53,9 +53,11 @@ # Controller # ============================================================================== {{- $controller := $spec.controller | default dict }} +# renovate: datasource=helm depName=snapshot-controller registryUrl=https://piraeus.io/helm-charts +{{- $controllerChartVersion := $controller.chartVersion | default "5.0.3" }} {{- $controllerCfg := dict "name" ($controller.name | default "snapshot-controller") - "chartVersion" ($controller.chartVersion | default "5.0.3") + "chartVersion" $controllerChartVersion "values" ($controller.values | default dict) "overrideAllValues" ($controller.overrideAllValues | default dict) }} diff --git a/renovate.json b/renovate.json index f32df84..eae6448 100644 --- a/renovate.json +++ b/renovate.json @@ -12,10 +12,20 @@ }, "packageRules": [ { - "description": "Automerge minor and patch updates that pass all checks", - "matchUpdateTypes": ["minor", "patch"], + "description": "Automerge minor and patch updates after all checks pass", + "matchUpdateTypes": [ + "minor", + "patch" + ], "automerge": true }, + { + "description": "Require manual review for major updates", + "matchUpdateTypes": [ + "major" + ], + "automerge": false + }, { "description": "Disable automatic updates for all hops-ops Docker images", "matchDatasources": [ @@ -26,6 +36,14 @@ "/^hops-ops//" ] }, + { + "description": "Group AWS provider-family packages", + "matchPackageNames": [ + "/provider-family-aws/", + "/provider-aws-.*/" + ], + "groupName": "aws-providers" + }, { "description": "Use feat(deps): commit prefix for hops-ops Crossplane packages (github-releases datasource)", "matchManagers": [ @@ -48,5 +66,61 @@ "semanticCommitType": "feat", "semanticCommitScope": "deps" } + ], + "ignorePaths": [ + "**/node_modules/**", + "**/bower_components/**", + "**/vendor/**", + "**/__tests__/**", + "**/test/**", + "**/__fixtures__/**" + ], + "automergeType": "pr", + "platformAutomerge": false, + "ignoreTests": false, + "customManagers": [ + { + "customType": "regex", + "description": "hops-ops Crossplane configurations (tracked via GitHub Releases)", + "managerFilePatterns": [ + "apis/**/configuration.yaml", + "upbound.yaml" + ], + "matchStrings": [ + "\\s*(configuration|function|package|provider):\\s*ghcr\\.io/hops-ops/(?.*?)\\s*version:\\s*(\"|')>=(?.*?)(\"|')\\s*" + ], + "datasourceTemplate": "github-releases", + "packageNameTemplate": "hops-ops/{{depName}}" + }, + { + "customType": "regex", + "description": "Crossplane packages from other registries (tracked via Docker tags)", + "managerFilePatterns": [ + "apis/**/configuration.yaml", + "upbound.yaml" + ], + "matchStrings": [ + "\\s*(configuration|function|package|provider):\\s*(?[^/]+)\\/(?[^/]+)\\/(?[^/\\s]+)\\s*version:\\s*(\"|')>=(?.*?)(\"|')\\s*" + ], + "datasourceTemplate": "docker", + "registryUrlTemplate": "https://{{registryUrl}}", + "depNameTemplate": "{{orgName}}/{{repoName}}", + "packageNameTemplate": "{{orgName}}/{{repoName}}" + }, + { + "customType": "regex", + "description": "Annotated runtime dependencies in schemas, templates, examples, and tests", + "managerFilePatterns": [ + "apis/**/*.yaml", + "examples/**/*.yaml", + "functions/**/*.yaml.gotmpl", + "tests/**/*.k" + ], + "matchStrings": [ + "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?(?:default\\s+|:=\\s*|[\"']?(?:version|chartVersion|tag|default)[\"']?\\s*(?:[=:]\\s*|\\s+))[\"']?(?v?[0-9][^\\s\"'}]*)", + "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?(?:default\\s+|[\"']?image[\"']?\\s*[=:]\\s*)[\"']?[A-Za-z0-9._/-]+:(?v?[A-Za-z0-9][^\\s\"'}]*)", + "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?package\\s*=\\s*\"[^\"]+:(?[^\"]+)\"" + ] + } ] } diff --git a/tests/test-render/main.k b/tests/test-render/main.k index 7a19410..fe79941 100644 --- a/tests/test-render/main.k +++ b/tests/test-render/main.k @@ -33,6 +33,7 @@ _items = [ chart = { name = "snapshot-controller" repository = "https://piraeus.io/helm-charts" + # renovate: datasource=helm depName=snapshot-controller registryUrl=https://piraeus.io/helm-charts version = "5.0.3" } namespace = "kube-system" diff --git a/upbound.yaml b/upbound.yaml index 2461271..2667617 100644 --- a/upbound.yaml +++ b/upbound.yaml @@ -7,7 +7,7 @@ spec: - apiVersion: pkg.crossplane.io/v1 kind: Function package: xpkg.crossplane.io/crossplane-contrib/function-auto-ready - version: '>=v0.6.2' + version: '>=v0' - apiVersion: pkg.crossplane.io/v1 kind: Provider package: xpkg.crossplane.io/crossplane-contrib/provider-helm From aef7b78e260a79d50285f4106212c6e9f7a49f3e Mon Sep 17 00:00:00 2001 From: Patrick Lee Scott Date: Sat, 29 Aug 2026 16:59:08 -0500 Subject: [PATCH 2/7] fix: bound dependencies below next major --- renovate.json | 16 ++++++++++++---- upbound.yaml | 4 ++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/renovate.json b/renovate.json index eae6448..84500b9 100644 --- a/renovate.json +++ b/renovate.json @@ -82,30 +82,38 @@ { "customType": "regex", "description": "hops-ops Crossplane configurations (tracked via GitHub Releases)", + "matchStringsStrategy": "recursive", "managerFilePatterns": [ "apis/**/configuration.yaml", "upbound.yaml" ], "matchStrings": [ - "\\s*(configuration|function|package|provider):\\s*ghcr\\.io/hops-ops/(?.*?)\\s*version:\\s*(\"|')>=(?.*?)(\"|')\\s*" + "\\s*(configuration|function|package|provider):\\s*ghcr\\.io/hops-ops/(?.*?)\\s*version:\\s*(\"|')>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*=v{{{newMajor}}} [^/]+)\\/(?[^/]+)\\/(?[^/\\s]+)\\s*version:\\s*(\"|')>=(?.*?)(\"|')\\s*" + "\\s*(configuration|function|package|provider):\\s*(?[^/]+)\\/(?[^/]+)\\/(?[^/\\s]+)\\s*version:\\s*(\"|')>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*=v{{{newMajor}}} =v0' + version: '>=v0 =v1' + version: '>=v1 Date: Sat, 29 Aug 2026 17:10:42 -0500 Subject: [PATCH 3/7] fix: avoid overlapping Renovate extraction --- renovate.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/renovate.json b/renovate.json index 84500b9..f0a3bb5 100644 --- a/renovate.json +++ b/renovate.json @@ -98,14 +98,14 @@ }, { "customType": "regex", - "description": "Crossplane packages from other registries (tracked via Docker tags)", + "description": "Crossplane packages from xpkg registries (tracked via Docker tags)", "matchStringsStrategy": "recursive", "managerFilePatterns": [ "apis/**/configuration.yaml", "upbound.yaml" ], "matchStrings": [ - "\\s*(configuration|function|package|provider):\\s*(?[^/]+)\\/(?[^/]+)\\/(?[^/\\s]+)\\s*version:\\s*(\"|')>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*xpkg\\.[^/]+)\\/(?[^/]+)\\/(?[^/\\s]+)\\s*version:\\s*(\"|')>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?(?:default\\s+|:=\\s*|[\"']?(?:version|chartVersion|tag|default)[\"']?\\s*(?:[=:]\\s*|\\s+))[\"']?(?v?[0-9][^\\s\"'}]*)", - "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?(?:default\\s+|[\"']?image[\"']?\\s*[=:]\\s*)[\"']?[A-Za-z0-9._/-]+:(?v?[A-Za-z0-9][^\\s\"'}]*)", + "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?[\"']?image[\"']?\\s*[=:]\\s*[\"']?[A-Za-z0-9._/-]+:(?v?[A-Za-z0-9][^\\s\"'}]*)", "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?package\\s*=\\s*\"[^\"]+:(?[^\"]+)\"" ] } From 0540cd38b9f9b8389739518183db9749cc15cc2d Mon Sep 17 00:00:00 2001 From: Patrick Lee Scott Date: Sat, 29 Aug 2026 17:24:37 -0500 Subject: [PATCH 4/7] fix: address dependency review findings --- README.md | 6 +++--- apis/volumesnapshotstacks/definition.yaml | 2 +- renovate.json | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c2191b9..577b750 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ spec: | `ha.topologySpreadByZone` | bool | `true` | Add `topologySpreadConstraint` by `topology.kubernetes.io/zone` | | **Controller** | | | | | `controller.name` | string | `snapshot-controller` | Helm release name | -| `controller.chartVersion` | string | `5.0.3` | piraeus-charts chart version (tracks upstream `v8.5.0`) | +| `controller.chartVersion` | string | stack default | piraeus-charts chart version | | `controller.values` | object | — | Helm values merged with stack defaults | | `controller.overrideAllValues` | object | — | Helm values that replace all defaults | @@ -127,8 +127,8 @@ That's it. Smallest stack in the repo. | Kind | Package | Version | |---|---|---| -| Function | `crossplane-contrib/function-auto-ready` | `>=v0.6.2` | -| Provider | `crossplane-contrib/provider-helm` | `>=v1` | +| Function | `crossplane-contrib/function-auto-ready` | `>=v0 =v1 \\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?(?:default\\s+|:=\\s*|[\"']?(?:version|chartVersion|tag|default)[\"']?\\s*(?:[=:]\\s*|\\s+))[\"']?(?v?[0-9][^\\s\"'}]*)", - "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?[\"']?image[\"']?\\s*[=:]\\s*[\"']?[A-Za-z0-9._/-]+:(?v?[A-Za-z0-9][^\\s\"'}]*)", + "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?(?:default\\s*:\\s*|[\"']?image[\"']?\\s*[=:]\\s*)[\"']?[A-Za-z0-9._/-]+:(?v?[A-Za-z0-9][^\\s\"'}]*)", "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?package\\s*=\\s*\"[^\"]+:(?[^\"]+)\"" ] } From 9d38c96894e90cbf41db066b65debc4f817ddec2 Mon Sep 17 00:00:00 2001 From: Patrick Lee Scott Date: Sat, 29 Aug 2026 17:25:56 -0500 Subject: [PATCH 5/7] fix: scope package dependency extraction --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 34b2557..21c3374 100644 --- a/renovate.json +++ b/renovate.json @@ -128,7 +128,7 @@ "matchStrings": [ "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?(?:default\\s+|:=\\s*|[\"']?(?:version|chartVersion|tag|default)[\"']?\\s*(?:[=:]\\s*|\\s+))[\"']?(?v?[0-9][^\\s\"'}]*)", "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?(?:default\\s*:\\s*|[\"']?image[\"']?\\s*[=:]\\s*)[\"']?[A-Za-z0-9._/-]+:(?v?[A-Za-z0-9][^\\s\"'}]*)", - "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?package\\s*=\\s*\"[^\"]+:(?[^\"]+)\"" + "# renovate: datasource=(?\\S+) depName=(?\\S+)(?: registryUrl=(?\\S+))?\\s+[^\\n]*?package\\s*=\\s*\"xpkg\\.[^/]+/[^\"]+:(?[^\"]+)\"" ] } ] From cd6d63f18062d813b0dbe2c751949bd647541df1 Mon Sep 17 00:00:00 2001 From: Patrick Lee Scott Date: Sat, 29 Aug 2026 17:30:11 -0500 Subject: [PATCH 6/7] fix: validate Renovate configuration changes --- .github/workflows/on-pr.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/on-pr.yaml b/.github/workflows/on-pr.yaml index f03a2f4..080255d 100644 --- a/.github/workflows/on-pr.yaml +++ b/.github/workflows/on-pr.yaml @@ -10,6 +10,7 @@ on: - reopened - synchronize paths: + - 'renovate.json' - ".github/workflows/**" - ".gitops/**" - "apis/**" From f84e3713af2963149735596de41c38d49247bdbd Mon Sep 17 00:00:00 2001 From: Patrick Lee Scott Date: Sat, 29 Aug 2026 18:00:16 -0500 Subject: [PATCH 7/7] fix: use compatible major dependency ranges --- README.md | 4 ++-- renovate.json | 12 ++++++------ upbound.yaml | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 577b750..3a1f3fd 100644 --- a/README.md +++ b/README.md @@ -127,8 +127,8 @@ That's it. Smallest stack in the repo. | Kind | Package | Version | |---|---|---| -| Function | `crossplane-contrib/function-auto-ready` | `>=v0 =v1 .*?)\\s*version:\\s*(\"|')>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*.*?)\\s*version:\\s*(\"|')\\^v?[0-9]+(\"|')\\s*", + "(?\\^v?[0-9]+)" ], "datasourceTemplate": "github-releases", "versioningTemplate": "npm", "packageNameTemplate": "hops-ops/{{depName}}", - "autoReplaceStringTemplate": ">=v{{{newMajor}}} xpkg\\.[^/]+)\\/(?[^/]+)\\/(?[^/\\s]+)\\s*version:\\s*(\"|')>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*>=v?[0-9]+(?:\\.[0-9]+){0,2}(?:\\s*xpkg\\.[^/]+)\\/(?[^/]+)\\/(?[^/\\s]+)\\s*version:\\s*(\"|')\\^v?[0-9]+(\"|')\\s*", + "(?\\^v?[0-9]+)" ], "datasourceTemplate": "docker", "versioningTemplate": "npm", "registryUrlTemplate": "https://{{registryUrl}}", "depNameTemplate": "{{orgName}}/{{repoName}}", "packageNameTemplate": "{{orgName}}/{{repoName}}", - "autoReplaceStringTemplate": ">=v{{{newMajor}}} =v0 =v1