Ответ
Кеш в GitLab CI/CD — это механизм для сохранения файлов и директорий между разными запусками пайплайнов или даже между разными этапами (jobs) одного запуска. Его основная цель — ускорить выполнение, избегая повторной загрузки или генерации одних и тех же данных (например, зависимостей пакетов).
Как это работает на практике:
В файле .gitlab-ci.yml вы определяете, какие пути нужно кешировать. GitLab Runner сохраняет их как архив и загружает при последующих запусках, если ключ кеша совпадает.
# Пример кеширования зависимостей Node.js и кэша компилятора Rust
cache:
key: "$CI_COMMIT_REF_SLUG" # Ключ, часто привязанный к ветке
paths:
- node_modules/ # Зависимости npm
- target/ # Кэш сборки Cargo (Rust)
- .gradle/caches/ # Кэш Gradle
stages:
- build
- test
build-job:
stage: build
script:
- npm ci # Быстрая установка, т.к. node_modules закеширован
- npm run build
cache: # Можно переопределить кеш для конкретного job
policy: pull # Только загрузить кеш, не сохранять
key: "$CI_COMMIT_REF_SLUG"
paths:
- node_modules/
test-job:
stage: test
script:
- npm test
cache: # Job тестирования также использует закешированные зависимости
policy: pull
key: "$CI_COMMIT_REF_SLUG"
paths:
- node_modules/
Ключевые особенности и best practices:
- Ключ (key): Определяет версию кеша. Использование
$CI_COMMIT_REF_SLUG(имя ветки) — распространённая практика. Для зависимостей, общих для всего проекта, можно использовать статический ключ, напримерkey: "global-cache". - Политика (policy):
pull-push(по умолчанию),pull(только загрузка),push(только сохранение). На этапе деплоя часто используютpolicy: pull, чтобы не перезаписывать кеш. - Кеш vs Артефакты (artifacts): Кеш — для ускорения (не гарантируется сохранность). Артефакты — для передачи файлов между этапами (например, собранный JAR-файл) и их хранения.
- Размер и инвалидация: Большие кеши замедляют пайплайн. Важно очищать кеш при изменении ключа (например, при обновлении
package.jsonнужно изменить ключ, добавив хэш файла:key: "$CI_COMMIT_REF_SLUG-$CI_PROJECT_DIR/package.json").