- Зачем:
- проверка была сломана с рождения цели: bash -n со списком файлов
разбирает только первый, остальные уходят ему в аргументы. Из пяти
скриптов проверялся один, и за всё время этого никто не заметил.
- чинить незачем: скрипты стенда запускают с той же машины, и
синтаксическая ошибка вылезает при первом же запуске с номером строки.
Учебной ценности в проверке нет — из неё не узнаёшь ничего, кроме того,
что у bash есть ключ -n.
- держалась она не строчкой, а двенадцатью: обход репозитория, временный
файл со списком, mapfile и две ветки на пустой список.
- Что:
- из scripts/config-test.sh убраны разбор Bash и весь аппарат сбора
списка файлов; 53 строки стали 40.
- разбор файлов DAG остался и получил комментарий с основанием: их на
машине не запускает никто, обработчик разбирает их внутри контейнера, и
ошибка всплывает не сообщением, а молча пропавшим DAG.
- README и карта проверок больше не обещают проверку синтаксиса Bash.
- в карте записано, почему проверку не стоит заводить заново.
- Проверка:
- make config-test зелёный.
- оставшийся разбор DAG краснеет: незакрытая скобка в dags/test_kafka.py
роняет цель с SyntaxError и ненулевым кодом; файл восстановлен.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
46 lines
2.3 KiB
Bash
Executable File
46 lines
2.3 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)"
|
|
|
|
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'
|