Подтвердить что ты не робот

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
4b9b3361

Ответ 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 для получения дополнительной информации.

Ответ 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)