Caching 在同一gitlab CI管道中重用conda环境? 动机

Caching 在同一gitlab CI管道中重用conda环境? 动机,caching,anaconda,continuous-integration,conda,gitlab-ci,Caching,Anaconda,Continuous Integration,Conda,Gitlab Ci,我的主要目标是:在管道中,我希望尽可能多地重用(即,如果所有作业共享相同的环境,则不要多次构建conda环境) 在我的项目中,我使用conda作为依赖管理器,使用gitlab ci/cd进行持续集成。为了简单起见,假设我有一个构建作业和一个测试作业。最直接的方法是在任何作业中从environment.yml创建conda环境,然后执行实际工作。这会给任何作业增加几分钟的开销。这对我来说似乎也是一种开销,因为我希望在构建作业中构建一次环境,然后在测试作业中使用它(特别是在为不同的测试创建多个作业时

我的主要目标是:在管道中,我希望尽可能多地重用(即,如果所有作业共享相同的环境,则不要多次构建conda环境)

在我的项目中,我使用conda作为依赖管理器,使用gitlab ci/cd进行持续集成。为了简单起见,假设我有一个构建作业和一个测试作业。最直接的方法是在任何作业中从
environment.yml
创建conda环境,然后执行实际工作。这会给任何作业增加几分钟的开销。这对我来说似乎也是一种开销,因为我希望在构建作业中构建一次环境,然后在测试作业中使用它(特别是在为不同的测试创建多个作业时)

研究成果 我需要做的第一件事是将
CONDA_ENVS_PATH
设置为项目目录中的某个位置

我看过gitlab的缓存机制,但发现它只对同一管道中重复运行的同一作业有帮助,而对管道中相同运行的不同作业没有帮助

我还研究了gitlab的工件机制,但发现由于这些工件的启动和下载,它们不会显著增加运行时间(基本上我只是通过不下载许多小软件包和不必再次编译它们来节省时间,而是通过压缩和解压缩它们来节省时间)

我还试图通过在测试作业中将它们设置为
none
来使用
GIT\u CLEAN\u标志。这样,从git获取最新数据时不会删除conda环境。这确实在我的管道中造成了严重的加速,但它并不总是起作用。有些工作失败,找不到康达环境。然而,一个简单的重新运行确实神奇地工作。当然,在CI/CD设置中,这种不确定性是不实际的

作为对原始问题的一种变通方法,我们提出了一个中间解决方案。我们通过一个最小的docker文件和对
.gitlab ci.yml
的一些更改,引入了一个docker映像,它保存了我们的自定义环境(请参见下面的示例)。通过在dockerfile或环境更改时仅执行构建自定义docker映像的作业,我们在每次运行中节省了宝贵的时间。同时,我们在环境定义中保持了充分的灵活性,并且可以按照通常的方式进行调整:通过更改
environment.yml

问题: 到目前为止尝试的所有解决方案都不是真正令人满意的。因此,我的问题是:我的测试作业如何重用与gitlab ci中的构建作业相同的conda环境?


如果其他人想要使用类似的设置:以下是我当前的方法:

#Dockerfile
来自ContinuMio/miniconda3:最新版本
复制environment.yml。
运行conda env create-f environment.yml
入口点[“”]
#.gitlab-ci.yml
#使用此项目的docker文件的最新版本
#除非另有规定,否则这将是所有作业的默认映像
图像:$CI\u注册表\u图像:最新
#将缓存目录更改为在项目目录中,因为我们可以
#仅缓存本地项。
变量:
PRE_COMMIT_HOME:“${CI_PROJECT_DIR}/.cache/PRE COMMIT”
阶段:
-建造
-试验
#使conda环境可用于所有作业
#这要求conda环境与gitlab项目路径具有相同的名称
#避免使用破折号和其他非字母字符
违约:
在脚本之前:
-源代码激活“${CI_项目名称}”
#构建docker映像,包括后续作业的正确conda环境
#这假设正在为gitlab实例配置docker映像注册表
dockerimage:
阶段:建造
图片:
名称:gcr.io/kaniko项目/执行者:调试
入口点:[“”]
规则:
-变化:
-Dockerfile
-环境.yml
在脚本之前:[]
脚本:
-mkdir-p/kaniko/.docker
-echo“{\“auths\”:{\“$CI\u REGISTRY\”:{\“username\”:“$CI\u REGISTRY\u USER\”,“password\”:“$CI\u REGISTRY\u password\”}}}}>/kaniko/.docker/config.json
-/kaniko/executor--context$CI\u PROJECT\u DIR--dockerfile$CI\u PROJECT\u DIR/dockerfile--destination$CI\u REGISTRY\u IMAGE:最新
#运行pytest
pytest:
阶段:测试
脚本:
-康达安装pytest cov
-pytest测试——cov=src

编辑:我用最新的方法替换了使用GIT_CLEAN_标志的示例代码:使用自定义docker图像


免责声明:我看到了和问题,但它们都是过时的,没有令人满意的答案,我只是在写了这个问题后才发现它们,所以我希望我的附加问题增加了主题的可发现性