deploy foundation: push-based deploy.sh, spec-007, v3.0.0
This commit is contained in:
Executable
+52
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env bash
|
||||
# deploy.sh <host> <tag> — push-based deploy from the dev machine (SPEC-007).
|
||||
# Rollback = run again with the previous tag (DEP-06); restore the
|
||||
# bot.db.pre-<tag> backup first when the schema version moved (PER-06).
|
||||
set -euo pipefail
|
||||
|
||||
HOST="${1:?usage: deploy.sh <fjerkroa|ggg> <tag>}"
|
||||
TAG="${2:?usage: deploy.sh <fjerkroa|ggg> <tag>}"
|
||||
|
||||
case "$HOST" in
|
||||
fjerkroa) SERVICE=kroa CONFIG=kroa.toml ;;
|
||||
ggg) SERVICE=luma CONFIG=ggg.toml ;;
|
||||
*) echo "unknown host: $HOST (known: fjerkroa, ggg)" >&2; exit 1 ;;
|
||||
esac
|
||||
|
||||
# Tags only — no branch/commit deploys (DEP-01)
|
||||
git rev-parse -q --verify "refs/tags/$TAG" >/dev/null || { echo "not a tag: $TAG" >&2; exit 1; }
|
||||
|
||||
# Restaurant service window (DEP-05)
|
||||
if [ "$HOST" = fjerkroa ] && [ "${DEPLOY_FORCE:-0}" != 1 ]; then
|
||||
HOUR=$(TZ=Europe/Oslo date +%H)
|
||||
if [ "$HOUR" -ge 11 ] && [ "$HOUR" -lt 22 ]; then
|
||||
echo "refusing kroa deploy during service hours (11-22 Europe/Oslo); DEPLOY_FORCE=1 overrides (DEP-05)" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "== deploy $TAG -> $HOST (service $SERVICE, config $CONFIG) =="
|
||||
|
||||
# Code push: tag tree over ~/fjerkroa_bot; untracked config/state survives (DEP-01)
|
||||
git archive "$TAG" | ssh "$HOST" 'mkdir -p ~/fjerkroa_bot && tar -x -C ~/fjerkroa_bot'
|
||||
|
||||
ssh "$HOST" "set -e
|
||||
[ -x ~/venv-bot/bin/python ] || python3.11 -m venv ~/venv-bot
|
||||
~/venv-bot/bin/pip install -q --upgrade pip
|
||||
~/venv-bot/bin/pip install -q ~/fjerkroa_bot
|
||||
printf '#!/bin/sh\ncd %s/fjerkroa_bot || exit 1\nexec %s/venv-bot/bin/python -m fjerkroa_bot --config $CONFIG\n' \"\$HOME\" \"\$HOME\" > ~/fjerkroa_bot/start.sh
|
||||
chmod +x ~/fjerkroa_bot/start.sh
|
||||
~/venv-bot/bin/python -c 'import fjerkroa_bot'
|
||||
find ~/fjerkroa_bot -maxdepth 3 -name bot.db | while read -r db; do cp \"\$db\" \"\$db.pre-$TAG\"; done # DEP-03
|
||||
supervisorctl restart $SERVICE"
|
||||
|
||||
echo "== waiting for startsecs =="
|
||||
sleep 35
|
||||
|
||||
# Smoke (DEP-04)
|
||||
ssh "$HOST" "supervisorctl status $SERVICE | grep -q RUNNING" \
|
||||
|| { echo "SMOKE FAIL: $SERVICE not RUNNING on $HOST — rollback: deploy.sh $HOST <previous-tag> (DEP-06)" >&2; exit 1; }
|
||||
ssh "$HOST" "tail -80 ~/logs/supervisord.log | grep -q 'We have logged in as'" \
|
||||
|| { echo "SMOKE FAIL: no fresh Discord login line on $HOST — check logs, consider rollback (DEP-06)" >&2; exit 1; }
|
||||
|
||||
echo "== OK: $HOST runs $TAG — RUNNING + logged in (DEP-04) =="
|
||||
Reference in New Issue
Block a user