Pip не активирован должным образом при использовании venv в Jenkins

#python #bash #jenkins #pip #python-venv

#python #bash #дженкинс #pip #python-venv

Вопрос:

Я использую Jenkins, работающий на Raspberry Pi 3 (работает под управлением Rasbian). В этом экземпляре Jenkins я хочу запустить Python (3.6) в виртуальной среде, используя venv . Однако, когда я запускаю свой скрипт (используя Jenkins Execute-shell build-step) и активирую pip , он не работает должным образом, и я не могу использовать установленные модули. Запуск точно такого же скрипта в терминале работает отлично, и я могу использовать модуль.

Я пытался найти проблему, и похоже pip , что in venv не используется, когда я запускаю скрипт через Jenkins.

В jenkins я добавил следующее после venv установки и активации, чтобы попытаться отладить его. Рабочее пространство находится в /var/lib/jenkins/workspace/Test Python VENV/ :

 >python --version
Python 3.6.5
>pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)
>which python
/var/lib/jenkins/workspace/Test Python VENV/venv/bin/python
>which pip
/var/lib/jenkins/workspace/Test Python VENV/venv/bin/pip
>pip install coverage
Collecting coverage
Installing collected packages: coverage
Successfully installed coverage-4.5.3
>pip show coverage | grep Location     
Location: /var/lib/jenkins/.local/lib/python2.7/site-packages
>python -m coverage --version
/var/lib/jenkins/workspace/Test Python VENV/venv/bin/python: No module named coverage
  

Однако, если я запускаю тот же скрипт в терминале (т. Е. Вне Jenkins), он работает, и я получаю следующее (каталог есть ~Develop/python_test/ ):

 >python --version
Python 3.6.5
>pip --version
pip 9.0.3 from /home/pi/Develop/python_test/venv/lib/python3.6/site-packages (python 3.6)
>which python
/home/pi/Develop/python_test/venv/bin/python
>which pip
/home/pi/Develop/python_test/venv/bin/pip
>pip install coverage
Collecting coverage
Installing collected packages: coverage
Successfully installed coverage-4.5.3
>pip show coverage | grep Location
Location: /home/pi/Develop/python_test/venv/lib/python3.6/site-packages
>python -m coverage --version
Coverage.py, version 4.5.3 with C extension
  

Итак, моя проблема в том, что когда я запускаю это через Jenkins, Pip в venv, похоже, не используется, вместо этого используется системный Pip по умолчанию. И по какой-то причине pip --version и which pip показывает два разных пути в Jenkins.

Полный скрипт, который я запускаю (как в Jenkins, так и в терминале), можно найти ниже:

 echo Creating and activating virtual environment
python="python3.6"
venv_name="venv"

echo VERSIONS BEFORE VENV
python --version
pip --version
which python
which pip

echo 'Creating venv'
$python -m venv $venv_name
echo 'Activating venv'
. $venv_name/bin/activate

echo VERSIONS AFTER VENV
python --version
pip --version
which python
which pip

pip install coverage
pip show coverage | grep Location
python -m coverage --version 
  

Комментарии:

1. Возможно, у вас действует глобальная конфигурация pip (или переменные среды, влияющие на pip). Кроме того, имеет ли python -m pip внутри venv тот же эффект?

2. @AKX: python -m pip похоже, это не тот же pip, что и just pip . python -m pip указывает на pip внутреннюю часть моего env . Если я изменю с pip на python -m pip в своем скрипте, похоже, он работает. Знаете ли вы, что может вызвать это? У меня есть pip (подключенный к python 2.7) в моей переменной PATH / environment, но я подумал, что это не будет проблемой, pip и он будет перенаправлен на pip inside my venv , как только я его активирую, но разве это не так?

Ответ №1:

Вы можете попробовать Pyenv плагин Pyenv Дженкинса

Я протестировал ваш скрипт, и, похоже, он работает, просто добавьте #!/bin/bash shebang.