web-dev-qa-db-fra.com

gitlab 8.2.1, Comment utiliser le cache dans .gitlab-ci.yml

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.

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 job '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 du job '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é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
26
delanne

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.

11
Lance Chen

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
19
wcc526

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)

4
patrickf