version: 0.2 env: variables: # Runtime versions NODE_VERSION: "18" PYTHON_VERSION: "3.9" GO_VERSION: "1.21" # Build configuration BUILD_ENV: "production" RUST_BACKTRACE: "1" phases: install: runtime-versions: nodejs: 18 python: 3.9 golang: 1.21 commands: - echo "Installing build dependencies..." # Install Rust with error handling #- | # if ! command -v rustc &> /dev/null; then # curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y # source $HOME/.cargo/env # rustup update stable # fi # Install AWS CDK globally - npm install -g aws-cdk@latest # Verify runtime versions - echo "=== Runtime Versions ===" - node --version - npm --version - python3 --version - go version - rustc --version || echo "Rust not available" - cdk --version pre_build: commands: - set -e # Exit on any error - echo "Pre-build phase started on $(date)" # Install React dependencies with clean install - echo "Installing React dependencies..." - npm ci --prefer-offline --no-audit # Install Python dependencies for Lambda functions - | if [ -d "functions/python" ] && [ -f "functions/python/requirements.txt" ]; then echo "Installing Python dependencies..." cd functions/python pip3 install -r requirements.txt --target . --upgrade --no-cache-dir cd ../.. else echo "No Python Lambda function found, skipping..." fi # Download Go dependencies - | if [ -d "functions/go" ] && [ -f "functions/go/go.mod" ]; then echo "Downloading Go dependencies..." cd functions/go go mod download go mod verify cd ../.. else echo "No Go Lambda function found, skipping..." fi # Check Rust dependencies - | if [ -d "functions/rust" ] && [ -f "functions/rust/Cargo.toml" ]; then echo "Checking Rust dependencies..." cd functions/rust cargo check --release cd ../.. else echo "No Rust Lambda function found, skipping..." fi build: commands: - echo "Build phase started on $(date)" # Run linting and code quality checks early - | if [ -f "package.json" ] && grep -q '"lint"' package.json; then echo "Running code quality checks..." npm run lint fi # Run tests before building - | if [ -f "package.json" ] && grep -q '"test"' package.json; then echo "Running tests..." npm test -- --coverage --ci --testResultsProcessor="jest-junit" --watchAll=false fi # Build React application - echo "Building React application..." - npm run build # Build Lambda functions in parallel where possible - echo "Building Lambda functions..." # Build Go Lambda function - | if [ -d "functions/go" ]; then echo "Building Go Lambda function..." cd functions/go GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" -o bootstrap main.go zip -9 go-lambda.zip bootstrap cd ../.. fi # Build Rust Lambda function - | if [ -d "functions/rust" ]; then echo "Building Rust Lambda function..." cd functions/rust if command -v cargo-lambda &> /dev/null; then cargo lambda build --release else cargo install cargo-lambda cargo lambda build --release fi cd ../.. fi # Package Python Lambda function - | if [ -d "functions/python" ]; then echo "Packaging Python Lambda function..." cd functions/python zip -r9 ../python-lambda.zip . -x "*.pyc" "__pycache__/*" "*.git*" "*.DS_Store*" cd ../.. fi # Build CDK infrastructure - echo "Synthesizing CDK infrastructure..." - npx cdk synth --all post_build: commands: - echo "Post-build phase started on $(date)" # Create deployment package structure - mkdir -p dist/{react,lambdas,infrastructure} # Copy React build artifacts - | if [ -d "build" ]; then cp -r build/* dist/react/ else echo "No React build directory found" fi # Copy Lambda function packages - | [ -f "functions/go/go-lambda.zip" ] && cp functions/go/go-lambda.zip dist/lambdas/ [ -f "functions/python-lambda.zip" ] && cp functions/python-lambda.zip dist/lambdas/ [ -f "functions/rust/target/lambda/rust-lambda/bootstrap.zip" ] && cp functions/rust/target/lambda/rust-lambda/bootstrap.zip dist/lambdas/rust-lambda.zip # Copy CDK synthesized templates - | if [ -d "cdk.out" ]; then cp -r cdk.out/* dist/infrastructure/ fi # Generate build metadata - | cat > dist/build-info.json << EOF { "buildTime": "$(date -u +%Y-%m-%dT%H:%M:%SZ)", "commitHash": "${CODEBUILD_RESOLVED_SOURCE_VERSION:-unknown}", "buildId": "${CODEBUILD_BUILD_ID:-unknown}", "projectName": "${CODEBUILD_BUILD_PROJECT_NAME:-unknown}", "buildNumber": "${CODEBUILD_BUILD_NUMBER:-unknown}" } EOF - echo "Build completed successfully on $(date)" reports: jest_reports: files: - junit.xml base-directory: . file-format: JUNITXML coverage_reports: files: - clover.xml base-directory: coverage file-format: CLOVERXML artifacts: files: - '**/*' base-directory: dist name: personal-site-build-$CODEBUILD_BUILD_NUMBER cache: paths: - node_modules/**/* - ~/.npm/**/* - ~/.cache/pip/**/* - ~/.cargo/**/* - functions/go/go.mod - functions/go/go.sum - functions/rust/target/**/*