Jenkins流水线构建阶段安装pytest后,测试阶段仍提示pytest not found怎么办
问题根因
- 你在每个stage单独配置了docker agent,Jenkins会为每个stage启动全新的独立python:3容器,Build阶段容器内安装的依赖不会被带到Test阶段的新容器中
- 就算依赖文件被挂载到工作空间,你通过pip安装的用户侧可执行文件默认保存在
$HOME/.local/bin目录,该目录不在系统默认PATH中,直接执行pytest命令也会找不到
可行解决方案
方案1:全局复用同一个Docker容器(最推荐)
把Docker agent配置提到流水线顶层,所有stage共用同一个容器,依赖一次安装全流程可用,修改后的Jenkinsfile如下:
pipeline { agent { docker { image 'python:3' } } stages { stage('Build') { steps { echo 'Building..' withEnv(["HOME=${env.WORKSPACE}"]) { sh '/usr/local/bin/python -m pip install --upgrade pip' sh 'pip install -r requirements.txt' } } } stage('Test') { steps { echo 'Testing..' withEnv(["HOME=${env.WORKSPACE}"]) { // 也可以直接用python -m调用避免PATH问题 sh 'python -m pytest ./tests/unit/test_models.py' } } } stage('Deploy') { steps { echo 'Deploying....' } } } }
方案2:保留多容器配置,调整命令调用方式
如果你的业务要求每个stage必须使用独立容器,可修改Test阶段的执行命令,两种修改方式二选一:
- 方式A:通过python模块方式调用pytest,无需关心PATH配置
sh 'python -m pytest ./tests/unit/test_models.py' - 方式B:执行命令前把pip可执行文件目录加入PATH
sh ''' export PATH=$HOME/.local/bin:$PATH pytest ./tests/unit/test_models.py '''
方案3:使用虚拟环境保存依赖
在Build阶段创建虚拟环境并安装依赖,虚拟环境文件会保存在Jenkins自动挂载的工作空间中,Test阶段直接激活虚拟环境即可使用:
// Build阶段新增命令 sh 'python -m venv venv' sh 'source venv/bin/activate && pip install -r requirements.txt' // Test阶段执行命令前先激活虚拟环境 sh 'source venv/bin/activate && pytest ./tests/unit/test_models.py'
内容的提问来源于stack exchange,提问作者Clement
相关产品推荐
相关产品推荐

