#maven #docker #kubernetes #gitlab
# #maven #docker #kubernetes #gitlab
Вопрос:
Ситуация:
- сервер A: мы запускаем Gitlab в контейнере.
- сервер B: у нас есть Kubernetes.
Gitlab использует Kubernetes runner. Некоторые из наших проектов затем создают приложения, используя контейнер docker с помощью Git и Maven.
Maven всегда приходится загружать всевозможные вещи в свой кэш /root/.m2. Что мне нужно сделать, так это создать постоянный том, который могут использовать эти задания, поэтому после его загрузки не нужно делать это снова каждый раз, когда кто-то хочет что-то создать или протестировать. Эти контейнеры всегда создаются заново с использованием одного готового образа.
Довольно простой материал, за исключением того, что я абсолютно новичок в Gitlab и Kubernetes.
Где мне нужно создать том? Я попытался изменить config.toml в runner, чтобы включить тип host_path volume, но я не знаю, удалось ли мне, и Maven, безусловно, должен каждый раз загружать все требования. Я даже не знаю, нужно ли перезапускать контейнер runner для внесения изменений и как. Это конфигурация бегуна.toml :
listen_address = "[::]:9252"
concurrent = 4
check_interval = 3
log_level = "info"
[session_server]
session_timeout = 1800
[[runners]]
name = "runner-gitlab-runner-c55d9bf98-2nn7c"
url = "https://private_network:8443/"
token = "yeah, token"
executor = "kubernetes"
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.kubernetes]
host = ""
bearer_token_overwrite_allowed = false
image = "ubuntu:16.04"
namespace = "gitlab-managed-apps"
namespace_overwrite_allowed = ""
privileged = true
service_account_overwrite_allowed = ""
pod_annotations_overwrite_allowed = ""
[runners.kubernetes.volumes.host_path]
name = "maven-volume"
mount_path = "/root/.m2"
read_only = false
Я не знаю достаточно, чтобы понять, чего мне не хватает. Может быть, мне нужно что-то определить в .gitlab-ci.yml в этих проектах или что-то еще. Я просмотрел учебные пособия, я пробовал страницы справки Gitlab, но я все еще не могу найти рабочее решение.
Запуск GitLab Community Edition 11.6.5.
Комментарии:
1. Рассматривали ли вы эти альтернативы: вы можете добавить каталог .m2 в кеш вашего задания на сборку или вы можете использовать собственное зеркало maven (nexus, artifactory, archiva), которое позволяет вам также распространять ваши личные артефакты.
2. Мы используем nexus, но ему все равно нужно загружать из него все артефакты.
3. Что касается кэша, опять же, полный новичок в этой области, я не знаю, как сделать постоянный кеш в нашей локальной среде. Подойдет любое решение, которое позволяет людям быстро разрабатывать и тестировать свои творения. Я знаю, что это можно решить с помощью многоступенчатых изображений docker, где одно изображение содержит эти артефакты, но это кажется медленным, так как вам приходится перестраивать изображение каждый раз, когда что-то меняется.
Ответ №1:
1) Создайте постоянный объем Kubernetes (я использую NFS в качестве типа PersistentVolume) :
apiVersion: v1
kind: PersistentVolume
metadata:
name: gitlabrunner-nfs-volume
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 15Gi
mountOptions:
- nolock
nfs:
path: /kubernetes/maven/
server: NFS_SERVER_IP
persistentVolumeReclaimPolicy: Recycle
2) создайте Kubernetes PersistentVolumeClaim :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gitlabrunner-claim
namespace: gitlab
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 15Gi
volumeName: gitlabrunner-nfs-volume
status:
accessModes:
- ReadWriteMany
capacity:
storage: 15Gi
3) Обратитесь к PersistentVolumeClaim в вашем config.toml :
[[runners.kubernetes.volumes.pvc]]
mount_path = "/cache/maven.repository"
name = "gitlabrunner-claim"
Это позволяет монтировать том каждый раз, когда контейнер запускается с этой конфигурацией.
4) в файле .gitlab-ci.yml установите MVN_OPTS, как ответил @thomas :
variables:
MVN_OPTS: "-Dmaven.repo.local=/cache/maven.repository"
Комментарии:
1. Это именно то, что мне было нужно. Мой тестовый проект уже показывает значительное сокращение времени, и я могу начать внедрять изменения в .gitlab-ci.yml в реальные проекты. Программисты будут счастливы.
Ответ №2:
Я бы использовал отдельный кеш для каждого проекта, используя это в вашей конфигурации сборки
variables:
MAVEN_OPTS: "-Dmaven.repo.local=./.m2/repository"
cache:
paths:
- ./.m2/repository
# share cache across branches
key: "$CI_BUILD_REF_NAME"
Это предотвращает помехи между отдельными сборками проекта.
Вы можете найти конфигурацию ссылок у ребят из gitlab: https://gitlab.com/gitlab-org/gitlab-ci-yml/blob/master/Maven.gitlab-ci.yml
Комментарии:
1. Пока это решение не сработало для нас, я буду делать специальный проект, чтобы я мог играть с ним все время, но это займет некоторое время из-за праздников. Доберусь до него через несколько дней.