feat(goose-v149): add 103 full pool switch script with rollback
Switch native 18006-18014 from goosed agent 1.41 to goose serve 1.49; harden Portal restart during canary teardown. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Executable
+168
@@ -0,0 +1,168 @@
|
||||
#!/usr/bin/env bash
|
||||
# Switch 103 native goosed pool 18006-18014 from 1.41 to Goose v1.49 (goose serve).
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
NATIVE_ROOT="${GOOSE_NATIVE_ROOT:-/Users/john/Project/tkmind_go-native}"
|
||||
GOOSED_V149_ROOT="${GOOSE_V149_ROOT:-/Users/john/Project/tkmind_go-v149}"
|
||||
STAMP="${GOOSE_V149_RELEASE_STAMP:-$(date +%Y%m%d-v149-m1)}"
|
||||
RELEASE_BIN="${NATIVE_ROOT}/releases/goose-${STAMP}"
|
||||
BACKUP_TAG="$(date +%Y%m%d-%H%M%S)"
|
||||
BACKUP_DIR="${NATIVE_ROOT}/backups/pre-v149-pool-${BACKUP_TAG}"
|
||||
RUN_SCRIPT="${NATIVE_ROOT}/run-goosed-native.sh"
|
||||
PORTAL_ENV="${GOOSE_V149_CANARY_ENV_FILE:-/Users/john/Project/Memind/.env}"
|
||||
GUI="gui/$(id -u)"
|
||||
CANARY_LABEL="cn.tkmind.goose-v149-canary"
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Usage:
|
||||
bash scripts/install-goose-v149-pool-103.sh [--yes]
|
||||
bash scripts/install-goose-v149-pool-103.sh --rollback
|
||||
|
||||
Replaces native 1.41 pool (:18006-:18014) with Goose v1.49 goose serve.
|
||||
Backups land in ${NATIVE_ROOT}/backups/pre-v149-pool-*
|
||||
|
||||
Rollback restores run script + .env.* from latest backup and re-bootstrap launchd.
|
||||
EOF
|
||||
}
|
||||
|
||||
say() { printf '[goose-v149-pool-103] %s\n' "$*"; }
|
||||
|
||||
rollback() {
|
||||
local latest
|
||||
latest="$(ls -dt "${NATIVE_ROOT}"/backups/pre-v149-pool-* 2>/dev/null | head -1 || true)"
|
||||
if [[ -z "${latest}" ]]; then
|
||||
echo "No pool backup found under ${NATIVE_ROOT}/backups/" >&2
|
||||
exit 1
|
||||
fi
|
||||
say "rollback from ${latest}"
|
||||
cp "${latest}/run-goosed-native.sh" "${RUN_SCRIPT}"
|
||||
chmod +x "${RUN_SCRIPT}"
|
||||
for env in "${latest}"/.env.*; do
|
||||
[[ -f "${env}" ]] || continue
|
||||
cp "${env}" "${NATIVE_ROOT}/$(basename "${env}")"
|
||||
done
|
||||
ln -sfn "${NATIVE_ROOT}/releases/goosed-20260729-v141-m1" "${NATIVE_ROOT}/goosed"
|
||||
for p in $(seq 18006 18014); do
|
||||
launchctl bootout "${GUI}/cn.tkmind.goosed-native-${p}" 2>/dev/null || true
|
||||
launchctl bootstrap "${GUI}" "${HOME}/Library/LaunchAgents/cn.tkmind.goosed-native-${p}.plist"
|
||||
done
|
||||
if [[ -x "${ROOT}/scripts/switch-goose-v149-canary-103.sh" ]]; then
|
||||
bash "${ROOT}/scripts/switch-goose-v149-canary-103.sh" off || true
|
||||
fi
|
||||
sleep 3
|
||||
for p in $(seq 18006 18014); do
|
||||
printf '%s: ' "$p"
|
||||
curl -kfsS --connect-timeout 5 "https://127.0.0.1:${p}/status" || echo FAIL
|
||||
done
|
||||
say "rollback complete"
|
||||
}
|
||||
|
||||
if [[ "${1:-}" == "--rollback" ]]; then
|
||||
rollback
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ "${1:-}" != "--yes" ]]; then
|
||||
echo "Refusing without --yes (103 production pool switch)" >&2
|
||||
usage >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
SRC_BIN="${GOOSED_V149_ROOT}/target/release/goose"
|
||||
if [[ ! -x "${SRC_BIN}" ]]; then
|
||||
SRC_BIN="${NATIVE_ROOT}/releases/goose-${STAMP}"
|
||||
fi
|
||||
if [[ ! -x "${SRC_BIN}" ]]; then
|
||||
echo "Missing v1.49 binary: ${GOOSED_V149_ROOT}/target/release/goose" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir -p "${BACKUP_DIR}" "${NATIVE_ROOT}/releases"
|
||||
cp -a "${RUN_SCRIPT}" "${BACKUP_DIR}/"
|
||||
for p in $(seq 18006 18014); do
|
||||
cp -a "${NATIVE_ROOT}/.env.${p}" "${BACKUP_DIR}/"
|
||||
done
|
||||
say "backup ${BACKUP_DIR}"
|
||||
|
||||
install -m 755 "${SRC_BIN}" "${RELEASE_BIN}"
|
||||
ln -sfn "${RELEASE_BIN}" "${NATIVE_ROOT}/goosed"
|
||||
|
||||
cat > "${RUN_SCRIPT}" <<'RUNEOF'
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
export PATH="/opt/homebrew/opt/node@24/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin"
|
||||
PORT="${1:?missing port argument}"
|
||||
ROOT="/Users/john/Project/tkmind_go-native"
|
||||
cd "${ROOT}"
|
||||
set -a
|
||||
# shellcheck source=/dev/null
|
||||
source "${ROOT}/.env.${PORT}"
|
||||
set +a
|
||||
GOOSE_BIN="${GOOSE_BIN:-${ROOT}/goosed}"
|
||||
exec env "CUSTOM_DEEPSEEK-CP_API_KEY=${DEEPSEEK_API_KEY:-}" \
|
||||
"${GOOSE_BIN}" serve \
|
||||
--host "${GOOSE_HOST:-127.0.0.1}" \
|
||||
--port "${PORT}" \
|
||||
--tls
|
||||
RUNEOF
|
||||
chmod +x "${RUN_SCRIPT}"
|
||||
|
||||
for p in $(seq 18006 18014); do
|
||||
ENV_FILE="${NATIVE_ROOT}/.env.${p}"
|
||||
mkdir -p "${NATIVE_ROOT}/state/${p}"/{config,data,state,cache}
|
||||
if ! grep -q 'GOOSE_V149_POOL' "${ENV_FILE}" 2>/dev/null; then
|
||||
{
|
||||
echo ""
|
||||
echo "# GOOSE_V149_POOL overrides ($(date -u +%Y-%m-%dT%H:%M:%SZ))"
|
||||
echo "GOOSE_BIN=${RELEASE_BIN}"
|
||||
echo "XDG_CONFIG_HOME=${NATIVE_ROOT}/state/${p}/config"
|
||||
echo "XDG_DATA_HOME=${NATIVE_ROOT}/state/${p}/data"
|
||||
echo "XDG_STATE_HOME=${NATIVE_ROOT}/state/${p}/state"
|
||||
echo "XDG_CACHE_HOME=${NATIVE_ROOT}/state/${p}/cache"
|
||||
echo "MEMORY_BACKEND=legacy"
|
||||
echo "MEMORY_VECTOR_ENABLED=0"
|
||||
echo "MEMORY_AGENT_INJECTION_MODE=off"
|
||||
echo "MEMORY_LIFECYCLE_ENABLED=0"
|
||||
echo "MEMORY_CANDIDATE_ENABLED=0"
|
||||
} >> "${ENV_FILE}"
|
||||
fi
|
||||
done
|
||||
|
||||
say "stop stable pool + canary :18015"
|
||||
for p in $(seq 18006 18014); do
|
||||
launchctl bootout "${GUI}/cn.tkmind.goosed-native-${p}" 2>/dev/null || true
|
||||
done
|
||||
launchctl bootout "${GUI}/${CANARY_LABEL}" 2>/dev/null || true
|
||||
|
||||
if [[ -x "${ROOT}/scripts/switch-goose-v149-canary-103.sh" ]] \
|
||||
&& grep -q '# GOOSE_V149_CANARY_BEGIN' "${PORTAL_ENV}" 2>/dev/null; then
|
||||
bash "${ROOT}/scripts/switch-goose-v149-canary-103.sh" off || true
|
||||
fi
|
||||
|
||||
say "bootstrap v1.49 pool"
|
||||
for p in $(seq 18006 18014); do
|
||||
launchctl bootstrap "${GUI}" "${HOME}/Library/LaunchAgents/cn.tkmind.goosed-native-${p}.plist"
|
||||
done
|
||||
|
||||
sleep 5
|
||||
FAIL=0
|
||||
for p in $(seq 18006 18014); do
|
||||
printf '%s: ' "$p"
|
||||
if curl -kfsS --connect-timeout 8 "https://127.0.0.1:${p}/status" >/dev/null; then
|
||||
echo ok
|
||||
else
|
||||
echo FAIL
|
||||
FAIL=1
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "${FAIL}" -ne 0 ]]; then
|
||||
say "pool health check failed; consider: bash $0 --rollback" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
"${RELEASE_BIN}" --version | head -1
|
||||
say "pool switch ok release=${RELEASE_BIN}"
|
||||
say "backup=${BACKUP_DIR}"
|
||||
@@ -67,8 +67,8 @@ write_canary_block() {
|
||||
|
||||
restart_portal() {
|
||||
launchctl kickstart -k "${GUI}/${PORTAL_LABEL}" 2>/dev/null || launchctl bootstrap "${GUI}" "${HOME}/Library/LaunchAgents/${PORTAL_LABEL}.plist"
|
||||
sleep 2
|
||||
curl -fsS --connect-timeout 5 http://127.0.0.1:8081/api/status
|
||||
sleep 5
|
||||
curl -fsS --connect-timeout 10 http://127.0.0.1:8081/api/status || echo "[goose-v149-canary-103] WARN: Portal /api/status not ready yet" >&2
|
||||
}
|
||||
|
||||
cmd="${1:-}"
|
||||
|
||||
Reference in New Issue
Block a user