mirror of
https://github.com/nolen777/eagle0.git
synced 2026-07-28 21:35:42 +00:00
1. Speed up check_build_deps.sh:
- Cache expensive `bazel query deps(...)` results
- Reuse cached deps for all three checks instead of running
separate bazel query commands
- Use grep filtering on cached results instead of bazel intersect
2. Run lint job in parallel with test job:
- Split bazel_test.yml into separate lint and test jobs
- Jobs run concurrently, reducing total CI time
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
151 lines
4.7 KiB
Bash
Executable File
151 lines
4.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# Check BUILD.bazel dependency constraints
|
|
# This script enforces architectural boundaries in the codebase.
|
|
#
|
|
# Usage:
|
|
# ./scripts/check_build_deps.sh # Check all rules
|
|
# ./scripts/check_build_deps.sh --ci # CI mode (fail on any violation)
|
|
# ./scripts/check_build_deps.sh --count # Just count current violations (for tracking progress)
|
|
# ./scripts/check_build_deps.sh --strict # Same as --ci (strict enforcement)
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
cd "$REPO_ROOT"
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
MODE="${1:-check}"
|
|
EXIT_CODE=0
|
|
|
|
# Cache for expensive bazel query results
|
|
LIBRARY_DEPS_CACHE=""
|
|
MAIN_DEPS_CACHE=""
|
|
|
|
# Get deps of library/ (cached)
|
|
get_library_deps() {
|
|
if [ -z "$LIBRARY_DEPS_CACHE" ]; then
|
|
LIBRARY_DEPS_CACHE=$(bazel query 'deps(//src/main/scala/net/eagle0/eagle/library/...)' 2>/dev/null || true)
|
|
fi
|
|
echo "$LIBRARY_DEPS_CACHE"
|
|
}
|
|
|
|
# Get deps of src/main (cached)
|
|
get_main_deps() {
|
|
if [ -z "$MAIN_DEPS_CACHE" ]; then
|
|
MAIN_DEPS_CACHE=$(bazel query 'deps(//src/main/...)' 2>/dev/null || true)
|
|
fi
|
|
echo "$MAIN_DEPS_CACHE"
|
|
}
|
|
|
|
# Rule 1: src/main should not depend on src/test
|
|
check_main_depends_on_test() {
|
|
echo -e "${YELLOW}Checking: src/main should not depend on src/test...${NC}"
|
|
|
|
violations=$(get_main_deps | grep "^//src/test/" || true)
|
|
|
|
if [ -n "$violations" ]; then
|
|
echo -e "${RED}VIOLATION: src/main depends on src/test:${NC}"
|
|
echo "$violations"
|
|
return 1
|
|
else
|
|
echo -e "${GREEN}✓ No violations${NC}"
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# Rule 2: library/ should not depend on Scala proto types
|
|
# C++/Go proto deps are allowed (they're build-time deps for map generation tools)
|
|
check_library_depends_on_scala_proto() {
|
|
echo -e "${YELLOW}Checking: library/ should not depend on Scala proto types...${NC}"
|
|
|
|
violations=$(get_library_deps | grep "^//src/main/protobuf/.*_scala_proto$" || true)
|
|
if [ -z "$violations" ]; then
|
|
count=0
|
|
else
|
|
count=$(echo "$violations" | grep -c "^//" || true)
|
|
fi
|
|
|
|
if [ "$count" -gt 0 ]; then
|
|
echo -e "${RED}VIOLATION: Found $count Scala proto dependencies in library/:${NC}"
|
|
echo "$violations"
|
|
return 1
|
|
else
|
|
echo -e "${GREEN}✓ No Scala proto dependencies in library/${NC}"
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# Rule 3: library/ should not depend on proto_converters
|
|
# Proto conversions should happen at service boundaries, not in library code
|
|
check_library_depends_on_proto_converters() {
|
|
echo -e "${YELLOW}Checking: library/ should not depend on proto_converters...${NC}"
|
|
|
|
violations=$(get_library_deps | grep "^//src/main/scala/net/eagle0/eagle/model/proto_converters/" || true)
|
|
|
|
if [ -n "$violations" ]; then
|
|
count=$(echo "$violations" | wc -l | tr -d ' ')
|
|
echo -e "${RED}VIOLATION: library/ depends on $count proto_converters targets:${NC}"
|
|
echo "$violations"
|
|
echo ""
|
|
echo "Proto conversions should happen at service boundaries (ShardokInterfaceGrpcClient,"
|
|
echo "EagleServiceImpl, etc.), not in library code."
|
|
return 1
|
|
else
|
|
echo -e "${GREEN}✓ No proto_converters dependencies in library/${NC}"
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# Count proto deps for informational purposes
|
|
count_proto_deps() {
|
|
echo -e "${YELLOW}=== Proto dependency counts ===${NC}"
|
|
|
|
library_deps=$(get_library_deps)
|
|
scala_proto_results=$(echo "$library_deps" | grep "^//src/main/protobuf/.*_scala_proto$" || true)
|
|
if [ -z "$scala_proto_results" ]; then
|
|
scala_proto_count=0
|
|
else
|
|
scala_proto_count=$(echo "$scala_proto_results" | wc -l | tr -d ' ')
|
|
fi
|
|
echo "library/ Scala proto deps: $scala_proto_count"
|
|
|
|
# C++/Go proto deps are expected (map generation tools)
|
|
all_proto_count=$(echo "$library_deps" | grep -c "^//src/main/protobuf/" || echo "0")
|
|
echo "library/ all proto deps (includes C++/Go build tools): $all_proto_count"
|
|
}
|
|
|
|
echo "=== BUILD.bazel Dependency Check ==="
|
|
echo ""
|
|
|
|
case "$MODE" in
|
|
--count)
|
|
count_proto_deps
|
|
;;
|
|
--ci|--strict)
|
|
check_main_depends_on_test || EXIT_CODE=1
|
|
check_library_depends_on_scala_proto || EXIT_CODE=1
|
|
check_library_depends_on_proto_converters || EXIT_CODE=1
|
|
;;
|
|
*)
|
|
check_main_depends_on_test || EXIT_CODE=1
|
|
check_library_depends_on_scala_proto || EXIT_CODE=1
|
|
check_library_depends_on_proto_converters || EXIT_CODE=1
|
|
echo ""
|
|
count_proto_deps
|
|
;;
|
|
esac
|
|
|
|
echo ""
|
|
if [ $EXIT_CODE -eq 0 ]; then
|
|
echo -e "${GREEN}=== All checks passed ===${NC}"
|
|
else
|
|
echo -e "${RED}=== Some checks failed ===${NC}"
|
|
fi
|
|
|
|
exit $EXIT_CODE
|