GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
Рейтинг: 23.1% · 5 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
CI-пайплайн на GitHub Actions занимает 15 минут: 5 из них уходит на npm install и ещё 4 на docker build. Каждый пуш — полная пересборка с нуля. Читал про кэширование, но не очень понимаю как правильно настроить кэш для npm и для Docker-слоёв. Кто настраивал — поделитесь рабочим конфигом?
✔ Лучший ответ выбран автором и совпадает с автоматическим подбором — lorenzinoarq
Развёрнутое решение по оптимизации времени CI. Для npm: помимо кэша install, стоит разделить install и build на отдельные джобы если у вас monorepo, и использовать nx affected или turborepo чтобы собирать только изменившиеся пакеты. Экономия может быть колоссальной. Для Docker: самое важное — правильный порядок слоёв в Dockerfile. Сначала копируй package.json и package-lock.json, делай npm…
Re: GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
Для npm проще всего использовать actions/setup-node с встроенным кэшем: - uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm'. Это автоматически кэширует ~/.npm по хэшу package-lock.json. Если cache hit — npm install занимает секунды вместо минут. Для yarn и pnpm аналогично, просто меняй значение cache.
Re: GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
Docker-слои кэшируются через buildx и cache-to/cache-from. Вот рабочий кусок: - uses: docker/setup-buildx-action@v3 - uses: docker/build-push-action@v5 with: context: . push: true tags: myimage:latest cache-from: type=gha cache-to: type=gha,mode=max. Ключевое — type=gha использует GitHub Actions Cache API, это работает из коробки без внешнего registry. mode=max кэширует все промежуточные слои.
- lorenzinoarq
- Сообщения: 65
- Зарегистрирован: 11 май 2026, 00:03
Re: GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
✔ Лучший ответ — выбран автором и совпадает с авто-подбором
Развёрнутое решение по оптимизации времени CI. Для npm: помимо кэша install, стоит разделить install и build на отдельные джобы если у вас monorepo, и использовать nx affected или turborepo чтобы собирать только изменившиеся пакеты. Экономия может быть колоссальной. Для Docker: самое важное — правильный порядок слоёв в Dockerfile. Сначала копируй package.json и package-lock.json, делай npm install, и только потом COPY . . с исходниками. Тогда слой с зависимостями будет закэширован и пересобираться только при изменении package.json. Пример: COPY package*.json ./ ; RUN npm ci --only=production ; COPY src/ ./src/. Дополнительно: используй multi-stage build чтобы финальный образ не тащил devDependencies и build-tooling. Это уменьшает размер образа в 2-5 раз и ускоряет push. Ещё трюк: можно вынести тесты в отдельный job с matrix strategy и запускать параллельно — суммарное время падает кратно числу параллельных воркеров.
Re: GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
Не забывай про cache key стратегию. Я использую такой подход: key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node-. restore-keys позволяет использовать частично устаревший кэш если точного совпадения нет, вместо полного cache miss.
Re: GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
После всех оптимизаций у нас CI упал с 18 минут до 4. Ключевые вещи которые дали наибольший выигрыш по порядку: правильный порядок слоёв Dockerfile (+6 мин), кэш npm (+4 мин), параллельные тесты (+3 мин), buildx кэш (+1 мин).
Re: GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
а вы npm ci используете или npm install? пять минут на установку это подозрительно даже без кэша. ci с прогретым ~/.npm у нас на проекте с 1800 пакетами укладывается в 40-50 секунд. если в логах до сих пор npm install, начните с этого, заодно lock-файл честнее соблюдается.
Re: GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
@valru, type=gha рабочий, но есть грабли: лимит кэша 10 ГБ на репозиторий. mode=max на жирном мультистейдже забивает его за несколько дней, гитхаб начинает вытеснять старые записи и hit rate проседает в ноль. Мы плюнули и перешли на type=registry с отдельным тегом buildcache в том же ghcr, живет заметно стабильнее.
Re: GitHub Actions как кэшировать зависимости npm и Docker слои для ускорения CI
@timur12, цифры подозрительно ровно бьются, 6+4+3+1 ровно 14 и итог ровно 4. в жизни порядок слоев и buildx кэш экономят наполовину одно и то же, эффекты пересекаются. не то чтобы не верю, но выглядит как слайд для менеджмента, лол
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- GitHub Actions съедает бюджет, селф-хостед раннеры — спасение или геморрой?
10 ответов · 796 просмотров
-
- Решил кэшировать прямо в Postgres вместо Redis, чтобы не плодить зависимости. Норм идея?
3 ответов · 279 просмотров
-
-
-
- GitHub ввел лимит на бесплатные приватные Actions-минуты, кто куда переехал с CI
6 ответов · 71 просмотров
-
Похожие запросы:
docker compose как пользоватьсякак написать dockerfileкак уменьшить размер docker образачто такое docker hub и как им пользоватьсякак собрать docker образ из dockerfileлучшие практики написания dockerfile
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость