Ctrl K
ComunidadGuías…

scripts/entrypoint.test.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TEST_DIR="$(mktemp -d)"
ENTRYPOINT_PID=""

cleanup() {
  if [ -n "$ENTRYPOINT_PID" ]; then
    kill -KILL "$ENTRYPOINT_PID" 2>/dev/null || true
  fi
  if [ -s "$TEST_DIR/migrate.pid" ]; then
    kill -KILL "$(cat "$TEST_DIR/migrate.pid")" 2>/dev/null || true
  fi
  rm -rf "$TEST_DIR"
}
trap cleanup EXIT

cp "$ROOT_DIR/docker/entrypoint.sh" "$TEST_DIR/entrypoint.sh"

cat >"$TEST_DIR/migrate" <<'SCRIPT'
#!/bin/sh
trap 'printf "TERM\n" >"$MIGRATE_SIGNAL_FILE"; exit 143' TERM
printf '%s\n' "$$" >"$MIGRATE_PID_FILE"
printf '%s\n' "$MULTICA_INTERNAL_DATABASE_STARTUP_STARTED_AT_UNIX" >"$MIGRATE_STARTED_AT_FILE"
while :; do
  sleep 1
done
SCRIPT

cat >"$TEST_DIR/server" <<'SCRIPT'
#!/bin/sh
printf 'started\n' >"$SERVER_STARTED_FILE"
printf '%s\n' "$MULTICA_INTERNAL_DATABASE_STARTUP_STARTED_AT_UNIX" >"$SERVER_STARTED_AT_FILE"
SCRIPT

chmod +x "$TEST_DIR/entrypoint.sh" "$TEST_DIR/migrate" "$TEST_DIR/server"

export MIGRATE_PID_FILE="$TEST_DIR/migrate.pid"
export MIGRATE_SIGNAL_FILE="$TEST_DIR/migrate.signal"
export MIGRATE_STARTED_AT_FILE="$TEST_DIR/migrate.started-at"
export SERVER_STARTED_FILE="$TEST_DIR/server.started"
export SERVER_STARTED_AT_FILE="$TEST_DIR/server.started-at"

(
  cd "$TEST_DIR"
  exec ./entrypoint.sh
) &
ENTRYPOINT_PID=$!

for _ in $(seq 1 50); do
  if [ -s "$MIGRATE_PID_FILE" ]; then
    break
  fi
  sleep 0.1
done
if [ ! -s "$MIGRATE_PID_FILE" ]; then
  echo "migrator did not start"
  exit 1
fi

kill -TERM "$ENTRYPOINT_PID"
set +e
wait "$ENTRYPOINT_PID"
status=$?
set -e
ENTRYPOINT_PID=""

if [ "$status" -ne 143 ]; then
  echo "entrypoint exited with $status, want 143 after SIGTERM"
  exit 1
fi
if [ "$(cat "$MIGRATE_SIGNAL_FILE" 2>/dev/null || true)" != "TERM" ]; then
  echo "entrypoint did not forward SIGTERM to the migrator"
  exit 1
fi
if [ -e "$SERVER_STARTED_FILE" ]; then
  echo "entrypoint started the server after interrupted migrations"
  exit 1
fi

cat >"$TEST_DIR/migrate" <<'SCRIPT'
#!/bin/sh
printf '%s\n' "$MULTICA_INTERNAL_DATABASE_STARTUP_STARTED_AT_UNIX" >"$MIGRATE_STARTED_AT_FILE"
exit 0
SCRIPT
chmod +x "$TEST_DIR/migrate"

(
  cd "$TEST_DIR"
  ./entrypoint.sh
)
if [ "$(cat "$SERVER_STARTED_FILE" 2>/dev/null || true)" != "started" ]; then
  echo "entrypoint did not start the server after successful migrations"
  exit 1
fi
started_at="$(cat "$MIGRATE_STARTED_AT_FILE" 2>/dev/null || true)"
if [ -z "$started_at" ] || [ "$started_at" != "$(cat "$SERVER_STARTED_AT_FILE" 2>/dev/null || true)" ]; then
  echo "entrypoint did not share one database startup timestamp"
  exit 1
fi
case "$started_at" in
  *[!0-9]*)
    echo "entrypoint database startup timestamp is not a Unix timestamp"
    exit 1
    ;;
esac

echo "entrypoint startup and signal forwarding ok"