From 0b90d9cdb5212dcb5ee46a02ae6c1a7ebe5550de Mon Sep 17 00:00:00 2001 From: ordinarthur <@arthurbarre.js@gmail.com> Date: Mon, 20 Apr 2026 10:05:47 +0200 Subject: [PATCH] fix(docker): materialize @anydrop/shared as real dir, not workspace symlink MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pnpm's workspace symlink (server/node_modules/@anydrop/shared → ../../../shared) works locally but breaks on the Gitea Actions runner. TSC resolves the symlink but cannot read through it, yielding TS2307 on "@anydrop/shared". Fix: after building shared, copy its package.json + dist into {server,web}/node_modules/@anydrop/shared as a plain directory before running the dependent build. Module resolution becomes filesystem-local, independent of BuildKit layer semantics or storage driver symlink handling. --- server/Dockerfile | 12 +++++++++++- web/Dockerfile | 7 ++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/server/Dockerfile b/server/Dockerfile index ee7a66e..1b75601 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -12,7 +12,17 @@ RUN pnpm install --frozen-lockfile COPY shared/ shared/ COPY server/ server/ -RUN pnpm --filter @anydrop/shared run build && pnpm --filter @anydrop/server run build + +# Build shared first, then materialize it as a real directory inside +# server/node_modules so TS module resolution does not rely on pnpm's +# workspace symlink (which has been observed to break across build layers +# on some CI runners / storage drivers). +RUN pnpm --filter @anydrop/shared run build \ + && test -f shared/dist/index.d.ts \ + && rm -rf server/node_modules/@anydrop/shared \ + && mkdir -p server/node_modules/@anydrop/shared \ + && cp -r shared/package.json shared/dist server/node_modules/@anydrop/shared/ \ + && pnpm --filter @anydrop/server run build # Runtime stage FROM node:20-alpine diff --git a/web/Dockerfile b/web/Dockerfile index f7ca1ec..2b36e96 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -14,7 +14,12 @@ RUN pnpm install --frozen-lockfile COPY shared/ shared/ COPY web/ web/ -RUN pnpm --filter @anydrop/shared run build && pnpm --filter @anydrop/web exec vite build +RUN pnpm --filter @anydrop/shared run build \ + && test -f shared/dist/index.d.ts \ + && rm -rf web/node_modules/@anydrop/shared \ + && mkdir -p web/node_modules/@anydrop/shared \ + && cp -r shared/package.json shared/dist web/node_modules/@anydrop/shared/ \ + && pnpm --filter @anydrop/web exec vite build # Runtime stage FROM nginx:alpine