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?
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
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"
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
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.
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