как добавить постоянный том для Maven в Gitlab с помощью Kubernetes runner

#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. Пока это решение не сработало для нас, я буду делать специальный проект, чтобы я мог играть с ним все время, но это займет некоторое время из-за праздников. Доберусь до него через несколько дней.