#!/usr/bin/env bash set -euo pipefail SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) ROOT=$(cd "$SCRIPT_DIR/../.." && pwd) COMPOSE_FILE="$ROOT/ops/devops/symbols/docker-compose.symbols.yaml" PROJECT_NAME=${PROJECT_NAME:-symbolsci} ARTIFACT_DIR=${ARTIFACT_DIR:-"$ROOT/out/symbols-ci"} STAMP=$(date -u +"%Y%m%dT%H%M%SZ") RUN_DIR="$ARTIFACT_DIR/$STAMP" mkdir -p "$RUN_DIR" log() { printf '[%s] %s\n' "$(date -u +%H:%M:%S)" "$*"; } cleanup() { local code=$? log "Collecting compose logs" docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME" logs >"$RUN_DIR/compose.log" 2>&1 || true log "Tearing down stack" docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME" down -v >/dev/null 2>&1 || true log "Artifacts in $RUN_DIR" exit $code } trap cleanup EXIT log "Pulling images" docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME" pull --ignore-pull-failures >/dev/null 2>&1 || true log "Starting services" docker compose -f "$COMPOSE_FILE" -p "$PROJECT_NAME" up -d --remove-orphans wait_http() { local url=$1; local name=$2; local tries=${3:-30} for i in $(seq 1 "$tries"); do if curl -fsS --max-time 5 "$url" >/dev/null 2>&1; then log "$name ready" return 0 fi sleep 2 done log "$name not ready" return 1 } wait_http "http://localhost:9000/minio/health/ready" "MinIO" 25 wait_http "http://localhost:8080/healthz" "Symbols.Server" 25 log "Seeding bucket" docker run --rm --network symbols-ci minio/mc:RELEASE.2024-08-17T00-00-00Z \ alias set symbols http://minio:9000 minio minio123 >/dev/null docker run --rm --network symbols-ci minio/mc:RELEASE.2024-08-17T00-00-00Z \ mb -p symbols/symbols >/dev/null log "Capture readiness endpoint" curl -fsS http://localhost:8080/healthz -o "$RUN_DIR/healthz.json" log "Smoke list request" curl -fsS http://localhost:8080/ -o "$RUN_DIR/root.html" || true echo "status=pass" > "$RUN_DIR/summary.txt"