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")