web-dev-qa-db-ja.com

gitlab 8.2.1、.gitlab-ci.ymlでキャッシュを使用する方法

.gitlab-ci.ymlで「キャッシュ」を使用しようとしています( http://doc.gitlab.com/ce/ci/yaml/README.html#cache )。私のgitlabバージョンは8.2.1で、ランナーは次のとおりです。

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

したがって、ドキュメントによると、すべてが最新ですが、キャッシュを使用できません;-(。すべてのファイルが常に削除されます。何か間違ったことをしていますか?

キャッシュアーカイブは作成されますが、次のジョブには渡されません。

これが私の.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

ジョブ「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.

ジョブ「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

私の回避策

私の回避策は、/ 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はジョブごとのキャッシュのみをサポートし、8.3は ビルドディレクトリ(#97)のフォルダーをキャッシュする可能性の@ayufanのコメント に従ってジョブ間で機能する「グループ」キャッシュを導入します。

ただし、100%確信は持てませんが、gitlab-ci-muti-runnerのソースコードをすばやく掘り下げると、docker executorはキャッシュ機能で動作しないようです。すべてのジョブでまったく新しいコンテナが作成および破棄されるため、cache.tgzアーカイブは次のビルドでは存在しなくなります。

エラッタ:

上記の説明は正しく設定されていない環境でのテストのため、正しくありません。デフォルトでは、gitlab-ci-multi-runnerは各同時ビルドのキャッシュストレージとして専用のデータボリュームコンテナーを作成します。キャッシュコンテナはアプリケーションコンテナの/cacheディレクトリにマウントされ、それらのcache.tgz tarballはデフォルトで/cacheの下に配置されます。したがって、キャッシュは実際には独立したビルド間で再利用可能です。

2015/12/11の更新:

「グループ」キャッシュが gitlab-runner @ 7dc9524f6ef0144b3797fc07c9035f38a8ad0512 に既に実装されていることがわかりましたが、まだリリースも文書化もされていない可能性があります。あなたはそれを有効にすることができます

cache:
  paths:
    - doc/
  group: sharedcache

その結果、パス<namespace>/<repo>/sharedcache/および<namespace>/<repo>/createcache/の下に別々に配置された2つのキャッシュtarballの代わりに、パス<namespace>/<repo>/testcache/の下に1つのキャッシュtarballが配置されます。

2017/12/04更新:

「グループ」キャッシュはcache:keyに置き換えられました。 keyキーを使用して、ジョブまたはgit参照間でキャッシュを共有します。デフォルトでは、キャッシュはすべてのジョブ間で共有されます。だから、次のように書くだけで仕事ができます

cache:
  paths:
    - doc/

チェックアウト GitLab CI cache:key および gitlab-runner @ d34f76f86a7c2fc4d399e9922175bcc614434016 詳細について.

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

共有ランナーでコンテナのローカルファイルをキャッシュすることはできないようです。あなたは、例えばあなたのファイルを入れる必要があります。キャッシュフォルダー:

before_script:
  - export GRADLE_USER_HOME=/cache/.gradle

...

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

これは自動的に行われるため、/ cacheフォルダーをキャッシュするファイルとして配置する必要はありませんが、わかりやすくするために(Gradleキャッシュを移動する場合も)そのままにしておきます。

4
patrickf