如何阻止GitLab CI/CD删除前置任务创建的venv虚拟环境?
GitLab CI虚拟环境在后续任务中被删除的问题分析与解决
问题原因
- 工作目录自动清理机制:GitLab CI的每个Job运行在独立环境中,新Job启动时Runner会执行代码检出操作,默认会清理工作目录中未被Git仓库追踪的文件。TestEnv是build Job创建的虚拟环境目录,未被添加到仓库(也不应该被添加),因此在GuiTest Job检出代码时会被自动删除。
- Dependencies配置未生效:尽管GuiTest配置了
dependencies: [build],但该配置仅用于指定从上游Job下载artifacts(构建产物),而build Job未配置artifacts传递TestEnv目录,导致虚拟环境无法自动流转到下游Job。
解决方法
方法一:通过Artifacts传递虚拟环境
在build Job中添加artifacts配置,将TestEnv标记为需要传递的产物,GitLab会自动打包并传递到下游Job。
修改后的build Job配置:
build: script: - sudo apt-get update && sudo apt-get install libgirepository1.0-dev libgtk-3-dev -y - python3 -m venv TestEnv - pwd tags: - test artifacts: paths: - TestEnv/ expire_in: 1h # 设置过期时间,避免占用过多存储资源
GuiTest Job无需额外修改,Runner会在检出代码后自动解压artifacts中的TestEnv目录,此时执行source TestEnv/bin/activate即可正常激活虚拟环境。
方法二:使用缓存复用虚拟环境
如果多个Job需要重复使用同一个虚拟环境,且依赖包不会频繁更新,可以用GitLab CI的缓存功能避免重复创建。
在.gitlab-ci.yml中添加全局缓存配置:
cache: paths: - TestEnv/ key: test-env-cache # 自定义缓存键,确保不同分支/环境的缓存相互独立 build: script: - sudo apt-get update && sudo apt-get install libgirepository1.0-dev libgtk-3-dev -y - python3 -m venv TestEnv - pwd tags: - test GuiTest: stage: test before_script: - pwd - source TestEnv/bin/activate dependencies: - build script: - pwd tags: - test
缓存会在Job结束后保存TestEnv目录,下一次Job运行时会先加载缓存。注意:缓存可靠性不如artifacts,适用于非关键场景。
方法三:在下游Job中重新创建虚拟环境
如果虚拟环境创建速度较快,可在GuiTest Job中重新执行创建和依赖安装步骤,避免依赖上游Job的文件传递:
修改后的GuiTest Job配置:
GuiTest: stage: test before_script: - sudo apt-get update && sudo apt-get install libgirepository1.0-dev libgtk-3-dev -y - python3 -m venv TestEnv - source TestEnv/bin/activate script: - pwd tags: - test
此方法无需依赖上游Job,但会重复执行安装步骤,降低CI运行效率。
内容的提问来源于stack exchange,提问作者Olumide
相关产品推荐
相关产品推荐

