who_need_help/scripts/e2e-stop.sh

85 lines
2.5 KiB
Bash
Executable File

#!/bin/sh
set -eu
if [ "$#" -ne 1 ]; then
echo "Usage: $0 who_need_help_e2e_RUN_ID" >&2
exit 1
fi
project=$1
case "$project" in
who_need_help_e2e_*) ;;
*)
echo "Refusing to stop a non-E2E Compose project: $project" >&2
exit 1
;;
esac
ROOT=$(CDPATH='' cd -- "$(dirname -- "$0")/.." && pwd)
run_id=${project#who_need_help_e2e_}
# Compose still resolves required interpolation values for `down`. These values
# mirror the exact per-run tags. The project label passed above remains the
# Compose resource scope.
export APP_IMAGE="who-need-help:e2e-$run_id"
export SOCKET_PROXY_IMAGE="who-need-help:socket-proxy-e2e-$run_id"
export POSTGIS_IMAGE="who-need-help:postgis-e2e-$run_id"
export E2E_TEST_IMAGE="who-need-help-e2e-tests:$run_id"
export E2E_OUTPUT_DIR="$ROOT/output/e2e/stop-placeholder"
export E2E_UID
E2E_UID=$(id -u)
export E2E_GID
E2E_GID=$(id -g)
export TRAEFIK_PROJECT_CONSTRAINT="$project"
export TRAEFIK_APP_NAME="$project"
export TRAEFIK_DOCKER_NETWORK="${project}_ingress"
export MAP_TILE_URL="/__e2e__/map-tile.png?z={z}&x={x}&y={y}"
docker compose \
--project-name "$project" \
--env-file "$ROOT/.env.e2e" \
--file "$ROOT/compose.yaml" \
--file "$ROOT/compose.e2e.yaml" \
down --remove-orphans
postgres_volume="${project}_postgres_data"
if docker volume inspect "$postgres_volume" >/dev/null 2>&1; then
observed_project=$(docker volume inspect --format \
'{{index .Labels "com.docker.compose.project"}}' "$postgres_volume")
observed_volume=$(docker volume inspect --format \
'{{index .Labels "com.docker.compose.volume"}}' "$postgres_volume")
remaining_refs=$(docker ps -aq --filter "volume=$postgres_volume")
if [ "$observed_project" != "$project" ] || \
[ "$observed_volume" != "postgres_data" ] || \
[ -n "$remaining_refs" ]; then
echo "Refusing to remove unexpected or referenced E2E volume: $postgres_volume" >&2
exit 1
fi
docker volume rm "$postgres_volume"
fi
for image in "$E2E_TEST_IMAGE" "$APP_IMAGE" "$POSTGIS_IMAGE" "$SOCKET_PROXY_IMAGE"; do
if docker image inspect "$image" >/dev/null 2>&1; then
referenced=false
for container_id in $(docker ps -aq --filter "ancestor=$image"); do
observed_image=$(docker inspect --format '{{.Config.Image}}' "$container_id")
if [ "$observed_image" = "$image" ]; then
referenced=true
break
fi
done
if [ "$referenced" = true ]; then
echo "Refusing to remove referenced E2E image: $image" >&2
exit 1
fi
docker image rm "$image"
fi
done