Как кэшировать репозиторий maven между сборками?

Моя цель - создать, упаковать и протестировать java-проект, созданный с помощью maven, с использованием конвейера сборки Councourse.

Настройка как таковая на месте, и все работает нормально, но время сборки слишком велико из-за низкой скорости загрузки maven из нашего нексуса.

В моем yml-файле задания сборки используется следующий ресурс в качестве основы для сборки maven:

# ...
image_resource:
  type: docker-image
  source:
    repository: maven
    tag: '3.3-jdk-8'
# ...

Я осознаю тот факт, что наличие «чистого листа» для каждой постройки - это то, что заложено в зал по задумке.

Теперь мой вопрос: что было бы хорошим способом кэшировать локальный репозиторий maven (скажем, с некоторыми базовыми вещами внутри, такими как Spring и его зависимости)?

На ум приходят следующие варианты:

  1. Использование образа докера, в который уже встроены зависимости
  2. Создание ресурса, который предоставляет мне необходимые зависимости

Насколько я понимаю, вариант 1) не уменьшит размер загрузки для сборки, поскольку собрание, похоже, не кэширует образы докеров, используемые в качестве основы для заданий сборки (или я здесь ошибаюсь?)

Прежде чем двигаться дальше, я хотел бы убедиться, что следующий вариант 2) дает мне какое-либо преимущество - используются ли образы докеров для кеширования собрания в качестве ресурсов?

Я могу что-то упустить, так как я относительно новичок в этом. Так что простите меня, если я заставлю вас заявить здесь очевидное. :)


person Sebastian Schuth    schedule 22.11.2016    source источник


Ответы (3)


  • Предполагая, что ваш Nexus является локальным, я хотел бы выяснить, почему из-за этого низкая скорость загрузки, поскольку локальное использование чего-то вроде Nexus и Artifactory в настоящее время является самым простым способом кэширования. Они будут управлять временем жизни ваших кэшированных зависимостей, чтобы у вас не было кэшированных зависимостей дольше, чем они необходимы, и новые зависимости добавляются по мере их использования.
  • Если вы хотите использовать кеш для разных задач задания, тогда _1 _ кэшированная папка зависимостей (.m2 папка для maven) задачи и используйте ее как input другой задачи. Для справки см. Следующий пример:
 ---
 jobs:
   - name: create-and-consume
     public: true
     plan:
       - task: make-a-file
         config:
           platform: linux
           run:
             # ...
           outputs:
             # ensure that relative .m2 folder is used: https://stackoverflow.com/a/16649787/5088458
             - name: .m2
       - task: consume-the-file
         config:
           platform: linux
           inputs:
             - name: .m2
           run:
             # ...
  • Если вы хотите использовать общий кеш для всех выполнений одной задачи в задании, задачи также можно настроить на папки кеша.
  • If you want to cached between jobs then you could:
    • build a docker image with the cached folder, but then you'll need to manage that when dependencies are updated, although that may be possible via another pipeline.
    • создайте ресурс, который будет управлять кешем за вас. Например, посмотрите gradle-cache-resource или npm-cache-resource, хотя они требуют, чтобы ввод был из git-resource.

Я думаю, Concourse CI кэширует образы докеров, используемые для задач, но также может иметь их в качестве ресурсов вашего конвейера, а затем использовать _ 5_ параметр задачи для передачи этого ресурса. Вы можете увидеть, что кэшируется и как долго, используя команду volumes fly .

person WhiteKnight    schedule 22.11.2016
comment
Отлично, спасибо за обширное освещение темы - это было именно то, на что я надеялся, задав такой широкий вопрос :) В итоге у меня появился отдельный конвейер, который создает базовый образ, который я использую для сборки, с предварительным заполненный локальный репозиторий maven. В моем случае это сильно ускорило процесс: 2 минуты, по сравнению с 10 минутами на сборку. - person Sebastian Schuth; 28.11.2016
comment
@sschuth команда конкурса также только что опубликовала сообщение в блоге о том, как это сделать для драгоценных камней Ruby. - person materialdesigner; 16.12.2016

Я могу подтвердить, что Concourse действительно кеширует образы докеров, поэтому создание образа со всеми зависимостями может быть неплохим вариантом.

person Josh Zarrabi    schedule 23.11.2016
comment
Да, теперь я могу подтвердить, что кеширование изображений докеров, используемых для задач, работает. - person Sebastian Schuth; 28.11.2016

Вы можете использовать тот же механизм, что и тип ресурсов git для кэширования вашего кэша maven, как и здесь: https://github.com/ymedlop-sandbox/npm-cache-resource (не мое репо)

person David Karlsson    schedule 02.12.2016