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: []