Кейс
Есть проект, собираемый при помощи Gradle, и CI/CD-пайплайн в GitLab, выполняющий некоторые Gradle-таски на разных stage. Необходимо:
- Реализовать кэширование зависимостей, чтобы не выкачивать их заново на каждом stage, а также при каждом новом запуске pipeline
- Реализовать кэширование результатов сборки, чтобы последующий stage выполнял не всю сборку "с нуля", а использовал результаты предыдущих stage'й
Решение
Во-первых, настраиваем GRADLE_USER_HOME, чтобы он размещался внутри сборочной директории, и настраиваем кэширование для папки с зависимостями внутри GRADLE_USER_HOME в соответствии с https://docs.gradle.org/6.1.1/userguide/dependency_resolution.html#sec:dependency_cache:
before_script:
- export GRADLE_USER_HOME=`pwd`/.gradle
myjob:
...
cache:
key: gradle_modules_cache
paths:
- .gradle/caches/modules-2
policy: pull-push
Т.к. это кэш, он будет разделяться не только джобами внутри пайплайна, но и между разными пайплайнами.
Во-вторых, в settings.gradle настраиваем кастомную директорию для билд-кэша (см. https://docs.gradle.org/current/userguide/build_cache.html):
buildCache {
local {
directory = new File(rootDir, 'build-cache')
}
}
и для промежуточных джобов настраиваем публикацию этой директории в качестве артефакта:
artifacts:
paths:
- build-cache/
expire_in: 1 hour
В последующих джобах прописываем dependencies на предыдущие джобы, чтобы они подхватывали build-cache/ оттуда. Таким образом, build cache будет передаваться между джобами, но не будет передаваться между пайплайнами, что как раз корректно.
Ну и последнее - при вызове gradle используем --build-cache, чтобы собственно включить использования билд-кэша.
Вуаля, в логах сборки видим, что результаты предыдущих джобов подтягиваются из кэша:
Комментариев нет:
Отправить комментарий