Кэш npm, pip, Maven и других зависимостей для ускорения сборок.
Кэширование зависимостей — один из самых эффективных способов ускорения CI/CD пайплайнов. Правильная настройка кэша сокращает время сборок в 2–5 раз.
Каждый запуск пайплайна начинается с установки зависимостей. Без кэша:
# Без кэширования — каждый раз заново
steps:
- uses: actions/checkout@v4
- run: npm install # 2–5 минут каждый раз!
- run: npm testПроблемы без кэша:
С кэшем:
Официальное действие для кэширования:
steps:
- name: Cache npm dependencies
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-Параметры:
path — файлы или директории для кэшированияkey — уникальный идентификатор кэшаrestore-keys — альтернативные ключи для частичного совпаденияКлюч должен:
# Хороший ключ
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
# Плохой ключ — не меняется при изменении зависимостей
key: npm-cache-v1
# Плохой ключ — один кэш для всех ОС
key: npm-${{ hashFiles('**/package-lock.json') }}Если точный ключ не найден, GitHub проверяет restore-keys:
steps:
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-npm-Сценарий:
${{ runner.os }}-npm-npm install обновляет только изменившиеся пакетыname: Node.js CI with cache
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm' # Встроенное кэширование!
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm testВстроенное кэширование actions/setup-node:
Вручную для полного контроля:
steps:
- uses: actions/checkout@v4
- name: Cache node_modules
uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install dependencies
run: npm ciname: Python CI with cache
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip' # Встроенное кэширование
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
run: pytestВручную для pip:
steps:
- uses: actions/cache@v4
with:
path: |
~/.cache/pip
~/.local/share/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-name: Java CI with Maven
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Java
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'maven'
- name: Build with Maven
run: mvn -B package
- name: Run tests
run: mvn testПуть к кэшу Maven: ~/.m2/repository
steps:
- uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-В GitLab CI кэширование настроено иначе — через ключевое слово cache:
# .gitlab-ci.yml
test:
stage: test
image: node:20
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- node_modules/
policy: pull-push
script:
- npm ci
- npm testПараметры cache:
key — идентификатор кэша (переменные CI/CD доступны)paths — файлы для кэшированияpolicy — pull-push (по умолчанию), pull, или pushДоступные переменные:
| Переменная | Описание |
|---|---|
$CI_COMMIT_REF_SLUG | URL-safe имя ветки |
$CI_COMMIT_REF_NAME | Имя ветки или тега |
$CI_PIPELINE_ID | ID пайплайна |
$CI_PROJECT_ID | ID проекта |
Примеры ключей:
# Отдельный кэш для каждой ветки
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- node_modules/
# Глобальный кэш для всех веток
cache:
key: global-npm-cache
paths:
- node_modules/
# Кэш для конкретной версии зависимостей
cache:
key: npm-$CI_COMMIT_REF_SLUG-${{ hashFiles('package-lock.json') }}
paths:
- node_modules/pull-push (по умолчанию):
cache:
policy: pull-push # Загрузить перед job, сохранить послеpull — только загрузка:
cache:
policy: pull # Только загрузить, не сохранятьpush — только сохранение:
cache:
policy: push # Только сохранить, не загружатьНе используйте actions/cache для Docker! Вместо этого:
Через buildx cache:
steps:
- uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: myapp:latest
cache-from: type=gha
cache-to: type=gha,mode=maxЧерез registry cache:
steps:
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: myapp:latest
cache-from: type=registry,ref=myorg/myapp:buildcache
cache-to: type=registry,ref=myorg/myapp:buildcache,mode=maxGitHub Actions:
GitLab CI:
Не кэшируйте:
actions/upload-artifactПример:
# Не нужно кэшировать — установка быстрая
steps:
- run: pip install requests # 5 секунд
# Нужно кэшировать — установка долгая
steps:
- run: pip install -r requirements.txt # 2–3 минуты с tensorflow, pandasВключите логирование:
steps:
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
id: cache-npm
- name: Check cache
run: |
echo "Cache hit: ${{ steps.cache-npm.outputs.cache-hit }}"Вывод:
cache-hit: true — кэш найден по точному ключуcache-hit: false — кэш не найден или восстановлен по restore-keyscache: 'npm', cache: 'pip') когда возможноКэширование зависимостей — критически важная оптимизация:
actions/cache@v4 или встроенное в setup-действияcache с key, paths, policyПравильно настроенный кэш сокращает время сборок в 2–5 раз.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.