- Reset master to upstream/main (16,697 commits) - Overlay 2,271 local-only files (skills, tools, workspace, configs, apps) - Restore IDENTITY.md and USER.md templates - Build verified, gateway running, Discord working Co-Authored-By: Claude Opus 4.6 <[email protected]>
121 lines
5.7 KiB
Bash
121 lines
5.7 KiB
Bash
#!/bin/bash
|
|
# Pre-update pipeline — kør inden openclaw update
|
|
# Trin: backup → test gateway → smoke test → lint+build → update → verify → rollback hvis fejl
|
|
|
|
set -euo pipefail
|
|
|
|
LOG="/home/alex/clawd/logs/update.log"
|
|
BACKUP_SCRIPT="/home/alex/clawd/tools/daily-backup.sh"
|
|
CONFIG="/home/alex/.openclaw/openclaw.json"
|
|
ROLLBACK_DIR="/home/alex/clawd/backups/pre-update"
|
|
|
|
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG"; }
|
|
fail() { log "❌ FEJL: $*"; exit 1; }
|
|
|
|
# ─── 1. BACKUP ───────────────────────────────────────────────────────────────
|
|
log "── Trin 1/5: Backup ──"
|
|
bash "$BACKUP_SCRIPT" >> "$LOG" 2>&1 || fail "Backup fejlede — afbryder"
|
|
|
|
# Gem config til rollback
|
|
mkdir -p "$ROLLBACK_DIR"
|
|
cp "$CONFIG" "$ROLLBACK_DIR/openclaw.json.pre-update"
|
|
CURRENT_VERSION=$(openclaw --version 2>/dev/null | grep -oP '\d{4}\.\d+\.\d+(-\d+)?' || echo "unknown")
|
|
echo "$CURRENT_VERSION" > "$ROLLBACK_DIR/version.txt"
|
|
log "✅ Backup ok — version: $CURRENT_VERSION"
|
|
|
|
# ─── 2. TEST GATEWAY (FØR UPDATE) ────────────────────────────────────────────
|
|
log "── Trin 2/5: Test gateway (før update) ──"
|
|
GW_RUNNING=$(systemctl is-active openclaw 2>/dev/null || echo "unknown")
|
|
if [ "$GW_RUNNING" = "active" ]; then
|
|
log "✅ Gateway ok (systemd: active)"
|
|
else
|
|
# Fallback: tjek via openclaw status JSON
|
|
GW_STATE=$(openclaw status --json 2>/dev/null | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('gatewayService',{}).get('state','unknown'))" 2>/dev/null || echo "unknown")
|
|
if [ "$GW_STATE" = "active" ] || [ "$GW_STATE" = "running" ]; then
|
|
log "✅ Gateway ok (state: $GW_STATE)"
|
|
else
|
|
fail "Gateway er nede inden update (systemd: $GW_RUNNING) — afbryder"
|
|
fi
|
|
fi
|
|
|
|
# ─── 3. SMOKE TEST (FØR UPDATE) ──────────────────────────────────────────────
|
|
log "── Trin 3/5: Smoke test (før update) ──"
|
|
# Tjek at gateway-porten svarer med HTTP
|
|
GATEWAY_PORT=$(openclaw status --json 2>/dev/null | python3 -c "import json,sys,re; d=json.load(sys.stdin); url=d.get('gateway',{}).get('url',''); m=re.search(r':(\d+)', url); print(m.group(1) if m else '18789')" 2>/dev/null || echo "18789")
|
|
GATEWAY_HOST=$(openclaw status --json 2>/dev/null | python3 -c "import json,sys,re; d=json.load(sys.stdin); url=d.get('gateway',{}).get('url',''); m=re.search(r'://([^:/]+)', url); print(m.group(1) if m else '127.0.0.1')" 2>/dev/null || echo "127.0.0.1")
|
|
|
|
HTTP_CODE=$(curl -sLo /dev/null -w "%{http_code}" --max-time 5 "http://$GATEWAY_HOST:$GATEWAY_PORT/" 2>/dev/null || echo "000")
|
|
if [ "$HTTP_CODE" != "000" ]; then
|
|
log "✅ Smoke test ok (HTTP $HTTP_CODE fra $GATEWAY_HOST:$GATEWAY_PORT)"
|
|
else
|
|
log "⚠️ Smoke test: ingen HTTP svar — gateway kører men port utilgængelig (fortsætter)"
|
|
fi
|
|
|
|
# ─── 3.5 NPM LINT + BUILD ────────────────────────────────────────────────────
|
|
log "── Trin 3.5/5: lint + build ──"
|
|
cd /home/alex/clawd
|
|
|
|
CHECK_OUTPUT=$(pnpm tsgo 2>&1) || { log "❌ TypeScript check fejlede — afbryder"; echo "$CHECK_OUTPUT" >> "$LOG"; exit 1; }
|
|
log "✅ TypeScript check ok"
|
|
|
|
BUILD_OUTPUT=$(pnpm build 2>&1) || { log "❌ build fejlede — afbryder"; echo "$BUILD_OUTPUT" >> "$LOG"; exit 1; }
|
|
log "✅ build ok"
|
|
|
|
# ─── 4. OPDATER ──────────────────────────────────────────────────────────────
|
|
log "── Trin 4/5: Opdater OpenClaw + Claude Code ──"
|
|
UPDATE_OUTPUT=$(openclaw update --yes --no-restart 2>&1) || true
|
|
echo "$UPDATE_OUTPUT" >> "$LOG"
|
|
|
|
NEW_VERSION=$(openclaw --version 2>/dev/null | grep -oP '\d{4}\.\d+\.\d+(-\d+)?' || echo "unknown")
|
|
|
|
# Opdater Claude Code
|
|
CLAUDE_CURRENT=$(claude --version 2>/dev/null | grep -oP '[\d.]+' | head -1 || echo "unknown")
|
|
CLAUDE_OUTPUT=$(sudo npm i -g @anthropic-ai/claude-code@latest 2>&1) || true
|
|
echo "$CLAUDE_OUTPUT" >> "$LOG"
|
|
CLAUDE_NEW=$(claude --version 2>/dev/null | grep -oP '[\d.]+' | head -1 || echo "unknown")
|
|
if [ "$CLAUDE_CURRENT" != "$CLAUDE_NEW" ]; then
|
|
log "⬆️ Claude Code opdateret: $CLAUDE_CURRENT → $CLAUDE_NEW"
|
|
else
|
|
log "✅ Claude Code allerede opdateret: $CLAUDE_CURRENT"
|
|
fi
|
|
|
|
if [ "$CURRENT_VERSION" = "$NEW_VERSION" ]; then
|
|
log "✅ Allerede på nyeste version ($CURRENT_VERSION) — ingen restart nødvendig"
|
|
exit 0
|
|
fi
|
|
|
|
log "⬆️ Opdateret: $CURRENT_VERSION → $NEW_VERSION"
|
|
|
|
# Genstart gateway (openclaw.service ejer port 18789)
|
|
sudo systemctl restart openclaw 2>/dev/null || true
|
|
sleep 5
|
|
|
|
# ─── 5. VERIFY (EFTER UPDATE) ────────────────────────────────────────────────
|
|
log "── Trin 5/5: Verify efter update ──"
|
|
|
|
GATEWAY_OK=false
|
|
for i in 1 2 3; do
|
|
if systemctl is-active --quiet openclaw; then
|
|
GATEWAY_OK=true
|
|
break
|
|
fi
|
|
log " Venter på gateway... ($i/3)"
|
|
sleep 5
|
|
done
|
|
|
|
if [ "$GATEWAY_OK" = false ]; then
|
|
log "❌ Gateway kom ikke op efter update — ROLLBACK"
|
|
cp "$ROLLBACK_DIR/openclaw.json.pre-update" "$CONFIG"
|
|
sudo systemctl restart openclaw 2>/dev/null || true
|
|
log "♻️ Rollback til $CURRENT_VERSION — check manuelt!"
|
|
exit 1
|
|
fi
|
|
|
|
log "✅ Gateway oppe efter update"
|
|
|
|
# Doctor fix efter update
|
|
openclaw doctor --fix >> "$LOG" 2>&1 || true
|
|
log "✅ Doctor fix kørt"
|
|
|
|
log "🎉 Pipeline færdig: $CURRENT_VERSION → $NEW_VERSION"
|