#!/usr/bin/env bash # bootstrap.sh — Installeer ArgoCD via Helm en genereer de root App-of-Apps # Eénmalig uitvoeren in de VM na `vagrant up`. # # Gebruik: # cd /vagrant # ./scripts/bootstrap.sh # # Wat het doet: # 1. Detecteert de URL van jouw fork op basis van de git remote # 2. Maakt de argocd namespace aan # 3. Installeert ArgoCD via Helm (manifests/argocd/values.yaml) # 4. Wacht tot ArgoCD klaar is # 5. Past apps/project.yaml toe # 6. Genereert apps/root.yaml met jouw fork-URL en past het toe # 7. Print het admin-wachtwoord en een port-forward hint set -euo pipefail ARGOCD_NAMESPACE="argocd" ARGOCD_CHART_VERSION="7.7.11" REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" EXPECTED_NODE_NAME="ops-demo" EXPECTED_HOST_ONLY_IP="$(awk -F'"' '/^HOST_ONLY_IP = "/ {print $2; exit}' "${REPO_ROOT}/Vagrantfile" 2>/dev/null || true)" EXPECTED_HOST_ONLY_IP="${EXPECTED_HOST_ONLY_IP:-192.168.56.10}" EXPECTED_API_SERVER="https://${EXPECTED_HOST_ONLY_IP}:6443" die() { echo "FOUT: $*" >&2 exit 1 } require_cmd() { command -v "$1" >/dev/null 2>&1 || die "verplichte tool ontbreekt: $1" } echo "══════════════════════════════════════════════" echo " ops-demo Bootstrap" echo "══════════════════════════════════════════════" # ── Preflight checks ────────────────────────────────────────────────────────── require_cmd git require_cmd kubectl require_cmd helm # vagrant ssh -c can inherit host KUBECONFIG; force VM kubeconfig for safety. if [[ -f /home/vagrant/.kube/config ]]; then export KUBECONFIG=/home/vagrant/.kube/config fi if ! kubectl get nodes >/dev/null 2>&1; then die "kubectl kan het cluster niet bereiken. Log in op de VM met 'vagrant ssh' en run het script vanaf /vagrant." fi CURRENT_CONTEXT="$(kubectl config current-context 2>/dev/null || true)" CURRENT_SERVER="$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}' 2>/dev/null || true)" if [[ "${CURRENT_SERVER}" != "${EXPECTED_API_SERVER}" ]]; then die "kubectl wijst naar '${CURRENT_SERVER:-onbekend}', verwacht '${EXPECTED_API_SERVER}'. Controleer je context eerst (huidige context: ${CURRENT_CONTEXT:-onbekend})." fi if ! kubectl get node "${EXPECTED_NODE_NAME}" -o name >/dev/null 2>&1; then die "verwachte node '${EXPECTED_NODE_NAME}' niet gevonden in huidige cluster. Stop om deploy naar de verkeerde cluster te voorkomen." fi if [[ "${CURRENT_CONTEXT}" != "ops-demo" ]]; then echo "WAARSCHUWING: huidige context is '${CURRENT_CONTEXT:-onbekend}', verwacht 'ops-demo'." echo " Cluster-checks zijn wel geslaagd; je kunt doorgaan." fi if [[ "${PWD}" != /vagrant* ]]; then echo "WAARSCHUWING: je staat niet in /vagrant. Aanbevolen: 'cd /vagrant' voor je dit script draait." fi # ── 1. Detecteer fork URL ───────────────────────────────────────────────────── REMOTE_URL=$(git -C "${REPO_ROOT}" remote get-url origin 2>/dev/null || echo "") if [[ -z "${REMOTE_URL}" ]]; then echo "FOUT: geen git remote 'origin' gevonden." echo " Clone de repo eerst via: git clone https://github.com/JOUW_USERNAME/ops-demo.git" exit 1 fi # Converteer SSH naar HTTPS als nodig (git@github.com:user/repo.git → https://...) if [[ "${REMOTE_URL}" == git@* ]]; then REPO_URL=$(echo "${REMOTE_URL}" | sed 's|git@github.com:|https://github.com/|') else REPO_URL="${REMOTE_URL}" fi # Zorg dat de URL eindigt op .git [[ "${REPO_URL}" == *.git ]] || REPO_URL="${REPO_URL}.git" echo "→ Fork URL gedetecteerd: ${REPO_URL}" # ── 2. Namespace ────────────────────────────────────────────────────────────── echo "→ Namespace aanmaken: ${ARGOCD_NAMESPACE}" kubectl create namespace "${ARGOCD_NAMESPACE}" --dry-run=client -o yaml | kubectl apply -f - # ── 3. Helm install ArgoCD ──────────────────────────────────────────────────── echo "→ Argo Helm-repo toevoegen" helm repo add argo https://argoproj.github.io/argo-helm --force-update helm repo update argo echo "→ ArgoCD installeren (chart ${ARGOCD_CHART_VERSION})" helm upgrade --install argocd argo/argo-cd \ --namespace "${ARGOCD_NAMESPACE}" \ --version "${ARGOCD_CHART_VERSION}" \ --values "${REPO_ROOT}/manifests/argocd/values.yaml" \ --wait \ --timeout 5m # ── 4. AppProject toepassen ─────────────────────────────────────────────────── echo "→ AppProject 'workshop' aanmaken" kubectl apply -f "${REPO_ROOT}/apps/project.yaml" # ── 5. Genereer en pas apps/root.yaml toe ───────────────────────────────────── echo "→ apps/root.yaml genereren voor ${REPO_URL}" mkdir -p "${REPO_ROOT}/apps" cat > "${REPO_ROOT}/apps/root.yaml" <