CI-GATE.0-2: establish repository CI canary
This commit is contained in:
147
scripts/run_ci_gate.sh
Executable file
147
scripts/run_ci_gate.sh
Executable file
@@ -0,0 +1,147 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
export PIP_DISABLE_PIP_VERSION_CHECK=1
|
||||
export PIP_NO_CACHE_DIR=1
|
||||
export PIP_NO_INPUT=1
|
||||
export PYTHONDONTWRITEBYTECODE=1
|
||||
|
||||
project_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
python_bin="${project_root}/app/.venv/bin/python"
|
||||
ci_cache_dir=""
|
||||
|
||||
cleanup_ci_cache() {
|
||||
if [[ -z "${ci_cache_dir}" || ! -d "${ci_cache_dir}" ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
case "${ci_cache_dir}" in
|
||||
*/dzentra-ci-pycache.*)
|
||||
rm -rf -- "${ci_cache_dir}"
|
||||
;;
|
||||
*)
|
||||
printf 'Отказ от очистки неожиданного пути: %s\n' "${ci_cache_dir}" >&2
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
trap cleanup_ci_cache EXIT
|
||||
|
||||
verify_environment() {
|
||||
if [[ ! -x "${python_bin}" ]]; then
|
||||
printf 'Не найден Python environment: %s\n' "${python_bin}" >&2
|
||||
printf 'Установите app/requirements-dev.lock по инструкции CI gate.\n' >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
local python_minor
|
||||
python_minor="$(
|
||||
"${python_bin}" -c \
|
||||
'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")'
|
||||
)"
|
||||
if [[ "${python_minor}" != "3.12" ]]; then
|
||||
printf 'Требуется Python 3.12, найден Python %s.\n' "${python_minor}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
"${python_bin}" -m pip check
|
||||
}
|
||||
|
||||
run_quality() {
|
||||
local ci_tmp_base
|
||||
ci_tmp_base="${TMPDIR:-/tmp}"
|
||||
ci_cache_dir="$(
|
||||
mktemp -d "${ci_tmp_base%/}/dzentra-ci-pycache.XXXXXX"
|
||||
)"
|
||||
|
||||
"${project_root}/scripts/check_python_types.sh"
|
||||
"${python_bin}" \
|
||||
"${project_root}/scripts/check_documentation_integrity.py"
|
||||
(
|
||||
cd "${project_root}/app"
|
||||
"${python_bin}" -m pytest \
|
||||
-q \
|
||||
-p no:cacheprovider \
|
||||
-W error::ResourceWarning \
|
||||
tests/static
|
||||
)
|
||||
PYTHONPYCACHEPREFIX="${ci_cache_dir}" \
|
||||
"${python_bin}" -m compileall \
|
||||
-q \
|
||||
"${project_root}/app/src" \
|
||||
"${project_root}/app/tests" \
|
||||
"${project_root}/scripts"
|
||||
git -C "${project_root}" diff --check
|
||||
|
||||
cleanup_ci_cache
|
||||
ci_cache_dir=""
|
||||
}
|
||||
|
||||
run_offline_regression() {
|
||||
(
|
||||
cd "${project_root}/app"
|
||||
"${python_bin}" -m pytest \
|
||||
-q \
|
||||
-p no:cacheprovider \
|
||||
-W error::ResourceWarning
|
||||
)
|
||||
}
|
||||
|
||||
run_loopback_integration() {
|
||||
(
|
||||
cd "${project_root}/app"
|
||||
"${python_bin}" -m pytest \
|
||||
-q \
|
||||
-p no:cacheprovider \
|
||||
-W error::ResourceWarning \
|
||||
-m integration \
|
||||
tests/integration/market_data/acquisition/runtime
|
||||
)
|
||||
}
|
||||
|
||||
print_usage() {
|
||||
printf '%s\n' \
|
||||
'Использование: ./scripts/run_ci_gate.sh MODE' \
|
||||
'' \
|
||||
'MODE:' \
|
||||
' quality Pyright, документация, static и compileall' \
|
||||
' offline-regression полная default offline-регрессия' \
|
||||
' loopback-integration локальная WebSocket integration-проверка' \
|
||||
' all все три режима последовательно'
|
||||
}
|
||||
|
||||
main() {
|
||||
local mode="${1:-}"
|
||||
|
||||
if [[ "$#" -ne 1 ]]; then
|
||||
print_usage >&2
|
||||
return 2
|
||||
fi
|
||||
|
||||
verify_environment
|
||||
|
||||
case "${mode}" in
|
||||
quality)
|
||||
run_quality
|
||||
;;
|
||||
offline-regression)
|
||||
run_offline_regression
|
||||
;;
|
||||
loopback-integration)
|
||||
run_loopback_integration
|
||||
;;
|
||||
all)
|
||||
run_quality
|
||||
run_offline_regression
|
||||
run_loopback_integration
|
||||
;;
|
||||
*)
|
||||
print_usage >&2
|
||||
return 2
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user