Skip to content

Commit 5e95c56

Browse files
author
Michael Kaiser
committed
Add script for building all typescript projects
1 parent c8dd8ed commit 5e95c56

File tree

1 file changed

+166
-0
lines changed

1 file changed

+166
-0
lines changed

scripts/build-all-typescript.sh

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
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

Comments
 (0)