Зачем. Демонстрационный DAG example_clickstream_hello ничего не проверял: он не обращался ни к ClickHouse, ни к Kafka, поэтому его зелёный результат ничего не говорил о стенде. Пробники проверяют связи по-настоящему — и тем же клиентом, каким будут ходить рабочие DAG. Что. - test_clickhouse: пишет строку в ReplicatedMergeTree на ноде 1 и читает её с ноды 2 через Distributed. Данные проходят путь «нода 2 → все шарды → шард ноды 1», то есть проверяется межшардовое чтение, а не одна нода. - test_kafka: пишет в постоянный топик сообщение с меткой прогона и вычитывает его обратно. - infra/airflow/Dockerfile: clickhouse-connect 1.6.0 и confluent-kafka 2.15.0 вшиты в образ, импорт проверяется на сборке — при запуске контейнера пакеты не доустанавливаются. - Проверки: scripts/stand-smoke.sh гоняет оба пробника через API Airflow, scripts/config-test.sh разбирает DAG без стенда, tests/stand-smoke-guards.sh проверяет красный путь, tests/dag-probes-unit.py — модульные проверки разбора. - README и ADR 0001 обновлены тем же изменением. - Удалён dags/example_clickstream_hello.py. Проверка. make config-test — пройдено 3, 3 и 6, ошибок 0. make clean; cp .env.example .env; make up — 116 с на чистых томах. make smoke — пройдено 25, ошибок 0; стенд занимает 2244,0 MiB. make smoke-cluster — все 8 проверок кластера. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
68 lines
2.7 KiB
Bash
Executable File
68 lines
2.7 KiB
Bash
Executable File
#!/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)"
|
|
readonly SHELL_FILES_LIST="$CACHE_DIR/shell-files"
|
|
|
|
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"
|
|
if ! find "$ROOT_DIR" \
|
|
-path "$ROOT_DIR/.git" -prune -o \
|
|
-type f -name '*.sh' -print0 >"$SHELL_FILES_LIST"; then
|
|
printf 'ОШИБКА: не удалось получить список файлов Bash для проверки.\n' >&2
|
|
exit 1
|
|
fi
|
|
mapfile -d '' -t shell_files <"$SHELL_FILES_LIST"
|
|
if [[ "${#shell_files[@]}" -eq 0 ]]; then
|
|
printf 'ОШИБКА: не найдено ни одного файла Bash для проверки.\n' >&2
|
|
exit 1
|
|
fi
|
|
bash -n "${shell_files[@]}"
|
|
PYTHONPYCACHEPREFIX="$CACHE_DIR" uv run --no-project python -m compileall -q "$ROOT_DIR/dags"
|
|
unit_status=0
|
|
unit_output="$(
|
|
PYTHONPYCACHEPREFIX="$CACHE_DIR" \
|
|
uv run --no-project python "$ROOT_DIR/tests/dag-probes-unit.py" 2>&1
|
|
)" || unit_status=$?
|
|
printf '%s\n' "$unit_output"
|
|
if [[ "$unit_status" -ne 0 ]]; then
|
|
exit "$unit_status"
|
|
fi
|
|
if grep -Eq '^(Ran [0-9]+ tests|OK|FAILED)' <<<"$unit_output" ||
|
|
! grep -Eq '^ИТОГ: пройдено [0-9]+, ошибок 0$' <<<"$unit_output"; then
|
|
printf 'ОШИБКА: малые проверки пробников вывели итог не на русском языке.\n' >&2
|
|
exit 1
|
|
fi
|
|
git -C "$ROOT_DIR" diff --check
|
|
|
|
printf 'ЗЕЛЁНО: Compose, Bash, Python и пробельные ошибки diff проверены.\n'
|