【发布时间】:2021-10-21 18:35:45
【问题描述】:
我对 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
我知道artifacts 和caching,但我不确定这些是否是为了将prepare-env 作业的Docker 容器的整个状态转移到后续作业run-first-job 和run-second-job 中,即仅安装一次软件包,然后在其他工作中使用它们。
欢迎任何提示,提前谢谢!
【问题讨论】:
-
您能否进一步解释一下您对“环境”和“状态”的理解?你指的是例如有状态的 Web 应用程序?如果您在
prepare阶段所做的只是安装一些软件包,那么我不明白您为什么不将其烘焙到自定义 Docker 映像中。 -
感谢您的评论。我已经详细说明了我关于国家的问题。正如我所说,我正在寻找一种解决方案,而无需为此创建单个 docker 映像,即使您是对的,这将是一个很好的解决方案。但我试图在没有额外图像的情况下做到这一点。
-
如果我理解正确的话,“状态”是指
prepare-env作业的Docker容器的状态? -
是的,我会进一步说明我的问题;-)
-
恕我直言,这里的挑战是管道中的作业可以在不同的运行器上执行,从而难以重用前一阶段的容器。我看到的唯一可能性是从
prepare阶段(例如到 GitLab 的容器注册表)推送图像,然后可以由后续阶段拉取。
标签: gitlab gitlab-ci gitlab-ci-runner