Как стать автором
Обновить

Как я ускорил сборку проекта на 25% с помощью кэширования зависимостей

Уровень сложностиПростой

Всем привет! Меня зовут Дмитрий, я backend-разработчик. В этой статье хочу поделиться опытом оптимизации процесса сборки в одном из наших проектов на Node.js. Возможно, мой опыт поможет вам сократить время CI/CD pipeline.

Проблема

В нашем проекте используется довольно много npm-зависимостей. Каждый коммит собирается через GitHub Actions. Примерный pipeline такой:

  1. Клонирование репозитория

  2. Установка зависимостей (npm ci)

  3. Запуск тестов

  4. Сборка приложения

Самый долгий этап — установка зависимостей. Он занимал до 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.

Спасибо за внимание! Готов ответить на вопросы в комментариях.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.