Ctrl K
ComunidadGuías…

apps/api/buildspec.yml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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