Как включить кэширование артефактов maven для GitLab ci runner?
мы используем GitLab ci с общими бегунами для нашей непрерывной интеграции. Для каждой сборки runner загружает тонны артефактов maven.
есть ли способ настроить GitLab ci для кэширования этих артефактов, чтобы мы могли ускорить процесс построения, предотвращая загрузку одного и того же артефакта снова и снова?
5 ответов
GitLab CI позволяет определить определенные пути, которые содержат данные, которые должны быть кэшированы между сборками, на основе каждого задания или сборки (см. здесь для более подробной информации). В сочетании с рекомендацией khmarbaise это можно использовать для кэширования зависимостей между несколькими сборками.
пример, который кэширует все зависимости заданий в вашей сборке:
cache:
paths:
- .m2/
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2"
maven_job:
script:
- mvn clean install
согласно разговору на трекер проблем GitLab, мне удалось изменить путь локального репозитория Maven и поместить его в ./.m2/repository/
каталог, который затем будет сохраняться между запусками, добавив этот глобальный блок в конфигурацию CI:
cache:
paths:
- ./.m2/repository
# keep cache across branch
key: "$CI_BUILD_REF_NAME"
к сожалению, согласно этот ответ StackOverflow путь локального репозитория maven может быть установлен только при каждом запуске с -Dmaven.repo.local
или путем редактирования settings.xml
, что является утомительной задачей в сделайте в сценарии конфигурации gitlab-ci. Одним из вариантов было бы установить переменную с параметрами Maven по умолчанию и передать ее каждому запуску.
кроме того, важно, чтобы локальный репозиторий Maven был дочерним для текущего каталога. По какой-то причине, положив его в /cache
или /builds
не сработало для меня, хотя кто-то из GitLab утверждал, что это должно быть.
пример работающего gitlab-ci.yml
файл конфигурации для Maven + Java:
image: maven:3-jdk-8
variables:
MAVEN_OPTS: "-Djava.awt.headless=true -Dmaven.repo.local=./.m2/repository"
MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version"
cache:
paths:
- ./.m2/repository
# keep cache across branch
key: "$CI_BUILD_REF_NAME"
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- "mvn clean compile $MAVEN_CLI_OPTS"
artifacts:
paths:
- target/
unittest-job:
stage: test
dependencies:
- build-job
script:
- "mvn package $MAVEN_CLI_OPTS"
artifacts:
paths:
- target/
integrationtest-job:
stage: test
dependencies:
- build-job
script:
- "mvn verify $MAVEN_CLI_OPTS"
artifacts:
paths:
- target/
deploy-job:
stage: deploy
artifacts:
paths:
- "target/*.jar"
вы можете добавить папку кэша в конфигурацию GitLab-ci runner и передать ее maven.
/ etc/gitlab-runner / config.томл
[[runners]]
...
[runners.docker]
...
volumes = ["/cache", "/.m2"]
...
.gitlab-ci.в формате YML
variables:
MAVEN_OPTS: "-Dmaven.repo.local=/.m2"
build:
script:
- mvn package
принятый ответ не сделал этого для меня.
As zlobster упомянуто, у парней в GitLab есть этот удивительный хранилище где вы можете найти правильный пример .gitlab-ci.yml
файл, используемый для проектов Maven.
в основном, вам нужны следующие строки:
cache:
paths:
- .m2/repository
имейте в виду, что если вы решите добавить локальный кэш для определенного задания, глобальный, добавленный выше, будет заменен. Подробнее об этом здесь.
если вы используете kubernetes в качестве исполнителя для GitLab-runner, вы также можете использовать кэш maven. Я решил иметь постоянный кэш на NFS с k8s PV (но другой тип Тома поддерживается gitlab-runner). Следующая конфигурация не использует кэш функция gitlab из-за настойчивости, предлагаемой NFS.
1) Создайте PersistentVolume на вашем кластере, например здесь с NFS (адаптируйтесь к вашему слою персистентности и вашим параметрам) :
apiVersion: v1
kind: PersistentVolume
metadata:
name: gitlabrunner-nfs-volume
spec:
capacity:
storage: 10Gi
mountOptions:
- nolock
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /gitlabrunner
server: 1.2.3.4
2) Ссылка на PV, чтобы получить претензию в качестве Тома в runner pod:
[[runners.kubernetes.volumes.pvc]]
name = "pvc-1"
mount_path = "/path/to/mount/point1"
Примечание (03/09/18): параметр командной строки для этих параметров еще не существует. Есть открытое вопрос.
3) укажите тот же путь для кэша GitLab-runner:
[[runners]]
executor = "kubernetes"
# ...
cache_dir = "/path/to/mount/point1"
или
--cache-dir "/path/to/mount/point1"
в интерактивном режиме
4) Используйте каталог"/path/to/mount / point1 " в -Dmaven.repo.local
опции