介绍
在 gitlab ci 中,不同的 stage 都会重新下载代码,例如下面的 .gitlab-ci.yml
default:
image: ruby:2.7.5
stages: # 运行的阶段顺序
- build
- test
- deploy
build: # job 的名称
stage: build # 阶段的名称
script:
- ls -l
- echo 123 > test1.txt # 在 build 阶段创建了一个 test1.txt 文件,写入了 123
- ls -l
test:
stage: test
script:
- ls -l
deploy:
stage: deploy
script:
- echo "This job deploys something from the $CI_COMMIT_BRANCH branch."
我们在 build 阶段创建了一个 test1.txt 文件,运行该流水线,查看结果
但有时候我们不想每个阶段都初始化仓库,例如上面的 build 阶段构建完成之后会产生一些文件,而这些文件会在 test 阶段用到,这时候 test 阶段就不需要在初始化了
GIT_CHECKOUT
GIT_CHECKOUT 变量,默认值为 true,即每次运行 job 都下载代码,按照我们上面的需求,需要在 test 阶段禁止下载代码,我们将此变量的值在全局设置为 false,然后在第一个作业中设置为 true,也就实现了在第一个 job 中下载代码,在其他的 job 中不下载代码了
注意:使用 GIT_CHECKOUT 要保证不同的 stage 在同一个 runner 上运行
.gitlab-ci.yaml 如下
default:
image: ruby:2.7.5
variables:
GIT_CHECKOUT: "false" # GIT_CHECKOUT 为 false,不下载代码
stages:
- build
- test
- deploy
build:
stage: build
variables:
GIT_CHECKOUT: "true" # 下载代码
script:
- ls -l
- echo 123 > test1.txt
- ls -l
test: # GIT_CHECKOUT 使用的是全局不,不下载代码
stage: test
script:
- ls -l
deploy:
stage: deploy
variables:
GIT_CHECKOUT: "true" # 下载代码
script:
- ls -l
运行上面的流水线,查看效果
制品 artifacts
文档:https://docs.gitlab.cn/jh/ci/yaml/#dependencies
上面使用 GIT_CHECKOUT 要求 job 在同一个 runner 上运行,但在实际工作中,我们经常会在不同的 runner 上运行不同的 job,这时候就需要使用制品了。
制品的意思就是我们将某些文件保存起来,在需要用这些文件的地方,在下载就可以了
使用 artifacts 关键词可以将当前作业的一些文件存储起来,可以存储文件夹和文件列表。并且用户可以选择在作业失败,成功时或者总是存储文件。使用 artifacts 储存的文件将会被上传到 gitlab,开发者可以在 gitlab 上在线预览他们。存储后的文件将会在下一个阶段自动恢复到当前的工作目录。开发者也可以自由配置恢复哪些制品,不恢复哪些制品。被恢复的制品,存放的位置与以前一致
dependencies:要获取哪些作业制品,作业列表。只能是当前阶段之前的作业,如果空数组则跳过下载任何文件。不考虑先前作业的状态,因此,如果它是失败或者未运行的手动作业,则不会发生错误
如果您不使用 dependencies
,则前一阶段的所有产物都会传递给每个作业
.gitlab-ci.yml 使用制品如下
default:
image: ruby:2.7.5
stages:
- build
- test
- deploy
build:
stage: build
script:
- ls -l
- echo 123 > test1.txt
- ls -l
artifacts:
name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME" # 创建制品存档的名称
when: on_success # 制品何时进行收集
expire_in: "1 week" # 制品的过期时间,过期自动清理
paths: # 定义要收集的制品文件或者目录信息
- test1.txt
test:
stage: test
script:
- ls -l
dependencies: # 只使用 build 阶段产生的制品,不写 dependencies 默认会下载所有阶段产生的制品
- build
deploy:
stage: deploy
script:
- ls -l
dependencies: [] # 不使用任何阶段的制品
运行流水线,查看结果