Files
openclaw/tools/pre-update-pipeline.sh
Clawd BotandClaude Opus 4.6 ca9b510922 chore: align with upstream openclaw/openclaw and overlay local additions
- 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]>
2026-03-03 07:40:46 +01:00

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"