apps/api/buildspec.yml
Rama main · réplica de lectura del repositorio original.
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