|
| 1 | +.PHONY: dev-fetch-secret dev-build dev-compile dev-execute dev-shell dev-shell-saturn dev-clean help |
| 2 | +.PHONY: dev-docker-up dev-docker-down dev-docker-logs dev-docker-rebuild dev-pubsub-interactive |
| 3 | +.PHONY: dev-list-runs dev-clean-runs dev-view-run |
| 4 | + |
| 5 | +help: ## Show this help message |
| 6 | + @echo 'Usage: make [target]' |
| 7 | + @echo '' |
| 8 | + @echo 'Quick Start:' |
| 9 | + @echo ' make dev-fetch-secret # Fetch secrets from GCP' |
| 10 | + @echo ' make dev-build # Build Docker images' |
| 11 | + @echo ' make dev-docker-up # Start all services (creates new run)' |
| 12 | + @echo ' make dev-compile # Test compilation' |
| 13 | + @echo ' make dev-execute # Test execution' |
| 14 | + @echo ' make dev-pubsub-interactive # Interactive Pub/Sub client' |
| 15 | + @echo '' |
| 16 | + @echo 'Run Management:' |
| 17 | + @echo ' make dev-list-runs # List all test runs' |
| 18 | + @echo ' make dev-docker-logs # View logs for current run' |
| 19 | + @echo ' make dev-view-run RUN_ID=X # View logs for specific run' |
| 20 | + @echo ' make dev-clean-runs # Clean old runs (keeps 5)' |
| 21 | + @echo '' |
| 22 | + @echo 'All available targets:' |
| 23 | + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-27s\033[0m %s\n", $$1, $$2}' |
| 24 | + |
| 25 | +dev-fetch-secret: ## Fetch secrets from Google Cloud Secret Manager |
| 26 | + @# TODO: Eliminate storing secret locally |
| 27 | + @echo "Fetching secret from GCP Secret Manager..." |
| 28 | + @# Check if gcloud is installed |
| 29 | + @if ! command -v gcloud >/dev/null 2>&1; then \ |
| 30 | + echo "Error: gcloud CLI is not installed"; \ |
| 31 | + echo "Install from: https://cloud.google.com/sdk/docs/install"; \ |
| 32 | + exit 1; \ |
| 33 | + fi |
| 34 | + @# Check if authenticated |
| 35 | + @if ! gcloud auth list --filter=status:ACTIVE --format="value(account)" >/dev/null 2>&1; then \ |
| 36 | + echo "Error: Not authenticated with gcloud"; \ |
| 37 | + echo "Run: gcloud auth login"; \ |
| 38 | + exit 1; \ |
| 39 | + fi |
| 40 | + @mkdir -p development/secrets |
| 41 | + @gcloud secrets versions access latest \ |
| 42 | + --secret="production-saturn" \ |
| 43 | + --project="mitbattlecode" \ |
| 44 | + > development/secrets/secret.json |
| 45 | + @echo "✓ Secret saved to development/secrets/secret.json" |
| 46 | + |
| 47 | +dev-build: ## Build all Docker images |
| 48 | + @echo "Building Docker images..." |
| 49 | + @cd development && docker-compose build |
| 50 | + @echo "✓ Docker images built" |
| 51 | + |
| 52 | +dev-compile: ## Send a compile message |
| 53 | + @# Check if a run is active |
| 54 | + @if [ ! -f development/runs/latest ]; then \ |
| 55 | + echo "Error: No active run found. Start services with 'make dev-docker-up' first."; \ |
| 56 | + exit 1; \ |
| 57 | + fi |
| 58 | + @# Generate request ID |
| 59 | + $(eval RUN_ID := $(shell cat development/runs/latest)) |
| 60 | + $(eval REQUEST_ID := $(shell date +%Y%m%d_%H%M%S)) |
| 61 | + @# Create request directory structure |
| 62 | + @mkdir -p development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID) |
| 63 | + @echo "Creating compile request: compile_$(REQUEST_ID)" |
| 64 | + @# Generate config from template |
| 65 | + @sed \ |
| 66 | + -e 's|{{REPORT_PATH}}|/development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/report.txt|g' \ |
| 67 | + -e 's|{{BINARY_PATH}}|/development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/binary.zip|g' \ |
| 68 | + development/configs/compile.template.json \ |
| 69 | + > development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/config.json |
| 70 | + @echo "✓ Config generated: development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/config.json" |
| 71 | + @# Send compile message with generated config |
| 72 | + @docker exec saturn-pubsub-dev ./pubsubclient publish-json testing-saturn /development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/config.json |
| 73 | + @echo "✓ Compile message sent" |
| 74 | + @echo "✓ Request ID: compile_$(REQUEST_ID)" |
| 75 | + @echo "✓ Output directory: development/runs/$(RUN_ID)/requests/compile_$(REQUEST_ID)/" |
| 76 | + |
| 77 | +dev-execute: ## Send an execute message |
| 78 | + @# Check if a run is active |
| 79 | + @if [ ! -f development/runs/latest ]; then \ |
| 80 | + echo "Error: No active run found. Start services with 'make dev-docker-up' first."; \ |
| 81 | + exit 1; \ |
| 82 | + fi |
| 83 | + @# Generate request ID |
| 84 | + $(eval RUN_ID := $(shell cat development/runs/latest)) |
| 85 | + $(eval REQUEST_ID := $(shell date +%Y%m%d_%H%M%S)) |
| 86 | + @# Create request directory structure |
| 87 | + @mkdir -p development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID) |
| 88 | + @echo "Creating execute request: execute_$(REQUEST_ID)" |
| 89 | + @# Generate config from template |
| 90 | + @sed \ |
| 91 | + -e 's|{{REPORT_PATH}}|/development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/report.txt|g' \ |
| 92 | + -e 's|{{REPLAY_PATH}}|/development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/replay.bc25java|g' \ |
| 93 | + development/configs/execute.template.json \ |
| 94 | + > development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/config.json |
| 95 | + @echo "✓ Config generated: development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/config.json" |
| 96 | + @# Send execute message with generated config |
| 97 | + @docker exec saturn-pubsub-dev ./pubsubclient publish-json testing-saturn /development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/config.json |
| 98 | + @echo "✓ Execute message sent" |
| 99 | + @echo "✓ Request ID: execute_$(REQUEST_ID)" |
| 100 | + @echo "✓ Output directory: development/runs/$(RUN_ID)/requests/execute_$(REQUEST_ID)/" |
| 101 | + |
| 102 | +dev-shell-pubsub: ## Open shell in Pub/Sub container |
| 103 | + @docker exec -it saturn-pubsub-dev bash |
| 104 | + |
| 105 | +dev-pubsub-interactive: ## Open interactive Pub/Sub client with rlwrap |
| 106 | + @echo "Starting interactive Pub/Sub client..." |
| 107 | + @echo "Available commands will be shown below." |
| 108 | + @echo "Use Ctrl+D or Ctrl+C to exit." |
| 109 | + @echo "" |
| 110 | + @docker exec -it saturn-pubsub-dev rlwrap bash -c '\ |
| 111 | + ./pubsubclient; \ |
| 112 | + echo ""; \ |
| 113 | + echo "Interactive mode - enter commands:"; \ |
| 114 | + while true; do \ |
| 115 | + read -e -p "$$ " cmd || break; \ |
| 116 | + eval "$$cmd"; \ |
| 117 | + done' |
| 118 | + |
| 119 | +dev-shell-saturn: ## Open shell in Saturn container |
| 120 | + @docker exec -it saturn-dev bash |
| 121 | + |
| 122 | +dev-clean: ## Clean up Docker containers and images |
| 123 | + @echo "Cleaning up development environment..." |
| 124 | + @cd development && docker-compose down -v |
| 125 | + @docker rmi development-pubsub-emulator development-saturn 2>/dev/null || true |
| 126 | + @echo "✓ Cleanup complete" |
| 127 | + |
| 128 | +dev-docker-up: ## Start all Docker services and show logs |
| 129 | + @# TODO: Add support for setting logging level |
| 130 | + @# Generate run ID |
| 131 | + $(eval RUN_ID := $(shell date +%Y%m%d_%H%M%S)) |
| 132 | + @echo "Starting run: $(RUN_ID)" |
| 133 | + @echo "" |
| 134 | + @# Create run directory structure |
| 135 | + @mkdir -p development/runs/$(RUN_ID)/scaffolds |
| 136 | + @mkdir -p development/runs/$(RUN_ID)/logs |
| 137 | + @echo "$(RUN_ID)" > development/runs/latest |
| 138 | + @# Start services with run-specific scaffold directory |
| 139 | + @echo "Starting Docker services..." |
| 140 | + @cd development && \ |
| 141 | + RUN_ID=$(RUN_ID) \ |
| 142 | + SCAFFOLD_DIR=./runs/$(RUN_ID)/scaffolds \ |
| 143 | + docker-compose up -d |
| 144 | + @echo "✓ Services started" |
| 145 | + @echo "✓ Run ID: $(RUN_ID)" |
| 146 | + @echo "✓ Scaffolds: development/runs/$(RUN_ID)/scaffolds" |
| 147 | + @echo "✓ Logs: development/runs/$(RUN_ID)/logs" |
| 148 | + @echo "" |
| 149 | + @# Start background log capture |
| 150 | + @echo "Capturing logs to development/runs/$(RUN_ID)/logs/" |
| 151 | + @(cd development && docker-compose logs -f) > development/runs/$(RUN_ID)/logs/combined.log 2>&1 & echo $$! > development/runs/$(RUN_ID)/logs/.logger.pid |
| 152 | + @# Tail logs to terminal with colorized container names |
| 153 | + @echo "Showing logs (Ctrl+C to exit, services and logging will keep running)..." |
| 154 | + @echo "" |
| 155 | + @tail -f development/runs/$(RUN_ID)/logs/combined.log | sed \ |
| 156 | + -e 's/saturn-pubsub-dev/\x1b[36msaturn-pubsub-dev\x1b[0m/g' \ |
| 157 | + -e 's/saturn-dev[^-]/\x1b[33msaturn-dev\x1b[0m/g' |
| 158 | + |
| 159 | +dev-docker-down: ## Stop all Docker services |
| 160 | + @echo "Stopping Docker services..." |
| 161 | + @# Stop background logger if running |
| 162 | + @if [ -f development/runs/$$(cat development/runs/latest 2>/dev/null)/logs/.logger.pid ]; then \ |
| 163 | + kill $$(cat development/runs/$$(cat development/runs/latest)/logs/.logger.pid) 2>/dev/null || true; \ |
| 164 | + rm development/runs/$$(cat development/runs/latest)/logs/.logger.pid; \ |
| 165 | + fi |
| 166 | + @cd development && docker-compose down |
| 167 | + @echo "✓ Services stopped" |
| 168 | + |
| 169 | +dev-docker-logs: ## View logs for current run |
| 170 | + @if [ ! -f development/runs/latest ]; then \ |
| 171 | + echo "No active run found. Start services with 'make dev-docker-up' first."; \ |
| 172 | + exit 1; \ |
| 173 | + fi |
| 174 | + @RUN_ID=$$(cat development/runs/latest); \ |
| 175 | + echo "Viewing logs for run: $$RUN_ID"; \ |
| 176 | + echo ""; \ |
| 177 | + tail -f development/runs/$$RUN_ID/logs/combined.log | sed \ |
| 178 | + -e 's/saturn-pubsub-dev/\x1b[36msaturn-pubsub-dev\x1b[0m/g' \ |
| 179 | + -e 's/saturn-dev[^-]/\x1b[33msaturn-dev\x1b[0m/g' |
| 180 | + |
| 181 | +dev-docker-rebuild: ## Rebuild Docker images and restart services |
| 182 | + @echo "Rebuilding and restarting Docker services..." |
| 183 | + @cd development && docker-compose up -d --build |
| 184 | + @echo "✓ Rebuild complete" |
| 185 | + |
| 186 | +dev-list-runs: ## List all test runs |
| 187 | + @echo "Available test runs:" |
| 188 | + @echo "" |
| 189 | + @if [ -d development/runs ]; then \ |
| 190 | + for run in $$(ls -t development/runs | grep -E '^[0-9]{8}_[0-9]{6}$$'); do \ |
| 191 | + echo " $$run"; \ |
| 192 | + if [ -d "development/runs/$$run/scaffolds" ]; then \ |
| 193 | + scaffold_count=$$(find development/runs/$$run/scaffolds -type f 2>/dev/null | wc -l | tr -d ' '); \ |
| 194 | + echo " Scaffolds: $$scaffold_count files"; \ |
| 195 | + fi; \ |
| 196 | + if [ -f "development/runs/$$run/logs/combined.log" ]; then \ |
| 197 | + log_size=$$(du -h development/runs/$$run/logs/combined.log | cut -f1); \ |
| 198 | + echo " Logs: $$log_size"; \ |
| 199 | + fi; \ |
| 200 | + echo ""; \ |
| 201 | + done; \ |
| 202 | + else \ |
| 203 | + echo " No runs found"; \ |
| 204 | + fi |
| 205 | + @if [ -f development/runs/latest ]; then \ |
| 206 | + echo "Latest run: $$(cat development/runs/latest)"; \ |
| 207 | + fi |
| 208 | + |
| 209 | +dev-view-run: ## View logs for a specific run (usage: make dev-view-run RUN_ID=20260102_134523) |
| 210 | + @if [ -z "$(RUN_ID)" ]; then \ |
| 211 | + echo "Error: Please specify RUN_ID"; \ |
| 212 | + echo "Usage: make dev-view-run RUN_ID=20260102_134523"; \ |
| 213 | + echo ""; \ |
| 214 | + echo "Available runs:"; \ |
| 215 | + ls -1 development/runs | grep -E '^[0-9]{8}_[0-9]{6}$$' || echo " No runs found"; \ |
| 216 | + exit 1; \ |
| 217 | + fi |
| 218 | + @if [ ! -f "development/runs/$(RUN_ID)/logs/combined.log" ]; then \ |
| 219 | + echo "Error: Run $(RUN_ID) not found or has no logs"; \ |
| 220 | + exit 1; \ |
| 221 | + fi |
| 222 | + @echo "Viewing logs for run: $(RUN_ID)" |
| 223 | + @echo "" |
| 224 | + @tail -f development/runs/$(RUN_ID)/logs/combined.log | sed \ |
| 225 | + -e 's/saturn-pubsub-dev/\x1b[36msaturn-pubsub-dev\x1b[0m/g' \ |
| 226 | + -e 's/saturn-dev[^-]/\x1b[33msaturn-dev\x1b[0m/g' |
| 227 | + |
| 228 | +dev-clean-runs: ## Clean old test runs (keeps latest 5) |
| 229 | + @echo "Cleaning old test runs..." |
| 230 | + @if [ -d development/runs ]; then \ |
| 231 | + runs_to_delete=$$(ls -t development/runs | grep -E '^[0-9]{8}_[0-9]{6}$$' | tail -n +6); \ |
| 232 | + if [ -n "$$runs_to_delete" ]; then \ |
| 233 | + echo "Deleting old runs:"; \ |
| 234 | + for run in $$runs_to_delete; do \ |
| 235 | + echo " $$run"; \ |
| 236 | + rm -rf development/runs/$$run; \ |
| 237 | + done; \ |
| 238 | + echo "✓ Cleanup complete"; \ |
| 239 | + else \ |
| 240 | + echo "No old runs to clean (keeping latest 5)"; \ |
| 241 | + fi; \ |
| 242 | + else \ |
| 243 | + echo "No runs directory found"; \ |
| 244 | + fi |
0 commit comments