Files
optima/api/prisma/migrate-entrypoint.sh
T

44 lines
1.5 KiB
Bash
Executable File

#!/bin/sh
set -e
# ---------------------------------------------------------------------------
# Run prisma migrate deploy. On P3009 (a failed migration is blocking deploy),
# extract the migration name from the error, resolve it as rolled-back, and
# retry. All migration SQL in this repo is idempotent so a re-run is safe.
# Loop handles multiple blocked migrations; max retries prevents infinite loops.
# ---------------------------------------------------------------------------
MAX_RETRIES=10
ATTEMPT=0
while [ $ATTEMPT -lt $MAX_RETRIES ]; do
ATTEMPT=$((ATTEMPT + 1))
echo "[migrate] Running prisma migrate deploy (attempt $ATTEMPT)..."
DEPLOY_OUTPUT=$(bunx prisma migrate deploy 2>&1)
EXIT_CODE=$?
echo "$DEPLOY_OUTPUT"
if [ $EXIT_CODE -eq 0 ]; then
echo "[migrate] All migrations applied successfully."
exit 0
fi
# P3009: a previously-failed migration is blocking deploy.
# The error message contains the migration name in backticks:
# The `20260402000000_fix_severity_typo` migration started at ... failed
if echo "$DEPLOY_OUTPUT" | grep -q "P3009"; then
FAILED=$(echo "$DEPLOY_OUTPUT" | grep -oE '\`[0-9]{14}(_[a-zA-Z_]+)?\`' | tr -d '\`' | head -1)
if [ -n "$FAILED" ]; then
echo "[migrate] Resolving failed migration as rolled-back: $FAILED"
bunx prisma migrate resolve --rolled-back "$FAILED"
continue
fi
fi
echo "[migrate] Migration failed with a non-recoverable error."
exit 1
done
echo "[migrate] Exceeded max retries ($MAX_RETRIES). Giving up."
exit 1