6. 流水线和工件

缓存是任务下载和保存的一个或多个文件,随后的任务可以直接使用这部分文件,用以加快执行速度。而工件也是任务执行过程中保存下来的文件。

缓存和工件的区别

缓存一般是用于依赖,像从网上下载下来的依赖包。缓存一般是存储在runner所在的机器上(如果是容器方式,则会新开一个容器,专门用来存放缓存数据),如果开启了分布式缓存技术,还能够存放到s3存储上。

而工件则一般是用来保存不同阶段构建时生成的一些中间文件,是由任务生成,保存在gitlab所在主机上,可以在gitlab页面的GUI 流水线里下载。(保存在什么位置还不知道)

缓存和工件都会定义相对于项目根目录的文件路径,并且都不能链接到项目外部的文件。

缓存的保存位置

所有任务里里定义的缓存都打包到一个cache.zip文件里。runner配置会定义在哪里存储这个文件。默认情况下,缓存是存储在runner安装机器上,而位置也会根据执行器(executor)的不同而不同,具体的情况如下所示:

runner执行器类型 缓存的路径
shell(linux主机类型) 本地目录,在gitlab-runner用户的家目录:/home/gitlab-runner/cache////cache.zip.
Docker (容器类型) Docker卷下,路径是:/var/lib/docker/volumes//_data////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,那么你项目里的所有任务都会运行在相同的主机上,任务执行流程是:

  1. 流水线执行
  2. job A开始运行
  3. 执行before_script脚本
  4. 执行script脚本
  5. 执行after_script脚本
  6. cache部分运行,vendor/目录会被打包压缩到cache.zip,这个文件然后会被保存到上面说到的目录下(根据执行器和cache: key的不同而不同)
  7. job B运行
  8. 缓存解压(如果根据cache: key在对应目录下找到了)
  9. before_script脚本执行
  10. script脚本执行
  11. 流水线结束。

缓存的清除

Runner会使用缓存来加速任务的执行,因为它可以复用数据,但是有时候会导致一些不一致的问题,因此需要清除缓存。有两种方式:

1. 修改cache:key来清除缓存

在.gitlab-ci.yml文件里修改cache: key的值,下一次流水线运行时,缓存就会存储在不同的位置(旧的缓存是否会被清除,待验证)

2. 手动清除缓存

在Gitlab的web界面,按下面流程执行:

  • 在顶部,选择Menu->Projects,找到你的项目
  • 在左侧边栏,点击CI/CD->Pipelines页
  • 在右上方,点击Clear runner caches

下一次提交代码的时候,你的CI/CD任务会使用一个新的缓存。

你可能感兴趣的:(6. 流水线和工件)