You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止GitLab CI/CD删除前置任务创建的venv虚拟环境?

GitLab CI虚拟环境在后续任务中被删除的问题分析与解决

问题原因

  1. 工作目录自动清理机制:GitLab CI的每个Job运行在独立环境中,新Job启动时Runner会执行代码检出操作,默认会清理工作目录中未被Git仓库追踪的文件。TestEnv是build Job创建的虚拟环境目录,未被添加到仓库(也不应该被添加),因此在GuiTest Job检出代码时会被自动删除。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:04:58