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

时间:2015-11-26 13:50:08

标签: 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)

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

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

这是我的.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 个答案:

答案 0 :(得分:17)

https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/327

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">


    	<context:component-scan base-package="com.demo.mongo.example" />
        <mvc:annotation-driven />
        
    	<!-- Factory bean that creates the Mongo instance -->
    	<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
    		<property name="host" value="localhost" />
    	</bean>
    	
    	<!-- MongoTemplate for connecting and querying the documents in the database -->
    	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    		<constructor-arg name="mongo" ref="mongo" />
    		<constructor-arg name="databaseName" value="test" />
    	</bean>

    	<!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
    	<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
       	<bean
    		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<property name="prefix">
    			<value>/WEB-INF/</value>
    		</property>
    		<property name="suffix">
    			<value>.jsp</value>
    		</property>
    	</bean>
    </beans>

答案 1 :(得分:10)

8.2仅支持每个作业缓存,8.3将引入&#34; group&#34;根据{{​​3}}在作业中提供的缓存。

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

<强>勘误表:

由于在配置错误的环境中进行测试,上述描述不正确。默认情况下,gitlab-ci-multi-runner会为每个并发构建创建一个专用数据卷容器作为缓存存储。缓存容器安装在应用程序容器中的目录doc = Nokogiri::XML(xml) doc.xpath("//rss/channel/item/mynamespace:custom_tag").each do |node| puts node.text end # => some_text 中,默认情况下,这些cache.tgz tarball放在/cache下。因此,缓存实际上可以在独立构建中重用。

更新2015/12/11:

刚刚发现&#34; group&#34;缓存已经在@ayufan's comment in Possibility to cache folders in build directory (#97)中实现,可能尚未发布和记录。您可以使用

启用它
/cache

结果是一个缓存tarball放在路径cache: paths: - doc/ group: sharedcache 下,而不是两个缓存tarball分别放在路径<namespace>/<repo>/sharedcache/<namespace>/<repo>/createcache/下。

更新2017/12/04:

&#34;组&#34;缓存已被<namespace>/<repo>/testcache/取代。使用cache:key键在作业或git引用之间创建缓存共享。默认情况下,缓存在所有作业之间共享。所以,只需编写以下内容即可完成工作

key

结帐gitlab-runner@7dc9524f6ef0144b3797fc07c9035f38a8ad0512GitLab CI cache:key了解详情。

答案 2 :(得分: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缓存时)

答案 3 :(得分:0)

我们发现,最好缓存整个.gradle文件夹。每个项目只能使用一次。如果k8用于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