Как я ускорил сборку проекта на 25% с помощью кэширования зависимостей
Всем привет! Меня зовут Дмитрий, я backend-разработчик. В этой статье хочу поделиться опытом оптимизации процесса сборки в одном из наших проектов на Node.js. Возможно, мой опыт поможет вам сократить время CI/CD pipeline.
Проблема
В нашем проекте используется довольно много npm-зависимостей. Каждый коммит собирается через GitHub Actions. Примерный pipeline такой:
Клонирование репозитория
Установка зависимостей (
npm ci
)Запуск тестов
Сборка приложения
Самый долгий этап — установка зависимостей. Он занимал до 2 минут, что при большом количестве коммитов замедляет работу всей команды.
Решение: Кэширование зависимостей
GitHub Actions поддерживает кэширование директорий между запусками workflow. Для Node.js достаточно кэшировать папку ~/.npm
или node_modules
. Я выбрал кэширование ~/.npm
, чтобы исключить возможные проблемы с бинарями в node_modules
.
Пример workflow
name: Node.js CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Cache npm
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-npm-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-cache-
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Build
run: npm run build
Результаты
После внедрения кэширования время установки зависимостей снизилось с 2 минут до 20-30 секунд на большинстве запусков.
До: 120 секунд
После: 30 секунд
Это позволило сократить общее время сборки pipeline примерно на 25%.
Подводные камни
Если обновляется
package-lock.json
, кэш не сработает — это ожидаемо.Иногда кэш может устареть или стать неправильным, тогда помогает сброс кэша или удаление вручную.
Для monorepo стоит кэшировать несколько директорий.
Выводы
Кэширование зависимостей — простой и эффективный способ ускорить сборку проекта. Особенно это актуально для больших проектов и частых обновлений. Рекомендую попробовать, если вы еще не используете кэш на CI.
Спасибо за внимание! Готов ответить на вопросы в комментариях.