#!/usr/bin/env bash set -euo pipefail readonly ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" read -r -a COMPOSE_CMD <<<"${COMPOSE_BIN:-docker compose}" readonly CACHE_DIR="$(mktemp -d)" cleanup() { rm -rf "$CACHE_DIR" } trap cleanup EXIT "${COMPOSE_CMD[@]}" --project-directory "$ROOT_DIR" config --quiet config_json="$("${COMPOSE_CMD[@]}" --project-directory "$ROOT_DIR" config --format json)" grep -qx 'ARG SUPERSET_BASE_IMAGE' "$ROOT_DIR/infra/superset/Dockerfile" jq -e ' .services.superset.image == "clickstream-superset:local" and (.services.superset.build.args.SUPERSET_BASE_IMAGE | length > 0) ' >/dev/null <<<"$config_json" grep -qx 'ARG AIRFLOW_BASE_IMAGE' "$ROOT_DIR/infra/airflow/Dockerfile" jq -e ' .services["airflow-init"].image == "clickstream-airflow:local" and (.services["airflow-init"].build.args.AIRFLOW_BASE_IMAGE | length > 0) and all( .services[]; ((.environment // {}) | has("_PIP_ADDITIONAL_REQUIREMENTS") | not) ) ' >/dev/null <<<"$config_json" jq -e ' .services["airflow-init"] as $service | ($service.environment.AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_PASSWORDS_FILE == "/opt/airflow/auth/simple_auth_manager_passwords.json") and any($service.volumes[]; .source == "airflow_auth" and .target == "/opt/airflow/auth") and any($service.volumes[]; .source == "airflow_logs" and .target == "/opt/airflow/logs") ' >/dev/null <<<"$config_json" # Файлы DAG на машине никто не запускает: их разбирает обработчик внутри # контейнера, и синтаксическая ошибка там всплывает не сообщением, а тем, что # DAG молча не появился в списке. Локальный разбор — единственная дешёвая # обратная связь. Скрипты стенда проверять так незачем: их запускают с этой же # машины, и ошибка вылезает при первом же запуске с номером строки. PYTHONPYCACHEPREFIX="$CACHE_DIR" uv run --no-project python -m compileall -q "$ROOT_DIR/dags" git -C "$ROOT_DIR" diff --check printf 'ЗЕЛЁНО: Compose, Python и пробельные ошибки diff проверены.\n'