gitlab 8.2.1,如何在.gitlab-ci.yml中使用缓存

del*_*nne 27 gitlab gitlab-ci gitlab-ci-runner

我正在尝试在.gitlab-ci.yml(http://doc.gitlab.com/ce/ci/yaml/README.html#cache)中使用'cache' .我的gitlab版本是8.2.1,我的Runner是:

$ docker exec -it gitlab-runner gitlab-runner -v 
gitlab-runner version 0.7.2 (998cf5d)
Run Code Online (Sandbox Code Playgroud)

所以根据文档,一切都是最新的,但我无法使用缓存;-(.我的所有文件都被删除.我做错了什么?

创建缓存存档,但不传递给下一个作业.

这是我的.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
Run Code Online (Sandbox Code Playgroud)

作业'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.
Run Code Online (Sandbox Code Playgroud)

输出'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
Run Code Online (Sandbox Code Playgroud)

我的解决方法

我的解决方法是手动解压/ 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
Run Code Online (Sandbox Code Playgroud)

wcc*_*526 19

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
Run Code Online (Sandbox Code Playgroud)

  • 我使用了上面的配置,但是gradle包装器仍在将文件下载到.gradle/wrapper中.也许这是其他一些相关问题. (2认同)

小智 11

8.2仅支持每个作业缓存,8.3将根据@ ayufan在构建目录中缓存文件夹的可能性中的注释引入作业中的"组"缓存(#97).

然而,虽然我不能100%肯定,通过快速挖掘gitlab-ci-muti-runner的源代码,docker executor似乎不能使用缓存功能.由于在每个作业中都创建并销毁了一个全新的容器,因此cache.tgz存档将不再存在于下一个构建中.

勘误表:

由于在配置错误的环境中进行测试,以上描述不正确.默认情况下,gitlab-ci-multi-runner会为每个并发构建创建一个专用数据卷容器作为缓存存储.缓存容器安装/cache在应用程序容器中的目录中,并且/cache默认情况下将那些cache.tgz tarball放在其下.因此,高速缓存实际上可以在独立构建中重用.

更新2015/12/11:

刚刚发现"group"缓存已经在gitlab-runner @ 7dc9524f6ef0144b3797fc07c9035f38a8ad0512中实现,可能还没有发布和记录.您可以启用它

cache:
  paths:
    - doc/
  group: sharedcache
Run Code Online (Sandbox Code Playgroud)

其结果是一个高速缓存压缩包被置于下路径<namespace>/<repo>/sharedcache/而不是两个缓存压缩包被下路径分开放置<namespace>/<repo>/createcache/<namespace>/<repo>/testcache/.

更新2017/12/04:

"组"缓存已被替换cache:key.使用key密钥在作业或git引用之间进行缓存共享.默认情况下,缓存在所有作业之间共享.所以,简单地写下面就可以了

cache:
  paths:
    - doc/
Run Code Online (Sandbox Code Playgroud)

Checkout GitLab CI缓存:keygitlab-runner @ d34f76f86a7c2fc4d399e9922175bcc614434016以获取更多信息.