gitlab 8.2.1, comment utiliser cache in.gitlab-ci.yml
j'essaie d'utiliser' cache'.gitlab-ci.yml (http://doc.gitlab.com/ce/ci/yaml/README.html#cache). Mon gitlab version 8.2.1 et mon Coureur est:
$ docker exec -it gitlab-runner gitlab-runner -v
gitlab-runner version 0.7.2 (998cf5d)
donc selon le doc, 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 cache est créée, mais n'est pas transmise aux travaux suivants.
Voici mon .gitlab-ci.yml
$ 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
sortie du travail 'createcache'
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.
Sortie de l'emploi "testcache'
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
ma solution consiste à désactiver manuellement ce qui se trouve dans le répertoire /cache ... Je suis presque 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
3 réponses
8.2 ne supporte que le cache par tâche, et 8.3 introduira le cache "group" qui sert parmi les tâches selon le commentaire de@ayufan dans la possibilité de mettre en cache des dossiers dans le répertoire de compilation (#97).
cependant, bien que je ne puisse pas être sûr à 100%, en fouillant rapidement le code source de gitlab-ci-muti-runner, l'exécuteur de docker ne semble pas fonctionner avec la fonctionnalité de cache. Depuis qu'un nouveau conteneur entier est créé et détruit dans chaque travail, le cache.les archives tgz n'existent plus dans la prochaine génération.
Errata:
La description ci-dessus est incorrect grâce à des essais à un problème de configuration de l'environnement. Par défaut, gitlab-ci-multi-runner crée un conteneur de volume de données dédié comme un stockage de cache pour chaque construction concurrente. Le conteneur cache est monté dans le répertoire /cache
dans le conteneur d'application et dans le cache.tgz les archives sont placées sous /cache
par défaut. Donc les caches sont réellement réutilisable parmi les constructions indépendantes.
mises à jour 2015/12/11:
vient de découvrir que le cache "group" a déjà été implémenté dans gitlab-coureur@7dc9524f6ef0144b3797fc07c9035f38a8ad0512, peut-être pas encore sorti et documenté. Vous pouvez l'activer avec
cache:
paths:
- doc/
group: sharedcache
le résultat est un cache tarball placé sous le chemin <namespace>/<repo>/sharedcache/
au lieu de placer deux balles de cache séparément sous le chemin <namespace>/<repo>/createcache/
et <namespace>/<repo>/testcache/
.
mises à jour 2017/12/04:
le cache"group" a été remplacé par cache:key
. Utilisez le key
touche pour faire partager le cache entre les tâches ou les références git. Par défaut, un cache est partagé entre toutes les tâches. Donc, il suffit d'écrire ce qui suit ferait le travail
cache:
paths:
- doc/
Caisse GitLab CI cache: key et gitlab-coureur@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 des fichiers de conteneurs locaux avec des coureurs partagés. Vous devez mettre vos fichiers par exemple dans 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 parler, il n'est pas nécessaire de mettre le dossier /cache en tant que fichiers de cache, car cela se produit automatiquement, mais je le laisse pour plus de clarté (aussi quand je veux déplacer le cache gradle)