Jak włączyć buforowanie artefaktów Maven dla gitlab Ci runner?

Używamy gitlab ci z współdzielonymi biegaczami do ciągłej integracji. Do każdej budowy biegacz pobiera Tony artefaktów maven.

Czy istnieje sposób na skonfigurowanie gitlab ci do buforowania tych artefaktów, abyśmy mogli przyspieszyć proces budowania, zapobiegając pobieraniu tego samego artefaktu w kółko?

Author: helt, 2016-06-13

5 answers

Gitlab Ci pozwala na zdefiniowanie pewnych ścieżek, które zawierają dane, które powinny być buforowane pomiędzy kompilacjami, dla każdego zadania lub kompilacji (zobacz Tutaj Po Więcej Szczegółów). W połączeniu z rekomendacją khmarbaise ' a, może to być używane do buforowania zależności między wieloma kompilacjami.

Przykład, który buforuje wszystkie zależności zadania w Twojej kompilacji:

cache:
  paths:
    - .m2/

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=.m2"

maven_job:
  script:
    - mvn clean install
 24
Author: andban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-13 15:02:45

Zgodnie z conversation over on GitLab ' s issue tracker , udało mi się zmienić ścieżkę lokalnego repozytorium Mavena i umieścić go w katalogu ./.m2/repository/, czyli będziemy utrzymywać się między uruchomieniami dodając ten globalny blok do konfiguracji CI:

cache:
  paths:
    - ./.m2/repository
  # keep cache across branch
  key: "$CI_BUILD_REF_NAME"

Niestety, zgodnie z Ta odpowiedź StackOverflow ścieżka lokalnego repozytorium maven może być ustawiona tylko przy każdym uruchomieniu z -Dmaven.repo.local lub przez edycję settings.xml, co jest żmudnym zadaniem w konfiguracji gitlab-ci scenariusz. Opcją byłoby ustawienie zmiennej z domyślnymi opcjami Mavena i przekazanie jej do każdego uruchomienia.

Ważne jest również, aby lokalne repozytorium Maven było potomkiem bieżącego katalogu. Z jakiegoś powodu umieszczenie go w /cache lub /builds nie zadziałało dla mnie, mimo że ktoś z GitLab twierdził, że powinien.

Przykład działającego pliku konfiguracyjnego gitlab-ci.yml dla 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"
 5
Author: oskopek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:39

Możesz dodać folder cache do konfiguracji gitlab-ci runner i przekazać go mavenowi.

/etc / gitlab-runner / config.toml

[[runners]]
...
  [runners.docker]
  ...
   volumes = ["/cache", "/.m2"]
  ...

.gitlab-ci.yml

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=/.m2"

build:
  script:
    - mvn package
 3
Author: Alexey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-03 16:54:18

Zaakceptowana odpowiedź nie zrobiła tego za mnie.

Jak wspomniałem zlobster , chłopaki z GitLab mają to niesamowite repozytorium , gdzie można znaleźć odpowiedni przykład pliku .gitlab-ci.yml używanego w projektach Maven.

W Zasadzie, to czego potrzebujesz to te linie:

cache:
  paths:
    - .m2/repository

Pamiętaj, że jeśli zdecydujesz się dodać lokalny bufor dla określonego zadania, globalny dodany powyżej zostanie zastąpiony. Więcej na ten temat tutaj .

 0
Author: Ionuț Ciuta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-21 18:25:20

Jeśli używasz kubernetes jako executor dla gitlab-runner, możesz również użyć pamięci podręcznej maven. Zdecydowałem się mieć trwałą pamięć podręczną na NFS z k8s PV(ale inne typy woluminów są obsługiwane przez gitlab-runner ). Poniższa konfiguracja nie używa funkcji Cache gitlab ze względu na trwałość oferowaną przez NFS.

1) Utwórz PersistentVolume na swoim klastrze, np. tutaj z NFS (dostosuj do warstwy persistence i opcji):

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) odniesienie do W przeciwieństwie do poprzednich wersji, nie można ich używać.]}

[[runners.kubernetes.volumes.pvc]]
  name = "pvc-1"
  mount_path = "/path/to/mount/point1"

Uwaga (03/09/18): opcja wiersza poleceń dla tych parametrów jeszcze nie istnieje. Istnieje otwarty numer .

3) Podaj tę samą ścieżkę dla pamięci podręcznej gitlab-runner:

[[runners]]
  executor = "kubernetes"
  # ...
  cache_dir = "/path/to/mount/point1"

Lub

--cache-dir "/path/to/mount/point1" w trybie interaktywnym

4) Użyj katalogu "/ path / to / mount / point1 " w opcji -Dmaven.repo.local

 0
Author: Nicolas Pepinster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 13:08:30