github.com/freiheit-com/kuberpult@v1.24.2-0.20240328135542-315d5630abe6/charts/kuberpult/run-kind.sh (about) 1 #!/usr/bin/env bash 2 3 set -eu 4 set -o pipefail 5 6 # This script assumes that the docker images have already been built. 7 # To run/debug/develop this locally, you probably want to run like this: 8 # rm -rf ./manifests/; make clean; LOCAL_EXECUTION=true ./run-kind.sh 9 10 cd "$(dirname "$0")" 11 12 13 # prefix every call to "echo" with the name of the script: 14 function print() { 15 /bin/echo "$0:" "$@" 16 } 17 18 cleanup() { 19 print "Cleaning stuff up..." 20 helm uninstall kuberpult-local || print kuberpult was not installed 21 kind delete cluster || print kind cluster was not deleted 22 } 23 trap cleanup INT TERM 24 cleanup 25 26 print 'creating kind cluster with a hostpath to share testdata...' 27 kind create cluster --config=- <<EOF || print cluster exists 28 kind: Cluster 29 apiVersion: kind.x-k8s.io/v1alpha4 30 nodes: 31 - role: control-plane 32 EOF 33 34 export GIT_NAMESPACE=git 35 export ARGO_NAMESPACE=default 36 37 LOCAL_EXECUTION=${LOCAL_EXECUTION:-false} 38 print "LOCAL_EXECUTION: $LOCAL_EXECUTION" 39 40 print 'ensuring that the helm chart is build...' 41 # it was already build, but we are in another workflow now, so we have to rebuild it 42 make all 43 44 print installing ssh... 45 ./setup-cluster-ssh.sh 46 47 function waitForDeployment() { 48 ns="$1" 49 label="$2" 50 print "waitForDeployment: $ns/$label" 51 sleep 10 52 until kubectl wait --for=condition=ready pod -n "$ns" -l "$label" --timeout=30s 53 do 54 sleep 4s 55 print "logs:" 56 kubectl -n "$ns" logs -l "$label" || echo "could not get logs for $label" 57 print "describe pod:" 58 kubectl -n "$ns" describe pod -l "$label" 59 # print "describe pod:" 60 # kubectl -n "$ns" describe pod -l app=kuberpult-cd-service || echo "could not describe pod" 61 print ... 62 done 63 } 64 65 function portForwardAndWait() { 66 ns="$1" 67 deployment="$2" 68 portHere="$3" 69 portThere="$4" 70 ports="$portHere:$portThere" 71 print "portForwardAndWait for $ns/$deployment $ports" 72 kubectl -n "$ns" port-forward "$deployment" "$ports" & 73 print "portForwardAndWait: waiting until the port forward works..." 74 sleep 10 75 until nc -vz localhost "$portHere" 76 do 77 sleep 3s 78 print "logs:" 79 kubectl -n "$ns" logs "$deployment" 80 print "describe deployment:" 81 kubectl -n "$ns" describe "$deployment" 82 print "describe pod:" 83 kubectl -n "$ns" describe pod -l app=kuberpult-cd-service || echo "could not describe pod" 84 print ... 85 done 86 } 87 88 GPG="gpg --keyring trustedkeys-kuberpult.gpg" 89 gpgFile=~/.gnupg/trustedkeys-kuberpult.gpg 90 if test -f "$gpgFile" 91 then 92 echo warning: file already exists: "$gpgFile" 93 if "$LOCAL_EXECUTION" 94 then 95 echo "is it ok to delete the file? Press enter twice to delete" 96 # shellcheck disable=SC2162 97 read 98 # shellcheck disable=SC2162 99 read 100 rm "$gpgFile" 101 else 102 echo "this file should not exist on the ci" 103 exit 1 104 fi 105 fi 106 $GPG --no-default-keyring --batch --passphrase '' --quick-gen-key kuberpult-kind@example.com 107 $GPG --armor --export kuberpult-kind@example.com > kuberpult-keyring.gpg 108 109 print "setting up manifest repo" 110 waitForDeployment "git" "app.kubernetes.io/name=server" 111 portForwardAndWait "git" "deployment/server" "2222" "22" 112 113 rm -f emptyfile 114 print "cloning..." 115 GIT_SSH_COMMAND='ssh -o UserKnownHostsFile=emptyfile -o StrictHostKeyChecking=no -i ../../services/cd-service/client' git clone ssh://git@localhost:2222/git/repos/manifests 116 117 cd manifests 118 pwd 119 cp -r ../../../infrastructure/scripts/create-testdata/testdata_template/environments . 120 git add environments 121 GIT_AUTHOR_NAME='Initial Kuberpult Commiter' GIT_COMMITTER_NAME='Initial Kuberpult Commiter' GIT_AUTHOR_EMAIL='team.sre.permanent+kuberpult-initial-commiter@freiheit.com' GIT_COMMITTER_EMAIL='team.sre.permanent+kuberpult-initial-commiter@freiheit.com' git commit -m "add initial environments from template" 122 print "pushing environments to manifest repo..." 123 GIT_SSH_COMMAND='ssh -o UserKnownHostsFile=emptyfile -o StrictHostKeyChecking=no -i ../../../services/cd-service/client' git checkout -B main 124 GIT_SSH_COMMAND='ssh -o UserKnownHostsFile=emptyfile -o StrictHostKeyChecking=no -i ../../../services/cd-service/client' git push -f origin main 125 cd - 126 127 128 export IMAGE_REGISTRY=europe-west3-docker.pkg.dev/fdc-public-docker-registry/kuberpult 129 130 if "$LOCAL_EXECUTION" 131 then 132 print 'building cd service...' 133 make -C ../../services/cd-service/ docker 134 135 print 'building frontend service...' 136 make -C ../../services/frontend-service/ docker 137 138 print 'building rollout service...' 139 make -C ../../services/rollout-service/ docker 140 else 141 print 'not building services...' 142 fi 143 144 print version... 145 VERSION=$(make --no-print-directory -C ../../services/cd-service/ version) 146 print "version is ${VERSION}" 147 IMAGE_TAG_KUBERPULT=${IMAGE_TAG_KUBERPULT:-$VERSION} 148 print "IMAGE_TAG_KUBERPULT is now ${IMAGE_TAG_KUBERPULT}" 149 150 cd_imagename="${IMAGE_REGISTRY}/kuberpult-cd-service:${IMAGE_TAG_KUBERPULT}" 151 frontend_imagename="${IMAGE_REGISTRY}/kuberpult-frontend-service:${IMAGE_TAG_KUBERPULT}" 152 rollout_imagename="${IMAGE_REGISTRY}/kuberpult-rollout-service:${IMAGE_TAG_KUBERPULT}" 153 154 print "cd image: $cd_imagename" 155 print "frontend image: $frontend_imagename" 156 157 if ! "$LOCAL_EXECUTION" 158 then 159 print 'pulling cd service...' 160 docker pull "$cd_imagename" 161 print 'pulling frontend service...' 162 docker pull "$frontend_imagename" 163 print 'pulling rollout service...' 164 docker pull "$rollout_imagename" 165 else 166 print 'not pulling cd or frontend service...' 167 fi 168 169 print 'loading docker images into kind...' 170 print "$cd_imagename" 171 print "$frontend_imagename" 172 kind load docker-image "$cd_imagename" 173 kind load docker-image "$frontend_imagename" 174 kind load docker-image "$rollout_imagename" 175 176 177 ## argoCd 178 179 print "starting argoCd..." 180 181 helm repo add argo-cd https://argoproj.github.io/argo-helm 182 183 184 helm uninstall argocd || echo "did not uninstall argo" 185 cat <<YAML > argocd-values.yml 186 configs: 187 ssh: 188 knownHosts: | 189 $(sed -e "s/^/ /" <../../services/cd-service/known_hosts) 190 cm: 191 accounts.kuberpult: apiKey 192 timeout.reconciliation: 0s 193 params: 194 controller.repo.server.plaintext: "true" 195 server.repo.server.plaintext: "true" 196 repo.server: kuberpult-cd-service:8443 197 rbac: 198 policy.csv: | 199 p, role:kuberpult, applications, get, */*, allow 200 p, role:kuberpult, applications, create, */*, allow 201 p, role:kuberpult, applications, sync, */*, allow 202 p, role:kuberpult, applications, delete, */*, allow 203 g, kuberpult, role:kuberpult 204 205 YAML 206 helm install argocd argo-cd/argo-cd --values argocd-values.yml --version 5.36.0 207 208 print applying app... 209 210 kubectl apply -f - <<EOF 211 apiVersion: argoproj.io/v1alpha1 212 kind: AppProject 213 metadata: 214 name: test-env 215 namespace: ${ARGO_NAMESPACE} 216 spec: 217 description: test-env 218 destinations: 219 - name: "dest1" 220 namespace: '*' 221 server: https://kubernetes.default.svc 222 sourceRepos: 223 - '*' 224 --- 225 apiVersion: argoproj.io/v1alpha1 226 kind: Application 227 metadata: 228 name: root 229 namespace: ${ARGO_NAMESPACE} 230 spec: 231 destination: 232 namespace: ${ARGO_NAMESPACE} 233 server: https://kubernetes.default.svc 234 project: test-env 235 source: 236 path: argocd/v1alpha1 237 repoURL: ssh://git@server.${GIT_NAMESPACE}.svc.cluster.local/git/repos/manifests 238 targetRevision: HEAD 239 syncPolicy: 240 automated: {} 241 EOF 242 243 waitForDeployment "default" "app.kubernetes.io/name=argocd-server" 244 portForwardAndWait "default" service/argocd-server 8080 443 245 print "admin password:" 246 argocd_adminpw=$(kubectl -n default get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d) 247 echo "$argocd_adminpw" 248 echo "$argocd_adminpw" > argocd_adminpw.txt 249 250 argocd login --port-forward --username admin --password "$argocd_adminpw" 251 252 token=$(argocd account generate-token --port-forward --account kuberpult) 253 254 echo "argocd token: $token" 255 256 257 kubectl create ns development 258 kubectl create ns development2 259 kubectl create ns staging 260 261 ## kuberpult 262 print 'installing kuberpult helm chart...' 263 264 cat <<VALUES > vals.yaml 265 cd: 266 resources: 267 limits: 268 memory: 200Mi 269 cpu: 0.05 270 requests: 271 memory: 200Mi 272 cpu: 0.05 273 frontend: 274 resources: 275 limits: 276 memory: 200Mi 277 cpu: 0.05 278 requests: 279 memory: 200Mi 280 cpu: 0.05 281 rollout: 282 enabled: true 283 resources: 284 limits: 285 memory: 200Mi 286 cpu: 0.05 287 requests: 288 memory: 200Mi 289 cpu: 0.05 290 ingress: 291 domainName: kuberpult.example.com 292 log: 293 level: INFO 294 git: 295 url: "ssh://git@server.${GIT_NAMESPACE}.svc.cluster.local/git/repos/manifests" 296 sourceRepoUrl: "https://github.com/freiheit-com/kuberpult/tree/{branch}/{dir}" 297 branch: "main" 298 networkTimeout: 1s 299 ssh: 300 identity: | 301 $(sed -e "s/^/ /" <../../services/cd-service/client) 302 known_hosts: | 303 $(sed -e "s/^/ /" <../../services/cd-service/known_hosts) 304 argocd: 305 token: "$token" 306 server: "https://argocd-server.${ARGO_NAMESPACE}.svc.cluster.local:443" 307 insecure: true 308 refresh: 309 enabled: true 310 manageArgoApplications: 311 enabled: false 312 filter: "" 313 datadogProfiling: 314 enabled: false 315 apiKey: invalid-3 316 pgp: 317 keyRing: | 318 $(sed -e "s/^/ /" <./kuberpult-keyring.gpg) 319 VALUES 320 321 # Get helm dependency charts and unzip them 322 (rm -rf charts && helm dep update && cd charts && for filename in *.tgz; do tar -xf "$filename" && rm -f "$filename"; done;) 323 324 helm template ./ --values vals.yaml > tmp.tmpl 325 helm install --values vals.yaml kuberpult-local ./ 326 print 'checking for pods and waiting for portforwarding to be ready...' 327 328 kubectl get deployment 329 kubectl get pods 330 331 print "port forwarding to cd service..." 332 waitForDeployment "default" "app=kuberpult-cd-service" 333 portForwardAndWait "default" deployment/kuberpult-cd-service 8082 8080 334 335 waitForDeployment "default" "app=kuberpult-frontend-service" 336 portForwardAndWait "default" "deployment/kuberpult-frontend-service" "8081" "8081" 337 print "connection to frontend service successful" 338 339 kubectl get deployment 340 kubectl get pods 341 342 for _ in $(seq 1 3) 343 do 344 ../../infrastructure/scripts/create-testdata/create-release.sh echo; 345 done 346 347 348 if "$LOCAL_EXECUTION" 349 then 350 echo "hit ctrl+c to stop" 351 read -r -d '' _ </dev/tty 352 else 353 echo "done. Kind cluster is up and kuberpult and argoCd are running." 354 fi