28

我正在尝试在 .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
4

4 回答 4

21

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
于 2016-02-18T10:34:03.047 回答
14

8.2 仅支持每个作业缓存,8.3 将根据@ayufan 在构建目录中缓存文件夹的可能性 (#97) 中的评论引入在作业之间服务的“组”缓存。

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

勘误表:

由于在错误配置的环境中测试,上述描述不正确。默认情况下,gitlab-ci-multi-runner 创建一个专用的数据卷容器作为每个并发构建的缓存存储。缓存容器被挂载到/cache应用程序容器的目录中,并且这些 cache.tgz 压缩包/cache默认放置在下面。所以缓存实际上可以在独立构建之间重用。

2015/12/11 更新:

刚刚发现“组”缓存已经在gitlab-runner@7dc9524f6ef0144b3797fc07c9035f38a8ad0512中实现,可能还没有发布和记录。你可以启用它

cache:
  paths:
    - doc/
  group: sharedcache

结果是一个缓存 tarball 被放置在 path 下,<namespace>/<repo>/sharedcache/而不是两个缓存 tarball 分别放置在 path<namespace>/<repo>/createcache/<namespace>/<repo>/testcache/.

2017 年 12 月 4 日更新:

“组”缓存已替换为cache:key. 使用key密钥在作业或 git 引用之间进行缓存共享。默认情况下,所有作业之间共享一个缓存。因此,只需编写以下内容即可完成工作

cache:
  paths:
    - doc/

查看GitLab CI cache:keygitlab-runner@d34f76f86a7c2fc4d399e9922175bcc614434016了解更多信息。

于 2015-12-10T18:28:14.740 回答
4

似乎无法使用共享运行器缓存容器本地文件。您必须将文件放在例如缓存文件夹中:

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 缓存时)

于 2017-04-27T11:53:18.880 回答
0

我们发现,最好缓存整个.gradle文件夹。每个项目只能使用一次。如果 k8s 用于 gitlab-runner,那么你应该关闭守护进程。

gitlab-ci.yaml

variables:
  GRADLE_OPTS: "-Dorg.gradle.daemon=false" # no gradle-daemon on k8s

# ...

buildJar:
  stage: build
  image: gradle:5.6.4-jdk11
  before_script:
    - export GRADLE_USER_HOME=`pwd`/.gradle
  script:
    - gradle assemble
  cache:
    key: "gradleCache"
    paths:
      - .gradle
于 2019-12-09T12:54:22.530 回答