Build obrazu frontendu trwa w CI 14 minut
Każdy PR buduje obraz Dockera z aplikacją Next.js. Build trwa 14 minut, z czego npm install 6 minut, mimo że zależności zmieniają się rzadko. Developerzy czekają na preview i scalają PR-y bez niego.
Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.
Moje rozwiązanie
Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.
Pokaż, czego szuka rekruter, i modelową odpowiedź
Co sprawdza rekruter
- Czy znasz cache warstw i kolejność instrukcji w Dockerfile
- Czy umiesz użyć cache w CI, gdzie każdy runner startuje czysty
- Czy mierzysz, zanim optymalizujesz
Odpowiedź seniora
Najpierw rozbijam czas na kroki (docker build --progress=plain, czasy jobów w CI). Najczęstsza przyczyna to COPY . . przed npm ci, przez co każda zmiana w kodzie unieważnia warstwę z zależnościami.
Kolejność: najpierw COPY package.json i lockfile, potem npm ci, dopiero potem reszta kodu. Do tego BuildKit z cache mount na katalog npm (RUN --mount=type=cache,target=/root/.npm) i .dockerignore, który wyklucza node_modules, .git i artefakty. W CI runner jest czysty, więc włączam zewnętrzny cache warstw: docker buildx z --cache-from i --cache-to typu registry albo gha. Next.js dostaje też cache katalogu .next/cache.
Jeśli to monorepo, buduję tylko projekty dotknięte zmianą i używam turbo prune lub nx, żeby do obrazu trafił tylko potrzebny wycinek. Cel ustalam liczbowo, np. 3 minuty przy zmianie samego kodu, i pilnuję go w dashboardzie czasów pipeline’u.
Typowe wpadki
- Większy runner jako jedyne rozwiązanie
- Kopiowanie node_modules z hosta do obrazu
- Brak .dockerignore, przez co kontekst buildu ma setki MB
Dopytają o
- Jak upewnisz się, że cache nie przemyca nieaktualnych zależności?
- Czy preview w ogóle musi być obrazem Dockera?
- Jak obsłużysz prywatny rejestr npm w buildzie bez wycieku tokenu?