GitLab-CI中的artifacts使用研究

在GitLab-CI中, cacheartifacts比较容易混淆.

其中 cache 指的是缓存, 常用于依赖安装中, 如几个jobs都需要安装相同的依赖, 可以使用依赖, 此时可以加快依赖的安装进度;
对于artifacts则是将某个工件上传到GitLab提供下载或后续操作使用, 由于每个job启动时, 都会自动删除.gitignore中指定的文件, 因此对于依赖安装目录, 即可以使用cache, 也可以使用artifacts.

两个主要有以下几个区别:

  1. cache不一定命中,artifacts肯定命中, 能否使用cache取决当当前机器是否生成过cache, artifacts则每次都会从GitLab下载
  2. 重新安装时因为使用的是缓存, 所以很有可能不是最新的
  3. 特别是开发环境, 如果每次都希望使用最新的更新, 应当删除cache, 使用artifacts, 这样可以保证确定的更新
    4.artifacts中定义的部分, 会自动生成, 并可以传到下面的job中解压使用, 避免了重复依赖安装等工作
  4. 如果使用Docker运行Gitlab-Runner, cache会生成一些临时容器, 不容易清理
  5. artifacts可以设置自动过期时间, 过期自动删除,cache不会自动清理
  6. artifacts会先传到GitLab服务器, 然后需要时再重新下载, 所以这部分也可以在GitLab下载和浏览

artifacts 的依赖使用

下面是一个使用artifacts的例子, 首先有一个安装依赖的工作, 然后工作完成后, 会将安装文件转移到后续的工作时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
installing-dependencies:
stage: prepare
script:
- composer install --prefer-dist --optimize-autoloader -n --no-interaction -v --no-suggest
- composer dump-autoload --optimize
artifacts:
name: "vendor"
untracked: true
expire_in: 60 mins
paths:
- $CI_PROJECT_DIR/vendor
code-review:
stage: testing
dependencies:
- installing-dependencies
script:
- php vendor/bin/phpcs --config-set ignore_warnings_on_exit 1
- php vendor/bin/phpcs --standard=PSR2 -w --colors ./
test-image:
stage: build
image: docker:latest
services:
- docker:dind
dependencies:
- installing-dependencies
script:
- docker build -t $CI_PROJECT_NAME:latest .
- docker push domain.com/repos/$CI_PROJECT_NAME:latest
only:
- develop

如果上述过程使用cache, 则会变成下面这样子, 注意, 此时每次都要执行composer install这样的依赖安装工作, 即before_script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cache:
paths:
- vendor
before_scritp:
- composer install --prefer-dist --optimize-autoloader -n --no-interaction -v --no-suggest
- composer dump-autoload --optimize
code-review:
stage: testing
script:
- php vendor/bin/phpcs --config-set ignore_warnings_on_exit 1
- php vendor/bin/phpcs --standard=PSR2 -w --colors ./
test-image:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $CI_PROJECT_NAME:latest .
- docker push domain.com/repos/$CI_PROJECT_NAME:latest
only:
- develop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cache:
paths:
- vendor
code-review:
stage: testing
script:
- composer install --prefer-dist --optimize-autoloader -n --no-interaction -v --no-suggest
- composer dump-autoload --optimize
- php vendor/bin/phpcs --config-set ignore_warnings_on_exit 1
- php vendor/bin/phpcs --standard=PSR2 -w --colors ./
test-image:
stage: build
image: docker:latest
services:
- docker:dind
script:
- composer install --prefer-dist --optimize-autoloader -n --no-interaction -v --no-suggest
- composer dump-autoload --optimize
- docker build -t $CI_PROJECT_NAME:latest .
- docker push domain.com/repos/$CI_PROJECT_NAME:latest
only:
- develop

否则, 会出现类似 vendor not found的问题

禁用artifacts

默认artifacts会自动在不同的stage中传输, 如果该stage中的job不需要artifacts, 则可以禁用artifacts, 以加速构建速度

1
dependencies: []

注意

使用cache会出现一个问题, 就是缓存有可能使用上次执行该job时的缓存, 不能保证某些文件最新

相关文档

Introduction to job artifacts

Thanks for reading.