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