#!/bin/bash set -e if [[ -a ".env" ]]; then source .env fi function help() { echo echo "task [options]" echo echo "commands:" echo # Define column widths CMD_WIDTH=26 OPT_WIDTH=14 DESC_WIDTH=50 COLUMN="| %-${CMD_WIDTH}s | %-${OPT_WIDTH}s | %-${DESC_WIDTH}s |\n" # Print table header printf "$COLUMN" "Command" "Option" "Description" echo "|$(printf '%*s' $((CMD_WIDTH + 2)) '' | tr ' ' '-')|$(printf '%*s' $((OPT_WIDTH + 2)) '' | tr ' ' '-')|$(printf '%*s' $((DESC_WIDTH + 2)) '' | tr ' ' '-')|" # Env printf "$COLUMN" "version" "" "Show version of required tools." printf "$COLUMN" "template-dotenv" "" "Generate .env from .env.template." printf "$COLUMN" "test-k8s" "[clean]" "Test Kubernetes environment." printf "$COLUMN" "load-kubeconfig" "" "Load kubeconfig file from pass." printf "$COLUMN" "load-dotenv" "" "Restore content to .env from pass entry." printf "$COLUMN" "save-kubeconfig" "" "Save kubeconfig file in pass." printf "$COLUMN" "save-dotenv" "" "Store content of .env in pass entry." # Docs printf "$COLUMN" "install" "" "Install node dependencies." printf "$COLUMN" "docs" "" "Generate Helm chart readmes." printf "$COLUMN" "lint" "" "Lint Helm charts." printf "$COLUMN" "dev-vitepress" "" "Start VitePress dev server." printf "$COLUMN" "build-vitepress" "" "Build site with VitePress." printf "$COLUMN" "preview-vitepress" "" "Server VitePress build." # Host printf "$COLUMN" "start-kind" "" "Start kind Kubernetes cluster." printf "$COLUMN" "delete-kind" "" "Delete kind Kubernetes cluster." printf "$COLUMN" "start-minikube" "" "Start minikube Kubernetes cluster." printf "$COLUMN" "add-repos" "" "Add the required Helm repos." printf "$COLUMN" "setup-hosts" "" "Update hosts file." printf "$COLUMN" "forward-odoo" "" "Forward odoo port." printf "$COLUMN" "forward-ingress-nginx" "" "Forward ingress-nginx port." printf "$COLUMN" "forward-haproxy-ingress" "" "Forward haproxy-ingress port." # Charts printf "$COLUMN" "list-chart" "" "List Helm charts." printf "$COLUMN" "list-context" "" "List contexts." printf "$COLUMN" "template-values" "[ctx]" "Template values file." printf "$COLUMN" "install-chart" "[name][ctx]" "Install Helm chart." printf "$COLUMN" "upgrade-release" "[name][ctx]" "Upgrade Helm release." printf "$COLUMN" "uninstall-release" "" "Uninstall Helm release." # kubectl printf "$COLUMN" "logs-odoo" "" "Show pod logs." printf "$COLUMN" "logs-haproxy-ingress" "" "Show haproxy-ingress logs." printf "$COLUMN" "logs-ingress-nginx" "" "Show ingress-nginx logs." printf "$COLUMN" "list" "" "List Helm deployments." printf "$COLUMN" "list-pods" "" "List all pods." printf "$COLUMN" "login-oc" "" "Refresh the auth token for OpenShift." # Helm printf "$COLUMN" "template-manifest" "[ctx]" "Template all charts with Helm." printf "$COLUMN" "package-repo" "" "Package Helm charts." printf "$COLUMN" "index-repo" "" "Index Helm chart." printf "$COLUMN" "publish-repo" "" "Copy Helm chart files to dist." printf "$COLUMN" "remove-repo" "" "Remove the kubernetes-build repo." printf "$COLUMN" "install-repo" "[name]" "Install chart from kubernetes-build repo." # LLM printf "$COLUMN" "commit-with-llm" "" "Commit with llm generated commit message." printf "$COLUMN" "update-with-llm" "[glob][prompt]" "Feed files matching glob to LLM and apply changes." # Test printf "$COLUMN" "test-cluster-issuer" "" "Test cert isser." } # Default vars OC_PROJECT=${OC_PROJECT:="odoo"} NAMESPACE=${NAMESPACE:="odoo"} RELEASE_NAME=${RELEASE_NAME:="odoo"} # Dynamic vars PASS_ENTRY=$(echo "env/${PWD##*/}" | tr '[:upper:]' '[:lower:]') PASS_KUBECONFIG_ENTRY=$(echo "env/kubeconfig_$USER" | tr '[:upper:]' '[:lower:]') # Import commands function clone-taskfile(){ if [ ! -d "$HOME/taskfile.build" ]; then echo -e "\033[38;5;214mGit\033[0m: Clone taskfile repo" git clone https://git.taskfile.build "$HOME/taskfile.build" else echo -e "\033[38;5;214mGit\033[0m: Pull taskfile repo" git -C "$HOME/taskfile.build" pull fi } if [ -d "$HOME/taskfile.build/bin" ]; then for file in "$HOME/taskfile.build/bin/"*; do if [ -f "$file" ]; then source "$file" fi done fi # Env Commands function version() { minikube version kind version helm version } function install() { pnpm install } function setup-hosts() { echo "Adding entries to /etc/hosts ..." grep -qxF '127.0.0.1 cloud.local' /etc/hosts || echo "127.0.0.1 cloud.local" | sudo tee -a /etc/hosts > /dev/null grep -qxF "127.0.0.1 $NAMESPACE.cloud.local" /etc/hosts || echo "127.0.0.1 $NAMESPACE.cloud.local" | sudo tee -a /etc/hosts > /dev/null grep -qxF "127.0.0.1 $NAMESPACE.local" /etc/hosts || echo "127.0.0.1 $NAMESPACE.local" | sudo tee -a /etc/hosts > /dev/null grep -qxF "127.0.0.1 restic.cloud.local" /etc/hosts || echo "127.0.0.1 restic.cloud.local" | sudo tee -a /etc/hosts > /dev/null grep -qxF "127.0.0.1 restic.local" /etc/hosts || echo "127.0.0.1 restic.local" | sudo tee -a /etc/hosts > /dev/null } function test-k8s() { if [ "$1" = "clean" ]; then echo "Cleanup environment" delete-kind rm values.yaml else start-kind add-repos install-chart odoo install-ingress-nginx fi } function save-kubeconfig() { if [ -f "$HOME/.kube/config" ]; then echo "Store ~/.kube/config file in pass: $PASS_KUBECONFIG_ENTRY" cat "$HOME/.kube/config" | pass insert -m -f "$PASS_KUBECONFIG_ENTRY" else echo "No ~/.kube/config file found." fi } function load-kubeconfig() { if pass find "$PASS_KUBECONFIG_ENTRY" >/dev/null; then echo "Load ~/.kube/config file from pass: $PASS_KUBECONFIG_ENTRY" mkdir -p "$HOME/.kube/" pass show "$PASS_KUBECONFIG_ENTRY" > "$HOME/.kube/config" else echo "Pass entry not found." fi } # Docs Commands function docs() { pnpm run generate-readme --values cluster-issuer/values.yaml -r cluster-issuer/README.md pnpm run generate-readme --values odoo/values.yaml -r odoo/README.md pnpm run generate-readme --values postgres/values.yaml -r postgres/README.md pnpm run generate-readme --values vshnPostgres/values.yaml -r vshnPostgres/README.md } function lint() { helm lint cluster-issuer helm lint odoo helm lint postgres helm lint vshnPostgres } function dev-vitepress() { cp README.md index.md pnpm run docs:dev } function build-vitepress() { cp README.md index.md pnpm run docs:build } function preview-vitepress() { pnpm run docs:preview } # Host Commands function start-kind() { echo "Start kind." kind create cluster } function delete-kind() { echo "Delete kind." kind delete cluster } function start-minikube() { echo "Start minikube." minikube start } function forward-odoo() { PORT=8080 echo "Open http://localhost:$PORT url in your browser." kubectl port-forward service/odoo $PORT:8069 } function forward-ingress-nginx() { PORT=8080 echo "Open http://$NAMESPACE.cloud.local:$PORT or http://$NAMESPACE.local:$PORT url in your browser." kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller $PORT:80 } function forward-haproxy-ingress() { PORT=8080 echo "Open http://$NAMESPACE.cloud.local:$PORT or http://$NAMESPACE.local:$POR url in your browser." kubectl port-forward -n haproxy-ingress svc/haproxy-ingress $PORT:80 } # Helm Commands function list-chart() { echo "postgresql" echo "postgres" echo "vshnpostgres" echo "cert-manager" echo "cert-issuer" echo "ingress-nginx" echo "haproxy-ingress" echo "kuard" } function list-context() { echo "(empty)" echo "chk" echo "axo" } function template-values { echo "Template values.yaml" export NAMESPACE export ACME_EMAIL export INFOMANIAK_API_TOKEN if [ -n "$1" ]; then envsubst < "values.$1.yaml.template" > "values.yaml" else envsubst < "values.yaml.template" > "values.yaml" fi } function install-chart() { if test -z "$1"; then echo "\$1 is empty."; exit; fi if [ "$2" = "axo" ]; then echo "Set oc project to $OC_PROJECT." oc project "$OC_PROJECT" fi template-values "$2" "install-$1" } function install-kuard() { echo "Apply kuard deployment and service." kubectl apply -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/deployment.yaml kubectl apply -f https://raw.githubusercontent.com/cert-manager/website/master/content/docs/tutorials/acme/example/service.yaml echo "Apply kuard ingress" cat < manifest.yaml helm --debug template cluster-issuer cluster-issuer \ --namespace cert-manager \ --values ./values.yaml >> manifest.yaml } function list() { helm list } function package-repo() { echo "Package Helm charts." index-repo helm package cluster-issuer helm package postgres helm package vshnPostgres mkdir -p ./odoo/charts cp postgres-0.1.0.tgz odoo/charts/ cp vshnPostgres-0.1.0.tgz odoo/charts/ helm package odoo } function index-repo() { echo "Update index.yaml" helm repo index . } function publish-repo() { build-vitepress cp *.tgz .vitepress/dist cp index.yaml .vitepress/dist } function add-repos(){ echo "Add kubernetes-build." helm repo add kubernetes-build https://kubernetes.build echo "Add ingress-nginx." helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx echo "Add haproxy-ingress." helm repo add haproxy-ingress https://haproxy-ingress.github.io/charts echo "Add jetstack." helm repo add jetstack https://charts.jetstack.io echo "Add bitnami." helm repo add bitnami https://charts.bitnami.com/bitnami } function remove-repo(){ echo "Remove the kubernetes-build repo." helm repo remove kubernetes-build } function install-repo(){ echo "Install release odoo from kubernetes-build repo." helm install odoo kubernetes-build/odoo } if declare -f "$1" > /dev/null; then "$1" "${@:2}" else case "$1" in *) echo "Unknown command: $1" help exit 1 ;; esac fi