GitLab CI/CD关键词(三):制品artifacts,缓存cache


转载自:https://cloud.tencent.com/developer/article/1978769

简介

本篇文章将讲解制品artifacts与缓存cache二个关键词。二个关键词都可以将流水线中的文件存储起来,但区别点也很多。

制品artifacts

使用artifacts关键词可以将当前作业的一些文件存储起来,可以存储文件夹和文件列表。并且用户可以选择在作业失败,成功时或者总是存储文件。使用artifacts储存的文件将会被上传到gitlab,开发者可以在gitlab上在线预览他们。存储后的文件将会在下一个阶段自动恢复到当前的工作目录。开发者也可以自由配置恢复哪些制品,不恢复哪些制品。被恢复的制品,存放的位置与以前一致。

下面看一个简单的例子

MalzaharJob:
  script: echo 'The man who has made up his mind to win will never say “impossible”.'
  artifacts:
    paths:
      - dist/
      - target/

在该例子中,在作业下使用artifacts来存储一些文件夹,文件或文件夹的路径都是通过paths参数来指定的。除了使用paths配置文件路径,文件夹路径外, 在artifacts下,有不少配置项,下面为大家逐个介绍。

artifacts:exclude 排除文件

使用exclude参数可以排查一些文件不放到制品中。如

MalzaharJob:
  script: echo 'The man who has made up his mind to win will never say “impossible”.'
  artifacts:
    paths:
      - dist/
      - target/
    exclude:
      - target/**/*.o

使用exclude来排查tagret目录下的以 .o 结尾的文件。 这些文件不会被上传到gitlab。

artifacts:expire_in 过期时间

上传到gitlab 的制品可以设置过期时间,过期后将无法获取,自动清理。

在gitlab中即使设置了过期时间,最新的作业制品也不会被清理,这是一种防护手段,此外还有流水线制品,这里一般特指测试报告等。

expire_in的值支持的有很多,以下几种格式都是支持的。如果没有单位,默认的单位为秒.

'42'
42 seconds
3 mins 4 sec
2 hrs 20 min
2h20min
6 mos 1 day
47 yrs 6 mos and 4d
3 weeks and 2 days
never

如果没有设置一个作业制品的过期时间,那么将默认使用 管理员配置的制品存储时间,30天,gitlab超管可以修改它。 参考网址:

artifacts:expose_as 展示在MR上的名称

使用expose_as可以定义在合并请求时要显示的制品名称。

test:
  script: ["echo 'test' > file.txt"]
  artifacts:
    expose_as: 'artifact 1'
    paths: ['file.txt']

注意: artifacts:paths中使用了CI/CD变量,制品将不会显示在UI上。

一个合并请求最多只能暴露10个作业制品, 全局模式下不支持artifacts:expose_as, 如果开启了gitlab page,一些类型的单个文件可以直接显示在页面上。

artifacts:name 制品名称

开发者可以指定制品的名称,默认为artifacts。下载后文件名为 artifacts.zip。可以使用变量。

build:
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
    paths:
      - binaries/

artifacts:paths 制品文件路径

指定制品中文件的路径。路径必须是当前项目路径的相对路径,不能直接指定外部路径。可以使用通配符。

build:
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
    paths:
      - dist/

artifacts:public 是否公共可见

使用artifacts:public可以配置制品是否可以被外界访问,下载。

在独自部署的gitlab上,该属性是默认关闭的,但超管可以在管理页面开启。在 gitlab.com上,是没有该属性的。

当artifacts:public的值为true时,默认就是为true,这意味着作业的制品可以别任何人,访客下载。如果不想被其他人看到,可以是设置为false

build:
  artifacts:
    name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME"
    paths:
      - dist/
    public: false

artifacts:reports 收集报告

artifacts:reports 配置可以收集一些使用include关键词引入的模板 的作业制品。制品类型有这些功能是付费版本才有的。

artifacts:untracked 上传被git 忽略的文件

使用artifacts:untracked可以上传一些被git忽略的文件。这些文件被添加到了.gitignore列表中。值为 false(默认),或者true。

job:
  artifacts:
    untracked: true
    paths:
      - dist/

这里会将dist中所有文件上传到制品库,即使dist目录中有被git忽略的文件。

artifacts:when 何时上传制品

artifacts:when 用于配置制品上传的时机,有三种选择,

  • on_success 作业成功时上传,默认。
  • on_failure 作业运行失败时上传,
  • always 总是上传。可以用于收集一些错误日志。 如果作业超时,则不会上传。

缓存cache

缓存cache的设计是为了存储流水线和作业之间的一些公用文件,比如node_modules。缓存将在制品之前恢复到当前工作目录。下面是一个使用缓存的例子,cache可以使用default关键词来定义全局的缓存。

install:
  script: npm install
  cache:
    paths:
      - node_modules

需要缓存的文件使用paths来指定路径。缓存后在下一个作业中自动恢复到当前的工作目录(如果找到相同key的缓存)。
gitlab默认是本地缓存,要使用分布式缓存需要配置gitlab runner的配置文件。参考网站:

cache:paths 文件路径

cache:paths 用于配置要缓存的文件路径。与artifacts:paths一样,路径必须是当前项目目录的相对路径,也可以使用通配符。

rspec:
  script:
    - echo "This job uses a cache."
  cache:
    key: binaries-cache
    paths:
      - binaries/*.apk
      - .config

cache:key 缓存唯一标识key

当前环境是否使用缓存,根据缓存的key来决定。如果有相同的key则恢复以前的缓存,如果缓存的key不同则不恢复。cache:key可以是一个字符串,也可以使用变量,或者变量加字符串。

cache-job:
  script:
    - echo "This job uses a cache."
  cache:
    key: binaries-cache-$CI_COMMIT_REF_SLUG
    paths:
      - binaries/

一些细节:

  • 如果你用的是Windows Batch,来运行你的脚本,你需要使用 % 替换 $ 例如key: %CI_COMMIT_REF_SLUG%, 此外key的值不能包含 / ,如果需要请使用%2F 替换。不能单独使用 . 如果需要请使用%2E.
  • 默认的cache:key为default。

cache: key:files 使用文件设置key

cache: key的值可以指定一个文件列表,在生成key时,这些文件会被转化为一个hash值,当文件改变了,hash值也会跟着变。这样就实现了缓存依赖一些文件的变动而变动,如果一些文件没有变动,则一直使用之前的缓存。

cache-job:
  script:
    - echo "This job uses a cache."
  cache:
    key:
      files:
        - Gemfile.lock
        - package.json
    paths:
      - vendor/ruby
      - node_modules

cache: key:prefix key的前缀

设置key的前缀

rspec:
  script:
    - echo "This rspec job uses a cache."
  cache:
    key:
      files:
        - Gemfile.lock
      prefix: $CI_JOB_NAME
    paths:
      - vendor/ruby

cache:untracked缓存被git忽略的文件

使用cache:untracked可以缓存所有被git忽略的文件。 默认值false,可以设置为true

rspec:
  script: test
  cache:
    untracked: true

cache:when 何时缓存

cahce:when 可以配置何时进行缓存

  • on_success (默认): 只有当作业运行成功时保存缓存
  • on_failure: 仅仅当作业失败后保存缓存
  • always: 总是保存缓存

cache:policy 缓存上传,下载的策略

cache:policy 用于配置缓存的上传,下载策略,在一些作业下,只需要拉取缓存,在作业结束时不需要上传缓存。 这个时候就可以配置cache:policy。

值有三个:

  • pull 在作业开始时拉取缓存
  • push 在作业结束时上传缓存
  • pull-push 默认 拉取缓存,上传缓存
prepare-dependencies-job:
  stage: build
  cache:
    key: gems
    paths:
      - vendor/bundle
  policy: push  script:
      - echo "This job only downloads dependencies and builds the cache."
      - echo "Downloading dependencies..."

注意如果要在某个作业上禁用缓存 可以设置 cache: []

相关