2015-11-26 25 views
20

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

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

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

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

は、ジョブの

$ 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 

出力私.gitlab-ci.ymlは ' 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ディレクトリに何があるかをuntarに手動で

...私はそれがないかなり確信していますキャッシュを使用する正しい方法...

$ 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 

答えて

10

8.2はジョブごとのキャッシュのみをサポートし、8.3はジョブ間で機能する「グループ」キャッシュを導入します@ayufan's comment in Possibility to cache folders in build directory (#97)に従って。

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

エラッタ:

上記の説明が原因の設定ミス環境でのテストに間違っています。デフォルトでは、gitlab-ci-multi-runnerは、コンカレントビルドごとに専用のデータボリュームコンテナをキャッシュストレージとして作成します。キャッシュコンテナはアプリケーションコンテナ内のディレクトリ/cacheにマウントされ、cache.tgzタールボールはデフォルトで/cacheに配置されます。したがって、キャッシュは独立したビルドの中で実際に再利用可能です。

アップデート2015年12月11日:

は単に「グループ」キャッシュがすでに多分まだリリースされ、文書化されていない、[email protected]に実装されていることが分かりました。あなたは結果がパス<namespace>/<repo>/sharedcache/代わりに、2つのキャッシュのtarballのパス<namespace>/<repo>/createcache/<namespace>/<repo>/testcache/下別途配置されているの下で1つのキャッシュのtarballに置かれている

cache: 
    paths: 
    - doc/ 
    group: sharedcache 

でそれを有効にすることができます。

アップデート2017年12月4日:

"グループ" キャッシュはcache:keyに置き換えられました。 keyキーを使用して、ジョブまたはgit参照間でキャッシュ共有を行います。デフォルトでは、キャッシュはすべてのジョブで共有されます。詳細については、仕事

cache: 
    paths: 
    - doc/ 

アウトGitLab CI cache:key[email protected]を行うだろうだから、単純に次のように記述します。

+0

CI linterは 'test:cache configには未知のキーが含まれています:group' – Kyslik

+0

@Kyslikこれは' cache:key'に置き換えられました。 https://gitlab.com/gitlab-org/gitlab-runner/commit/d34f76f86a7c2fc4d399e9922175bcc614434016と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

を確認してください。上記の設定を使用しましたが、 gradleラッパーはまだファイルを.gradle/wrapperにダウンロードしていました。他の関連する問題かもしれません。 – SailAvid

+1

私は@ SailAvidと同じ結果を見たと言わなければならない。私はまた、最初のジョブ(例えばビルド)から存在する可能性のあるすべてのgradleディレクトリについてキャッシュし、すべての依存関係が2番目のジョブで再度取得されるようにしようとしました。 – user376327

+1

同じです。ファイルを読むとき、 'GRADLE_USER_HOME'をビルドフォルダのパス*に設定しているように見えます(キャッシュできるので)。キャッシュは作成され、次のジョブに適用されますが、gradleはダウンロードを続けます。これに関する新しいアイデアは? – hardysim

2

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

before_script: 
    - export GRADLE_USER_HOME=/cache/.gradle 

... 

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

は自動的に行われますので、厳密には、キャッシュにファイルとして/キャッシュフォルダを配置する必要はありませんが、(私はGradleのキャッシュを移動したいときにも)、私はわかりやすくするためにそれを残す

+0

'/ cache'はどこかに書かれていますか?私は[cache:](https://docs.gitlab.com/ce/ci/yaml/#cache)と言及しているドキュメントしか見ていない – bitek

+0

私はそれをどこかに読んで覚えているかもしれませんが、おそらく彼らは行動を変えたり、ドキュメント? – for3st

関連する問題