#!/usr/bin/env bash # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # Allocate a Kind cluster with Knative, Kourier and a local container registry. # set -o errexit set -o nounset set -o pipefail CONTAINER_ENGINE=${CONTAINER_ENGINE:-docker} export TERM="${TERM:-dumb}" main() { local knative_serving_version="v$(get_latest_release_version "knative" "serving")" local knative_eventing_version="v$(get_latest_release_version "knative" "eventing")" local contour_version="v$(get_latest_release_version "knative-extensions" "net-contour")" # Kubernetes Version node image per Kind releases (full hash is suggested): # https://github.com/kubernetes-sigs/kind/releases local kind_node_version=v1.29.2@sha256:51a1434a5397193442f0be2a297b488b6c919ce8a3931be0ce822606ea5ca245 # shellcheck disable=SC2155 local em=$(tput bold)$(tput setaf 2) # shellcheck disable=SC2155 local me=$(tput sgr0) echo "${em}Allocating...${me}" kubernetes ( set -o pipefail; (serving && dns && networking) 2>&1 | sed -e 's/^/svr /')& ( set -o pipefail; (eventing && namespace) 2>&1 | sed -e 's/^/evt /')& ( set -o pipefail; registry 2>&1 | sed -e 's/^/reg /') & ( set -o pipefail; dapr_runtime 2>&1 | sed -e 's/^/dpr /')& local job for job in $(jobs -p); do wait "$job" done next_steps echo "${em}DONE${me}" } # Returns whether the current branch is a release branch. function is_release_branch() { [[ $(current_branch) =~ ^release-[0-9\.]+$ ]] } # Retrieve latest version from given Knative repository tags # On 'main' branch the latest released version is returned # On 'release-x.y' branch the latest patch version for 'x.y.*' is returned # Similar to hack/library.sh get_latest_knative_yaml_source() function get_latest_release_version() { local org_name="$1" local repo_name="$2" local major_minor="" if is_release_branch; then local branch_name branch_name="$(current_branch)" major_minor="${branch_name##release-}" fi local version version="$(git ls-remote --tags --ref https://github.com/"${org_name}"/"${repo_name}".git \ | grep "${major_minor}" \ | cut -d '-' -f2 \ | cut -d 'v' -f2 \ | sort -Vr \ | head -n 1)" echo "${version}" } kubernetes() { echo "${em}① Kubernetes${me}" cat <=n )); then echo "Unable to set knative domain" exit 1 fi echo 'Retrying...' sleep 5 done } networking() { echo "${em}④ Contour Ingress${me}" echo "Version: ${contour_version}" echo "Install load balancer." kubectl apply -f "https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml" sleep 5 kubectl wait --namespace metallb-system \ --for=condition=ready pod \ --selector=app=metallb \ --timeout=300s local kind_addr kind_addr="$($CONTAINER_ENGINE container inspect func-control-plane | jq '.[0].NetworkSettings.Networks.kind.IPAddress' -r)" echo "Setting up address pool." kubectl apply -f - <Channel kubectl apply -f - << EOF apiVersion: v1 kind: ConfigMap metadata: name: config-br-defaults namespace: knative-eventing data: default-br-config: | # This is the cluster-wide default broker channel. clusterDefault: brokerClass: MTChannelBasedBroker apiVersion: v1 kind: ConfigMap name: imc-channel namespace: knative-eventing EOF } dapr_runtime() { echo "${em}⑦ Dapr${me}" echo "Version:\\n$(dapr version)" local dapr_flags="" if [ "${GITHUB_ACTIONS:-false}" = "true" ]; then dapr_flags="--image-registry=ghcr.io/dapr --log-as-json" fi # Install Dapr Runtime # shellcheck disable=SC2086 dapr init ${dapr_flags} --kubernetes --wait # Enalble Redis Persistence and Pub/Sub # # 1) Redis # Creates a Redis leader with three replicas # TODO: helm and the bitnami charts are likely not necessary. The Bitnami # charts do tweak quite a few settings, but I am skeptical it is necessary # in a CI/CD environment, as it does add nontrivial support overhead. # TODO: If the bitnami redis chart seems worth the effort, munge this command # to only start a single instance rather than four. # helm repo add bitnami https://charts.bitnami.com/bitnami echo "${em}- Redis ${me}" helm repo add bitnami https://charts.bitnami.com/bitnami helm install redis bitnami/redis --set image.tag=6.2 helm repo update # 2) Expose a Redis-backed Dapr State Storage component echo "${em}- State Storage Component${me}" kubectl apply -f - << EOF apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: statestore namespace: default spec: type: state.redis version: v1 metadata: - name: redisHost value: redis-master.default.svc.cluster.local:6379 - name: redisPassword secretKeyRef: name: redis key: redis-password EOF # 3) Expose A Redis-backed Dapr Pub/Sub Component echo "${em}- Pub/Sub Component${me}" kubectl apply -f - << EOF apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: pubsub namespace: default spec: type: pubsub.redis version: v1 metadata: - name: redisHost value: redis-master.default.svc.cluster.local:6379 - name: redisPassword secretKeyRef: name: redis key: redis-password EOF } next_steps() { # shellcheck disable=SC2155 local red=$(tput bold)$(tput setaf 1) echo "${em}Image Registry${me}" echo "If not in CI (running ci.sh): " echo " ${red}set registry as insecure${me} in the docker daemon config (/etc/docker/daemon.json on linux or ~/.docker/daemon.json on OSX):" echo " { \"insecure-registries\": [ \"localhost:50000\" ] }" } main "$@"