Распространение пакета python вместе с зависимостями модулей с использованием RPM

У меня есть несколько приложений на основе python, состоящих из скриптов/модулей, которые должны быть упакованы и развернуты как RPM.

Более сложный бит заключается в том, что каждое приложение должно быть распределено вместе со всеми зависимостями модуля python, и их следует использовать в предпочтении всем, которые установлены в системе.

Целевые узлы для некоторых из этих RPM имеют ограниченный сетевой доступ, поэтому RPM должны содержать все необходимое для запуска приложения, а не загружать что-либо во время развертывания.

Я посмотрел на упаковку и распространение virtualenv, но перемещение виртуального файла, похоже, не поддерживается.

Я просмотрел zc.buildout, но обнаружил, что документации не хватает. Я мог видеть, как загружать зависимости во время разработки, но не как распространять их как часть более крупного приложения. Возможно, для разных приложений требуются разные версии одного и того же модуля, поэтому их не следует устанавливать в системе.

Еще одна болевая точка заключается в том, что любые скрипты python в приложении должны быть изменены, чтобы использовать другой sys.path во время разработки и после развертывания, я не видел очевидного способа обойти это.

Есть ли предложения о том, как лучше всего это достичь? Идеальное резюме рабочего процесса с точки зрения разработчика будет выглядеть так:

  • скачать источник приложения
  • запустите script для получения определенных зависимостей модулей, если их нет (возможно, используя pip)
  • запустите script для создания приложения python и упакуйте его и все загруженные зависимости в RPM

Затем окончательный RPM должен быть установлен и запускаться на хосте без сетевого доступа, и установлен только интерпретатор python.

Ответ 1

Я видел бы это как две отдельные проблемы.

  • Вам нужна повторяющаяся система установки/сборки для ваших разработчиков.

  • Вам нужен установщик установщика.

Buildout (или pip, возможно, в сочетании с дополнительным script) может позаботиться о первой проблеме. В принципе: "как подготовить проект к разработке на новом ноутбуке". В идеале вы просто скажете python bootstrap.py;bin/buildout и будьте готовы (то же самое с pip/virtualenv).

Теперь, когда у вас есть повторяемая сборка, вы можете использовать ее в качестве основы для установщика. Handiest - это чистая виртуальная машина, которую вы используете именно для этой цели. Например, Virtualbox/бродяга. Создайте скрипты, которые настроили виртуальный бокс и установили там соответствующие зависимости.

Затем установщик-установщик script может выполнить новую проверку вашего проекта внутри виртуального бокса и выполнить повторную сборку в месте, где вы хотите иметь его в установщике (например, /opt/yourproject).

Затем используйте FPM, чтобы сделать фактический пакет (.deb,.rpm, что угодно). Перейдите в опции FPM, которые сообщают о необходимых зависимостях, таким образом вы всегда можете быть уверены, что эти зависимости установлены. (Примечание: это зависимости от уровня ОС, такие как memcached или postgres; зависимости python следует обрабатывать с помощью pip или buildout).

Если вы разделите свою большую проблему в этих двух меньших проблемах, их можно атаковать отдельно.