diff --git a/CHANGELOG.md b/CHANGELOG.md index 19db4eb..4ed5494 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] + +## [2.2.1](https://github.com/cloudogu/ces-build-lib/releases/tag/2.2.1) - 2024-05-16 +### Fixed +- [#125] K3d setup waits now until all dogus are rolled out and the setup is really done. + ## [2.2.0](https://github.com/cloudogu/ces-build-lib/releases/tag/2.2.0) - 2024-05-02 ### Added - `Maven.useMirrors([name: 'maven-proxy', mirrorOf: 'central', url: 'https://maven.example.org'])` diff --git a/README.md b/README.md index 0190147..5bf9c06 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ Jenkins Pipeline Shared library, that contains additional features for Git, Mave * Install [Pipeline: GitHub Groovy Libraries](https://wiki.jenkins.io/display/JENKINS/Pipeline+GitHub+Library+Plugin) * Use the Library in any Jenkinsfile like so ``` -@Library('github.com/cloudogu/ces-build-lib@2.2.0') +@Library('github.com/cloudogu/ces-build-lib@2.2.1') import com.cloudogu.ces.cesbuildlib.* ``` * Best practice: Use a defined version (e.g. a git commit hash or a git tag, such as `6cd41e0` or `1.67.0` in the example above) and not a branch such as `develop`. Otherwise, your build might change when the there is a new commit on the branch. Using branches is like using snapshots! diff --git a/pom.xml b/pom.xml index f3864c2..ae9ebf5 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ com.cloudogu.ces ces-build-lib ces-build-lib - 2.2.0 + 2.2.1 diff --git a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy index c9ea914..e6f58cc 100644 --- a/src/com/cloudogu/ces/cesbuildlib/K3d.groovy +++ b/src/com/cloudogu/ces/cesbuildlib/K3d.groovy @@ -304,7 +304,7 @@ class K3d { appendToYamlFile(K3D_VALUES_YAML_FILE, ".logLevel", loglevel) } - void installAndTriggerSetup(String tag, Integer timout = 300, Integer interval = 5) { + void installAndTriggerSetup(String tag, Integer timeout = 300, Integer interval = 5) { script.echo "Installing setup..." String registryUrl = "registry.cloudogu.com" String registryNamespace = "k8s" @@ -316,7 +316,34 @@ class K3d { helm("registry logout ${registryUrl}") script.echo "Wait for dogu-operator to be ready..." - waitForDeploymentRollout("k8s-dogu-operator-controller-manager", timout, interval) + waitForDeploymentRollout("k8s-dogu-operator-controller-manager", timeout, interval) + + script.echo "Wait for setup-finisher to be executed..." + waitForSetupToFinish(timeout, interval) + + script.echo "Wait for dogus to be ready..." + waitForDogusToBeRolledOut(timeout, interval) + } + + void waitForDogusToBeRolledOut(Integer timeout, Integer interval) { + String dogus = kubectl("get dogus --template '{{range .items}}{{.metadata.name}}{{\"\\n\"}}{{end}}'", true) + String[] doguList = dogus.split("\n") + for (String dogu : doguList) { + script.echo "Wait for $dogu to be rolled out..." + waitForDeploymentRollout(dogu, timeout, interval) + } + } + + 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")) { + return + } + } + + this.script.error "failed to wait for setup to finish: timeout" } /** diff --git a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy index d5f83d4..d9e01c1 100644 --- a/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy +++ b/test/com/cloudogu/ces/cesbuildlib/K3dTest.groovy @@ -205,6 +205,11 @@ class K3dTest extends GroovyTestCase { 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 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 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") + K3d sut = new K3d(scriptMock, "leWorkSpace", "leK3dWorkSpace", "path") @@ -216,6 +221,10 @@ class K3dTest extends GroovyTestCase { 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()) @@ -226,6 +235,13 @@ class K3dTest extends GroovyTestCase { 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") assertThat(scriptMock.writeFileParams.get(0)).isNotNull() String setupYaml = scriptMock.writeFileParams.get(1) @@ -235,7 +251,6 @@ class K3dTest extends GroovyTestCase { void testSetupShouldThrowExceptionOnDoguOperatorRollout() { // given - 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")