fix(cms): automate migrations on startup and clean up deploy pipeline
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 26s
Build & Deploy / 🧪 QA (push) Failing after 2m54s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 3s
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 26s
Build & Deploy / 🧪 QA (push) Failing after 2m54s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 3s
This commit is contained in:
@@ -389,6 +389,10 @@ jobs:
|
|||||||
- name: 🚀 SSH Deploy
|
- name: 🚀 SSH Deploy
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
|
TARGET: ${{ needs.prepare.outputs.target }}
|
||||||
|
SLUG: ${{ needs.prepare.outputs.slug }}
|
||||||
|
IMAGE_TAG: ${{ needs.prepare.outputs.image_tag }}
|
||||||
|
PROJECT_NAME: ${{ needs.prepare.outputs.project_name }}
|
||||||
ENV_FILE: ${{ needs.prepare.outputs.env_file }}
|
ENV_FILE: ${{ needs.prepare.outputs.env_file }}
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ~/.ssh
|
mkdir -p ~/.ssh
|
||||||
@@ -417,48 +421,6 @@ jobs:
|
|||||||
# Execute remote commands — alpha is pre-logged into registry.infra.mintel.me
|
# Execute remote commands — alpha is pre-logged into registry.infra.mintel.me
|
||||||
ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file $ENV_FILE pull && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file $ENV_FILE up -d --remove-orphans"
|
ssh root@alpha.mintel.me "cd $SITE_DIR && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file $ENV_FILE pull && docker compose -p '${{ needs.prepare.outputs.project_name }}' --env-file $ENV_FILE up -d --remove-orphans"
|
||||||
|
|
||||||
# Sanitize Payload Migrations: Replace 'dev' push entries with proper migration names.
|
|
||||||
# Without this, Payload prompts interactively for confirmation and blocks forever in Docker.
|
|
||||||
DB_CONTAINER="${{ needs.prepare.outputs.project_name }}-klz-db-1"
|
|
||||||
echo "⏳ Waiting for database container to be ready..."
|
|
||||||
for i in $(seq 1 15); do
|
|
||||||
if ssh root@alpha.mintel.me "docker exec $DB_CONTAINER pg_isready -U payload -q 2>/dev/null"; then
|
|
||||||
echo "✅ Database is ready."
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
echo " Attempt $i/15..."
|
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "🔧 Sanitizing payload_migrations table (if exists)..."
|
|
||||||
REMOTE_DB_USER=$(ssh root@alpha.mintel.me "grep -h '^PAYLOAD_DB_USER=' $SITE_DIR/.env* 2>/dev/null | tail -1 | cut -d= -f2" || echo "payload")
|
|
||||||
REMOTE_DB_NAME=$(ssh root@alpha.mintel.me "grep -h '^PAYLOAD_DB_NAME=' $SITE_DIR/.env* 2>/dev/null | tail -1 | cut -d= -f2" || echo "payload")
|
|
||||||
REMOTE_DB_USER="${REMOTE_DB_USER:-payload}"
|
|
||||||
REMOTE_DB_NAME="${REMOTE_DB_NAME:-payload}"
|
|
||||||
|
|
||||||
# Auto-detect migrations from src/migrations/*.ts
|
|
||||||
BATCH=1
|
|
||||||
VALUES=""
|
|
||||||
for f in $(ls src/migrations/*.ts 2>/dev/null | sort); do
|
|
||||||
NAME=$(basename "$f" .ts)
|
|
||||||
[ -n "$VALUES" ] && VALUES="$VALUES,"
|
|
||||||
VALUES="$VALUES ('$NAME', $BATCH)"
|
|
||||||
((BATCH++))
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ -n "$VALUES" ]; then
|
|
||||||
echo "
|
|
||||||
DO \$\$ BEGIN
|
|
||||||
DELETE FROM payload_migrations WHERE batch = -1;
|
|
||||||
INSERT INTO payload_migrations (name, batch)
|
|
||||||
SELECT name, batch FROM (VALUES $VALUES) AS v(name, batch)
|
|
||||||
WHERE NOT EXISTS (SELECT 1 FROM payload_migrations pm WHERE pm.name = v.name);
|
|
||||||
EXCEPTION WHEN undefined_table THEN
|
|
||||||
RAISE NOTICE 'payload_migrations table does not exist yet — skipping sanitization';
|
|
||||||
END \$\$;
|
|
||||||
" | ssh root@alpha.mintel.me "docker exec -i $DB_CONTAINER psql -U $REMOTE_DB_USER -d $REMOTE_DB_NAME"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Restart app to pick up clean migration state
|
# Restart app to pick up clean migration state
|
||||||
APP_CONTAINER="${{ needs.prepare.outputs.project_name }}-klz-app-1"
|
APP_CONTAINER="${{ needs.prepare.outputs.project_name }}-klz-app-1"
|
||||||
ssh root@alpha.mintel.me "docker restart $APP_CONTAINER"
|
ssh root@alpha.mintel.me "docker restart $APP_CONTAINER"
|
||||||
@@ -620,7 +582,7 @@ jobs:
|
|||||||
STATUS_LINE="All checks passed"
|
STATUS_LINE="All checks passed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
TITLE="$EMOJI klz-cables.com $VERSION → $TARGET"
|
TITLE="$EMOJI klz-cables.com $VERSION -> $TARGET"
|
||||||
MESSAGE="$STATUS_LINE
|
MESSAGE="$STATUS_LINE
|
||||||
Deploy: $DEPLOY | Smoke: $SMOKE | Perf: $PERF
|
Deploy: $DEPLOY | Smoke: $SMOKE | Perf: $PERF
|
||||||
$URL"
|
$URL"
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ const dirname = path.dirname(filename);
|
|||||||
export default buildConfig({
|
export default buildConfig({
|
||||||
onInit: async (payload) => {
|
onInit: async (payload) => {
|
||||||
if (process.env.NODE_ENV === 'production') {
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
await payload.db.migrateUp();
|
||||||
await seedDatabase(payload);
|
await seedDatabase(payload);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user