ci: probe every e2epg IP and pin DATABASE_URL to the one with our DB
CI / Unit Tests (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Fresh-Linux Docker Deploy (push) Has been cancelled
CI / Release Images (push) Has been cancelled
CI / Typecheck (push) Has started running
CI / Assistant Split Regression (push) Has started running
CI / Lint (push) Has started running
CI / Architecture Guardrails (push) Has started running
CI / Unit Tests (push) Has been cancelled
CI / Build (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
CI / Fresh-Linux Docker Deploy (push) Has been cancelled
CI / Release Images (push) Has been cancelled
CI / Typecheck (push) Has started running
CI / Assistant Split Regression (push) Has started running
CI / Lint (push) Has started running
CI / Architecture Guardrails (push) Has started running
The 'e2epg' service-container hostname resolves to 3 IPs on the shared gitea_gitea network (leftover containers from concurrent / crashed runs). Prisma picked one IP, psql picked another — push reported success but the verification query saw an empty schema. Probe every resolved IP with our credentials and lock onto the one that accepts them, then rewrite DATABASE_URL / PLAYWRIGHT_DATABASE_URL via GITHUB_ENV so every subsequent step (prisma push, seed, E2E webServer, Playwright fixtures) hits the same postgres instance. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -381,22 +381,46 @@ jobs:
|
|||||||
# ones. Verify via direct psql.
|
# ones. Verify via direct psql.
|
||||||
echo "--- hosts resolving to 'e2epg' ---"
|
echo "--- hosts resolving to 'e2epg' ---"
|
||||||
getent hosts e2epg || true
|
getent hosts e2epg || true
|
||||||
|
# Split-brain fix: 'e2epg' resolves to MULTIPLE IPs on the shared
|
||||||
|
# gitea_gitea network (leftover service containers from concurrent
|
||||||
|
# or crashed runs). Prisma picks one IP; psql picks another; push
|
||||||
|
# reports success but verification sees an empty database. Probe
|
||||||
|
# every resolved IP and lock onto the one that accepts our creds,
|
||||||
|
# then force DATABASE_URL/PLAYWRIGHT_DATABASE_URL to that explicit
|
||||||
|
# IP for the rest of the job so every subsequent step hits the
|
||||||
|
# same postgres instance.
|
||||||
|
IPS=$(getent hosts e2epg | awk '{print $1}')
|
||||||
|
PG_IP=""
|
||||||
|
for ip in $IPS; do
|
||||||
|
if PGPASSWORD=capakraken_test psql -h "$ip" -U capakraken -d capakraken_test -v ON_ERROR_STOP=1 -Atc "SELECT 1" >/dev/null 2>&1; then
|
||||||
|
PG_IP="$ip"
|
||||||
|
echo "Locked onto postgres at $PG_IP"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
echo "Rejected $ip (auth or DB mismatch)"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -z "$PG_IP" ]; then
|
||||||
|
echo "ERROR: no resolved e2epg IP accepted capakraken_test credentials"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
PINNED_URL="postgresql://capakraken:capakraken_test@$PG_IP:5432/capakraken_test"
|
||||||
|
echo "DATABASE_URL=$PINNED_URL" >> "$GITHUB_ENV"
|
||||||
|
echo "PLAYWRIGHT_DATABASE_URL=$PINNED_URL" >> "$GITHUB_ENV"
|
||||||
echo "--- DROP SCHEMA ---"
|
echo "--- DROP SCHEMA ---"
|
||||||
psql -h e2epg -U capakraken -d capakraken_test -v ON_ERROR_STOP=1 \
|
psql -h "$PG_IP" -U capakraken -d capakraken_test -v ON_ERROR_STOP=1 \
|
||||||
-c "DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO capakraken; GRANT ALL ON SCHEMA public TO public;"
|
-c "DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO capakraken; GRANT ALL ON SCHEMA public TO public;"
|
||||||
echo "--- prisma db push ---"
|
echo "--- prisma db push ---"
|
||||||
pnpm --filter @capakraken/db exec prisma db push --schema ./prisma/schema.prisma --accept-data-loss --skip-generate
|
DATABASE_URL="$PINNED_URL" pnpm --filter @capakraken/db exec prisma db push --schema ./prisma/schema.prisma --accept-data-loss --skip-generate
|
||||||
echo "--- tables in public after push ---"
|
echo "--- tables in public after push ---"
|
||||||
# `\dt public.*` was interpreted literally by this psql build (returned
|
psql -h "$PG_IP" -U capakraken -d capakraken_test -v ON_ERROR_STOP=1 -At \
|
||||||
# "Did not find any relation named public.*"). Query pg_tables directly.
|
|
||||||
psql -h e2epg -U capakraken -d capakraken_test -v ON_ERROR_STOP=1 -At \
|
|
||||||
-c "SELECT tablename FROM pg_tables WHERE schemaname='public' ORDER BY tablename" \
|
-c "SELECT tablename FROM pg_tables WHERE schemaname='public' ORDER BY tablename" \
|
||||||
| tee /tmp/tables.txt
|
| tee /tmp/tables.txt
|
||||||
if ! grep -qx 'audit_logs' /tmp/tables.txt; then
|
if ! grep -qx 'audit_logs' /tmp/tables.txt; then
|
||||||
echo "ERROR: audit_logs table missing after push!"
|
echo "ERROR: audit_logs table missing after push!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
pnpm db:seed
|
DATABASE_URL="$PINNED_URL" pnpm db:seed
|
||||||
|
|
||||||
- name: Run E2E tests
|
- name: Run E2E tests
|
||||||
# Bypass turbo here — it runs in strict env mode and does not pass
|
# Bypass turbo here — it runs in strict env mode and does not pass
|
||||||
|
|||||||
Reference in New Issue
Block a user