.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)
したがって、ドキュメントによると、すべてが最新ですが、キャッシュを使用できません;-(。すべてのファイルが常に削除されます。何か間違ったことをしていますか?
キャッシュアーカイブは作成されますが、次のジョブには渡されません。
$ 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
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.
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
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 詳細について.
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
共有ランナーでコンテナのローカルファイルをキャッシュすることはできないようです。あなたは、例えばあなたのファイルを入れる必要があります。キャッシュフォルダー:
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キャッシュを移動する場合も)そのままにしておきます。