Как рассказать Дженкинсу об использовании конкретного виртуального питона
Я уже создал virtualenv для запуска моего python script.
Теперь, когда я интегрирую этот скрипт python с Jenkins, я обнаружил, что в данный момент Jenkins использует неправильную среду python.
Как я могу гарантировать, что Дженкинс использует правильный virtualenv?
В качестве примера, для моего случая я хочу использовать virtualenv test. Как я могу использовать этот предварительно подготовленный virtualenv для запуска моего python script.
source test/bin/activate
Ответы
Ответ 1
Вы должны установить один из плагинов python. Я использовал ShiningPanda. Затем вы сможете создавать отдельные конфигурации виртуальной среды в разделе "Управление установками Jenkins > Настройка системы > Python > Python".
В конфигурации задания будет шаг Python Builder, где вы можете выбрать среду python.
Просто убедитесь, что вы не запускаете сервис Jenkins из существующей виртуальной среды python.
Ответ 2
Во-первых, вам следует избегать использования ShiningPanda, потому что он сломан. Он будет сбой, если вы попытаетесь параллельно выполнять задания и также несовместимы с конвейерами Jenkins2.
Когда сборки выполняются параллельно (параллельно), Jenkins добавит @2
, @3
... в каталог рабочей области, так что два исполнения не будут использовать одну и ту же папку. Дженкинс делает клонирование исходного рабочего пространства, поэтому не удивляйтесь, если он будет содержать virtualenv, который вы создали в предыдущей сборке.
Вам нужно самостоятельно позаботиться о создании virtualenv, но вы должны быть очень осторожны в том, как вы его используете:
- папка рабочих пространств может не очищаться, и ее местоположение может меняться от одной сборки к другой.
- virtualenvs знает, что их сломают, когда они перемещаются, а дженкинс перемещает их.
- создание файлов за пределами рабочего пространства - это действительно плохая практика CI, избегайте соблазна использовать /tmp
Таким образом, ваш единственный безопасный вариант - создать уникальную папку виртуальной среды для каждой сборки внутри рабочей области. Вы можете легко сделать это, используя переменную среды $JOB_NUMBER
.
Это будет отличаться, даже если у вас есть задания, выполняемые параллельно. Также это не повторится.
Downsides:
- скорость: virtualenvs не используются повторно между сборками, поэтому они полностью воссозданы. Если вы используете
--site-packages
, вы можете значительно ускорить создание (если тяжелые пакеты уже установлены в системе)
- space: если рабочее пространство не очищается регулярно, количество виртуальных серверов будет расти. Обход проблемы: работа, которая очищает рабочие пространства каждую неделю или каждые две недели. Это также хорошая практика для выявления других ошибок. Некоторые люди выбирают очистку рабочего пространства для каждого выполнения.
Отрывок оболочки
#/bin/bash
set -euox pipefail
# Get an unique venv folder to using *inside* workspace
VENV=".venv-$BUILD_NUMBER"
# Initialize new venv
virtualenv "$VENV"
# Update pip
PS1="${PS1:-}" source "$VENV/bin/activate"
# <YOUR CODE HERE>
В первой строке используется bash строковый режим, подробнее в http://redsymbol.net/articles/unofficial-bash-strict-mode/
Ответ 3
Вы можете использовать Pyenv Pipeline Plugin. Использование очень просто, просто добавьте
stage('my_stage'){
steps{
script{
withPythonEnv('path_to_venv/bin'){
sh("python foo.py")
...
Вы можете добавить pip install whatever
в свои действия для обновления любой виртуальной среды, которую вы используете.
По умолчанию он будет искать виртуальную среду в рабочем пространстве jenkins, а если он не найдет ее, он создаст новую.