#!/bin/bash # Full deployment: mcpd image → k8s rollout → RPM build/publish/install # # Production runtime is Kubernetes (context: worker0-k8s0, namespace: mcpctl). # The docker-compose stack under stack/ + deploy/ is kept for local/VM testing # only and is no longer invoked from here. # # Infra (Deployment shape, env, RBAC, NetworkPolicies) is managed by Pulumi # in ../kubernetes-deployment. This script runs `pulumi preview` before the # rollout; if there is infra drift it halts so you can `pulumi up` first. set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # Load .env if [ -f .env ]; then set -a; source .env; set +a fi KUBE_CONTEXT="${KUBE_CONTEXT:-worker0-k8s0}" KUBE_NAMESPACE="${KUBE_NAMESPACE:-mcpctl}" KUBE_DEPLOYMENT="${KUBE_DEPLOYMENT:-mcpd}" PULUMI_DIR="${PULUMI_DIR:-$SCRIPT_DIR/../kubernetes-deployment}" PULUMI_STACK="${PULUMI_STACK:-homelab}" echo "========================================" echo " mcpctl Full Deploy" echo "========================================" # --- Pre-flight: Pulumi drift check --- echo "" echo ">>> Pre-flight: checking for Pulumi infra drift" echo "" if [ -d "$PULUMI_DIR" ]; then if [ -z "$PULUMI_CONFIG_PASSPHRASE" ]; then echo " WARNING: PULUMI_CONFIG_PASSPHRASE not set — skipping drift check." echo " Set it in .env or export it to enable." else preview_output=$(cd "$PULUMI_DIR" && pulumi preview --stack "$PULUMI_STACK" --non-interactive --diff 2>&1) || true if echo "$preview_output" | grep -qE '^\s+[-+~]'; then echo "$preview_output" echo "" echo "ERROR: Pulumi detected infra changes that have not been applied." echo " Run: cd $PULUMI_DIR && pulumi up -s $PULUMI_STACK" echo " Then re-run this script." exit 1 fi echo " No drift — infra is in sync." fi # passphrase check else echo " WARNING: Pulumi repo not found at $PULUMI_DIR — skipping drift check." fi echo "" echo ">>> Step 1/3: Build & push mcpd Docker image" echo "" bash scripts/build-mcpd.sh "$@" echo "" echo ">>> Step 2/3: Roll out mcpd on k8s ($KUBE_CONTEXT / $KUBE_NAMESPACE)" echo "" kubectl --context "$KUBE_CONTEXT" -n "$KUBE_NAMESPACE" rollout restart "deployment/$KUBE_DEPLOYMENT" kubectl --context "$KUBE_CONTEXT" -n "$KUBE_NAMESPACE" rollout status "deployment/$KUBE_DEPLOYMENT" --timeout=3m echo "" echo ">>> Step 3/3: Build, publish & install RPM" echo "" bash scripts/release.sh echo "" echo ">>> Post-deploy: Restart mcplocal" echo "" systemctl --user restart mcplocal sleep 2 echo "" echo ">>> Post-deploy: Smoke tests" echo "" export PATH="$HOME/.npm-global/bin:$PATH" if pnpm test:smoke; then echo " Smoke tests passed!" else echo " WARNING: Smoke tests failed! Verify mcplocal + mcpd are healthy." fi echo "" echo "========================================" echo " Full deploy complete!" echo "========================================"