Distribuir un paquete de Python junto con las dependencias de los módulos utilizando RPM

Tengo varias aplicaciones de Python que consisten en scripts / módulos que deben empaquetarse e implementarse como RPM.

La parte más complicada es que cada aplicación debe distribuirse junto con todas las dependencias de los módulos de Python, y estas deben usarse con preferencia a las instaladas en todo el sistema.

Los hosts de destino para algunos de estos RPM tienen acceso limitado a la red, por lo que los RPM deben contener todo lo necesario para ejecutar la aplicación, en lugar de descargar cualquier cosa en el momento de la implementación.

He analizado el empaquetado y la distribución de un virtualenv , pero la reubicación de un virtualenv no parece estar bien soportada.

He mirado zc.buildout , pero encontré que faltaba la documentación. Pude ver cómo descargar dependencias durante el desarrollo, pero no cómo distribuirlas como parte de una aplicación más grande. Es posible que diferentes aplicaciones requieran diferentes versiones del mismo módulo, por lo que no deben instalarse en todo el sistema.

Otro punto problemático es que cualquier secuencia de comandos de Python en la aplicación necesita ser modificada para usar un sys.path diferente durante el desarrollo y después de la implementación, no pude ver una manera obvia de evitar esto.

¿Hay sugerencias sobre la mejor manera de lograr esto? Un resumen ideal del flujo de trabajo desde el punto de vista de un desarrollador se vería así:

  1. descargar la fuente de la aplicación
  2. ejecute el script para obtener dependencias específicas del módulo si no está presente (tal vez utilizando pip )
  3. ejecute el script para comstackr la aplicación Python, y empaquetarlo y todas las dependencias descargadas en RPM

El RPM final debe ser instalable y ejecutable en un host sin acceso a la red, y solo un intérprete de python instalado.

Lo vería como dos problemas separados.

  1. Desea un sistema de instalación / construcción repetible para sus desarrolladores.

  2. Quieres un instalador constructor.

Buildout (o pip, quizás en combinación con un script adicional) puede resolver el primer problema. Básicamente: “cómo preparar el proyecto para el desarrollo en una computadora portátil nueva”. Lo ideal sería decir python bootstrap.py;bin/buildout y estar listo (lo mismo que con pip / virtualenv).

Ahora que tiene una construcción repetible, puede usar eso como base para un instalador. Handiest es una máquina virtual limpia que utiliza para este propósito. Virtualbox / vagrant, por ejemplo. Haga scripts que configuren el virtualbox y que instalen las dependencias adecuadas allí.

El script del creador del instalador puede realizar una comprobación nueva de su proyecto dentro de la virtualbox y hacer la construcción repetible en la ubicación donde desea tenerlo en el instalador (por ejemplo, /opt/yourproject ).

Luego use FPM para hacer el paquete real (.deb, .rpm, lo que sea). Pase las opciones de FPM que le informan sobre las dependencias necesarias, de esta manera siempre puede estar seguro de que esas dependencias están instaladas. (Nota: estas son dependencias a nivel de sistema operativo como memcached o postgres; las dependencias de python deben ser manejadas por pip o buildout).

Si divide su gran problema en estos dos problemas más pequeños, ambos pueden ser atacados por separado.