Files
mcpctl/fulldeploy.sh
Michal 3149ea3ae7
Some checks failed
CI/CD / lint (push) Successful in 52s
CI/CD / typecheck (push) Successful in 1m51s
CI/CD / test (push) Successful in 1m1s
CI/CD / smoke (push) Failing after 3m21s
CI/CD / build (push) Successful in 4m9s
CI/CD / publish (push) Has been skipped
fix: MCP proxy resilience — discovery cache, default liveness probes
Adds a per-server tools/list cache in McpRouter (positive + negative TTL)
so a slow or dead upstream only stalls the first discovery call, not every
subsequent client request. Invalidated on upstream add/remove.

Health probes now apply a default liveness spec (tools/list via the real
production path) to any RUNNING instance without an explicit healthCheck,
so synthetic and real failures converge on the same signal.

Includes supporting updates in mcpd-client, discovery, upstream/mcpd,
seeder, and fulldeploy/release scripts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 00:48:57 +01:00

91 lines
2.8 KiB
Bash
Executable File

#!/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 "========================================"