Gitlab 8.2.1, Как использовать кеш в .gitlab-ci.yml
Я пытаюсь использовать "кеш" в .gitlab-ci.yml(http://doc.gitlab.com/ce/ci/yaml/README.html#cache). Моя версия gitlab - 8.2.1, а мой Runner:
$ 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
Ответы
Ответ 1
8.2 поддерживает только кэш для каждого задания, а 8.3 вводит "групповой" кеш, который служит среди заданий в соответствии с комментарием @ayufan в разделе "Возможность кэшировать папки в каталоге сборки (# 97)".
Однако, хотя я не могу быть уверен на 100%, быстро копая исходный код gitlab-ci-muti-runner, похоже, что docker executor не работает с функциями кэша. Поскольку в каждом задании создается и уничтожается целый новый контейнер, архив cache.tgz больше не будет существовать в следующей сборке.
Опечатки:
Приведенное выше описание неверно из-за тестирования в неправильно настроенной среде. По умолчанию gitlab-ci-multi-runner создает выделенный контейнер тома данных в качестве хранилища для каждой параллельной сборки. Контейнер кеша монтируется в каталог /cache
в контейнере приложения, и эти tarballs cache.tgz по умолчанию помещаются в /cache
. Таким образом, кэши на самом деле можно использовать среди независимых сборок.
Обновления 2015/12/11:
Только что обнаружил, что "групповой" кэш уже был реализован в gitlab-runner @7dc9524f6ef0144b3797fc07c9035f38a8ad0512, возможно, еще не выпущен и не задокументирован. Вы можете включить его с
cache:
paths:
- doc/
group: sharedcache
В результате получается один <namespace>/<repo>/sharedcache/
кеша, размещенный по пути <namespace>/<repo>/sharedcache/
вместо двух тарболов кэша, помещаемых отдельно по пути <namespace>/<repo>/createcache/
и <namespace>/<repo>/testcache/
.
Обновления 2017/12/04:
"групповой" кэш был заменен cache:key
. Используйте key
key, чтобы разделить кеш между заданиями или ссылками на git. По умолчанию кеш распределяется между всеми заданиями. Итак, просто напишите следующее будет делать работу
cache:
paths:
- doc/
Оформить заказ кеша GitLab CI: ключ и gitlab-runner @d34f76f86a7c2fc4d399e9922175bcc614434016 для получения дополнительной информации.
Ответ 2
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
Ответ 3
Кажется, что кешировать локальные файлы контейнера с общими бегунами невозможно. Вы должны поместить свои файлы, например. папка с кешем:
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)