2015-11-26 5 views
20

Sto provando ad usare "cache" in .gitlab-ci.yml (http://doc.gitlab.com/ce/ci/yaml/README.html#cache). La mia versione è 8.2.1 gitlab e il mio Runner è:gitlab 8.2.1, Come usare la cache in .gitlab-ci.yml

$ docker exec -it gitlab-runner gitlab-runner -v 
gitlab-runner version 0.7.2 (998cf5d) 

Quindi, secondo il doc, tutto è aggiornato, ma sono in grado di utilizzare la cache ;-(Tutti i miei file sono sempre cancellato. . Sto facendo qualcosa di sbagliato?

viene creato un archivio di cache, ma non passò ai prossimi lavori.

Ecco il mio .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 

uscita del lavoro ' 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. 

uscita del lavoro '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 

mia soluzione

La mia soluzione è manualmente scompattare cosa c'è nella directory/cache ... Sono abbastanza sicuro che non è il modo corretto di utilizzare la 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 

risposta

10

8,2 supporta solo cache per posto di lavoro, e 8.3 introdurrà cache "gruppo" che serve tra i posti di lavoro secondo @ayufan's comment in Possibility to cache folders in build directory (#97).

Tuttavia, sebbene non possa essere sicuro al 100%, scavando rapidamente il codice sorgente di gitlab-ci-muti-runner, l'esecutore di finestra mobile non sembra funzionare con la funzionalità cache. Dal momento che un intero nuovo contenitore viene creato e distrutto in ogni lavoro, l'archivio cache.tgz non esisterebbe più nella prossima build.

Errata:

La descrizione sopra è corretto causa di test in un ambiente configurato correttamente. Per impostazione predefinita, gitlab-ci-multi-runner crea un contenitore di volumi di dati dedicato come memoria cache per ogni build concorrente. Il contenitore della cache è montato sulla directory /cache nel contenitore dell'applicazione e tali tarball cache.tgz sono posizionati sotto /cache per impostazione predefinita. Quindi le cache sono in realtà riutilizzabili tra le build indipendenti.

Aggiornamenti 2015/12/11:

appena scoperto che "gruppo" cache è già stata realizzata in [email protected], forse non ancora rilasciato e documentati. È possibile attivare con

cache: 
    paths: 
    - doc/ 
    group: sharedcache 

Il risultato è un archivio di cache che è disposto nel percorso <namespace>/<repo>/sharedcache/ invece di due tarballs della cache di essere immessi separatamente con percorso <namespace>/<repo>/createcache/ e <namespace>/<repo>/testcache/.

Aggiornamenti 2017/12/04:

cache "gruppo" è stato sostituito da cache:key. Utilizzare la chiave key per rendere la condivisione della cache tra lavori o riferimenti git.Per impostazione predefinita, una cache è condivisa tra tutti i lavori. Quindi, è sufficiente scrivere il seguente avrebbe fatto il lavoro

cache: 
    paths: 
    - doc/ 

Checkout GitLab CI cache:key e [email protected] per ulteriori informazioni.

+0

CI linter dice 'test: cache config contiene chiavi sconosciute: gruppo' – Kyslik

+0

@Kyslik E 'stato sostituito da' cache: key'. Controlla https://gitlab.com/gitlab-org/gitlab-runner/commit/d34f76f86a7c2fc4d399e9922175bcc614434016 e https://docs.gitlab.com/ee/ci/yaml/#cache-key –

15

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 
+2

Ho usato la configurazione qui sopra ma la gradle wrapper stava ancora scaricando i file in .gradle/wrapper. Forse è un altro problema correlato. – SailAvid

+1

Devo dire che ho visto gli stessi risultati di @SailAvid. Ho anche tentato di memorizzare nella cache tutte le possibili directory gradle che potevano esistere dal primo processo (ad es. Build) e tutte le dipendenze venivano nuovamente richiamate nel secondo lavoro. – user376327

+1

Lo stesso qui. Durante la lettura del file, sembra che stiamo impostando 'GRADLE_USER_HOME' su un percorso * all'interno * della cartella build (in modo che possiamo memorizzarlo nella cache) e la cache sembra essere creata e applicata ai seguenti lavori, ma Gradle continua a scaricarsi. Qualche nuova idea su questo? – hardysim

2

sembra che non è possibile memorizzare nella cache i file locali contenitore con i corridori in comune. Devi mettere i tuoi file in, ad es. la cartella della cache:

before_script: 
    - export GRADLE_USER_HOME=/cache/.gradle 

... 

cache: 
    paths: 
    - $GRADLE_USER_HOME/caches/ 
    - $GRADLE_USER_HOME/wrapper/ 
    - $GRADLE_USER_HOME/build-cache/ 

Rigorosamente non è necessario mettere nella cartella/cache come file da memorizzare nella cache, perché questo avviene automaticamente, ma lascio per chiarezza (anche quando voglio spostare la cache Gradle)

+0

Il '/ cache' è documentato da qualche parte? Ho visto solo documenti che citano [cache:] (https://docs.gitlab.com/ce/ci/yaml/#cache) – bitek

+0

Mi ricordo di averlo letto da qualche parte, forse hanno cambiato il comportamento e/o rimosso da i documenti? – for3st