J'essaie d'utiliser "cache" dans .gitlab-ci.yml ( http://doc.gitlab.com/ce/ci/yaml/README.html#cache ). Ma version de gitlab est 8.2.1 et mon Runner est:
$ docker exec -it gitlab-runner gitlab-runner -v
gitlab-runner version 0.7.2 (998cf5d)
Donc, selon le document, tout est à jour, mais je ne peux pas utiliser le cache ;-(. Tous mes fichiers sont toujours supprimés. Suis-je en train de faire quelque chose de mal?
Une archive de cache est créée, mais pas transmise aux travaux suivants.
$ cat .gitlab-ci.yml
stages:
- createcache
- testcache
createcache:
type: createcache
cache:
untracked: true
paths:
- doc/
script:
- touch doc/cache.txt
testcache:
type: testcache
cache:
untracked: true
paths:
- doc/
script:
- find .
- ls doc/cache.txt
Running on runner-141d90d4-project-2-concurrent-0 via 849d416b5994...
Fetching changes...
HEAD is now at 2ffbadb MUST BE REVERTED
[...]
$ touch doc/cache.txt
[...]
Archiving cache...
INFO[0000] Creating archive cache.tgz ...
INFO[0000] Done!
Build succeeded.
Running on runner-141d90d4-project-2-concurrent-0 via 849d416b5994...
Fetching changes...
Removing doc/cache.txt
[...]
$ ls doc/cache.txt
ls: cannot access doc/cache.txt: No such file or directory
ERROR: Build failed with: exit code 1
Ma solution consiste à décompresser manuellement ce qui se trouve dans le répertoire/cache ... Je suis sûr que ce n'est pas la bonne façon d'utiliser le cache ...
$ cat .gitlab-ci.yml
stages:
- build
- test
- deploy
image: ubuntu:latest
before_script:
- export CACHE_FILE=`echo ${CI_PROJECT_DIR}/createcache/${CI_BUILD_REF_NAME}/cache.tgz | sed -e "s|/builds|/cache|"`
createcache:
type: build
cache:
untracked: true
paths:
- doc/
script:
- find . | grep -v ".git"
- mkdir -p doc
- touch doc/cache.txt
testcache:
type: test
script:
- env
- find . | grep -v ".git"
- tar xvzf ${CACHE_FILE}
- ls doc/cache.txt
8.2 ne prend en charge que le cache par tâche, et 8.3 introduira un cache "de groupe" qui sert parmi les travaux en fonction de Commentaire de @ ayufan dans Possibilité de mettre en cache les dossiers dans le répertoire de construction (# 97) .
Cependant, bien que je ne puisse pas être sûr à 100%, en creusant rapidement le code source de gitlab-ci-muti-runner, l'exécuteur docker ne semble pas fonctionner avec la fonctionnalité de cache. Puisqu'un nouveau conteneur entier est créé et détruit dans chaque travail, l'archive cache.tgz n'existerait plus dans la prochaine génération.
Errata:
La description ci-dessus est incorrecte en raison de tests dans un environnement mal configuré. Par défaut, gitlab-ci-multi-runner crée un conteneur de volume de données dédié en tant que mémoire cache pour chaque génération simultanée. Le conteneur de cache est monté dans le répertoire /cache
dans le conteneur d'application et ces tarballs cache.tgz sont placés sous /cache
par défaut. Les caches sont donc réellement réutilisables parmi les versions indépendantes.
Mises à jour 2015/12/11:
Je viens de découvrir que le cache "groupe" a déjà été implémenté dans gitlab-runner @ 7dc9524f6ef0144b3797fc07c9035f38a8ad0512 , peut-être pas encore publié et documenté. Vous pouvez l'activer avec
cache:
paths:
- doc/
group: sharedcache
Le résultat est un tarball de cache placé sous le chemin <namespace>/<repo>/sharedcache/
au lieu que deux tarballs de cache soient placés séparément sous le chemin <namespace>/<repo>/createcache/
et <namespace>/<repo>/testcache/
.
Mises à jour 2017/12/04:
le cache "groupe" a été remplacé par cache:key
. Utilisez la touche key
pour effectuer le partage du cache entre les travaux ou les références git. Par défaut, un cache est partagé entre tous les travaux. Donc, écrivez simplement ce qui suit fera le travail
cache:
paths:
- doc/
Checkout GitLab CI cache: key and gitlab-runner @ d34f76f86a7c2fc4d399e9922175bcc614434016 pour plus d'informations.
https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/327
image: Java:openjdk-8-jdk
before_script:
- export GRADLE_USER_HOME=`pwd`/.gradle
cache:
paths:
- .gradle/wrapper
- .gradle/caches
build:
stage: build
script:
- ./gradlew assemble
test:
stage: test
script:
- ./gradlew check
Il semble qu'il ne soit pas possible de mettre en cache les fichiers locaux du conteneur avec des coureurs partagés. Vous devez mettre vos fichiers par exemple le dossier cache:
before_script:
- export GRADLE_USER_HOME=/cache/.gradle
...
cache:
paths:
- $GRADLE_USER_HOME/caches/
- $GRADLE_USER_HOME/wrapper/
- $GRADLE_USER_HOME/build-cache/
Strictement, il n'est pas nécessaire de mettre le dossier/cache en tant que fichiers à mettre en cache, car cela se produit automatiquement, mais je le laisse pour plus de clarté (également lorsque je veux déplacer le cache gradle)