我对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
我知道工件和缓存,但我不确定这些是否用于将prepare-env
作业的Docker容器的整个状态转移到后续作业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
谢谢你的帮助,Adam Marshall和slauth!