|
| 1 | +#!/bin/bash |
| 2 | +# |
| 3 | +# Script to build all TypeScript CDK projects in parallel |
| 4 | +# |
| 5 | +set -euo pipefail |
| 6 | + |
| 7 | +# Get the directory of this script |
| 8 | +SCRIPT_DIR=$(cd $(dirname $0) && pwd) |
| 9 | +REPO_ROOT=$(dirname "$SCRIPT_DIR") |
| 10 | +TYPESCRIPT_DIR="${REPO_ROOT}/typescript" |
| 11 | +BUILD_SCRIPT="$SCRIPT_DIR/build-typescript.sh" |
| 12 | + |
| 13 | +# Check if parallel is installed |
| 14 | +if ! command -v parallel &> /dev/null; then |
| 15 | + echo "GNU parallel is not installed. Please install it first." |
| 16 | + exit 1 |
| 17 | +fi |
| 18 | + |
| 19 | +# Check if the build script exists |
| 20 | +if [ ! -f "$BUILD_SCRIPT" ]; then |
| 21 | + echo "Error: Build script not found at $BUILD_SCRIPT" |
| 22 | + exit 1 |
| 23 | +fi |
| 24 | + |
| 25 | +# Create a temporary directory for build logs |
| 26 | +TEMP_DIR=$(mktemp -d) |
| 27 | +trap 'rm -rf "$TEMP_DIR"' EXIT |
| 28 | + |
| 29 | +# Find all TypeScript CDK projects (directories with cdk.json) |
| 30 | +# Exclude any matches from node_modules directories, cdk.out directories, and specific problematic projects |
| 31 | +echo "Finding all TypeScript CDK projects..." |
| 32 | +PROJECTS=$(find "$TYPESCRIPT_DIR" -name "cdk.json" -type f \ |
| 33 | + -not -path "*/node_modules/*" \ |
| 34 | + -not -path "*/cdk.out/*" \ |
| 35 | + | sort) |
| 36 | + |
| 37 | +# Count total projects |
| 38 | +TOTAL_PROJECTS=$(echo "$PROJECTS" | wc -l) |
| 39 | +echo "Found $TOTAL_PROJECTS TypeScript CDK projects to build" |
| 40 | +echo "==============================" |
| 41 | + |
| 42 | +# Function to build a single project |
| 43 | +build_project() { |
| 44 | + CDK_JSON_PATH="$1" |
| 45 | + PROJECT_DIR=$(dirname "$CDK_JSON_PATH") |
| 46 | + REL_PATH=$(realpath --relative-to="$REPO_ROOT" "$PROJECT_DIR") |
| 47 | + LOG_FILE="$TEMP_DIR/$(echo "$REL_PATH" | tr '/' '_').log" |
| 48 | + |
| 49 | + # Show start message |
| 50 | + echo "▶️ Starting build: $REL_PATH" |
| 51 | + |
| 52 | + # Check for DO_NOT_AUTOTEST file |
| 53 | + if [ -f "$PROJECT_DIR/DO_NOT_AUTOTEST" ]; then |
| 54 | + echo "⏭️ Skipping $REL_PATH (DO_NOT_AUTOTEST flag found)" |
| 55 | + echo "SKIPPED:$REL_PATH" > "$LOG_FILE.status" |
| 56 | + return 0 |
| 57 | + fi |
| 58 | + |
| 59 | + # Find the package.json in the project directory |
| 60 | + PACKAGE_JSON="$PROJECT_DIR/package.json" |
| 61 | + if [ ! -f "$PACKAGE_JSON" ]; then |
| 62 | + echo "⏭️ Skipping $REL_PATH (no package.json found)" |
| 63 | + echo "SKIPPED:$REL_PATH" > "$LOG_FILE.status" |
| 64 | + return 0 |
| 65 | + fi |
| 66 | + |
| 67 | + # Get the relative path to package.json for the build script |
| 68 | + PACKAGE_JSON_REL_PATH=$(realpath --relative-to="$REPO_ROOT" "$PACKAGE_JSON") |
| 69 | + |
| 70 | + # Create a modified version of the build script that suppresses cdk synth output |
| 71 | + TEMP_BUILD_SCRIPT="$TEMP_DIR/build-$(basename "$REL_PATH").sh" |
| 72 | + cat > "$TEMP_BUILD_SCRIPT" << 'EOF' |
| 73 | +#!/bin/bash |
| 74 | +set -euo pipefail |
| 75 | +
|
| 76 | +# Get the original script and arguments |
| 77 | +ORIGINAL_SCRIPT="$1" |
| 78 | +shift |
| 79 | +ARGS="$@" |
| 80 | +
|
| 81 | +# Run the original script but capture and filter the output |
| 82 | +"$ORIGINAL_SCRIPT" "$ARGS" 2>&1 | grep -v "cdk synth" | grep -v "Synthesizing" |
| 83 | +EOF |
| 84 | + chmod +x "$TEMP_BUILD_SCRIPT" |
| 85 | + |
| 86 | + # Run the build script with filtered output |
| 87 | + if "$TEMP_BUILD_SCRIPT" "$BUILD_SCRIPT" "$PACKAGE_JSON_REL_PATH" > "$LOG_FILE" 2>&1; then |
| 88 | + echo "✅ Build successful: $REL_PATH" |
| 89 | + echo "SUCCESS:$REL_PATH" > "$LOG_FILE.status" |
| 90 | + else |
| 91 | + echo "❌ Build failed: $REL_PATH" |
| 92 | + echo "FAILED:$REL_PATH" > "$LOG_FILE.status" |
| 93 | + fi |
| 94 | +} |
| 95 | +export -f build_project |
| 96 | +export SCRIPT_DIR |
| 97 | +export REPO_ROOT |
| 98 | +export BUILD_SCRIPT |
| 99 | +export TEMP_DIR |
| 100 | + |
| 101 | +# Run builds in parallel |
| 102 | +echo "$PROJECTS" | parallel --will-cite --jobs 50% build_project |
| 103 | + |
| 104 | +# Collect results |
| 105 | +SUCCESSFUL=0 |
| 106 | +FAILED=0 |
| 107 | +SKIPPED=0 |
| 108 | +ALL_PROJECTS=() |
| 109 | + |
| 110 | +for STATUS_FILE in "$TEMP_DIR"/*.status; do |
| 111 | + [ -f "$STATUS_FILE" ] || continue |
| 112 | + |
| 113 | + STATUS_CONTENT=$(cat "$STATUS_FILE") |
| 114 | + STATUS_TYPE=${STATUS_CONTENT%%:*} |
| 115 | + PROJECT_PATH=${STATUS_CONTENT#*:} |
| 116 | + |
| 117 | + case "$STATUS_TYPE" in |
| 118 | + "SUCCESS") |
| 119 | + ((SUCCESSFUL++)) |
| 120 | + ALL_PROJECTS+=("✅ $PROJECT_PATH") |
| 121 | + ;; |
| 122 | + "FAILED") |
| 123 | + ((FAILED++)) |
| 124 | + ALL_PROJECTS+=("❌ $PROJECT_PATH") |
| 125 | + ;; |
| 126 | + "SKIPPED") |
| 127 | + ((SKIPPED++)) |
| 128 | + ALL_PROJECTS+=("⏭️ $PROJECT_PATH") |
| 129 | + ;; |
| 130 | + esac |
| 131 | +done |
| 132 | + |
| 133 | +# Sort the projects list |
| 134 | +IFS=$'\n' SORTED_PROJECTS=($(sort <<<"${ALL_PROJECTS[*]}")) |
| 135 | +unset IFS |
| 136 | + |
| 137 | +# Print summary |
| 138 | +echo "" |
| 139 | +echo "==============================" |
| 140 | +echo "BUILD SUMMARY" |
| 141 | +echo "==============================" |
| 142 | +echo "Total: $((SUCCESSFUL + FAILED + SKIPPED)) (✅ $SUCCESSFUL succeeded, ❌ $FAILED failed, ⏭️ $SKIPPED skipped)" |
| 143 | +echo "" |
| 144 | +echo "Project Status:" |
| 145 | +echo "-----------------------------" |
| 146 | +for PROJ in "${SORTED_PROJECTS[@]}"; do |
| 147 | + echo "$PROJ" |
| 148 | +done |
| 149 | + |
| 150 | +# If any builds failed, print their logs and exit with error |
| 151 | +if [ $FAILED -gt 0 ]; then |
| 152 | + echo "" |
| 153 | + echo "Build logs for failed projects:" |
| 154 | + echo "==============================" |
| 155 | + for PROJ in "${SORTED_PROJECTS[@]}"; do |
| 156 | + if [[ $PROJ == ❌* ]]; then |
| 157 | + PROJECT_PATH=${PROJ#❌ } |
| 158 | + echo "" |
| 159 | + echo "Log for $PROJECT_PATH:" |
| 160 | + echo "-------------------------------------------" |
| 161 | + cat "$TEMP_DIR/$(echo "$PROJECT_PATH" | tr '/' '_').log" |
| 162 | + echo "-------------------------------------------" |
| 163 | + fi |
| 164 | + done |
| 165 | + exit 1 |
| 166 | +fi |
0 commit comments