gitlab - 在 gitlab runner 中的后续作业中保存并重新使用先前作业的整个状态(为后续作业缓存所有内容)
问题描述
我对 gitlab 比较陌生,并且已经知道如何创建和运行运行良好的 CI/CD 管道。尽管如此,它运行速度相对较慢,因为我目前使用before_script
.
所以我想要的是一次安装一堆包,然后在不同的工作中重新使用它们。我知道通常会为此创建一个 docker 映像并重新使用它来运行 CI。但在这里,我对在后续工作中重用不同工作状态的可能性感兴趣。
这是一个解释我的问题以及我想要实现的目标的最小示例:
stages:
- prepare
- stage1
- stage2
image: python
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
cache:
paths:
- .cache/pip
.prepare_step1:
before_script:
- pip install requests
prepare-env:
image: python:3.7
stage: prepare
tags:
- docker
extends:
- .prepare_step1
script:
- pip list
run-first-job:
stage: stage1
tags:
- docker
script:
# I want to re-use the complete last state of the "prepare-env" stage here
# i. e. use the installed requests package
- pip list
run-second-job:
stage: stage2
tags:
- docker
script:
# I want to re-use the complete last state of the "prepare-env" stage here
# i. e. use the installed requests package
- pip list
我知道工件和缓存,但我不确定这些是否是为了将作业的 Docker 容器的整个状态转移prepare-env
到后续作业中run-first-job
,run-second-job
即只安装一次包,然后在其他作业中使用它们。
欢迎任何提示,在此先感谢!
解决方案
Dockerfile
实际上,仅当特定文件(此处和setup.cfg
)发生更改时,我才通过构建 docker 映像找到了解决方案:
stages:
- prepare
- run
image: python
variables:
GIT_SUBMODULE_STRATEGY: recursive
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
cache:
paths:
- .cache/pip
.build_docker_image_ci:
before_script:
- IMAGE_NAME=$CI_REGISTRY_IMAGE:"my-ci-image"
- echo $IMAGE_NAME
- git submodule update --recursive --remote
script:
- docker login -u $CI_REGISTRY_USER -p $CI_BUILD_TOKEN $CI_REGISTRY
- DOCKER_BUILDKIT=1 docker build
--build-arg PYTHON_REGISTRY_CONSTRING="$PYTHON_REGISTRY_CONSTRING"
--pull -t $IMAGE_NAME .
- docker push $IMAGE_NAME
build-docker-image-ci:
image: python:3.7
tags:
- dockerbuilder
stage: prepare
extends:
- .build_docker_image_ci
rules:
- changes:
- Dockerfile
- setup.cfg
run-job:
stage: run
image: $CI_REGISTRY_IMAGE:my-ci-image
tags:
- docker
script:
- pip list
感谢您的帮助,亚当马歇尔和斯劳斯!
推荐阅读
- node.js - 密码发布不适用于 Nodejs 服务器的 Reactjs
- c# - 如何从 1 个用户控件向/从其他用户 control.cs 传输或获取值
- node.js - 请确保 `sails-cassandra` 是有效的 Sails/Waterline 适配器
- python - ViewFlow中如何跳转到流的中间?
- android - Android 数据绑定库 vs Kotlin Android 扩展
- jquery - 逻辑运算符在 jQuery 中无法正常工作
- java - 单击图片时,它应该存储在我手机的内部存储器中
- c# - 使用 linq 从使用 c# 的数据表中获取总和和不同的列数据
- three.js - three.js 如何为背景使用渐变色
- c - 无法复制文本文件并将其粘贴到新文件 C