version: 0.2 phases: pre_build: commands: - echo "Logging in to Amazon ECR..." - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com - REPOSITORY_URI=$ECR_REPOSITORY_URI - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} - echo "Installing dependencies..." - curl -fsSL https://bun.sh/install | bash build: commands: # Environment setup - export PATH="/root/.bun/bin:$PATH" - export PGSSLMODE=require - export NODE_ENV=production - export NEXT_TELEMETRY_DISABLED=1 - export UV_THREADPOOL_SIZE=36 - export NODE_OPTIONS="--max-old-space-size=65536" # Validate environment variables - echo "Validating environment variables..." - '[ -n "$DATABASE_URL" ] || { echo "❌ DATABASE_URL is not set"; exit 1; }' - '[ -n "$BASE_URL" ] || { echo "❌ BASE_URL is not set"; exit 1; }' - '[ -n "$BETTER_AUTH_URL" ] || { echo "❌ BETTER_AUTH_URL is not set"; exit 1; }' - '[ -n "$TRUST_APP_URL" ] || { echo "❌ TRUST_APP_URL is not set"; exit 1; }' - '[ -n "$APP_AWS_BUCKET_NAME" ] || { echo "❌ APP_AWS_BUCKET_NAME is not set"; exit 1; }' - '[ -n "$APP_AWS_ACCESS_KEY_ID" ] || { echo "❌ APP_AWS_ACCESS_KEY_ID is not set"; exit 1; }' - '[ -n "$APP_AWS_SECRET_ACCESS_KEY" ] || { echo "❌ APP_AWS_SECRET_ACCESS_KEY is not set"; exit 1; }' # Install only API workspace dependencies - echo "Installing API dependencies only..." - bun install --filter=@trycompai/api --frozen-lockfile || bun install --filter=@trycompai/api --ignore-scripts || bun install --ignore-scripts # Build workspace packages - echo "Building workspace packages..." - cd packages/auth && bun run build && cd ../.. - cd packages/db && bun run build && cd ../.. - cd packages/integration-platform && bun run build && cd ../.. - cd packages/company && bun run build && cd ../.. - cd packages/billing && bun run build && cd ../.. - echo "Building NestJS application..." - echo "APP_NAME is set to $APP_NAME" - echo "Current directory $(pwd)" - echo "Available apps $(ls -la apps/)" - cd apps/api - echo "Changed to $(pwd)" - bun run build - echo "Checking build output..." - ls -la dist/ - ls -la dist/apps/api/src/ || ls -la dist/src/ - '[ -f "dist/apps/api/src/main.js" ] || [ -f "dist/src/main.js" ] || { echo "❌ main.js not found"; exit 1; }' - mkdir -p ../docker-build # Handle both output structures (dist/apps/api/src or dist/src) - | if [ -d "dist/apps/api/src" ]; then echo "Using composite output structure..." cp -r dist/apps/api/* ../docker-build/ else echo "Using standard output structure..." cp -r dist/* ../docker-build/ fi - cp -r prisma ../docker-build/ - echo "Verifying copied files..." - ls -la ../docker-build/ - ls -la ../docker-build/src/ - '[ -f "../docker-build/src/main.js" ] || { echo "❌ main.js not found in docker-build/src"; exit 1; }' # Copy ALL node_modules from root (already installed with production deps) - echo "Copying node_modules from root..." - cp -r ../../node_modules ../docker-build/ # Remove workspace symlinks and replace with built versions - rm -rf ../docker-build/node_modules/@trycompai/utils - rm -rf ../docker-build/node_modules/@trycompai/db - rm -rf ../docker-build/node_modules/@trycompai/integration-platform - rm -rf ../docker-build/node_modules/@trycompai/auth - rm -rf ../docker-build/node_modules/@trycompai/company - rm -rf ../docker-build/node_modules/@trycompai/billing - mkdir -p ../docker-build/node_modules/@trycompai/utils - mkdir -p ../docker-build/node_modules/@trycompai/db - mkdir -p ../docker-build/node_modules/@trycompai/integration-platform - mkdir -p ../docker-build/node_modules/@trycompai/auth - mkdir -p ../docker-build/node_modules/@trycompai/company - mkdir -p ../docker-build/node_modules/@trycompai/billing - cp -r ../../packages/utils/src ../docker-build/node_modules/@trycompai/utils/ - cp ../../packages/utils/package.json ../docker-build/node_modules/@trycompai/utils/ - cp -r ../../packages/db/dist ../docker-build/node_modules/@trycompai/db/ - cp ../../packages/db/package.json ../docker-build/node_modules/@trycompai/db/ - cp -r ../../packages/integration-platform/dist ../docker-build/node_modules/@trycompai/integration-platform/ - cp ../../packages/integration-platform/package.json ../docker-build/node_modules/@trycompai/integration-platform/ - cp -r ../../packages/auth/dist ../docker-build/node_modules/@trycompai/auth/ - cp ../../packages/auth/package.json ../docker-build/node_modules/@trycompai/auth/ - cp -r ../../packages/company/dist ../docker-build/node_modules/@trycompai/company/ - cp ../../packages/company/package.json ../docker-build/node_modules/@trycompai/company/ - cp -r ../../packages/billing/dist ../docker-build/node_modules/@trycompai/billing/ - cp ../../packages/billing/package.json ../docker-build/node_modules/@trycompai/billing/ - cp Dockerfile ../docker-build/ # Remove workspace dependencies from package.json (they're copied manually above) - cat package.json | jq 'del(.dependencies["@trycompai/integration-platform"]) | del(.dependencies["@trycompai/auth"]) | del(.dependencies["@trycompai/company"]) | del(.dependencies["@trycompai/billing"])' > ../docker-build/package.json - cp ../../bun.lock ../docker-build/ || true - echo "Building Docker image..." - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t $ECR_REPOSITORY_URI:$IMAGE_TAG ../docker-build/ - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest post_build: commands: - echo "Pushing images to ECR..." - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG - docker push $ECR_REPOSITORY_URI:latest - echo "Updating ECS service..." - aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment - 'printf "[{\"name\":\"%s-container\",\"imageUri\":\"%s\"}]" api $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' cache: paths: - 'node_modules/**/*' - 'packages/db/node_modules/**/*' - 'apps/api/node_modules/**/*' - '/root/.bun/install/cache/**/*' - 'bun.lock' artifacts: files: - imagedefinitions.json name: ${APP_NAME}-build