Comment activer la mise en cache d'artefacts pour gitlab ci runner?

nous utilisons gitlab ci avec des coureurs partagés pour faire notre intégration continue. Pour chaque construction, le coureur télécharge des tonnes d'artefacts maven.

y a-t-il un moyen de configurer gitlab ci pour mettre en cache ces Artéfacts afin que nous puissions accélérer le processus de construction en empêchant le téléchargement du même artéfact encore et encore?

21
demandé sur helt 2016-06-13 11:37:17

5 réponses

Gitlab CI vous permet de définir certains chemins, qui contiennent des données qui devraient être mises en cache entre les constructions, sur une base par tâche ou par construction (voir ici pour plus de détails). En combinaison avec la recommandation de khmarbaise, ceci peut être utilisé pour mettre en cache les dépendances entre plusieurs compilations.

un exemple qui cache toutes les dépendances de travail dans votre build:

cache:
  paths:
    - .m2/

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

maven_job:
  script:
    - mvn clean install
24
répondu andban 2016-10-13 15:02:45

selon la conversation sur GitLab est issue tracker, j'ai réussi à changer le chemin du dépôt local Maven et à le mettre dans ./.m2/repository/ directory, qui est que nous allons ensuite persister entre les passages en ajoutant ce bloc global à la config CI:

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

Malheureusement, selon c'StackOverflow réponse le chemin du dépôt local maven ne peut être défini qu'à chaque exécution avec -Dmaven.repo.local ou en éditant votre settings.xml, qui est une tâche fastidieuse à faire dans un script de configuration gitlab-ci. Une option serait de définir une variable avec les options Maven par défaut et de la passer à chaque exécution.

de plus, il est crucial que le dépôt Maven local soit un enfant du répertoire courant. Pour une raison quelconque, de le mettre dans /cache ou /builds ne fonctionnait pas pour moi, même si Quelqu'un de GitLab le prétendait.

Exemple de travail gitlab-ci.yml fichier de configuration pour 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
répondu oskopek 2017-05-23 11:46:39

vous pouvez ajouter le dossier cache à la configuration Gitlab-ci runner et le passer à maven.

/ 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
répondu Alexey 2016-11-03 16:54:18

la réponse acceptée ne l'a pas fait pour moi.

zlobster mentionné, les gars de GitLab ont cette étonnante dépôt où vous pouvez trouver un bon exemple de l' .gitlab-ci.yml fichier utilisé pour les projets Maven.

fondamentalement, ce dont vous avez besoin sont ces lignes:

cache:
  paths:
    - .m2/repository

Gardez à l'esprit que si vous décidez d'ajouter un cache local pour un certain travail, le mondial, on a ajouté ci-dessus seront remplacés. En savoir plus sur cette ici.

0
répondu Ionuț Ciuta 2018-07-21 18:25:20

si vous utilisez kubernetes comme exécuteur pour gitlab-runner, vous pouvez aussi utiliser le cache maven. J'ai choisi D'avoir un cache persistant sur NFS avec K8S PV (mais les autres types de volumes sont supportés par gitlab-runner). La configuration suivante n'utilise pas le cache caractéristique gitlab en raison de la persistance offerte par NFS.

1) Créez un volume persistant sur votre cluster, par exemple ici avec NFS (adaptez à votre couche de persistance et à vos options) :

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) référez le PV pour obtenir une réclamation comme un volume dans le module runner :

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

Note (03/09/18): une option de ligne de commande pour ces paramaters n'existe pas encore. Il est ouvert problème.

3) spécifiez le même chemin pour le cache gitlab-runner:

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

ou

--cache-dir "/path/to/mount/point1" en mode interactif

4) Utilisez le répertoire" /path/to/mount/pointt1 " dans le -Dmaven.repo.local option

0
répondu Nicolas Pepinster 2018-09-03 13:08:30