From eaddb2478aaa34ef569cadb1261b1d84dc987a98 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Mon, 18 May 2026 22:50:04 -0400 Subject: [PATCH] fix(ci): scope integration Postgres discovery to this job's network MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `--filter name=integration` matched EVERY concurrent integration run's Postgres service container. A dev push and the main-merge run overlap on the shared act_runner daemon → 2 candidates → the "expected exactly 1" guard aborts (false failure; not a code defect). Discover instead by intersecting networks: act_runner attaches the job container and its service container to a shared per-job network, so select the postgres that sits on a network this job container is also on. The dev-compose container is skipped explicitly as before. CI-only change; the released v2026.05.19.0 code is unaffected (a clean re-run of the failed job passes — the failure was a concurrency race). Co-Authored-By: Claude Opus 4.7 (1M context) --- .forgejo/workflows/test-go.yml | 38 ++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/.forgejo/workflows/test-go.yml b/.forgejo/workflows/test-go.yml index 60b0ce60..329ef0a0 100644 --- a/.forgejo/workflows/test-go.yml +++ b/.forgejo/workflows/test-go.yml @@ -83,19 +83,31 @@ jobs: run: | set -eux # Discover THIS job's Postgres service container via the - # mounted docker socket. Scope by the job-name filter so the - # operator's dev compose `minstrel-postgres-*` (same image, - # same daemon) can never match. Require exactly one — abort - # loudly otherwise; a wrong target would truncate real data. - PG_LIST=$(docker ps --filter "name=integration" --filter "ancestor=postgres:16-alpine" --format '{{.ID}} {{.Names}}') - echo "candidates: ${PG_LIST:-}" - PG_COUNT=$(printf '%s\n' "$PG_LIST" | grep -c . || true) - test "$PG_COUNT" = "1" || { echo "FATAL: expected exactly 1 postgres service container, got $PG_COUNT"; exit 1; } - PG_ID=$(printf '%s' "$PG_LIST" | awk '{print $1}') - PG_NAME=$(printf '%s' "$PG_LIST" | awk '{print $2}') - case "$PG_NAME" in - *minstrel-postgres*|*_postgres_*) echo "FATAL: matched the dev compose container ($PG_NAME), refusing"; exit 1 ;; - esac + # mounted docker socket. act_runner attaches the job + # container and its service container(s) to a shared per-job + # network, so scope discovery to a postgres that sits on a + # network THIS job container is also on. The old + # `--filter name=integration` matched EVERY concurrent + # integration run's postgres (a dev push + the main-merge run + # overlap → 2 candidates → false "expected exactly 1" abort). + # The operator's dev compose `minstrel-postgres-*` is never on + # this job's network; skip it explicitly as belt-and-suspenders + # (a wrong target would truncate real data). + SELF=$(cat /etc/hostname) + SELF_NETS=$(docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}' "$SELF") + test -n "$SELF_NETS" + echo "self ($SELF) networks: $SELF_NETS" + PG_ID="" + PG_NAME="" + for cid in $(docker ps --filter "ancestor=postgres:16-alpine" -q); do + nm=$(docker inspect -f '{{.Name}}' "$cid" | sed 's#^/##') + case "$nm" in *minstrel-postgres*|*_postgres_*) continue ;; esac + for net in $(docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}' "$cid"); do + case " $SELF_NETS " in *" $net "*) PG_ID="$cid"; PG_NAME="$nm"; break 2 ;; esac + done + done + test -n "$PG_ID" || { echo "FATAL: no postgres service container on this job's network (self nets: $SELF_NETS)"; exit 1; } + echo "selected postgres: $PG_ID $PG_NAME" PG_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$PG_ID") test -n "$PG_IP" export MINSTREL_TEST_DATABASE_URL="postgres://minstrel:minstrel@${PG_IP}:5432/minstrel_test?sslmode=disable"