Кэширование в системе непрерывной интеграции (CI) — важная практика для ускорения процесса сборки и тестирования. В условиях частых изменений кода и постоянного выполнения тестов важно минимизировать время на повторную сборку и запуск тестов, которые не затронуты изменениями. В CI-системах, таких как Jenkins, GitHub Actions, GitLab CI, кэширование является мощным инструментом для улучшения производительности.
Кэширование в CI основывается на принципе сохранения данных между различными запусками сборки, чтобы не создавать их заново. Это может включать сохранение зависимостей, скомпилированных файлов, кеша тестов и прочих промежуточных данных. В контексте JavaScript-разработки кэширование в основном касается следующих аспектов:
Jest, как популярный фреймворк для тестирования в JavaScript, поддерживает кэширование на уровне тестов. Это особенно важно, если в проекте имеется большое количество тестов, и их повторный запуск может занимать значительное время. Jest автоматически кэширует результаты предыдущих тестов и использует их, если код не был изменен, что значительно ускоряет процессы CI.
Jest имеет встроенную систему кэширования, которая сохраняет
результаты выполнения тестов в локальном кэше (по умолчанию в папке
node_modules/.cache/jest). При следующем запуске тестов
Jest проверяет, были ли изменения в коде, и использует кэшированные
результаты для тех тестов, которые не затронуты.
Чтобы убедиться, что Jest использует кэширование, необходимо:
--cache при запуске тестов.Пример команды для запуска с кэшированием:
jest --cache
Это позволяет значительно сократить время, затрачиваемое на выполнение тестов, особенно в крупных проектах.
Для эффективного кэширования в CI-системах необходимо правильно настроить процесс сохранения и восстановления кэша. В большинстве CI-систем можно использовать механизмы, которые позволяют кэшировать зависимости и результаты тестов между разными запусками.
GitHub Actions:
В GitHub Actions кэширование можно настроить с помощью специального
действия actions/cache. Пример конфигурации для кэширования
зависимостей и результатов сборки:
name: Node.js CI
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Cache node modules
uses: actions/cache@v2
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
В этом примере ключ кэша зависит от хеш-суммы файла
package-lock.json, что гарантирует, что кэш будет сброшен,
если зависимости изменятся. Это помогает ускорить процесс сборки,
избегая повторной установки зависимостей, если они не были изменены.
GitLab CI:
В GitLab CI для кэширования используется директива cache
в файле .gitlab-ci.yml. Пример конфигурации:
stages:
- test
cache:
paths:
- node_modules/
test:
script:
- npm install
- npm test
В данном примере кешируются папки, в которых находятся зависимости проекта. Это позволяет существенно сократить время на установку пакетов в каждом новом запуске CI.
Jenkins:
В Jenkins кэширование также можно настроить, используя плагины, такие как Pipeline Utility Steps или стандартные возможности для кэширования файлов между различными этапами пайплайна. Пример конфигурации для кеширования зависимостей с помощью pipeline:
pipeline {
agent any
stages {
stage('Install Dependencies') {
steps {
script {
if (!fileExists('node_modules')) {
sh 'npm install'
}
}
}
}
stage('Run Tests') {
steps {
sh 'npm test'
}
}
}
post {
always {
archiveArtifacts artifacts: '**/test-results/*.xml', allowEmptyArchive: true
}
}
}
Здесь проверяется, существует ли папка node_modules, и
если она отсутствует, выполняется установка зависимостей. Кэширование на
уровне зависимостей можно дополнительно настроить через плагины.
При работе с большими проектами кэширование тестов, а не только зависимостей, может существенно улучшить производительность CI. Jest поддерживает так называемое “кэширование по тестам” — результаты тестов сохраняются, и при отсутствии изменений в тестируемых модулях Jest использует ранее сохраненные результаты.
Чтобы использовать эту возможность, необходимо просто запустить Jest с флагом кэширования. В CI-системах можно использовать этот флаг как часть конфигурации для экономии времени при каждом запуске тестов.
Кэширование в CI может приводить к ряду проблем:
package-lock.json или
yarn.lock.Правильное использование кэширования в CI-системах позволяет значительно сократить время на сборку и тестирование, особенно в проектах с большим количеством зависимостей и тестов. В большинстве случаев кэширование зависимостей и тестов может сократить время выполнения процессов CI на 30-50%.