diff --git a/docs/RELEASE_CANDIDATE_RUNBOOK_RU.md b/docs/RELEASE_CANDIDATE_RUNBOOK_RU.md index b562cb5..a8c1c81 100644 --- a/docs/RELEASE_CANDIDATE_RUNBOOK_RU.md +++ b/docs/RELEASE_CANDIDATE_RUNBOOK_RU.md @@ -16,6 +16,30 @@ bash scripts/build_release_candidate.sh v1.0.2-rc1 Перед сборкой рабочее дерево git должно быть чистым. Если есть незакоммиченные, staged или untracked файлы, скрипт завершится с ошибкой. Это защищает RC от незафиксированного состояния. +## Preflight + +Перед полной RC-сборкой можно проверить локальные предпосылки без создания каталога release candidate и без запуска cargo build/test: + +```bash +bash scripts/build_release_candidate.sh --preflight +``` + +Preflight проверяет наличие команд `git`, `cargo`, `bash`, `node`, `sha256sum`, наличие обязательных внутренних скриптов, а также то, что `dist/` игнорируется git. Этот режим не требует чистого git tree, не создает артефакты и не заменяет полную RC-сборку. + +## Если проект лежит на USB/HDD mount + +На локальном контуре проект может лежать под `/mnt/` или `/media/`. В таком случае cargo build artifacts в стандартном `adk-rust/target` могут падать на filesystem-ограничениях mount, например на `libsqlite3-sys` с `Operation not permitted`. + +Рекомендуемый запуск для такого контура: + +```bash +CARGO_TARGET_DIR=/home/igor/.cache/aw-rus-hardening-target bash scripts/build_release_candidate.sh v1.0.2-rc1 +``` + +Это не обход проверок. Все `cargo fmt`, `cargo test`, `cargo clippy`, `cargo build`, `quality-gate`, private-config guard, OpenAPI contract guard и SBOM generation продолжают выполняться. Меняется только место, куда cargo складывает build artifacts. + +`dist/` по-прежнему не коммитится. Требование чистого git tree для настоящей RC-сборки также остается обязательным. + ## Проверки Скрипт выполняет обязательные проверки и сборку Rust workspace: diff --git a/scripts/build_release_candidate.sh b/scripts/build_release_candidate.sh index 027e5c6..0babc93 100755 --- a/scripts/build_release_candidate.sh +++ b/scripts/build_release_candidate.sh @@ -4,11 +4,98 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT_DIR" +print_cargo_target_dir() { + if [[ -n "${CARGO_TARGET_DIR:-}" ]]; then + echo "CARGO_TARGET_DIR=$CARGO_TARGET_DIR" + else + echo "CARGO_TARGET_DIR is not set; cargo default target dir will be used" + fi +} + +preflight_ok() { + echo "[OK] $1" +} + +preflight_fail() { + echo "[FAIL] $1" >&2 + PREFLIGHT_FAILED=1 +} + +check_command() { + local command_name="$1" + if command -v "$command_name" >/dev/null 2>&1; then + preflight_ok "command available: $command_name" + else + preflight_fail "missing command: $command_name" + fi +} + +check_file() { + local path="$1" + if [[ -f "$path" ]]; then + preflight_ok "required file exists: $path" + else + preflight_fail "required file is missing: $path" + fi +} + +run_preflight() { + PREFLIGHT_FAILED=0 + + echo "release candidate preflight" + print_cargo_target_dir + + check_command git + check_command cargo + check_command bash + check_command node + check_command sha256sum + + check_file scripts/generate_release_sbom_v0_2.sh + check_file scripts/check_private_config_guard.sh + check_file scripts/check_portal_contract_sync.mjs + + if command -v git >/dev/null 2>&1; then + if git check-ignore -q dist/release-candidate/.preflight-probe; then + preflight_ok "dist/ is ignored by git" + else + preflight_fail "dist/ is not ignored by git" + fi + else + preflight_fail "cannot verify git ignore rules without git" + fi + + case "$ROOT_DIR" in + /mnt/*|/media/*) + cat <<'EOF' +[HINT] Project is under /mnt or /media. If cargo fails on the mount with Operation not permitted, run the full RC build with a writable target dir: + CARGO_TARGET_DIR=/home/igor/.cache/aw-rus-hardening-target bash scripts/build_release_candidate.sh v1.0.2-rc1 +EOF + ;; + esac + + if [[ "$PREFLIGHT_FAILED" -ne 0 ]]; then + echo "release candidate preflight: FAIL" >&2 + return 1 + fi + + echo "release candidate preflight: OK" +} + +if [[ "${1:-}" == "--preflight" ]]; then + run_preflight + exit $? +fi + +print_cargo_target_dir + RC_NAME="${1:-}" if [[ -z "$RC_NAME" ]]; then cat >&2 <<'EOF' usage: bash scripts/build_release_candidate.sh example: bash scripts/build_release_candidate.sh v1.0.2-rc1 + +preflight: bash scripts/build_release_candidate.sh --preflight EOF exit 2 fi