@@ -33,17 +33,33 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o /cmd/ ./cmd/...
3333FROM node-alpine AS shared-libs-builder
3434WORKDIR /app
3535
36+ # Step 1: Copy only package manifests for dependency installation.
37+ # This layer is cached as long as no package.json or lock file changes.
3638COPY package.json yarn.lock* .yarnrc.yml ./
3739COPY .yarn ./.yarn
40+ COPY ./packages/db/package.json ./packages/db/package.json
41+ COPY ./packages/db/prisma ./packages/db/prisma
42+ COPY ./packages/schemas/package.json ./packages/schemas/package.json
43+ COPY ./packages/shared/package.json ./packages/shared/package.json
44+ COPY ./packages/queryLanguage/package.json ./packages/queryLanguage/package.json
45+ # All workspace package.json files are needed for Yarn resolution
46+ COPY ./packages/web/package.json ./packages/web/package.json
47+ COPY ./packages/backend/package.json ./packages/backend/package.json
48+ COPY ./packages/mcp/package.json ./packages/mcp/package.json
49+
50+ RUN yarn install --mode=skip-build
51+
52+ # Step 2: Copy source files and build explicitly in topological order.
3853COPY ./packages/db ./packages/db
54+ COPY ./schemas ./schemas
3955COPY ./packages/schemas ./packages/schemas
40- COPY ./packages/shared ./packages/shared
4156COPY ./packages/queryLanguage ./packages/queryLanguage
57+ COPY ./packages/shared ./packages/shared
4258
43- RUN yarn workspace @sourcebot/db install
44- RUN yarn workspace @sourcebot/schemas install
45- RUN yarn workspace @sourcebot/shared install
46- RUN yarn workspace @sourcebot/query-language install
59+ RUN yarn workspace @sourcebot/db build && \
60+ yarn workspace @sourcebot/schemas build && \
61+ yarn workspace @sourcebot/query-language build && \
62+ yarn workspace @sourcebot/shared build
4763# ------------------------------------
4864
4965# ------ Build Web ------
@@ -79,20 +95,32 @@ ENV SENTRY_SMUAT=$SENTRY_SMUAT
7995RUN apk add --no-cache libc6-compat
8096WORKDIR /app
8197
98+ # Step 1: Install dependencies (cached unless package.json/lock changes).
8299COPY package.json yarn.lock* .yarnrc.yml ./
83100COPY .yarn ./.yarn
84- COPY ./packages/web ./packages/web
85- COPY --from=shared-libs-builder /app/node_modules ./node_modules
101+ COPY ./packages/web/package.json ./packages/web/package.json
102+ COPY ./packages/db/package.json ./packages/db/package.json
103+ COPY ./packages/db/prisma ./packages/db/prisma
104+ COPY ./packages/schemas/package.json ./packages/schemas/package.json
105+ COPY ./packages/shared/package.json ./packages/shared/package.json
106+ COPY ./packages/queryLanguage/package.json ./packages/queryLanguage/package.json
107+ COPY ./packages/backend/package.json ./packages/backend/package.json
108+ COPY ./packages/mcp/package.json ./packages/mcp/package.json
109+
110+ RUN yarn install --mode=skip-build
111+
112+ # Step 2: Copy pre-built shared libraries.
86113COPY --from=shared-libs-builder /app/packages/db ./packages/db
87114COPY --from=shared-libs-builder /app/packages/schemas ./packages/schemas
88115COPY --from=shared-libs-builder /app/packages/shared ./packages/shared
89116COPY --from=shared-libs-builder /app/packages/queryLanguage ./packages/queryLanguage
90117
91- # Fixes arm64 timeouts
92- RUN yarn workspace @sourcebot/ web install
118+ # Step 3: Copy web source and build.
119+ COPY ./packages/ web ./packages/web
93120
94121ENV NEXT_TELEMETRY_DISABLED=1
95- RUN yarn workspace @sourcebot/web build
122+ RUN --mount=type=cache,target=/app/packages/web/.next/cache \
123+ yarn workspace @sourcebot/web build
96124ENV SKIP_ENV_VALIDATION=0
97125# ------------------------------
98126
@@ -117,16 +145,28 @@ ENV SENTRY_RELEASE=$SENTRY_RELEASE
117145
118146WORKDIR /app
119147
148+ # Step 1: Install dependencies (cached unless package.json/lock changes).
120149COPY package.json yarn.lock* .yarnrc.yml ./
121150COPY .yarn ./.yarn
122- COPY ./schemas ./schemas
123- COPY ./packages/backend ./packages/backend
124- COPY --from=shared-libs-builder /app/node_modules ./node_modules
151+ COPY ./packages/backend/package.json ./packages/backend/package.json
152+ COPY ./packages/db/package.json ./packages/db/package.json
153+ COPY ./packages/db/prisma ./packages/db/prisma
154+ COPY ./packages/schemas/package.json ./packages/schemas/package.json
155+ COPY ./packages/shared/package.json ./packages/shared/package.json
156+ COPY ./packages/queryLanguage/package.json ./packages/queryLanguage/package.json
157+ COPY ./packages/web/package.json ./packages/web/package.json
158+ COPY ./packages/mcp/package.json ./packages/mcp/package.json
159+
160+ RUN yarn install --mode=skip-build
161+
162+ # Step 2: Copy pre-built shared libraries and backend source.
125163COPY --from=shared-libs-builder /app/packages/db ./packages/db
126164COPY --from=shared-libs-builder /app/packages/schemas ./packages/schemas
127165COPY --from=shared-libs-builder /app/packages/shared ./packages/shared
128166COPY --from=shared-libs-builder /app/packages/queryLanguage ./packages/queryLanguage
129- RUN yarn workspace @sourcebot/backend install
167+ COPY ./schemas ./schemas
168+ COPY ./packages/backend ./packages/backend
169+
130170RUN yarn workspace @sourcebot/backend build
131171
132172# Upload source maps to Sentry if we have the necessary build-time args.
0 commit comments