缓存是任务下载和保存的一个或多个文件,随后的任务可以直接使用这部分文件,用以加快执行速度。而工件也是任务执行过程中保存下来的文件。
缓存和工件的区别
缓存一般是用于依赖,像从网上下载下来的依赖包。缓存一般是存储在runner所在的机器上(如果是容器方式,则会新开一个容器,专门用来存放缓存数据),如果开启了分布式缓存技术,还能够存放到s3存储上。
而工件则一般是用来保存不同阶段构建时生成的一些中间文件,是由任务生成,保存在gitlab所在主机上,可以在gitlab页面的GUI 流水线里下载。(保存在什么位置还不知道)
缓存和工件都会定义相对于项目根目录的文件路径,并且都不能链接到项目外部的文件。
缓存的保存位置
所有任务里里定义的缓存都打包到一个cache.zip
文件里。runner配置会定义在哪里存储这个文件。默认情况下,缓存是存储在runner安装机器上,而位置也会根据执行器(executor)的不同而不同,具体的情况如下所示:
runner执行器类型 | 缓存的路径 |
---|---|
shell(linux主机类型) | 本地目录,在gitlab-runner用户的家目录:/home/gitlab-runner/cache/<user>/<project>/<cache-key>/cache.zip.
|
Docker (容器类型) | Docker卷下,路径是:/var/lib/docker/volumes/<volume-id>/_data/<user>/<project>/<cache-key>/cache.zip
|
Docker主机(自动扩展runner,例如k8s) | 和Docker一样 |
如果缓存和工件都使用了同一个目录,那么缓存可能会覆盖工件的内容,因为缓存更先存储。
缓存打包和解压是怎么执行的?
下面是两个不同阶段的任务示例:
stages:
- build
- test
before_script:
- echo "Hello"
job A:
stage: build
script:
- mkdir vendor/
- echo "build" > vendor/hello.txt
cache:
key: build-cache
paths:
- vendor/
after_script:
- echo "World"
job B:
stage: test
script:
- cat vendor/hello.txt
cache:
key: build-cache
paths:
- vendor/
如果在一个机器上安装了一个runner,那么你项目里的所有任务都会运行在相同的主机上,任务执行流程是:
- 流水线执行
-
job A
开始运行 - 执行
before_script
脚本 - 执行
script
脚本 - 执行
after_script
脚本 -
cache
部分运行,vendor/
目录会被打包压缩到cache.zip
,这个文件然后会被保存到上面说到的目录下(根据执行器和cache: key
的不同而不同) -
job B
运行 - 缓存解压(如果根据
cache: key
在对应目录下找到了) -
before_script
脚本执行 -
script
脚本执行 - 流水线结束。
缓存的清除
Runner会使用缓存来加速任务的执行,因为它可以复用数据,但是有时候会导致一些不一致的问题,因此需要清除缓存。有两种方式:
1. 修改cache:key来清除缓存
在.gitlab-ci.yml文件里修改cache: key的值,下一次流水线运行时,缓存就会存储在不同的位置(旧的缓存是否会被清除,待验证)
2. 手动清除缓存
在Gitlab的web界面,按下面流程执行:
- 在顶部,选择Menu->Projects,找到你的项目
- 在左侧边栏,点击CI/CD->Pipelines页
- 在右上方,点击Clear runner caches
下一次提交代码的时候,你的CI/CD任务会使用一个新的缓存。