#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" echo "=== 1. Pulling latest changes in all repositories ===" for dir in "$ROOT_DIR"/*/; do if [ -d "${dir}.git" ]; then repo_name="$(basename "$dir")" echo "-> git pull in ${repo_name}" git -C "$dir" pull fi done echo "=== 2. Running npm ci in dashfront, dashdbschema, and dashback ===" for pkg in dashfront dashdbschema dashback; do echo "-> npm ci in ${pkg}" npm --prefix "${ROOT_DIR}/${pkg}" ci done echo "=== 3. Building dashfront ===" npm --prefix "${ROOT_DIR}/dashfront" run build echo "=== 4. Building SEA in dashback ===" npm --prefix "${ROOT_DIR}/dashback" run sea DOCKER_DIST_DIR="/home/ubuntu/src/docker/dashback/dist" mkdir -p "$DOCKER_DIST_DIR" TIMESTAMP="$(date +%Y%m%d%H%M%S)" NEW_SEA="${DOCKER_DIST_DIR}/dashback_${TIMESTAMP}" CURRENT_SEA="${DOCKER_DIST_DIR}/dashback_current" PREV_SEA="$(readlink -f "$CURRENT_SEA" 2>/dev/null || true)" echo "-> Copying SEA to ${NEW_SEA} and linking ${CURRENT_SEA}..." touch "${DOCKER_DIST_DIR}/dashback" cp "${ROOT_DIR}/dashback/dist/dashback" "$NEW_SEA" chmod +x "$NEW_SEA" ln -sfn "$NEW_SEA" "$CURRENT_SEA" echo "=== 5. Running self-test on dashback_current in test container ===" exec 3>&1 set +e SELFTEST_OUTPUT=$(docker run --rm \ --read-only \ --tmpfs /tmp:rw,noexec,nosuid,size=512m \ --tmpfs /run:rw,noexec,nosuid,size=16m \ --tmpfs /app/data:rw,noexec,nosuid,size=64m \ -u "$(id -u):$(id -g)" \ -v "${DOCKER_DIST_DIR}:/app/dist:ro" \ -v "${CURRENT_SEA}:/app/dist/dashback:ro" \ dashback:latest \ ./dist/dashback --selftest 2>&1 | tee /dev/fd/3; exit "${PIPESTATUS[0]}") SELFTEST_EXIT=$? set -e exec 3>&- if [ "$SELFTEST_EXIT" -ne 0 ] || ! grep -q "Self-test PASSED" <<< "$SELFTEST_OUTPUT"; then echo "ERROR: Self-test did not confirm 'Self-test PASSED'. Aborting container restart." >&2 if [ -n "$PREV_SEA" ] && [ -f "$PREV_SEA" ]; then echo "-> Restoring ${CURRENT_SEA} to ${PREV_SEA}..." >&2 ln -sfn "$PREV_SEA" "$CURRENT_SEA" fi exit 1 fi echo "=== 6. Restarting dashback containers ===" CONTAINERS=$(docker ps -q --filter "ancestor=dashback:latest") if [ -n "$CONTAINERS" ]; then echo "-> Restarting dashback containers ($(docker ps --filter "ancestor=dashback:latest" --format '{{.Names}}' | paste -sd ', ' -))..." docker restart $CONTAINERS fi echo "=== Update complete! ==="