我有一个在Gitlab中运行的CI/CD管道。管道配置文件的前几行
.gitlab-ci.yml
看起来是这样的:
# jobs can use following stages
stages:
- lint
- build
- test
- deliver
- publish
image: python:3.7
此语句告诉我,所有CI/CD测试都将在基于
python:3.7
形象
我的软件包括一组数据处理模块,每个模块都附带了一组使用pytest的测试。挑战在于,每个数据处理模块使用的库可能差异很大,而且可能经常更改。这意味着,每次有人提交需要新库的数据处理模块的新版本时,我们都必须编辑.gitlab-ci.yml文件以添加语句,如第3行(
pip install
):
script:
- python3 -m pip install --user --upgrade pip setuptools twine
- python3 -m pytest -sv --cov=. --cov-report=html tests/
随着时间的推移,更多
pip安装
每次需要新库或需要新库版本时,都必须编辑或添加行。
不用说,这增加了DevOps的负担,以确保CI/CD配置是最新的。此外,这使得很难计算出捆绑所有数据处理软件的生产容器所需的配置。
我设想的一个解决方案是,每个数据处理模块都必须在模块设计者设计的Docker容器中进行测试,并且图像名称为,例如,DEVELOERS_Docker_image。那么Gitlab CI/CD脚本中的pytest命令将类似于:
script:
- docker run --name=pytest_container -it --rm DEVELOPERS_DOCKER_IMAGE python3 -m pytest -sv --cov=. --cov-report=html tests/
(带有额外的Docker装载以存储代码覆盖率结果)。
然而,这将需要旋转一个Docker容器(在本例中基于Docker映像
DEVELOPERS_DOCKER_IMAGE
),来自另一个Docker容器(在本例中是基于
python:3.7
形象
问题:
-
这可能吗?
-
这种方法是推荐还是不推荐?
-
是否有其他更好或更符合Docker习惯用法和/或最佳实践的解决方案?
我很感激能得到的任何帮助。