#!/usr/bin/env bash # ci-local.sh # Local equivalent of CI checks for self-hosted runner validation. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$PROJECT_ROOT" RUN_CONTRACTS=0 RUN_BACKEND=0 RUN_ANDROID=0 RUN_IOS=0 SKIP_INSTALL=0 usage() { cat <<'EOF' Usage: ./scripts/ci-local.sh [options] Options: --contracts Run process/SDD/TDD gate scripts. --backend Run lint + shared/android unit tests. --android Run Android emulator UI tests. --ios Run iOS simulator UI tests. --all Run contracts + backend + android + ios. --skip-install Skip setup bootstrap check. --help Show this help. If no test scope flags are provided, defaults to: --contracts --backend EOF } for arg in "$@"; do case "$arg" in --contracts) RUN_CONTRACTS=1 ;; --backend) RUN_BACKEND=1 ;; --android) RUN_ANDROID=1 ;; --ios) RUN_IOS=1 ;; --all) RUN_CONTRACTS=1 RUN_BACKEND=1 RUN_ANDROID=1 RUN_IOS=1 ;; --skip-install) SKIP_INSTALL=1 ;; --help|-h) usage; exit 0 ;; *) echo "[ci-local] Unknown option: $arg" usage exit 1 ;; esac done if [[ $RUN_CONTRACTS -eq 0 && $RUN_BACKEND -eq 0 && $RUN_ANDROID -eq 0 && $RUN_IOS -eq 0 ]]; then RUN_CONTRACTS=1 RUN_BACKEND=1 fi if [[ $SKIP_INSTALL -eq 0 ]]; then "$SCRIPT_DIR/setup-dev-environment.sh" --verify fi TIMESTAMP="$(date +%Y%m%d-%H%M%S)" LOG_DIR="$PROJECT_ROOT/build/local-ci" LOG_FILE="$LOG_DIR/local-ci-$TIMESTAMP.log" mkdir -p "$LOG_DIR" run_step() { local step_name="$1" shift echo "" echo "================================================" echo "[ci-local] $step_name" echo "================================================" "$@" 2>&1 | tee -a "$LOG_FILE" } echo "[ci-local] Writing log to $LOG_FILE" echo "[ci-local] Starting local CI run at $(date -u '+%Y-%m-%dT%H:%M:%SZ')" | tee -a "$LOG_FILE" if [[ $RUN_CONTRACTS -eq 1 ]]; then run_step "check-process" "$SCRIPT_DIR/check-process.sh" origin/main run_step "validate-sdd" "$SCRIPT_DIR/validate-sdd.sh" origin/main run_step "validate-tdd" env FORCE_AUDIT_GATES=1 "$SCRIPT_DIR/validate-tdd.sh" origin/main fi if [[ $RUN_BACKEND -eq 1 ]]; then run_step "ktlint+unit-tests" ./gradlew ktlintCheck shared:jvmTest androidApp:testDebugUnitTest fi if [[ $RUN_ANDROID -eq 1 ]]; then run_step "android-ui-tests" "$SCRIPT_DIR/run-emulator-tests.sh" android fi if [[ $RUN_IOS -eq 1 ]]; then run_step "ios-ui-tests" "$SCRIPT_DIR/run-emulator-tests.sh" ios fi echo "" echo "[ci-local] PASS" echo "[ci-local] Log: $LOG_FILE"