From f3584d76965d6c5a33d127d7c6f23359428878be Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 09:28:21 +0000 Subject: [PATCH 01/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 65 ++++++++++++++++----- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index beaaf5fc..a9217abe 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -14,6 +14,7 @@ class K3d { private static String K3D_LOG_FILENAME = "k8sLogs" private static String K3D_SETUP_JSON_FILE = "k3d_setup.json" private static String K3D_VALUES_YAML_FILE = "k3d_values.yaml" + private static String K3D_BLUEPRINT_FILE = "k3d_blueprint.yaml" private static String YQ_VERSION = "4.40.5" private String clusterName @@ -36,8 +37,6 @@ class K3d { adminGroup : "CesAdministrators", dependencies : ["official/ldap", "official/cas", - "k8s/nginx-ingress", - "k8s/nginx-static", "official/postfix", "official/usermgt"], defaultDogu : "", @@ -254,15 +253,16 @@ class K3d { } } - void configureSetupJson(config = [:]) { - String setupJsonConfigKey = ".setup_json" - - script.echo "configuring setup..." + void configureEcosystemCoreValues(config = [:]) { + script.echo "configuring ecosystem core..." // Merge default config with the one passed as parameter config = defaultSetupConfig << config - writeSetupJson(config) + writeBlueprintYaml(config) + } - appendFileToYamlFile(K3D_VALUES_YAML_FILE, setupJsonConfigKey, K3D_SETUP_JSON_FILE) + @Deprecated + void configureSetupJson(config = [:]) { + configureEcosystemCoreValues(config) } void configureSetupImage(String image) { @@ -320,7 +320,13 @@ class K3d { helm("registry login ${registryUrl} --username '${script.env.HARBOR_USERNAME}' --password '${script.env.HARBOR_PASSWORD}'") } - helm("install -f ${K3D_VALUES_YAML_FILE} k8s-ces-setup oci://${registryUrl}/${registryNamespace}/k8s-ces-setup --version ${tag} --namespace default") + // install crd first + helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") + + helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default") + + helm("apply -f ${K3D_BLUEPRINT_FILE} --namespace default") + helm("registry logout ${registryUrl}") script.echo "Wait for dogu-operator to be ready..." @@ -363,7 +369,7 @@ class K3d { */ void setup(String tag, config = [:], Integer timout = 300, Integer interval = 5) { assignExternalIP() - configureSetupJson(config) + configureEcosystemCoreValues(config) installAndTriggerSetup(tag, timout, interval) } @@ -610,16 +616,49 @@ data: String formatted = "" for (int i = 0; i < deps.size(); i++) { - formatted += "\"${deps[i]}\"" - + formatted += " - \"${deps[i]}\"" if ((i + 1) < deps.size()) { - formatted += ', ' + formatted += '\n' } } return formatted } + private void writeBlueprintYaml(config) { + List deps = config.dependencies + config.additionalDependencies + String formattedDeps = formatDependencies(deps) + script.writeFile file: K3D_BLUEPRINT_FILE, text: """ +apiVersion: k8s.cloudogu.com/v2 +kind: Blueprint +metadata: + labels: + app: ces + app.kubernetes.io/name: k8s-blueprint-lib + name: blueprint-ces-module + namespace: default +spec: + displayName: "Blueprint Terraform CES-Module" + blueprint: + dogus: +${formattedDeps} + config: + dogus: + ldap: + "admin_username": "${config.adminUsername}" + "admin_mail": "ces-admin@cloudogu.com" + "admin_member": "true" + "admin_password": "${config.adminPassword}" + global: + "fqdn": "${externalIP}" + "domain": "ces.local" + "certificate/type": "selfsigned" + "k8s/use_internal_ip": "false" + "internalIp": "" + "admin_group": "${config.adminGroup}" +""" + } + private void writeSetupJson(config) { List deps = config.dependencies + config.additionalDependencies String formattedDeps = formatDependencies(deps) From a8bb857fe7ea2dbc170712b473aeef00fd1258b8 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 09:37:47 +0000 Subject: [PATCH 02/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index a9217abe..21c0a8a4 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -323,7 +323,7 @@ class K3d { // install crd first helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") - helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default") + helm("install ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default") helm("apply -f ${K3D_BLUEPRINT_FILE} --namespace default") From 47b4a13048f2cd26a4b76b1f88c7318c04747f20 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 09:43:37 +0000 Subject: [PATCH 03/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 21c0a8a4..6bf624f2 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -325,12 +325,14 @@ class K3d { helm("install ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default") + script.echo "Wait for blueprint-operator to be ready..." + waitForDeploymentRollout("k8s-blueprint-operator-controller-manager", timeout, interval) + helm("apply -f ${K3D_BLUEPRINT_FILE} --namespace default") helm("registry logout ${registryUrl}") - script.echo "Wait for dogu-operator to be ready..." - waitForDeploymentRollout("k8s-dogu-operator-controller-manager", timeout, interval) + script.echo "Wait for setup-finisher to be executed..." waitForSetupToFinish(timeout, interval) @@ -616,7 +618,8 @@ data: String formatted = "" for (int i = 0; i < deps.size(); i++) { - formatted += " - \"${deps[i]}\"" + formatted += " - name: ${deps[i]}\n" + + " version: latest" if ((i + 1) < deps.size()) { formatted += '\n' } From 6ef7004c471897d1e95f3899ca273947efab6b59 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 09:51:05 +0000 Subject: [PATCH 04/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 6bf624f2..fe61e526 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -323,7 +323,7 @@ class K3d { // install crd first helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") - helm("install ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default") + helm("install ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") script.echo "Wait for blueprint-operator to be ready..." waitForDeploymentRollout("k8s-blueprint-operator-controller-manager", timeout, interval) From 0655e98483c7ca1770a5299a29a24e6de3241899 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 11:55:22 +0000 Subject: [PATCH 05/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index fe61e526..5350d483 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -254,6 +254,9 @@ class K3d { } void configureEcosystemCoreValues(config = [:]) { + + appendToYamlFile(K3D_VALUES_YAML_FILE, "defaultConfig.env.waitTimeoutMinutes", "15") + script.echo "configuring ecosystem core..." // Merge default config with the one passed as parameter config = defaultSetupConfig << config @@ -323,7 +326,7 @@ class K3d { // install crd first helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") - helm("install ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") + helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") script.echo "Wait for blueprint-operator to be ready..." waitForDeploymentRollout("k8s-blueprint-operator-controller-manager", timeout, interval) From 11dcafe19865934ba92b04642e7b79291bb577f7 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 12:34:08 +0000 Subject: [PATCH 06/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 5350d483..c21075f3 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -255,7 +255,7 @@ class K3d { void configureEcosystemCoreValues(config = [:]) { - appendToYamlFile(K3D_VALUES_YAML_FILE, "defaultConfig.env.waitTimeoutMinutes", "15") + appendToYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes", "15") script.echo "configuring ecosystem core..." // Merge default config with the one passed as parameter @@ -326,7 +326,7 @@ class K3d { // install crd first helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") - helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") + helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") script.echo "Wait for blueprint-operator to be ready..." waitForDeploymentRollout("k8s-blueprint-operator-controller-manager", timeout, interval) From b204a5d0563c9891ac1e5a5816796e4be8cbfe72 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 12:41:23 +0000 Subject: [PATCH 07/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index c21075f3..f3b814c5 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -255,7 +255,7 @@ class K3d { void configureEcosystemCoreValues(config = [:]) { - appendToYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes", "15") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes = 15") script.echo "configuring ecosystem core..." // Merge default config with the one passed as parameter From 50c2bd47a32ac076e349b181ced0c759a2c9d15a Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 13:22:29 +0000 Subject: [PATCH 08/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index f3b814c5..488b7a3e 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -326,6 +326,8 @@ class K3d { // install crd first helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") + prepatchFQDN() + helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") script.echo "Wait for blueprint-operator to be ready..." @@ -631,6 +633,17 @@ data: return formatted } + private void prepatchFQDN() { + String global_config_map = kubectl("kubectl get configmap global-config -n default -o yaml", true) + script.writeFile file: "cm.yaml", text: global_config_map + + doInYQContainer { + script.sh("yq eval -i '.data[\"config.yaml\"] |= (from_yaml | .fqdn = \"${externalIP}\" | to_yaml)' cm.yaml") + } + + kubectl("apply -f cm.yaml") + } + private void writeBlueprintYaml(config) { List deps = config.dependencies + config.additionalDependencies String formattedDeps = formatDependencies(deps) From d141954c91166babcd696b0642e7613825deffa1 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 30 Oct 2025 13:29:58 +0000 Subject: [PATCH 09/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 488b7a3e..625bc555 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -634,7 +634,7 @@ data: } private void prepatchFQDN() { - String global_config_map = kubectl("kubectl get configmap global-config -n default -o yaml", true) + String global_config_map = kubectl("get configmap global-config -n default -o yaml", true) script.writeFile file: "cm.yaml", text: global_config_map doInYQContainer { From e857b6bfbc35b63ea3c7b92210fcb239abfad365 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 06:47:32 +0000 Subject: [PATCH 10/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 625bc555..609a9c40 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -256,6 +256,8 @@ class K3d { void configureEcosystemCoreValues(config = [:]) { yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes = 15") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.internalTrafficPolicy = \"Cluster\"") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.externalTrafficPolicy = \"Cluster\"") script.echo "configuring ecosystem core..." // Merge default config with the one passed as parameter From 8dc3d66c94b1e03bd64bbf8675d67439493e5e48 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 06:55:13 +0000 Subject: [PATCH 11/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 609a9c40..3b51c47f 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -256,8 +256,8 @@ class K3d { void configureEcosystemCoreValues(config = [:]) { yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes = 15") - yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.internalTrafficPolicy = \"Cluster\"") - yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.externalTrafficPolicy = \"Cluster\"") + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.internalTrafficPolicy", "Cluster") + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.externalTrafficPolicy", "Cluster") script.echo "configuring ecosystem core..." // Merge default config with the one passed as parameter @@ -328,7 +328,7 @@ class K3d { // install crd first helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") - prepatchFQDN() + //prepatchFQDN() helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") From 09e6e9575fae33bec8e71aadc3738b5f37ac40af Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 07:24:42 +0000 Subject: [PATCH 12/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 3b51c47f..333eebc3 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -255,10 +255,23 @@ class K3d { void configureEcosystemCoreValues(config = [:]) { - yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes = 15") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes = 5") + + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-dogu-operator.version", "3.15.0") + + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator-crd.version", "2.0.1") + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.version", "3.0.0-CR1") + + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.valuesObject.healthConfig.components.required = [{\"name\": \"k8s-dogu-operator\"}, {\"name\": \"k8s-service-discovery\"}]") + + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.internalTrafficPolicy", "Cluster") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.externalTrafficPolicy", "Cluster") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".backup.enabled = false") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".monitoring.enabled = false") + + script.echo "configuring ecosystem core..." // Merge default config with the one passed as parameter config = defaultSetupConfig << config From 366507e023ad9a73a8c357b8e9ae13e17e0f6031 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 07:33:05 +0000 Subject: [PATCH 13/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 333eebc3..68ebcfb7 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -262,7 +262,7 @@ class K3d { appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator-crd.version", "2.0.1") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.version", "3.0.0-CR1") - yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.valuesObject.healthConfig.components.required = [{\"name\": \"k8s-dogu-operator\"}, {\"name\": \"k8s-service-discovery\"}]") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.valuesObject.healthConfig.components.required = [{name: k8s-dogu-operator}, {name: k8s-service-discovery}]") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.internalTrafficPolicy", "Cluster") From f9d7c460b9ceb8420d753d4b6e6ae0c237a54d7b Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 07:35:44 +0000 Subject: [PATCH 14/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 68ebcfb7..64752c74 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -262,7 +262,7 @@ class K3d { appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator-crd.version", "2.0.1") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.version", "3.0.0-CR1") - yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.valuesObject.healthConfig.components.required = [{name: k8s-dogu-operator}, {name: k8s-service-discovery}]") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.valuesObject.healthConfig.components.required = [{\\\"name\\\": \\\"k8s-dogu-operator\\\"}, {\\\"name\\\": \\\"k8s-service-discovery\\\"}]") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.internalTrafficPolicy", "Cluster") From 43493dec4e6a91f83bfd50ec3f5855a712d5619a Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 07:50:39 +0000 Subject: [PATCH 15/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 64752c74..fa1b34a1 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -749,9 +749,10 @@ ${formattedDeps} script.dir(K3D_LOG_FILENAME) { script.deleteDir() } - script.sh("rm -rf ${K3D_LOG_FILENAME}.zip".toString()) - script.sh("rm -rf ${K3D_SETUP_JSON_FILE}".toString()) - script.sh("rm -rf ${K3D_VALUES_YAML_FILE}".toString()) + //script.sh("rm -rf ${K3D_LOG_FILENAME}.zip".toString()) + //script.sh("rm -rf ${K3D_SETUP_JSON_FILE}".toString()) + //script.sh("rm -rf ${K3D_BLUEPRINT_FILE}".toString()) + //script.sh("rm -rf ${K3D_VALUES_YAML_FILE}".toString()) collectResourcesSummaries() collectDoguDescriptions() From f5d3c9edb0cadec4226e4cec55e2d74480e9560c Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 08:26:22 +0000 Subject: [PATCH 16/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index fa1b34a1..bd566a01 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -146,9 +146,9 @@ class K3d { // Persists the cache of Jenkins agents pods for faster builds " -v /tmp:/tmp@server:0 " + // Disable traefik (no ingresses used so far) - " --k3s-arg=--disable=traefik@all:* " + + //" --k3s-arg=--disable=traefik@all:* " + // Disable servicelb (avoids "Pending" svclb pods and we use nodePorts right now anyway) - " --k3s-arg=--disable=servicelb@all:* " + + //" --k3s-arg=--disable=servicelb@all:* " + // Pin k8s version to 1.21.2 " --image=${K8S_IMAGE} " + // Use our k3d registry From 20c5befd8a8721e4c34b63a08414bc84258d03e4 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 08:44:26 +0000 Subject: [PATCH 17/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index bd566a01..3f27cb1c 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -146,7 +146,7 @@ class K3d { // Persists the cache of Jenkins agents pods for faster builds " -v /tmp:/tmp@server:0 " + // Disable traefik (no ingresses used so far) - //" --k3s-arg=--disable=traefik@all:* " + + //" --k3s-arg=--disable=traefik@all:* " +a // Disable servicelb (avoids "Pending" svclb pods and we use nodePorts right now anyway) //" --k3s-arg=--disable=servicelb@all:* " + // Pin k8s version to 1.21.2 @@ -341,7 +341,7 @@ class K3d { // install crd first helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") - //prepatchFQDN() + kubectl("--namespace default create configmap global-config --from-literal=config.yaml='fqdn: ${externalIP}'") helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") From ead037372c3bedd4374e9326c886bd36547f5338 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 08:56:40 +0000 Subject: [PATCH 18/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 3f27cb1c..36ce97c8 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -256,7 +256,7 @@ class K3d { void configureEcosystemCoreValues(config = [:]) { yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes = 5") - + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-dogu-operator-crd.version", "2.10.0") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-dogu-operator.version", "3.15.0") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator-crd.version", "2.0.1") From c8c834ededa3a8879a3cfd873b7a2c9e0d661a6c Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 08:57:11 +0000 Subject: [PATCH 19/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 36ce97c8..f3a2e915 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -749,10 +749,10 @@ ${formattedDeps} script.dir(K3D_LOG_FILENAME) { script.deleteDir() } - //script.sh("rm -rf ${K3D_LOG_FILENAME}.zip".toString()) - //script.sh("rm -rf ${K3D_SETUP_JSON_FILE}".toString()) - //script.sh("rm -rf ${K3D_BLUEPRINT_FILE}".toString()) - //script.sh("rm -rf ${K3D_VALUES_YAML_FILE}".toString()) + script.sh("rm -rf ${K3D_LOG_FILENAME}.zip".toString()) + script.sh("rm -rf ${K3D_SETUP_JSON_FILE}".toString()) + script.sh("rm -rf ${K3D_BLUEPRINT_FILE}".toString()) + script.sh("rm -rf ${K3D_VALUES_YAML_FILE}".toString()) collectResourcesSummaries() collectDoguDescriptions() From 5e8057b5a2ec4cc6e4af79589c00e133f6362c78 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 09:01:16 +0000 Subject: [PATCH 20/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index f3a2e915..f54b3bf8 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -348,12 +348,10 @@ class K3d { script.echo "Wait for blueprint-operator to be ready..." waitForDeploymentRollout("k8s-blueprint-operator-controller-manager", timeout, interval) - helm("apply -f ${K3D_BLUEPRINT_FILE} --namespace default") + kubectl("apply -f ${K3D_BLUEPRINT_FILE} --namespace default") helm("registry logout ${registryUrl}") - - script.echo "Wait for setup-finisher to be executed..." waitForSetupToFinish(timeout, interval) From 94b3169cff52026d9a554feb45187b525710beb6 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 09:15:17 +0000 Subject: [PATCH 21/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 45 ++++++++++----------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index f54b3bf8..a12216a1 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -646,17 +646,6 @@ data: return formatted } - private void prepatchFQDN() { - String global_config_map = kubectl("get configmap global-config -n default -o yaml", true) - script.writeFile file: "cm.yaml", text: global_config_map - - doInYQContainer { - script.sh("yq eval -i '.data[\"config.yaml\"] |= (from_yaml | .fqdn = \"${externalIP}\" | to_yaml)' cm.yaml") - } - - kubectl("apply -f cm.yaml") - } - private void writeBlueprintYaml(config) { List deps = config.dependencies + config.additionalDependencies String formattedDeps = formatDependencies(deps) @@ -677,17 +666,27 @@ ${formattedDeps} config: dogus: ldap: - "admin_username": "${config.adminUsername}" - "admin_mail": "ces-admin@cloudogu.com" - "admin_member": "true" - "admin_password": "${config.adminPassword}" + - key: admin_username + value: "${config.adminUsername}" + - key: admin_mail + value: "ces-admin@cloudogu.com" + - key: admin_member + value: "true" + - key: admin_password + value: "${config.adminPassword}" global: - "fqdn": "${externalIP}" - "domain": "ces.local" - "certificate/type": "selfsigned" - "k8s/use_internal_ip": "false" - "internalIp": "" - "admin_group": "${config.adminGroup}" + - key: fqdn + value: "${externalIP}" + - key: domain + value: "ces.local" + - key: certificate/type + value: "selfsigned" + - key: k8s/use_internal_ip + value: "false" + - key: internalIp + value: "" + - key: admin_group + value: "${config.adminGroup}" """ } @@ -749,8 +748,8 @@ ${formattedDeps} } script.sh("rm -rf ${K3D_LOG_FILENAME}.zip".toString()) script.sh("rm -rf ${K3D_SETUP_JSON_FILE}".toString()) - script.sh("rm -rf ${K3D_BLUEPRINT_FILE}".toString()) - script.sh("rm -rf ${K3D_VALUES_YAML_FILE}".toString()) + //script.sh("rm -rf ${K3D_BLUEPRINT_FILE}".toString()) + //script.sh("rm -rf ${K3D_VALUES_YAML_FILE}".toString()) collectResourcesSummaries() collectDoguDescriptions() From 90ff380f26a7180f0aea9c9d0eaf8742f327d070 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 09:27:59 +0000 Subject: [PATCH 22/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index a12216a1..2fe749ea 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -361,7 +361,7 @@ class K3d { void waitForDogusToBeRolledOut(Integer timeout, Integer interval) { String dogus = kubectl("get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'", true) - String[] doguList = dogus.split("\n") + String[] doguList = dogus.trim().split("\n") for (String dogu : doguList) { script.echo "Wait for $dogu to be rolled out..." waitForDeploymentRollout(dogu, timeout, interval) @@ -371,13 +371,13 @@ class K3d { void waitForSetupToFinish(Integer timeout, Integer interval) { for (int i = 0; i < timeout / interval; i++) { script.sh("sleep ${interval}s") - String deploys = kubectl("get deployments --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'", true) - if (!deploys.contains("k8s-ces-setup")) { + String blueprintReady = kubectl("get blueprint -n=default blueprint-ces-module -o jsonpath='{.status.conditions[?(@.type==\"EcosystemHealthy\")].status}{\" \"}{.status.conditions[?(@.type==\"Completed\")].status}'", true) + if (blueprintReady == "True True") { return } } - this.script.error "failed to wait for setup to finish: timeout" + this.script.error "failed to wait for ecosystem-core setup to finish: ${timeout}" } /** From ae8c1483f9f886556735062543f3aa12a04469dc Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 09:31:35 +0000 Subject: [PATCH 23/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 2fe749ea..325a3714 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -372,6 +372,7 @@ class K3d { for (int i = 0; i < timeout / interval; i++) { script.sh("sleep ${interval}s") String blueprintReady = kubectl("get blueprint -n=default blueprint-ces-module -o jsonpath='{.status.conditions[?(@.type==\"EcosystemHealthy\")].status}{\" \"}{.status.conditions[?(@.type==\"Completed\")].status}'", true) + script.echo blueprintReady if (blueprintReady == "True True") { return } From 851dc598265c4e4e501a52e9c153ab52ea16fa4f Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 09:35:15 +0000 Subject: [PATCH 24/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 325a3714..b4918263 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -372,13 +372,15 @@ class K3d { for (int i = 0; i < timeout / interval; i++) { script.sh("sleep ${interval}s") String blueprintReady = kubectl("get blueprint -n=default blueprint-ces-module -o jsonpath='{.status.conditions[?(@.type==\"EcosystemHealthy\")].status}{\" \"}{.status.conditions[?(@.type==\"Completed\")].status}'", true) + String dogus = kubectl("get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'", true) script.echo blueprintReady + script.echo dogus if (blueprintReady == "True True") { return } } - this.script.error "failed to wait for ecosystem-core setup to finish: ${timeout}" + this.script.error "failed to wait for ecosystem-core setup to finish: timeout" } /** From 85466bcc8808c9103a7644a853c6fb7063e9d836 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 09:55:16 +0000 Subject: [PATCH 25/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 30 ++++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index b4918263..ea3c013a 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -635,14 +635,30 @@ data: return [registryIp, registryPort] } - static String formatDependencies(List deps) { + String formatDependencies(List deps) { String formatted = "" - - for (int i = 0; i < deps.size(); i++) { - formatted += " - name: ${deps[i]}\n" + - " version: latest" - if ((i + 1) < deps.size()) { - formatted += '\n' + script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: harborCredentialsID, usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD']]) { + for (int i = 0; i < deps.size(); i++) { + String[] parts = deps[i].split[":"] + String version = "" + if (parts.length > 1 && parts[1] != "latest") { + version = parts[1] + } else { + String url = "https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions" + def connection = new URL(url).openConnection() + String basicAuth = "Basic " + "${script.env.HARBOR_USERNAME}:${script.env.HARBOR_PASSWORD}".bytes.encodeBase64().toString() + connection.setRequestProperty("Authorization", basicAuth) + connection.setRequestMethod("GET") + connection.connect() + + def response = connection.inputStream.text + script.echo response + } + formatted += " - name: ${parts[0]}\n" + + " version: ${version}" + if ((i + 1) < deps.size()) { + formatted += '\n' + } } } From a5f81f1bb731a3eac611c663db5d9a74e653c13d Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 09:58:01 +0000 Subject: [PATCH 26/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index ea3c013a..e7c6bc93 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -639,7 +639,7 @@ data: String formatted = "" script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: harborCredentialsID, usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD']]) { for (int i = 0; i < deps.size(); i++) { - String[] parts = deps[i].split[":"] + String[] parts = deps[i].split(":") String version = "" if (parts.length > 1 && parts[1] != "latest") { version = parts[1] From a014a2b94a9706f21c3dfcc1efb308448e08774b Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 10:06:31 +0000 Subject: [PATCH 27/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 24 +++++---------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index e7c6bc93..c880b3c3 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -35,10 +35,10 @@ class K3d { adminUsername : "ces-admin", adminPassword : "ecosystem2016", adminGroup : "CesAdministrators", - dependencies : ["official/ldap", - "official/cas", - "official/postfix", - "official/usermgt"], + dependencies : ["official/ldap:2.6.8-4", + "official/cas:7.2.7.4", + "official/postfix:3.10.4.4-1", + "official/usermgt:1.20.0.5"], defaultDogu : "", additionalDependencies : [], registryConfig : "", @@ -640,22 +640,8 @@ data: script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: harborCredentialsID, usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD']]) { for (int i = 0; i < deps.size(); i++) { String[] parts = deps[i].split(":") - String version = "" - if (parts.length > 1 && parts[1] != "latest") { - version = parts[1] - } else { - String url = "https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions" - def connection = new URL(url).openConnection() - String basicAuth = "Basic " + "${script.env.HARBOR_USERNAME}:${script.env.HARBOR_PASSWORD}".bytes.encodeBase64().toString() - connection.setRequestProperty("Authorization", basicAuth) - connection.setRequestMethod("GET") - connection.connect() - - def response = connection.inputStream.text - script.echo response - } formatted += " - name: ${parts[0]}\n" + - " version: ${version}" + " version: ${parts[1]}" if ((i + 1) < deps.size()) { formatted += '\n' } From df4331b4c8e34d9a10f7b9ef53d1176d8267fa5e Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 10:12:44 +0000 Subject: [PATCH 28/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index c880b3c3..f0580715 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -640,6 +640,7 @@ data: script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: harborCredentialsID, usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD']]) { for (int i = 0; i < deps.size(); i++) { String[] parts = deps[i].split(":") + script.echo parts formatted += " - name: ${parts[0]}\n" + " version: ${parts[1]}" if ((i + 1) < deps.size()) { From 6418d0e5d0aff8e84763c9ab7d6db40fd508c223 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 10:15:30 +0000 Subject: [PATCH 29/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index f0580715..3a10d15b 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -640,7 +640,7 @@ data: script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: harborCredentialsID, usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD']]) { for (int i = 0; i < deps.size(); i++) { String[] parts = deps[i].split(":") - script.echo parts + script.echo "DEP: '${deps[i]}'" formatted += " - name: ${parts[0]}\n" + " version: ${parts[1]}" if ((i + 1) < deps.size()) { From 2165081c2ed1da5b39bd49d42a563477dc7c61e6 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 10:42:31 +0000 Subject: [PATCH 30/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 3a10d15b..73ca30b7 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -638,11 +638,23 @@ data: String formatDependencies(List deps) { String formatted = "" script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: harborCredentialsID, usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD']]) { + String auth = script.sh(script: "printf '%s:%s' '${script.env.HARBOR_USERNAME}' '${script.env.HARBOR_PASSWORD}' | base64", returnStdout: true,) for (int i = 0; i < deps.size(); i++) { String[] parts = deps[i].split(":") script.echo "DEP: '${deps[i]}'" + String version = ""; + if (parts.length != 2 || parts[1] == "latest") { + docker.image("alpine") + .mountJenkinsUser().inside("--volume ${this.workspace}:/workdir -w /workdir"){ + version = script.sh(script: "apk add --no-cache curl jq >/dev/null && \ + curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} \ + | jq -r '.[]' | sort -V | tail -1", returnStdout: true) + } + } else { + version = parts[1] + } formatted += " - name: ${parts[0]}\n" + - " version: ${parts[1]}" + " version: ${version}" if ((i + 1) < deps.size()) { formatted += '\n' } From 8650c7c494f7719d585ec2a8629f953520a16c4c Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 10:50:21 +0000 Subject: [PATCH 31/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 73ca30b7..c965c537 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -644,10 +644,9 @@ data: script.echo "DEP: '${deps[i]}'" String version = ""; if (parts.length != 2 || parts[1] == "latest") { - docker.image("alpine") + docker.image("imega/jq") .mountJenkinsUser().inside("--volume ${this.workspace}:/workdir -w /workdir"){ - version = script.sh(script: "apk add --no-cache curl jq >/dev/null && \ - curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} \ + version = script.sh(script: "curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} \ | jq -r '.[]' | sort -V | tail -1", returnStdout: true) } } else { From d888cef9da04d3332c9759ccd74119e50328f10d Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 10:50:44 +0000 Subject: [PATCH 32/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index c965c537..4dac2ab4 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -644,7 +644,7 @@ data: script.echo "DEP: '${deps[i]}'" String version = ""; if (parts.length != 2 || parts[1] == "latest") { - docker.image("imega/jq") + docker.image("pascaliske/alpine‑curl‑jq") .mountJenkinsUser().inside("--volume ${this.workspace}:/workdir -w /workdir"){ version = script.sh(script: "curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} \ | jq -r '.[]' | sort -V | tail -1", returnStdout: true) From c7c3e520022e714a5d50fb99313acb805b6541e0 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 10:56:05 +0000 Subject: [PATCH 33/71] [151] first test with custom setup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 4dac2ab4..ec2de63d 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -644,7 +644,7 @@ data: script.echo "DEP: '${deps[i]}'" String version = ""; if (parts.length != 2 || parts[1] == "latest") { - docker.image("pascaliske/alpine‑curl‑jq") + docker.image("pascaliske/alpine‑curl‑jq:latest") .mountJenkinsUser().inside("--volume ${this.workspace}:/workdir -w /workdir"){ version = script.sh(script: "curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} \ | jq -r '.[]' | sort -V | tail -1", returnStdout: true) From f78d8d1c59267470b0c52ac531d18e7385434cfd Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 12:55:28 +0000 Subject: [PATCH 34/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index ec2de63d..2cc5d194 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -644,10 +644,10 @@ data: script.echo "DEP: '${deps[i]}'" String version = ""; if (parts.length != 2 || parts[1] == "latest") { - docker.image("pascaliske/alpine‑curl‑jq:latest") + docker.image("mikefarah/yq:${YQ_VERSION}") .mountJenkinsUser().inside("--volume ${this.workspace}:/workdir -w /workdir"){ version = script.sh(script: "curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} \ - | jq -r '.[]' | sort -V | tail -1", returnStdout: true) + | yq 'sort_by(.) | .[-1]'", returnStdout: true) } } else { version = parts[1] From 08f4a28a39c40bbff100cd16c7a8af781ca86d8f Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:01:58 +0000 Subject: [PATCH 35/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 2cc5d194..561472f2 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -646,8 +646,7 @@ data: if (parts.length != 2 || parts[1] == "latest") { docker.image("mikefarah/yq:${YQ_VERSION}") .mountJenkinsUser().inside("--volume ${this.workspace}:/workdir -w /workdir"){ - version = script.sh(script: "curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} \ - | yq 'sort_by(.) | .[-1]'", returnStdout: true) + version = script.sh(script: "apk add --no-cache curl && curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} | yq 'sort_by(.) | .[-1]'", returnStdout: true) } } else { version = parts[1] From 8a0cd1ccc6daa5845a91bacb33b4801a54246e3b Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:13:20 +0000 Subject: [PATCH 36/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 37 ++++++++++----------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 561472f2..bffe6a6a 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -1,6 +1,7 @@ package com.cloudogu.ces.cesbuildlib import com.cloudbees.groovy.cps.NonCPS +import groovy.json.JsonOutput class K3d { /** @@ -30,6 +31,7 @@ class K3d { private String registryName private String workspace private Docker docker + private HttpClient httpClient def defaultSetupConfig = [ adminUsername : "ces-admin", @@ -70,6 +72,7 @@ class K3d { this.harborCredentialsID = harborCredentialsID this.sh = new Sh(script) this.docker = new Docker(script) + this.httpClient = new HttpClient(this, harborCredentialsID) } /** @@ -637,25 +640,21 @@ data: String formatDependencies(List deps) { String formatted = "" - script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: harborCredentialsID, usernameVariable: 'HARBOR_USERNAME', passwordVariable: 'HARBOR_PASSWORD']]) { - String auth = script.sh(script: "printf '%s:%s' '${script.env.HARBOR_USERNAME}' '${script.env.HARBOR_PASSWORD}' | base64", returnStdout: true,) - for (int i = 0; i < deps.size(); i++) { - String[] parts = deps[i].split(":") - script.echo "DEP: '${deps[i]}'" - String version = ""; - if (parts.length != 2 || parts[1] == "latest") { - docker.image("mikefarah/yq:${YQ_VERSION}") - .mountJenkinsUser().inside("--volume ${this.workspace}:/workdir -w /workdir"){ - version = script.sh(script: "apk add --no-cache curl && curl -s https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions -u ${auth} | yq 'sort_by(.) | .[-1]'", returnStdout: true) - } - } else { - version = parts[1] - } - formatted += " - name: ${parts[0]}\n" + - " version: ${version}" - if ((i + 1) < deps.size()) { - formatted += '\n' - } + for (int i = 0; i < deps.size(); i++) { + String[] parts = deps[i].split(":") + script.echo "DEP: '${deps[i]}'" + String version = ""; + if (parts.length != 2 || parts[1] == "latest") { + def response = httpClient.get("https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions") + def versions = script.readJSON text: response["body"], returnPojo: true + version = version[0] + } else { + version = parts[1] + } + formatted += " - name: ${parts[0]}\n" + + " version: ${version}" + if ((i + 1) < deps.size()) { + formatted += '\n' } } From 2ced7bc1c6cee5b01f3e10bc1dc58ab97e27364a Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:13:29 +0000 Subject: [PATCH 37/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index bffe6a6a..9194d908 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -647,7 +647,7 @@ data: if (parts.length != 2 || parts[1] == "latest") { def response = httpClient.get("https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions") def versions = script.readJSON text: response["body"], returnPojo: true - version = version[0] + version = versions[0] } else { version = parts[1] } From 9da79fb8a9ec817c2da48467675367ca804e93ca Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:17:46 +0000 Subject: [PATCH 38/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 9194d908..3dc71f61 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -72,7 +72,7 @@ class K3d { this.harborCredentialsID = harborCredentialsID this.sh = new Sh(script) this.docker = new Docker(script) - this.httpClient = new HttpClient(this, harborCredentialsID) + this.httpClient = new HttpClient(this, "harbor-robot-trivy-cve") } /** From 5ab7d19fe5a412ced62c9f64e1a4ee027c27898d Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:27:23 +0000 Subject: [PATCH 39/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 3dc71f61..2025551e 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -2,6 +2,7 @@ package com.cloudogu.ces.cesbuildlib import com.cloudbees.groovy.cps.NonCPS import groovy.json.JsonOutput +import com.cloudogu.ces.cesbuildlib.* class K3d { /** @@ -72,7 +73,7 @@ class K3d { this.harborCredentialsID = harborCredentialsID this.sh = new Sh(script) this.docker = new Docker(script) - this.httpClient = new HttpClient(this, "harbor-robot-trivy-cve") + this.httpClient = new HttpClient(this.script, "harbor-robot-trivy-cve") } /** @@ -646,8 +647,9 @@ data: String version = ""; if (parts.length != 2 || parts[1] == "latest") { def response = httpClient.get("https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions") + script.echo JsonOutput.toJson(response["body"].toString()) def versions = script.readJSON text: response["body"], returnPojo: true - version = versions[0] + version = versions.getAt(0 as String) } else { version = parts[1] } From 18ca15b05c59226916113c494706bbe7aabb46ef Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:32:01 +0000 Subject: [PATCH 40/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 2025551e..55926de6 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -150,9 +150,9 @@ class K3d { // Persists the cache of Jenkins agents pods for faster builds " -v /tmp:/tmp@server:0 " + // Disable traefik (no ingresses used so far) - //" --k3s-arg=--disable=traefik@all:* " +a + " --k3s-arg=--disable=traefik@all:* " +a // Disable servicelb (avoids "Pending" svclb pods and we use nodePorts right now anyway) - //" --k3s-arg=--disable=servicelb@all:* " + + " --k3s-arg=--disable=servicelb@all:* " + // Pin k8s version to 1.21.2 " --image=${K8S_IMAGE} " + // Use our k3d registry @@ -647,7 +647,8 @@ data: String version = ""; if (parts.length != 2 || parts[1] == "latest") { def response = httpClient.get("https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions") - script.echo JsonOutput.toJson(response["body"].toString()) + script.echo response["body"] + script.echo response["status"] def versions = script.readJSON text: response["body"], returnPojo: true version = versions.getAt(0 as String) } else { From e2ee1fe00e8525ab059bdbbc8411a51c62d2817d Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:33:43 +0000 Subject: [PATCH 41/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 55926de6..ac6b362a 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -73,7 +73,7 @@ class K3d { this.harborCredentialsID = harborCredentialsID this.sh = new Sh(script) this.docker = new Docker(script) - this.httpClient = new HttpClient(this.script, "harbor-robot-trivy-cve") + this.httpClient = new HttpClient(this.script, harborCredentialsID) } /** From fdc9e19d7a13f1cba8cd4d5f864ca79a96a377f4 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:37:36 +0000 Subject: [PATCH 42/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index ac6b362a..a9f5d905 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -647,8 +647,7 @@ data: String version = ""; if (parts.length != 2 || parts[1] == "latest") { def response = httpClient.get("https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions") - script.echo response["body"] - script.echo response["status"] + script.echo JsonOutput.toJson(response["body"].toString()) def versions = script.readJSON text: response["body"], returnPojo: true version = versions.getAt(0 as String) } else { From de05272ccb46b603940765b7e334d203a7ff5c9c Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:39:51 +0000 Subject: [PATCH 43/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index a9f5d905..1db76dd2 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -150,7 +150,7 @@ class K3d { // Persists the cache of Jenkins agents pods for faster builds " -v /tmp:/tmp@server:0 " + // Disable traefik (no ingresses used so far) - " --k3s-arg=--disable=traefik@all:* " +a + " --k3s-arg=--disable=traefik@all:* " + // Disable servicelb (avoids "Pending" svclb pods and we use nodePorts right now anyway) " --k3s-arg=--disable=servicelb@all:* " + // Pin k8s version to 1.21.2 From be1996123580a546c1556aa83b5a44847ac40c66 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:40:49 +0000 Subject: [PATCH 44/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 1db76dd2..585864ed 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -647,6 +647,8 @@ data: String version = ""; if (parts.length != 2 || parts[1] == "latest") { def response = httpClient.get("https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions") + script.echo response["body"] + script.echo response["status"] script.echo JsonOutput.toJson(response["body"].toString()) def versions = script.readJSON text: response["body"], returnPojo: true version = versions.getAt(0 as String) From d2d9810c69f2c3a8042672807db4c87224c9dcf6 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:46:41 +0000 Subject: [PATCH 45/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 585864ed..48cb9e75 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -647,8 +647,9 @@ data: String version = ""; if (parts.length != 2 || parts[1] == "latest") { def response = httpClient.get("https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions") + script.echo response["httpCode"] script.echo response["body"] - script.echo response["status"] + script.echo JsonOutput.toJson(response["body"].toString()) def versions = script.readJSON text: response["body"], returnPojo: true version = versions.getAt(0 as String) From 14ad1693427c334a0e4802bfcd384f2df8ccd6a8 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 13:55:46 +0000 Subject: [PATCH 46/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy b/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy index fd393772..1cace345 100644 --- a/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy @@ -59,7 +59,8 @@ class HttpClient implements Serializable { } private String getCurlCommand(String httpMethod, String url, String contentType, String data) { - return "curl -i -X '" + escapeSingleQuotes(httpMethod) + "' " + + // TODO remove -v + return "curl -i -v -X '" + escapeSingleQuotes(httpMethod) + "' " + (credentials ? getCurlAuthParam() : '') + (contentType ? "-H 'Content-Type: " + escapeSingleQuotes(contentType) + "' " : '') + (data ? "-d '" + escapeSingleQuotes(data) + "' " : '') + From 4cec2dfe8ba3821e61dfa5cfe9d2536aba53fc23 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 14:10:34 +0000 Subject: [PATCH 47/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy b/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy index 1cace345..eb588170 100644 --- a/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy @@ -59,8 +59,7 @@ class HttpClient implements Serializable { } private String getCurlCommand(String httpMethod, String url, String contentType, String data) { - // TODO remove -v - return "curl -i -v -X '" + escapeSingleQuotes(httpMethod) + "' " + + return "curl -i '" + escapeSingleQuotes(httpMethod) + "' " + (credentials ? getCurlAuthParam() : '') + (contentType ? "-H 'Content-Type: " + escapeSingleQuotes(contentType) + "' " : '') + (data ? "-d '" + escapeSingleQuotes(data) + "' " : '') + @@ -68,7 +67,7 @@ class HttpClient implements Serializable { } private String getUploadFileCurlCommand(String httpMethod, String url, String contentType, String filePath) { - return "curl -i -X '" + escapeSingleQuotes(httpMethod) + "' " + + return "curl -i '" + escapeSingleQuotes(httpMethod) + "' " + (credentials ? getCurlAuthParam() : '') + (contentType ? "-H 'Content-Type: " + escapeSingleQuotes(contentType) + "' " : '') + (filePath ? "-T '" + escapeSingleQuotes(filePath) + "' " : '') + From 85484cd2fbd24969a3fbf9a8ff21f2a8c4b44f17 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 3 Nov 2025 14:38:15 +0000 Subject: [PATCH 48/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy b/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy index eb588170..b10c7081 100644 --- a/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy @@ -59,7 +59,7 @@ class HttpClient implements Serializable { } private String getCurlCommand(String httpMethod, String url, String contentType, String data) { - return "curl -i '" + escapeSingleQuotes(httpMethod) + "' " + + return "curl -i " + (credentials ? getCurlAuthParam() : '') + (contentType ? "-H 'Content-Type: " + escapeSingleQuotes(contentType) + "' " : '') + (data ? "-d '" + escapeSingleQuotes(data) + "' " : '') + From b840fcae7c93e57faca7f7b2a790249ac137e00e Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 07:39:08 +0000 Subject: [PATCH 49/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 48cb9e75..78440b9f 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -395,6 +395,12 @@ class K3d { * @param interval Interval in seconds for querying the actual state of the setup e. g. 2 */ void setup(String tag, config = [:], Integer timout = 300, Integer interval = 5) { + docker.image("cloudogu/base:latest") + .mountJenkinsUser() + .inside("--volume ${this.workspace}:/workdir -w /workdir") { + String dogulist = this.sh.returnStdOut("cesapp list-remote") + script.echo dogulist + } assignExternalIP() configureEcosystemCoreValues(config) installAndTriggerSetup(tag, timout, interval) From c2e250f1ab9c0947bee792500e2527138236bac7 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 08:03:18 +0000 Subject: [PATCH 50/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 78440b9f..cdd257d1 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -395,12 +395,14 @@ class K3d { * @param interval Interval in seconds for querying the actual state of the setup e. g. 2 */ void setup(String tag, config = [:], Integer timout = 300, Integer interval = 5) { - docker.image("cloudogu/base:latest") - .mountJenkinsUser() - .inside("--volume ${this.workspace}:/workdir -w /workdir") { - String dogulist = this.sh.returnStdOut("cesapp list-remote") - script.echo dogulist - } + docker.withRegistry('https://registry.cloudogu.com/', "cesmarvin-setup") { + docker.image("official/base:3.22.0-4") + .mountJenkinsUser() + .inside("--volume ${this.workspace}:/workdir -w /workdir") { + String dogulist = this.sh.returnStdOut("cesapp list-remote") + script.echo dogulist + } + } assignExternalIP() configureEcosystemCoreValues(config) installAndTriggerSetup(tag, timout, interval) From e03c08929c4fa0b8562c1eaedcb8785838e241d1 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 08:36:28 +0000 Subject: [PATCH 51/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index cdd257d1..4cc36878 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -395,13 +395,9 @@ class K3d { * @param interval Interval in seconds for querying the actual state of the setup e. g. 2 */ void setup(String tag, config = [:], Integer timout = 300, Integer interval = 5) { - docker.withRegistry('https://registry.cloudogu.com/', "cesmarvin-setup") { - docker.image("official/base:3.22.0-4") - .mountJenkinsUser() - .inside("--volume ${this.workspace}:/workdir -w /workdir") { - String dogulist = this.sh.returnStdOut("cesapp list-remote") - script.echo dogulist - } + script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'cesmarvin-setup', usernameVariable: 'TOKEN_ID', passwordVariable: 'TOKEN_SECRET']]) { + script.sh "sudo cesapp login ${script.env.TOKEN_ID} ${script.env.TOKEN_SECRET}" + script.sh "sudo cesapp list-remote" } assignExternalIP() configureEcosystemCoreValues(config) From 8c5c6a42816562472b38fb67c741c7b6621554e7 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 08:43:30 +0000 Subject: [PATCH 52/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 4cc36878..1476bd46 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -396,8 +396,7 @@ class K3d { */ void setup(String tag, config = [:], Integer timout = 300, Integer interval = 5) { script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'cesmarvin-setup', usernameVariable: 'TOKEN_ID', passwordVariable: 'TOKEN_SECRET']]) { - script.sh "sudo cesapp login ${script.env.TOKEN_ID} ${script.env.TOKEN_SECRET}" - script.sh "sudo cesapp list-remote" + script.sh "curl https://registry.cloudogu.com/v2/official/postgresql/tags/list -u ${script.env.TOKEN_ID}:${script.env.TOKEN_SECRET}" } assignExternalIP() configureEcosystemCoreValues(config) From 7f728b37e5682360d4712f16f4f70eddf5725425 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 08:55:51 +0000 Subject: [PATCH 53/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 33 +++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 1476bd46..2dd46a9e 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -3,6 +3,7 @@ package com.cloudogu.ces.cesbuildlib import com.cloudbees.groovy.cps.NonCPS import groovy.json.JsonOutput import com.cloudogu.ces.cesbuildlib.* +import groovy.json.JsonSlurper class K3d { /** @@ -395,9 +396,6 @@ class K3d { * @param interval Interval in seconds for querying the actual state of the setup e. g. 2 */ void setup(String tag, config = [:], Integer timout = 300, Integer interval = 5) { - script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'cesmarvin-setup', usernameVariable: 'TOKEN_ID', passwordVariable: 'TOKEN_SECRET']]) { - script.sh "curl https://registry.cloudogu.com/v2/official/postgresql/tags/list -u ${script.env.TOKEN_ID}:${script.env.TOKEN_SECRET}" - } assignExternalIP() configureEcosystemCoreValues(config) installAndTriggerSetup(tag, timout, interval) @@ -649,13 +647,15 @@ data: script.echo "DEP: '${deps[i]}'" String version = ""; if (parts.length != 2 || parts[1] == "latest") { - def response = httpClient.get("https://dogu.cloudogu.com/api/v2/dogus/${parts[0]}/_versions") - script.echo response["httpCode"] - script.echo response["body"] + String tags = "{}"; + script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'cesmarvin-setup', usernameVariable: 'TOKEN_ID', passwordVariable: 'TOKEN_SECRET']]) { + tags = this.sh.returnStdOut("curl https://registry.cloudogu.com/v2/${parts[0]}/tags/list -u ${script.env.TOKEN_ID}:${script.env.TOKEN_SECRET}").trim() + } - script.echo JsonOutput.toJson(response["body"].toString()) - def versions = script.readJSON text: response["body"], returnPojo: true - version = versions.getAt(0 as String) + script.echo JsonOutput.toJson(tags) + def obj = new JsonSlurper().parseText(tags) + + version = obj.tags.max { t -> parseTag(t) } } else { version = parts[1] } @@ -669,6 +669,21 @@ data: return formatted } + def parseTag = { String tag -> + def m = (tag =~ /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-(\d+))?$/) + if (!m.matches()) { + // Fallback: alles 0 setzen, damit „komische“ Tags nicht gewinnen + return [0,0,0,0] + } + // fehlende Gruppen als 0 + return [ + (m[0][1] as int), + (m[0][2] ? m[0][2] as int : 0), + (m[0][3] ? m[0][3] as int : 0), + (m[0][4] ? m[0][4] as int : 0) + ] + } + private void writeBlueprintYaml(config) { List deps = config.dependencies + config.additionalDependencies String formattedDeps = formatDependencies(deps) From c5359a301a23c4699595885728f8d6c48b5fdb48 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 09:06:09 +0000 Subject: [PATCH 54/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 2dd46a9e..6e5f8001 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -645,10 +645,10 @@ data: for (int i = 0; i < deps.size(); i++) { String[] parts = deps[i].split(":") script.echo "DEP: '${deps[i]}'" - String version = ""; + String version; if (parts.length != 2 || parts[1] == "latest") { String tags = "{}"; - script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'cesmarvin-setup', usernameVariable: 'TOKEN_ID', passwordVariable: 'TOKEN_SECRET']]) { + script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: this.backendCredentialsID, usernameVariable: 'TOKEN_ID', passwordVariable: 'TOKEN_SECRET']]) { tags = this.sh.returnStdOut("curl https://registry.cloudogu.com/v2/${parts[0]}/tags/list -u ${script.env.TOKEN_ID}:${script.env.TOKEN_SECRET}").trim() } @@ -669,19 +669,19 @@ data: return formatted } - def parseTag = { String tag -> + private String parseTag = { String tag -> def m = (tag =~ /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-(\d+))?$/) if (!m.matches()) { // Fallback: alles 0 setzen, damit „komische“ Tags nicht gewinnen - return [0,0,0,0] + return "00000.00000.00000.00000" } - // fehlende Gruppen als 0 - return [ - (m[0][1] as int), - (m[0][2] ? m[0][2] as int : 0), - (m[0][3] ? m[0][3] as int : 0), - (m[0][4] ? m[0][4] as int : 0) - ] + def major = (m[0][1] ?: "0") as int + def minor = (m[0][2] ?: "0") as int + def patch = (m[0][3] ?: "0") as int + def build = (m[0][4] ?: "0") as int + + // Zero-padding → lexikografisch sortierbar + return sprintf("%05d.%05d.%05d.%05d", major, minor, patch, build) } private void writeBlueprintYaml(config) { From ac9133c8697fad30015991a421238b4a15326d59 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 09:11:23 +0000 Subject: [PATCH 55/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 6e5f8001..c3b4aea4 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -655,7 +655,7 @@ data: script.echo JsonOutput.toJson(tags) def obj = new JsonSlurper().parseText(tags) - version = obj.tags.max { t -> parseTag(t) } + version = obj.tags.max { t -> script.parseTag("${t}") } } else { version = parts[1] } @@ -669,7 +669,7 @@ data: return formatted } - private String parseTag = { String tag -> + private String parseTag(String tag) { def m = (tag =~ /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-(\d+))?$/) if (!m.matches()) { // Fallback: alles 0 setzen, damit „komische“ Tags nicht gewinnen From 9c7abf828f375f6c09ceb45e6f0784b91701225e Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 09:16:53 +0000 Subject: [PATCH 56/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index c3b4aea4..ccde6f2d 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -655,7 +655,7 @@ data: script.echo JsonOutput.toJson(tags) def obj = new JsonSlurper().parseText(tags) - version = obj.tags.max { t -> script.parseTag("${t}") } + version = obj.tags.max { t -> parseTag("${t}") } } else { version = parts[1] } From 159cfa7fe7063e48cc1a584e22cc7cdd3604a8fc Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 09:35:57 +0000 Subject: [PATCH 57/71] [151] use yq instead of unsecure jq image --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index ccde6f2d..3a9b9b78 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -39,10 +39,10 @@ class K3d { adminUsername : "ces-admin", adminPassword : "ecosystem2016", adminGroup : "CesAdministrators", - dependencies : ["official/ldap:2.6.8-4", - "official/cas:7.2.7.4", - "official/postfix:3.10.4.4-1", - "official/usermgt:1.20.0.5"], + dependencies : ["official/ldap", + "official/cas", + "official/postfix", + "official/usermgt"], defaultDogu : "", additionalDependencies : [], registryConfig : "", @@ -355,13 +355,13 @@ class K3d { kubectl("apply -f ${K3D_BLUEPRINT_FILE} --namespace default") - helm("registry logout ${registryUrl}") - script.echo "Wait for setup-finisher to be executed..." waitForSetupToFinish(timeout, interval) script.echo "Wait for dogus to be ready..." waitForDogusToBeRolledOut(timeout, interval) + + helm("registry logout ${registryUrl}") } void waitForDogusToBeRolledOut(Integer timeout, Integer interval) { From 4498d5547d916b47f558895394571664f2349726 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 10:15:39 +0000 Subject: [PATCH 58/71] [151] cleanup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 63 +++------------------ 1 file changed, 8 insertions(+), 55 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 3a9b9b78..7a88ce61 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -2,7 +2,6 @@ package com.cloudogu.ces.cesbuildlib import com.cloudbees.groovy.cps.NonCPS import groovy.json.JsonOutput -import com.cloudogu.ces.cesbuildlib.* import groovy.json.JsonSlurper class K3d { @@ -15,7 +14,6 @@ class K3d { */ private static String K3D_VERSION = "5.6.0" private static String K3D_LOG_FILENAME = "k8sLogs" - private static String K3D_SETUP_JSON_FILE = "k3d_setup.json" private static String K3D_VALUES_YAML_FILE = "k3d_values.yaml" private static String K3D_BLUEPRINT_FILE = "k3d_blueprint.yaml" private static String YQ_VERSION = "4.40.5" @@ -646,6 +644,7 @@ data: String[] parts = deps[i].split(":") script.echo "DEP: '${deps[i]}'" String version; + // "latest" needs to be replaced with actual last version if (parts.length != 2 || parts[1] == "latest") { String tags = "{}"; script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: this.backendCredentialsID, usernameVariable: 'TOKEN_ID', passwordVariable: 'TOKEN_SECRET']]) { @@ -672,7 +671,7 @@ data: private String parseTag(String tag) { def m = (tag =~ /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-(\d+))?$/) if (!m.matches()) { - // Fallback: alles 0 setzen, damit „komische“ Tags nicht gewinnen + // Fallback: set all to 0 to ingnore invalid tags return "00000.00000.00000.00000" } def major = (m[0][1] ?: "0") as int @@ -680,7 +679,7 @@ data: def patch = (m[0][3] ?: "0") as int def build = (m[0][4] ?: "0") as int - // Zero-padding → lexikografisch sortierbar + // Zero-padding → lexicographically sortable return sprintf("%05d.%05d.%05d.%05d", major, minor, patch, build) } @@ -697,7 +696,7 @@ metadata: name: blueprint-ces-module namespace: default spec: - displayName: "Blueprint Terraform CES-Module" + displayName: "Blueprint K3D CES-Module" blueprint: dogus: ${formattedDeps} @@ -728,53 +727,6 @@ ${formattedDeps} """ } - private void writeSetupJson(config) { - List deps = config.dependencies + config.additionalDependencies - String formattedDeps = formatDependencies(deps) - - script.writeFile file: K3D_SETUP_JSON_FILE, text: """ -{ - "naming":{ - "fqdn":"${externalIP}", - "hostname":"ces", - "domain":"ces.local", - "certificateType":"selfsigned", - "relayHost":"mail.ces.local", - "completed":true - }, - "dogus":{ - "defaultDogu":"${config.defaultDogu}", - "install":[ - ${formattedDeps} - ], - "completed":true - }, - "admin":{ - "username":"${config.adminUsername}", - "mail":"ces-admin@cloudogu.com", - "password":"${config.adminPassword}", - "adminGroup":"${config.adminGroup}", - "adminMember":true, - "completed":true - }, - "userBackend":{ - "port":"389", - "useUserConnectionToFetchAttributes":true, - "dsType":"embedded", - "attributeID":"uid", - "attributeFullname":"cn", - "attributeMail":"mail", - "attributeGroup":"memberOf", - "searchFilter":"(objectClass=person)", - "host":"ldap", - "completed":true - }, - "registryConfig": {${config.registryConfig}}, - "registryConfigEncrypted": {${config.registryConfigEncrypted}} -}""" - } - - /** * Collects all necessary resources and log information used to identify problems with our kubernetes cluster. * @@ -785,9 +737,10 @@ ${formattedDeps} script.deleteDir() } script.sh("rm -rf ${K3D_LOG_FILENAME}.zip".toString()) - script.sh("rm -rf ${K3D_SETUP_JSON_FILE}".toString()) - //script.sh("rm -rf ${K3D_BLUEPRINT_FILE}".toString()) - //script.sh("rm -rf ${K3D_VALUES_YAML_FILE}".toString()) + script.archiveArtifacts(artifacts: K3D_BLUEPRINT_FILE) + script.sh("rm -rf ${K3D_BLUEPRINT_FILE}".toString()) + script.archiveArtifacts(artifacts: K3D_VALUES_YAML_FILE) + script.sh("rm -rf ${K3D_VALUES_YAML_FILE}".toString()) collectResourcesSummaries() collectDoguDescriptions() From fbaad5a7a61671a0d455f509fbba9cd170b74ca1 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 10:16:41 +0000 Subject: [PATCH 59/71] [151] cleanup --- src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy b/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy index b10c7081..fd393772 100644 --- a/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/HttpClient.groovy @@ -59,7 +59,7 @@ class HttpClient implements Serializable { } private String getCurlCommand(String httpMethod, String url, String contentType, String data) { - return "curl -i " + + return "curl -i -X '" + escapeSingleQuotes(httpMethod) + "' " + (credentials ? getCurlAuthParam() : '') + (contentType ? "-H 'Content-Type: " + escapeSingleQuotes(contentType) + "' " : '') + (data ? "-d '" + escapeSingleQuotes(data) + "' " : '') + @@ -67,7 +67,7 @@ class HttpClient implements Serializable { } private String getUploadFileCurlCommand(String httpMethod, String url, String contentType, String filePath) { - return "curl -i '" + escapeSingleQuotes(httpMethod) + "' " + + return "curl -i -X '" + escapeSingleQuotes(httpMethod) + "' " + (credentials ? getCurlAuthParam() : '') + (contentType ? "-H 'Content-Type: " + escapeSingleQuotes(contentType) + "' " : '') + (filePath ? "-T '" + escapeSingleQuotes(filePath) + "' " : '') + From a6bda4315e6ffb2fe5f669803c93033ce89931e6 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 10:20:59 +0000 Subject: [PATCH 60/71] [151] cleanup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 7a88ce61..9d3fccc5 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -31,7 +31,6 @@ class K3d { private String registryName private String workspace private Docker docker - private HttpClient httpClient def defaultSetupConfig = [ adminUsername : "ces-admin", @@ -72,7 +71,6 @@ class K3d { this.harborCredentialsID = harborCredentialsID this.sh = new Sh(script) this.docker = new Docker(script) - this.httpClient = new HttpClient(this.script, harborCredentialsID) } /** From 9299dc99f5e6daf00909dc3a4bc14962d501bb48 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Tue, 4 Nov 2025 10:26:38 +0000 Subject: [PATCH 61/71] [151] cleanup --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 9d3fccc5..3f06a400 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -640,7 +640,6 @@ data: String formatted = "" for (int i = 0; i < deps.size(); i++) { String[] parts = deps[i].split(":") - script.echo "DEP: '${deps[i]}'" String version; // "latest" needs to be replaced with actual last version if (parts.length != 2 || parts[1] == "latest") { @@ -648,10 +647,7 @@ data: script.withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: this.backendCredentialsID, usernameVariable: 'TOKEN_ID', passwordVariable: 'TOKEN_SECRET']]) { tags = this.sh.returnStdOut("curl https://registry.cloudogu.com/v2/${parts[0]}/tags/list -u ${script.env.TOKEN_ID}:${script.env.TOKEN_SECRET}").trim() } - - script.echo JsonOutput.toJson(tags) def obj = new JsonSlurper().parseText(tags) - version = obj.tags.max { t -> parseTag("${t}") } } else { version = parts[1] From 54e447fa4b0354c033ee5155c50a1f8a2e4dbd2d Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 6 Nov 2025 13:23:47 +0000 Subject: [PATCH 62/71] [151] adapt unit-tests to fit new ecosystem-core workflow --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 34 +++++++-- .../cloudogu/ces/cesbuildlib/K3dTest.groovy | 72 ++++++++++--------- 2 files changed, 64 insertions(+), 42 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 3f06a400..6487b1ac 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -1,7 +1,6 @@ package com.cloudogu.ces.cesbuildlib import com.cloudbees.groovy.cps.NonCPS -import groovy.json.JsonOutput import groovy.json.JsonSlurper class K3d { @@ -18,6 +17,11 @@ class K3d { private static String K3D_BLUEPRINT_FILE = "k3d_blueprint.yaml" private static String YQ_VERSION = "4.40.5" + private static String VERSION_K8S_DOGU_OPERATOR = "3.15.0" + private static String VERSION_K8S_DOGU_OPERATOR_CRD = "2.10.0" + private static String VERSION_K8S_BLUEPRINT_OPERATOR = "3.0.0-CR1" + private static String VERSION_K8S_BLUEPRINT_OPERATOR_CRD = "2.0.1" + private String clusterName private script private String path @@ -254,14 +258,32 @@ class K3d { } } + /** + * override component versions + */ + static void setComponentVersions(String dogu_op = VERSION_K8S_DOGU_OPERATOR, String dogu_op_crd = VERSION_K8S_DOGU_OPERATOR_CRD, String blue_op = VERSION_K8S_BLUEPRINT_OPERATOR, String blue_op_crd = VERSION_K8S_BLUEPRINT_OPERATOR_CRD) { + if (dogu_op != null) { + VERSION_K8S_DOGU_OPERATOR = dogu_op + } + if (dogu_op_crd != null) { + VERSION_K8S_DOGU_OPERATOR_CRD = dogu_op_crd + } + if (blue_op != null) { + VERSION_K8S_BLUEPRINT_OPERATOR = blue_op + } + if (blue_op_crd != null) { + VERSION_K8S_BLUEPRINT_OPERATOR_CRD = blue_op_crd + } + } + void configureEcosystemCoreValues(config = [:]) { yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes = 5") - appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-dogu-operator-crd.version", "2.10.0") - appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-dogu-operator.version", "3.15.0") + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-dogu-operator-crd.version", VERSION_K8S_DOGU_OPERATOR_CRD) + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-dogu-operator.version", VERSION_K8S_DOGU_OPERATOR) - appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator-crd.version", "2.0.1") - appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.version", "3.0.0-CR1") + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator-crd.version", VERSION_K8S_BLUEPRINT_OPERATOR_CRD) + appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.version", VERSION_K8S_BLUEPRINT_OPERATOR) yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.valuesObject.healthConfig.components.required = [{\\\"name\\\": \\\"k8s-dogu-operator\\\"}, {\\\"name\\\": \\\"k8s-service-discovery\\\"}]") @@ -373,9 +395,7 @@ class K3d { for (int i = 0; i < timeout / interval; i++) { script.sh("sleep ${interval}s") String blueprintReady = kubectl("get blueprint -n=default blueprint-ces-module -o jsonpath='{.status.conditions[?(@.type==\"EcosystemHealthy\")].status}{\" \"}{.status.conditions[?(@.type==\"Completed\")].status}'", true) - String dogus = kubectl("get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'", true) script.echo blueprintReady - script.echo dogus if (blueprintReady == "True True") { return } diff --git a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy index 60a456e1..0d63e08a 100644 --- a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy +++ b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy @@ -214,16 +214,25 @@ class K3dTest { def workspaceEnvDir = "leK3dWorkSpace" String tag = "v0.6.0" def scriptMock = new ScriptMock() + scriptMock.expectedShRetValueForScript.put("curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip", "192.168.56.2") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/ldap/tags/list -u null:null", "{\"tags\": [\"1.0.0\"]}") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/cas/tags/list -u null:null", "{\"tags\": [\"2.0.0\"]}") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/postfix/tags/list -u null:null", "{\"tags\": [\"3.0.0\"]}") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/usermgt/tags/list -u null:null", "{\"tags\": [\"4.0.0\"]}") + + scriptMock.expectedShRetValueForScript.put("whoami", "jenkins") scriptMock.expectedShRetValueForScript.put("cat /etc/passwd | grep jenkins", "jenkins:x:1000:1000:jenkins,,,:/home/jenkins:/bin/bash") scriptMock.expectedShRetValueForScript.put("yq -i '.setup_json = load_str(\"k3d_setup.json\")' k3d_values.yaml", "foo") - scriptMock.expectedShRetValueForScript.put("curl -s https://raw.githubusercontent.com/cloudogu/k8s-ces-setup/${tag}/k8s/k8s-ces-setup.yaml".toString(), "fake setup yaml with {{ .Namespace }}") scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/k8s-dogu-operator-controller-manager".toString(), "successfully rolled out") - scriptMock.expectedShRetValueForScript.put("curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip", "192.168.56.2") + scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/k8s-blueprint-operator-controller-manager".toString(), "successfully rolled out") + scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get blueprint -n=default blueprint-ces-module -o jsonpath='{.status.conditions[?(@.type==\"EcosystemHealthy\")].status}{\" \"}{.status.conditions[?(@.type==\"Completed\")].status}'".toString(), "True True") + + scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get deployments --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'".toString(), "k8s-dogu-operator\nk8s-service-discovery") - scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'".toString(), "cas\nnginx-ingress") + scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'".toString(), "cas\nldap") scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/cas".toString(), "successfully rolled out") - scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/nginx-ingress".toString(), "successfully rolled out") + scriptMock.expectedShRetValueForScript.put("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/ldap".toString(), "successfully rolled out") K3d sut = new K3d(scriptMock, "leWorkSpace", "leK3dWorkSpace", "path") @@ -232,31 +241,17 @@ class K3dTest { sut.setup(tag, [:], 1, 1) // then - assertThat(scriptMock.actualEcho.get(0)).isEqualTo("configuring setup...") - assertThat(scriptMock.actualEcho.get(1)).isEqualTo("create values.yaml for setup deployment") - assertThat(scriptMock.actualEcho.get(2)).isEqualTo("Installing setup...") - assertThat(scriptMock.actualEcho.get(3)).isEqualTo("Wait for dogu-operator to be ready...") - assertThat(scriptMock.actualEcho.get(4)).isEqualTo("Wait for setup-finisher to be executed...") - assertThat(scriptMock.actualEcho.get(5)).isEqualTo("Wait for dogus to be ready...") - assertThat(scriptMock.actualEcho.get(6)).isEqualTo("Wait for cas to be rolled out...") - assertThat(scriptMock.actualEcho.get(7)).isEqualTo("Wait for nginx-ingress to be rolled out...") - - assertThat(scriptMock.allActualArgs[0].trim()).isEqualTo("curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip") - assertThat(scriptMock.allActualArgs[1].trim()).isEqualTo("whoami".trim()) - assertThat(scriptMock.allActualArgs[2].trim()).isEqualTo("cat /etc/passwd | grep jenkins".trim()) - assertThat(scriptMock.allActualArgs[3].trim()).isEqualTo("yq -i '.setup_json = load_str(\"k3d_setup.json\")' k3d_values.yaml".trim()) - assertThat(scriptMock.allActualArgs[4].trim()).isEqualTo("sudo KUBECONFIG=leK3dWorkSpace/.k3d/.kube/config helm registry login registry.cloudogu.com --username 'null' --password 'null'".trim()) - assertThat(scriptMock.allActualArgs[5].trim()).isEqualTo("sudo KUBECONFIG=leK3dWorkSpace/.k3d/.kube/config helm install -f k3d_values.yaml k8s-ces-setup oci://registry.cloudogu.com/k8s/k8s-ces-setup --version v0.6.0 --namespace default".trim()) - assertThat(scriptMock.allActualArgs[6].trim()).isEqualTo("sudo KUBECONFIG=leK3dWorkSpace/.k3d/.kube/config helm registry logout registry.cloudogu.com".trim()) - assertThat(scriptMock.allActualArgs[7].trim()).isEqualTo("sleep 1s") - assertThat(scriptMock.allActualArgs[8].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/k8s-dogu-operator-controller-manager".trim()) - assertThat(scriptMock.allActualArgs[9].trim()).isEqualTo("sleep 1s") - assertThat(scriptMock.allActualArgs[10].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get deployments --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'") - assertThat(scriptMock.allActualArgs[11].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'") - assertThat(scriptMock.allActualArgs[12].trim()).isEqualTo("sleep 1s") - assertThat(scriptMock.allActualArgs[13].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/cas") - assertThat(scriptMock.allActualArgs[14].trim()).isEqualTo("sleep 1s") - assertThat(scriptMock.allActualArgs[15].trim()).isEqualTo("sudo KUBECONFIG=${workspaceEnvDir}/.k3d/.kube/config kubectl rollout status deployment/nginx-ingress") + for (int i = 0; i < 10; i++) { + assertThat(scriptMock.actualEcho.get(i)).isEqualTo("create values.yaml for setup deployment") + } + assertThat(scriptMock.actualEcho.get(10)).isEqualTo("configuring ecosystem core...") + assertThat(scriptMock.actualEcho.get(11)).isEqualTo("Installing setup...") + assertThat(scriptMock.actualEcho.get(12)).isEqualTo("Wait for blueprint-operator to be ready...") + assertThat(scriptMock.actualEcho.get(13)).isEqualTo("Wait for setup-finisher to be executed...") + assertThat(scriptMock.actualEcho.get(14)).isEqualTo("True True") + assertThat(scriptMock.actualEcho.get(15)).isEqualTo("Wait for dogus to be ready...") + assertThat(scriptMock.actualEcho.get(16)).isEqualTo("Wait for cas to be rolled out...") + assertThat(scriptMock.actualEcho.get(17)).isEqualTo("Wait for ldap to be rolled out...") assertThat(scriptMock.writeFileParams.get(0)).isNotNull() String setupYaml = scriptMock.writeFileParams.get(1) @@ -273,6 +268,11 @@ class K3dTest { scriptMock.expectedShRetValueForScript.put("whoami", "jenkins") scriptMock.expectedShRetValueForScript.put("cat /etc/passwd | grep jenkins", "jenkins:x:1000:1000:jenkins,,,:/home/jenkins:/bin/bash") scriptMock.expectedShRetValueForScript.put("yq -i '.setup_json = load_str(\"k3d_setup.json\")' k3d_values.yaml", "fake") + scriptMock.expectedShRetValueForScript.put("curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip", "192.168.56.2") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/ldap/tags/list -u null:null", "{\"tags\": [\"1.0.0\"]}") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/cas/tags/list -u null:null", "{\"tags\": [\"2.0.0\"]}") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/postfix/tags/list -u null:null", "{\"tags\": [\"3.0.0\"]}") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/usermgt/tags/list -u null:null", "{\"tags\": [\"4.0.0\"]}") K3d sut = new K3d(scriptMock, "leWorkSpace", "leK3dWorkSpace", "path") @@ -283,10 +283,10 @@ class K3dTest { } // then - assertThat(errorMsg.getMessage()).isEqualTo("failed to wait for deployment/k8s-dogu-operator-controller-manager rollout: timeout") + assertThat(errorMsg.getMessage()).isEqualTo("failed to wait for deployment/k8s-blueprint-operator-controller-manager rollout: timeout") - assertThat(scriptMock.actualEcho.get(0)).isEqualTo("configuring setup...") - assertThat(scriptMock.actualEcho.get(1)).isEqualTo("create values.yaml for setup deployment") + assertThat(scriptMock.actualEcho.get(10)).isEqualTo("configuring ecosystem core...") + assertThat(scriptMock.actualEcho.get(11)).isEqualTo("Installing setup...") assertThat(scriptMock.allActualArgs[0].trim()).isEqualTo("curl -H \"Metadata-Flavor: Google\" http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip") assertThat(scriptMock.allActualArgs[1].trim()).isEqualTo("whoami".trim()) @@ -433,7 +433,7 @@ spec: int fileCounter = 0 assertThat(scriptMock.allActualArgs[i++].trim()).contains("called deleteDir()") assertThat(scriptMock.allActualArgs[i++].trim()).contains("rm -rf k8sLogs.zip") - assertThat(scriptMock.allActualArgs[i++].trim()).contains("rm -rf k3d_setup.json") + assertThat(scriptMock.allActualArgs[i++].trim()).contains("rm -rf k3d_blueprint.yaml") assertThat(scriptMock.allActualArgs[i++].trim()).contains("rm -rf k3d_values.yaml") assertThat(scriptMock.allActualArgs[i++].trim()).contains("sudo KUBECONFIG=leK3dWorkSpace/.k3d/.kube/config kubectl get persistentvolumeclaim --show-kind --ignore-not-found -l app=ces -o yaml || true") @@ -514,8 +514,10 @@ spec: assertThat(scriptMock.zipParams.size()).isEqualTo(1) assertThat(scriptMock.zipParams[0]).isEqualTo(["archive":"false", "dir":"k8sLogs", "zipFile":"k8sLogs.zip"]) - assertThat(scriptMock.archivedArtifacts.size()).isEqualTo(1) - assertThat(scriptMock.archivedArtifacts[0]).isEqualTo(["allowEmptyArchive":"true", "artifacts":"k8sLogs.zip"]) + assertThat(scriptMock.archivedArtifacts.size()).isEqualTo(3) + assertThat(scriptMock.archivedArtifacts[0]).isEqualTo(["artifacts":"k3d_blueprint.yaml"]) + assertThat(scriptMock.archivedArtifacts[1]).isEqualTo(["artifacts":"k3d_values.yaml"]) + assertThat(scriptMock.archivedArtifacts[2]).isEqualTo(["allowEmptyArchive":"true", "artifacts":"k8sLogs.zip"]) assertThat(scriptMock.allActualArgs.size()).isEqualTo(i) assertThat(scriptMock.writeFileParams.size()).isEqualTo(25) From 095c595a73a51e1c0b4caf7261ab52f69c8efdff Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Fri, 7 Nov 2025 08:44:32 +0000 Subject: [PATCH 63/71] [151] add unittest for parse tags --- .../cloudogu/ces/cesbuildlib/K3dTest.groovy | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy index 0d63e08a..2f5e2479 100644 --- a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy +++ b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy @@ -585,6 +585,34 @@ spec: assertThat(scriptMock.allActualArgs[8].trim()).isEqualTo("yq -i \".setup.image.tag = \\\"1.2.3\\\"\" k3d_values.yaml".trim()) } + @Test + void testK3d_parseTags() { + // given + def workspaceDir = "leWorkspace" + def k3dWorkspaceDir = "leK3dWorkSpace" + def scriptMock = new ScriptMock() + K3d sut = new K3d(scriptMock, workspaceDir, k3dWorkspaceDir, "path") + + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/ldap/tags/list -u null:null", "{\"tags\": [\"1.0.0\", \"1.0.1\"]}") + scriptMock.expectedShRetValueForScript.put("curl https://registry.cloudogu.com/v2/official/cas/tags/list -u null:null", "{\"tags\": [\"2.0.0\", \"invalid\", \"2.0.1\"]}") + + List deps = new ArrayList<>() + deps.add("official/cas") + deps.add("official/ldap:latest") + deps.add("official/usermgt:3.0.0") + + // when + String formatted = sut.formatDependencies(deps) + + // then + assertThat(scriptMock.allActualArgs[0].trim()).isEqualTo("curl https://registry.cloudogu.com/v2/official/cas/tags/list -u null:null".trim()) + assertThat(scriptMock.allActualArgs[1].trim()).isEqualTo("curl https://registry.cloudogu.com/v2/official/ldap/tags/list -u null:null".trim()) + assertThat(formatted.contains("cas\n version: 2.0.1")) + assertThat(formatted.contains("ldap\n version: 1.0.1")) + assertThat(formatted.contains("usermgt\n version: 3.0.0")) + + } + @Test void testK3d_configureComponentOperatorVersion() { // given From 88f3c8cb160a95f59cce15f3e74c72098778a166 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Fri, 7 Nov 2025 09:03:30 +0000 Subject: [PATCH 64/71] [151] add unittest for parse tags --- .../cloudogu/ces/cesbuildlib/K3dTest.groovy | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy index 2f5e2479..cc72a3a6 100644 --- a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy +++ b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy @@ -613,6 +613,28 @@ spec: } + @Test + void testK3d_setComponentVersion() { + // given + + // when + K3d.setComponentVersions("1.0.0", "2.0.0", "3.0.0", "4.0.0") + + // then + assertThat("1.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR)) + assertThat("2.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR_CRD)) + assertThat("3.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR)) + assertThat("4.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR_CRD)) + + K3d.setComponentVersions() + + // then + assertThat("1.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR)) + assertThat("2.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR_CRD)) + assertThat("3.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR)) + assertThat("4.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR_CRD)) + } + @Test void testK3d_configureComponentOperatorVersion() { // given From 1a63c112fdec2541bd9056656bea987e59ef38cf Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 10 Nov 2025 09:47:37 +0000 Subject: [PATCH 65/71] [151] add unittest for parse tags --- test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy index cc72a3a6..81f142e6 100644 --- a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy +++ b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy @@ -633,6 +633,14 @@ spec: assertThat("2.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR_CRD)) assertThat("3.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR)) assertThat("4.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR_CRD)) + + K3d.setComponentVersions(null, null, null, null) + + // then + assertThat("1.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR)) + assertThat("2.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR_CRD)) + assertThat("3.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR)) + assertThat("4.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR_CRD)) } @Test From 44862aabd64a7e60c1f5fc1e4abc422bda0e3d8c Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 10 Nov 2025 09:48:55 +0000 Subject: [PATCH 66/71] [151] add unittest for parse tags --- test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy index 81f142e6..6138c74f 100644 --- a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy +++ b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy @@ -634,13 +634,18 @@ spec: assertThat("3.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR)) assertThat("4.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR_CRD)) + K3d.@VERSION_K8S_DOGU_OPERATOR = "5.0.0" + K3d.@VERSION_K8S_DOGU_OPERATOR_CRD = "6.0.0" + K3d.@VERSION_K8S_BLUEPRINT_OPERATOR = "7.0.0" + K3d.@VERSION_K8S_BLUEPRINT_OPERATOR_CRD = "8.0.0" + K3d.setComponentVersions(null, null, null, null) // then - assertThat("1.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR)) - assertThat("2.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR_CRD)) - assertThat("3.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR)) - assertThat("4.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR_CRD)) + assertThat("5.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR)) + assertThat("6.0.0".equals(K3d.@VERSION_K8S_DOGU_OPERATOR_CRD)) + assertThat("7.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR)) + assertThat("8.0.0".equals(K3d.@VERSION_K8S_BLUEPRINT_OPERATOR_CRD)) } @Test From e0554633e0ab636d8684f60d58adec8a4d601e6a Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Mon, 17 Nov 2025 09:37:50 +0000 Subject: [PATCH 67/71] [151] bump version of ecosystem core --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 6487b1ac..571e9a51 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -17,10 +17,12 @@ class K3d { private static String K3D_BLUEPRINT_FILE = "k3d_blueprint.yaml" private static String YQ_VERSION = "4.40.5" + private static String VERSION_ECOSYSTEM_CORE = "1.1.0" + private static String VERSION_K8s_COMPONENT_OPERATOR_CRD = "1.10.1" private static String VERSION_K8S_DOGU_OPERATOR = "3.15.0" private static String VERSION_K8S_DOGU_OPERATOR_CRD = "2.10.0" - private static String VERSION_K8S_BLUEPRINT_OPERATOR = "3.0.0-CR1" - private static String VERSION_K8S_BLUEPRINT_OPERATOR_CRD = "2.0.1" + private static String VERSION_K8S_BLUEPRINT_OPERATOR = "3.1.0" + private static String VERSION_K8S_BLUEPRINT_OPERATOR_CRD = "3.1.0" private String clusterName private script @@ -362,11 +364,11 @@ class K3d { } // install crd first - helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version 1.10.0 --namespace default") + helm("install k8s-component-operator-crd oci://${registryUrl}/${registryNamespace}/k8s-component-operator-crd --version ${VERSION_K8s_COMPONENT_OPERATOR_CRD} --namespace default") kubectl("--namespace default create configmap global-config --from-literal=config.yaml='fqdn: ${externalIP}'") - helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version 0.4.0 --namespace default --timeout 15m") + helm("install -f ${K3D_VALUES_YAML_FILE} ecosystem-core oci://${registryUrl}/${registryNamespace}/ecosystem-core --version ${VERSION_ECOSYSTEM_CORE} --namespace default --timeout 15m") script.echo "Wait for blueprint-operator to be ready..." waitForDeploymentRollout("k8s-blueprint-operator-controller-manager", timeout, interval) From 6c129feb92a7692ffa28e5f59830909e8393e145 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Wed, 19 Nov 2025 11:03:18 +0000 Subject: [PATCH 68/71] [151] add changelog --- CHANGELOG.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 261ddd7d..1f63d045 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- use ecosystem-core instead of k8e-ces-setup to install cluster + + ## [4.3.0](https://github.com/cloudogu/ces-build-lib/releases/tag/4.3.0) - 2025-08-21 ### Changed - Updates the BATS shell test image to 1.12 which supports the `--report-formatter` switch @@ -256,6 +259,4 @@ the login data used for the dogu-registry; #75 - Add gpg class to perform gpp based task such as signing; #64 - Add option to upload artifacts to a GitHub release; #64 -## v0.0.1 - v1.47.1 / previous versions - -Up till version v1.47.1 there was no change log +## v0.0.1 - v1.47.1 / From 704e13e490de4c897d4a36d4c20bb9db7338bbd3 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 20 Nov 2025 09:12:26 +0000 Subject: [PATCH 69/71] [151] use 1.2.0 of ecosystem-core --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 571e9a51..2b35e30e 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -17,7 +17,7 @@ class K3d { private static String K3D_BLUEPRINT_FILE = "k3d_blueprint.yaml" private static String YQ_VERSION = "4.40.5" - private static String VERSION_ECOSYSTEM_CORE = "1.1.0" + private static String VERSION_ECOSYSTEM_CORE = "1.2.0" private static String VERSION_K8s_COMPONENT_OPERATOR_CRD = "1.10.1" private static String VERSION_K8S_DOGU_OPERATOR = "3.15.0" private static String VERSION_K8S_DOGU_OPERATOR_CRD = "2.10.0" From adeaa4e37ac814edca8841b663b0a0353742b7fd Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 20 Nov 2025 09:48:18 +0000 Subject: [PATCH 70/71] [151] make monitoring and backup optional --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index 2b35e30e..b92d1b59 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -21,7 +21,7 @@ class K3d { private static String VERSION_K8s_COMPONENT_OPERATOR_CRD = "1.10.1" private static String VERSION_K8S_DOGU_OPERATOR = "3.15.0" private static String VERSION_K8S_DOGU_OPERATOR_CRD = "2.10.0" - private static String VERSION_K8S_BLUEPRINT_OPERATOR = "3.1.0" + private static String VERSION_K8S_BLUEPRINT_OPERATOR = "3.0.2" private static String VERSION_K8S_BLUEPRINT_OPERATOR_CRD = "3.1.0" private String clusterName @@ -49,7 +49,9 @@ class K3d { defaultDogu : "", additionalDependencies : [], registryConfig : "", - registryConfigEncrypted: "" + registryConfigEncrypted: "", + "enableBackup" : false, + "enableMonitoring" : false ] String getRegistryName() { @@ -279,6 +281,8 @@ class K3d { } void configureEcosystemCoreValues(config = [:]) { + // Merge default config with the one passed as parameter + config = defaultSetupConfig << config yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".defaultConfig.env.waitTimeoutMinutes = 5") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-dogu-operator-crd.version", VERSION_K8S_DOGU_OPERATOR_CRD) @@ -287,19 +291,18 @@ class K3d { appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator-crd.version", VERSION_K8S_BLUEPRINT_OPERATOR_CRD) appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.version", VERSION_K8S_BLUEPRINT_OPERATOR) + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-ces-control.disabled = true") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-blueprint-operator.valuesObject.healthConfig.components.required = [{\\\"name\\\": \\\"k8s-dogu-operator\\\"}, {\\\"name\\\": \\\"k8s-service-discovery\\\"}]") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.internalTrafficPolicy", "Cluster") appendToYamlFile(K3D_VALUES_YAML_FILE, ".components.k8s-service-discovery.valuesObject.loadBalancerService.externalTrafficPolicy", "Cluster") - yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".backup.enabled = false") - yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".monitoring.enabled = false") - + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".backup.enabled = ${config.enableBackup}") + yqEvalYamlFile(K3D_VALUES_YAML_FILE, ".monitoring.enabled = ${config.enableMonitoring}") script.echo "configuring ecosystem core..." - // Merge default config with the one passed as parameter - config = defaultSetupConfig << config writeBlueprintYaml(config) } From 88b8d86c4d9c7c962180bc050257e52c8ce9f456 Mon Sep 17 00:00:00 2001 From: Marco Bergen Date: Thu, 20 Nov 2025 10:09:00 +0000 Subject: [PATCH 71/71] [151] blueprint v3 --- src/com/cloudogu/ces/cesbuildlib/K3d.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index b92d1b59..e8ad36b6 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -706,7 +706,7 @@ data: List deps = config.dependencies + config.additionalDependencies String formattedDeps = formatDependencies(deps) script.writeFile file: K3D_BLUEPRINT_FILE, text: """ -apiVersion: k8s.cloudogu.com/v2 +apiVersion: k8s.cloudogu.com/v3 kind: Blueprint metadata: labels: