Pull to refresh

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

Level of difficultyEasy

Всем привет! Меня зовут Дмитрий, я 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.

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.