2015-11-26 21 views
20

Ich versuche 'Cache' in .gitlab-ci.yml (http://doc.gitlab.com/ce/ci/yaml/README.html#cache) zu verwenden. Meine Gitlab Version ist 8.2.1 und mein Runner ist:gitlab 8.2.1, Wie benutze ich den Cache in .gitlab-ci.yml

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

So nach dem doc, alles ist auf dem neuesten Stand, aber ich bin nicht in der Lage, den Cache zu verwenden ;-(All meine Dateien immer gelöscht werden. . Mache ich etwas falsch?

Ein Cache-Archiv erstellt wird, aber nicht auf die nächsten Jobs übergeben.

Hier ist meine .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 

Ausgabe des 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. 

Ausgabe des Jobs ‚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 

Meine Abhilfe

Meine Abhilfe ist manuell untar was im/Cache-Verzeichnis ist ... Ich bin ziemlich sicher, das ist nicht der richtiger Weg zur Verwendung des Caches ...

Antwort

10

8.2 wird nur pro Jobcache unterstützt, und 8.3 wird einen "Gruppen" -Cache einführen, der unter Jobs dient nach @ayufan's comment in Possibility to cache folders in build directory (#97).

Obwohl ich nicht 100% sicher sein kann, scheint der Docker-Executor nicht mit der Cache-Funktion zu funktionieren, wenn ich den Quellcode von gitlab-ci-muti-runner schnell durchsuche. Da in jedem Job ein ganz neuer Container erstellt und zerstört wird, ist das Archiv cache.tgz beim nächsten Build nicht mehr vorhanden.

Errata:

Die obige Beschreibung ist nicht korrekt aufgrund Tests in einer falsch konfigurierten Umwelt. Gitlab-ci-multi-runner erstellt standardmäßig einen dedizierten Data-Volume-Container als Cache-Speicher für jedes gleichzeitige Build. Der Cache-Container wird im Anwendungscontainer im Verzeichnis /cache gemountet, und diese cache.tgz-Tarballs werden standardmäßig unter /cache platziert. Daher sind Caches tatsächlich in unabhängigen Builds wiederverwendbar.

Updates 2015.12.11:

habe gerade herausgefunden, dass "Gruppe" Cache bereits in [email protected] umgesetzt worden ist, vielleicht noch nicht erschienen und dokumentiert. Sie können es ermöglichen, mit

cache: 
    paths: 
    - doc/ 
    group: sharedcache 

Das Ergebnis ist ein Cache-Tarball unter Pfad separat unter Pfad <namespace>/<repo>/sharedcache/ statt zwei Cache tarballs gelegt werden <namespace>/<repo>/createcache/ und <namespace>/<repo>/testcache/ platziert.

Updates 2017.12.04:

"Gruppe" Cache wurde von cache:key ersetzt. Verwenden Sie den Schlüssel key, um den Cache für Jobs oder Git-Referenzen freizugeben.Standardmäßig wird ein Cache für alle Jobs freigegeben. Also, schreiben Sie einfach das folgende den Job

cache: 
    paths: 
    - doc/ 

Kasse GitLab CI cache:key und [email protected] für weitere Informationen tun würde.

+0

CI linter sagt 'test: cache config enthält unbekannte Schlüssel: group' – Kyslik

+0

@Kyslik Es wurde durch' cache: key' ersetzt. Sehen Sie sich https://gitlab.com/gitlab-org/gitlab-runner/commit/d34f76f86a7c2fc4d399e9922175bcc614434016 und https://docs.gitlab.com/ee/ci/yaml/#cache-key an. –

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

Ich habe die obige Konfiguration verwendet, aber die Gradle Wrapper lud die Dateien immer noch in .digle/wrapper herunter. Vielleicht ist es ein anderes verwandtes Problem. – SailAvid

+1

Ich muss sagen, ich habe die gleichen Ergebnisse wie @SailAvid gesehen. Ich habe auch versucht, über jedes mögliche Gradle-Verzeichnis zwischenzuspeichern, das vom ersten Job existieren könnte (z. B. Build), und alle Abhängigkeiten wurden im zweiten Job wieder abgerufen. – user376327

+1

Das gleiche hier. Beim Lesen der Datei sieht es so aus, als würden wir 'GRADLE_USER_HOME' auf einen Pfad * innerhalb des Build-Ordners setzen (damit wir ihn zwischenspeichern können) und der Cache scheint erstellt und auf folgende Jobs angewendet zu werden, aber grittle wird weiter heruntergeladen. Irgendwelche neuen Ideen dazu? – hardysim

2

Es scheint, ist es nicht möglich Container lokale Dateien mit gemeinsamen Läufer zwischenzuspeichern. Sie müssen Ihre Dateien z. der Cache-Ordner:

before_script: 
    - export GRADLE_USER_HOME=/cache/.gradle 

... 

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

Streng ist es nicht erforderlich, um den/Cache-Ordner als Dateien in dem Cache zu stellen, da dies automatisch geschieht, aber ich lasse es für Klarheit (auch wenn ich die gradle Cache verschieben mag)

+0

Ist der '/ Cache' irgendwo dokumentiert? Ich habe nur Dokumente gesehen, die [Cache:] erwähnen (https://docs.gitlab.com/ce/ci/yaml/#cache) – bitek

+0

Ich erinnere mich, es irgendwo gelesen zu haben, vielleicht haben sie das Verhalten geändert und/oder es entfernt die Dokumente? – for3st