Как включить кэширование артефактов 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 опции