#!/bin/sh set -eu ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) cd "$ROOT" "$ROOT/scripts/ensure-local-e2e-env.sh" run_id="$(date -u +%Y%m%d%H%M%S)-$$" project="who_need_help_e2e_$run_id" output_dir="$ROOT/output/e2e/$run_id" case "$project" in who_need_help_e2e_*) ;; *) echo "Refusing unexpected E2E project name: $project" >&2 exit 1 ;; esac mkdir -p "$output_dir" export TRAEFIK_PROJECT_CONSTRAINT="$project" export TRAEFIK_APP_NAME="who-need-help-e2e-$run_id" export TRAEFIK_DOCKER_NETWORK="${project}_internal" export E2E_OUTPUT_DIR="$output_dir" export CODEX_SESSION_ID=${CODEX_SESSION_ID:-${CODEX_THREAD_ID:-local-e2e}} compose() { docker compose \ --project-name "$project" \ --env-file "$ROOT/.env.e2e" \ --file "$ROOT/compose.yaml" \ --file "$ROOT/compose.e2e.yaml" \ "$@" } cleanup() { status=$? if [ "$status" -ne 0 ]; then compose ps --all >"$output_dir/compose-ps.txt" 2>&1 || true compose logs --no-color >"$output_dir/compose.log" 2>&1 || true fi if [ "${KEEP_E2E_STACK:-0}" = "1" ]; then echo "Keeping isolated E2E project $project for inspection." echo "Artifacts: $output_dir" else compose down --volumes --remove-orphans >/dev/null fi exit "$status" } trap cleanup EXIT HUP INT TERM compose config --quiet compose up -d --build --wait db mailpit migrate proxy web worker compose build e2e compose run --rm --no-deps e2e echo "Isolated browser E2E passed." echo "Artifacts: $output_dir"