From e4c7d7b49979813e762ea42556b210bd55f83b77 Mon Sep 17 00:00:00 2001 From: tarunpandey23 Date: Tue, 23 Jun 2026 16:27:54 +0530 Subject: [PATCH] add deployment related files --- .dockerignore | 26 ++++++++++ .gitignore | 4 ++ coverage-service/.env.example | 2 +- deployment/coverage-api.env.example | 11 +++++ .../coverage-api}/Dockerfile | 36 +++++++++++--- deployment/coverage-worker.env.example | 24 +++++++++ .../coverage-worker}/Dockerfile | 38 +++++++++++--- .../docker-compose.coverage.yaml | 40 ++++++++------- deployment/docker-compose.openreview.yaml | 49 +++++++++++++++++++ deployment/openreview-api.env.example | 12 +++++ .../openreview-service}/Dockerfile | 10 ++-- deployment/openreview-worker.env.example | 31 ++++++++++++ service/.dockerignore | 6 --- service/.env.example | 4 +- 14 files changed, 245 insertions(+), 48 deletions(-) create mode 100644 .dockerignore create mode 100644 deployment/coverage-api.env.example rename {coverage-service/api => deployment/coverage-api}/Dockerfile (52%) create mode 100644 deployment/coverage-worker.env.example rename {coverage-service/worker => deployment/coverage-worker}/Dockerfile (53%) rename coverage-service/docker-compose.yml => deployment/docker-compose.coverage.yaml (63%) create mode 100644 deployment/docker-compose.openreview.yaml create mode 100644 deployment/openreview-api.env.example rename {service => deployment/openreview-service}/Dockerfile (74%) create mode 100644 deployment/openreview-worker.env.example delete mode 100644 service/.dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..64d9011 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,26 @@ +# Dependencies and build output +**/node_modules +**/dist +**/.venv-tools + +# Environment and secrets +**/.env +**/.env.local +**/.env.*.local + +# Git and editor +.git +.gitignore +**/.DS_Store +**/*.log + +# Test coverage report output (do not use **/coverage — it excludes source under +# service/src/dispatch/coverage and coverage-service/lib/src/coverage) +/coverage +**/.vitest + +# Docker (avoid recursive context) +deployment/coverage-api.env +deployment/coverage-worker.env +deployment/openreview-api.env +deployment/openreview-worker.env diff --git a/.gitignore b/.gitignore index 572f5e2..1a9f0b1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,10 @@ dist/ # Environment .env .env.local +deployment/coverage-api.env +deployment/coverage-worker.env +deployment/openreview-api.env +deployment/openreview-worker.env # Trace files *.json.trace diff --git a/coverage-service/.env.example b/coverage-service/.env.example index 6d9a25c..d490eb9 100644 --- a/coverage-service/.env.example +++ b/coverage-service/.env.example @@ -5,7 +5,7 @@ DATABASE_URL=postgresql://prcoverage:prcoverage@localhost:5432/prcoverage?schema REDIS_URL=redis://localhost:6379 # API -API_PORT=3000 +API_PORT=3010 WEBHOOK_SECRET=change-me-to-a-random-secret # GitHub (choose one auth method) diff --git a/deployment/coverage-api.env.example b/deployment/coverage-api.env.example new file mode 100644 index 0000000..f4eeb8f --- /dev/null +++ b/deployment/coverage-api.env.example @@ -0,0 +1,11 @@ +DATABASE_URL=postgresql://prcoverage:prcoverage@postgres:5432/prcoverage?schema=public +REDIS_URL=redis://redis:6379 +GITHUB_AUTH_MODE=pat +GITHUB_PAT= +LLM_PROVIDER=openai +OPENAI_API_KEY= +TEST_GENERATION_MODEL=gpt-4o +NODE_ENV=production +OPENAI_MODEL=gpt-4o-mini +ANTHROPIC_API_KEY= +ANTHROPIC_MODEL=claude-3-5-sonnet-20241022 diff --git a/coverage-service/api/Dockerfile b/deployment/coverage-api/Dockerfile similarity index 52% rename from coverage-service/api/Dockerfile rename to deployment/coverage-api/Dockerfile index e950db8..6b68c96 100644 --- a/coverage-service/api/Dockerfile +++ b/deployment/coverage-api/Dockerfile @@ -1,4 +1,11 @@ -FROM node:20-slim AS builder +# syntax=docker/dockerfile:1.7 + +FROM node:24-slim AS builder + +RUN apt-get update && apt-get install -y --no-install-recommends \ + openssl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* RUN corepack enable && corepack prepare pnpm@10.28.0 --activate @@ -7,8 +14,12 @@ WORKDIR /app COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY coverage-service/lib/package.json ./coverage-service/lib/ COPY coverage-service/api/package.json ./coverage-service/api/ +COPY coverage-service/api/prisma ./coverage-service/api/prisma +COPY coverage-service/api/scripts ./coverage-service/api/scripts -RUN pnpm install --frozen-lockfile --filter @openreview/coverage-lib --filter @openreview/coverage-api +RUN pnpm install --frozen-lockfile --ignore-scripts \ + --filter @openreview/coverage-lib \ + --filter @openreview/coverage-api COPY coverage-service/lib ./coverage-service/lib COPY coverage-service/api ./coverage-service/api @@ -17,7 +28,12 @@ RUN pnpm --filter @openreview/coverage-lib build RUN pnpm --filter @openreview/coverage-api exec prisma generate RUN pnpm --filter @openreview/coverage-api build -FROM node:20-slim +FROM node:24-slim AS runtime + +RUN apt-get update && apt-get install -y --no-install-recommends \ + openssl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* RUN corepack enable && corepack prepare pnpm@10.28.0 --activate @@ -26,17 +42,23 @@ WORKDIR /app COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY coverage-service/lib/package.json ./coverage-service/lib/ COPY coverage-service/api/package.json ./coverage-service/api/ +COPY coverage-service/api/prisma ./coverage-service/api/prisma +COPY coverage-service/api/scripts ./coverage-service/api/scripts -RUN pnpm install --frozen-lockfile --prod --filter @openreview/coverage-lib --filter @openreview/coverage-api +RUN pnpm install --frozen-lockfile --ignore-scripts \ + --filter @openreview/coverage-lib \ + --filter @openreview/coverage-api COPY --from=builder /app/coverage-service/lib/dist ./coverage-service/lib/dist COPY --from=builder /app/coverage-service/api/dist ./coverage-service/api/dist -COPY --from=builder /app/coverage-service/api/prisma ./coverage-service/api/prisma -COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma -COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma + +ENV CI=true +RUN pnpm --filter @openreview/coverage-api exec prisma generate WORKDIR /app/coverage-service/api +ENV NODE_ENV=production + EXPOSE 3000 CMD ["sh", "-c", "pnpm exec prisma migrate deploy && node dist/main.js"] diff --git a/deployment/coverage-worker.env.example b/deployment/coverage-worker.env.example new file mode 100644 index 0000000..2c1d61d --- /dev/null +++ b/deployment/coverage-worker.env.example @@ -0,0 +1,24 @@ +DATABASE_URL=postgresql://prcoverage:prcoverage@postgres:5432/prcoverage?schema=public +REDIS_URL=redis://redis:6379 +GITHUB_AUTH_MODE=pat +GITHUB_PAT= +LLM_PROVIDER=openai +OPENAI_API_KEY= +TEST_GENERATION_MODEL=gpt-4o +NODE_ENV=production +WORKER_CONCURRENCY=2 +WORK_DIR=/tmp/pr-coverage-runs +EXECUTION_TIMEOUT_MS=3600000 +JOB_LOCK_DURATION_MS=3600000 +JOB_STALLED_INTERVAL_MS=120000 +JOB_MAX_STALLED_COUNT=5 +WORKER_FORCE_SHUTDOWN=false +DIFF_COVER_BIN=diff-cover +PYTHON_BIN=python3 +TEST_THRESHOLD=80 +MAX_GENERATION_ATTEMPTS=3 +OPENAI_MODEL=gpt-4o-mini +ANTHROPIC_API_KEY= +ANTHROPIC_MODEL=claude-3-5-sonnet-20241022 +MAX_MEMORY_MB=2048 +MAX_CPU_CORES=2 diff --git a/coverage-service/worker/Dockerfile b/deployment/coverage-worker/Dockerfile similarity index 53% rename from coverage-service/worker/Dockerfile rename to deployment/coverage-worker/Dockerfile index 4e0a24a..a53f2d1 100644 --- a/coverage-service/worker/Dockerfile +++ b/deployment/coverage-worker/Dockerfile @@ -1,4 +1,11 @@ -FROM node:20-slim AS builder +# syntax=docker/dockerfile:1.7 + +FROM node:24-slim AS builder + +RUN apt-get update && apt-get install -y --no-install-recommends \ + openssl \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* RUN corepack enable && corepack prepare pnpm@10.28.0 --activate @@ -7,23 +14,30 @@ WORKDIR /app COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY coverage-service/lib/package.json ./coverage-service/lib/ COPY coverage-service/worker/package.json ./coverage-service/worker/ +COPY coverage-service/api/package.json ./coverage-service/api/ COPY coverage-service/api/prisma ./coverage-service/api/prisma +COPY coverage-service/api/scripts ./coverage-service/api/scripts -RUN pnpm install --frozen-lockfile --filter @openreview/coverage-lib --filter @openreview/coverage-worker +RUN pnpm install --frozen-lockfile --ignore-scripts \ + --filter @openreview/coverage-lib \ + --filter @openreview/coverage-worker \ + --filter @openreview/coverage-api COPY coverage-service/lib ./coverage-service/lib COPY coverage-service/worker ./coverage-service/worker RUN pnpm --filter @openreview/coverage-lib build -RUN pnpm --filter @openreview/coverage-worker exec prisma generate --schema=../api/prisma/schema.prisma +# Generate from @openreview/coverage-api — it owns the schema and prisma CLI. +RUN pnpm --filter @openreview/coverage-api exec prisma generate RUN pnpm --filter @openreview/coverage-worker build -FROM node:20-slim +FROM node:24-slim AS runtime RUN apt-get update && apt-get install -y --no-install-recommends \ git \ python3 \ python3-pip \ + openssl \ ca-certificates \ && pip3 install --break-system-packages diff-cover \ && rm -rf /var/lib/apt/lists/* @@ -35,19 +49,27 @@ WORKDIR /app COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY coverage-service/lib/package.json ./coverage-service/lib/ COPY coverage-service/worker/package.json ./coverage-service/worker/ +COPY coverage-service/api/package.json ./coverage-service/api/ +COPY coverage-service/api/prisma ./coverage-service/api/prisma +COPY coverage-service/api/scripts ./coverage-service/api/scripts -RUN pnpm install --frozen-lockfile --prod --filter @openreview/coverage-lib --filter @openreview/coverage-worker +RUN pnpm install --frozen-lockfile --ignore-scripts \ + --filter @openreview/coverage-lib \ + --filter @openreview/coverage-worker \ + --filter @openreview/coverage-api COPY --from=builder /app/coverage-service/lib/dist ./coverage-service/lib/dist COPY --from=builder /app/coverage-service/worker/dist ./coverage-service/worker/dist COPY --from=builder /app/coverage-service/api/prisma ./coverage-service/api/prisma -COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma -COPY --from=builder /app/node_modules/@prisma ./node_modules/@prisma + +ENV CI=true +RUN pnpm --filter @openreview/coverage-api exec prisma generate WORKDIR /app/coverage-service/worker +ENV NODE_ENV=production ENV WORK_DIR=/tmp/pr-coverage-runs -ENV EXECUTION_TIMEOUT_MS=600000 +ENV EXECUTION_TIMEOUT_MS=3600000 USER node diff --git a/coverage-service/docker-compose.yml b/deployment/docker-compose.coverage.yaml similarity index 63% rename from coverage-service/docker-compose.yml rename to deployment/docker-compose.coverage.yaml index dffa5f0..cc0a156 100644 --- a/coverage-service/docker-compose.yml +++ b/deployment/docker-compose.coverage.yaml @@ -1,3 +1,5 @@ +name: coverage + services: postgres: image: postgres:16-alpine @@ -6,7 +8,7 @@ services: POSTGRES_PASSWORD: prcoverage POSTGRES_DB: prcoverage ports: - - '5432:5432' + - '5433:5432' volumes: - postgres_data:/var/lib/postgresql/data healthcheck: @@ -18,7 +20,7 @@ services: redis: image: redis:7-alpine ports: - - '6379:6379' + - '6381:6379' healthcheck: test: ['CMD', 'redis-cli', 'ping'] interval: 5s @@ -27,38 +29,40 @@ services: api: build: - context: ../.. - dockerfile: coverage-service/api/Dockerfile + context: .. + dockerfile: deployment/coverage-api/Dockerfile ports: - - '3000:3000' - env_file: .env - environment: - DATABASE_URL: postgresql://prcoverage:prcoverage@postgres:5432/prcoverage?schema=public - REDIS_URL: redis://redis:6379 - API_PORT: 3000 + - '3010:3000' + env_file: coverage-api.env depends_on: postgres: condition: service_healthy redis: condition: service_healthy + healthcheck: + test: + [ + 'CMD-SHELL', + "node -e \"fetch('http://127.0.0.1:3000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"", + ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 30s restart: unless-stopped worker: build: - context: ../.. - dockerfile: coverage-service/worker/Dockerfile - env_file: .env - environment: - DATABASE_URL: postgresql://prcoverage:prcoverage@postgres:5432/prcoverage?schema=public - REDIS_URL: redis://redis:6379 - WORK_DIR: /tmp/pr-coverage-runs + context: .. + dockerfile: deployment/coverage-worker/Dockerfile + env_file: coverage-worker.env depends_on: postgres: condition: service_healthy redis: condition: service_healthy api: - condition: service_started + condition: service_healthy deploy: resources: limits: diff --git a/deployment/docker-compose.openreview.yaml b/deployment/docker-compose.openreview.yaml new file mode 100644 index 0000000..67119ea --- /dev/null +++ b/deployment/docker-compose.openreview.yaml @@ -0,0 +1,49 @@ +name: openreview + +services: + redis: + image: redis:7-alpine + ports: + - '6380:6379' + healthcheck: + test: ['CMD', 'redis-cli', 'ping'] + interval: 5s + timeout: 5s + retries: 5 + + web: + build: + context: .. + dockerfile: deployment/openreview-service/Dockerfile + ports: + - '3003:3000' + env_file: openreview-api.env + extra_hosts: + - host.docker.internal:host-gateway + depends_on: + redis: + condition: service_healthy + healthcheck: + test: + [ + 'CMD-SHELL', + "node -e \"fetch('http://127.0.0.1:3000/ready').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"", + ] + interval: 10s + timeout: 5s + retries: 5 + start_period: 15s + restart: unless-stopped + + worker: + build: + context: .. + dockerfile: deployment/openreview-service/Dockerfile + command: ['node', 'dist/worker.mjs'] + env_file: openreview-worker.env + extra_hosts: + - host.docker.internal:host-gateway + depends_on: + redis: + condition: service_healthy + restart: unless-stopped diff --git a/deployment/openreview-api.env.example b/deployment/openreview-api.env.example new file mode 100644 index 0000000..c58f1ce --- /dev/null +++ b/deployment/openreview-api.env.example @@ -0,0 +1,12 @@ +GITHUB_WEBHOOK_SECRET= +GITHUB_PAT= +REDIS_URL=redis://redis:6379 +HOST=0.0.0.0 +NODE_ENV=production +LOG_LEVEL=info +MAX_PAYLOAD_BYTES=26214400 +COVERAGE_SERVICE_ENABLED=true +COVERAGE_SERVICE_URL=http://ec2-15-206-186-202.ap-south-1.compute.amazonaws.com:3010 +COVERAGE_SERVICE_BRANCH_PREFIX=openreview/tests +COVERAGE_SERVICE_POLL_INTERVAL_MS=5000 +COVERAGE_SERVICE_POLL_TIMEOUT_MS=1800000 diff --git a/service/Dockerfile b/deployment/openreview-service/Dockerfile similarity index 74% rename from service/Dockerfile rename to deployment/openreview-service/Dockerfile index f869a86..6282ec6 100644 --- a/service/Dockerfile +++ b/deployment/openreview-service/Dockerfile @@ -1,7 +1,7 @@ # syntax=docker/dockerfile:1.7 # ----------------------------------------------------------------------------- -# Builder — installs all workspace deps and produces dist/ for service + deps +# Builder — installs workspace deps and produces dist/ for service + core # ----------------------------------------------------------------------------- FROM node:24-alpine AS builder @@ -12,8 +12,6 @@ WORKDIR /app # Workspace manifests first for better layer caching. COPY pnpm-workspace.yaml pnpm-lock.yaml package.json tsconfig.base.json ./ COPY core/package.json core/ -COPY cli/package.json cli/ -COPY action/package.json action/ COPY service/package.json service/ RUN pnpm install --frozen-lockfile --filter @openreview/service... --filter @openreview/core @@ -24,14 +22,14 @@ COPY service ./service RUN pnpm -r --filter @openreview/core --filter @openreview/service build # Prune dev dependencies for the runtime image. -RUN pnpm --filter @openreview/service --prod deploy /out +RUN pnpm --filter @openreview/service --prod deploy /out --legacy -# ----------------------------------------------------------------------------- # Runtime — slim Node image with only the service + its prod deps -# ----------------------------------------------------------------------------- + FROM node:24-alpine AS runtime ENV NODE_ENV=production +ENV HOST=0.0.0.0 WORKDIR /app diff --git a/deployment/openreview-worker.env.example b/deployment/openreview-worker.env.example new file mode 100644 index 0000000..42d02a3 --- /dev/null +++ b/deployment/openreview-worker.env.example @@ -0,0 +1,31 @@ +REDIS_URL=redis://redis:6379 +GITHUB_WEBHOOK_SECRET= +GITHUB_PAT= +OPENAI_API_KEY= +MAIN_MODEL=gpt-4o +SUB_MODEL=gpt-4o-mini +MAX_ITERATIONS=12 +MAX_LLM_CALLS=35 +MAX_FILES=100 +MAX_FILE_BYTES=200000 +MAX_TOTAL_BYTES=5000000 +DEFAULT_REVIEW_MODE=fast +REVIEW_DRAFTS=false +LINTER_ESLINT=true +LINTER_RUFF=true +LINTER_SEMGREP=false +LINTER_SHELLCHECK=false +LINTER_GITLEAKS=false +NODE_ENV=production +LOG_LEVEL=info +WORKER_CONCURRENCY=4 +JOB_MAX_ATTEMPTS=3 +JOB_BACKOFF_MS=5000 +JOB_KEEP_COMPLETED=200 +JOB_KEEP_FAILED=500 +COVERAGE_SERVICE_ENABLED=true +COVERAGE_SERVICE_URL=http://ec2-15-206-186-202.ap-south-1.compute.amazonaws.com:3010 +COVERAGE_SERVICE_BRANCH_PREFIX=openreview/tests +COVERAGE_SERVICE_POLL_INTERVAL_MS=5000 +COVERAGE_SERVICE_POLL_TIMEOUT_MS=1800000 +COVERAGE_SERVICE_DEFAULT_BRANCH=main diff --git a/service/.dockerignore b/service/.dockerignore deleted file mode 100644 index 3a5c1d0..0000000 --- a/service/.dockerignore +++ /dev/null @@ -1,6 +0,0 @@ -node_modules -dist -.env -.env.local -*.log -.DS_Store diff --git a/service/.env.example b/service/.env.example index b4f2430..9e61f42 100644 --- a/service/.env.example +++ b/service/.env.example @@ -31,7 +31,7 @@ REDIS_URL=redis://localhost:6379 # ----------------------------------------------------------------------------- # HTTP port the webhook receiver binds to. -PORT=3000 +PORT=3003 # Host interface the webhook receiver binds to. HOST=0.0.0.0 @@ -80,7 +80,7 @@ COVERAGE_SERVICE_ENABLED=false # Required when COVERAGE_SERVICE_ENABLED=true. # Examples: -# http://localhost:3000 (local dev — matches coverage-service/docker-compose) +# http://localhost:3010 (coverage stack — deployment/docker-compose.coverage.yaml) # https://coverage.internal (cluster service) COVERAGE_SERVICE_URL=