2010-07-12 22 views
7

He leído más de this question y creo que es un gran comienzo, pero estoy buscando más información.Cómo distribuir la aplicación Python/Django a través de RPM

He escrito una aplicación que usa Python 2.6 y Django 1.2.1. Me gustaría implementar esta aplicación en un sistema que no tiene instalados Python 2.6 o Django. El sistema en sí no tiene muchas cosas instaladas: sqlite3, pysqlite2, gcc, etc. Sin embargo, el sistema tiene Python 2.4.3.

¿Cuál sería la forma más sensata de crear RPM de Python 2.6, Django y mi propia aplicación (una aplicación Django estándar) para que cada una se pueda instalar por separado para permitir la actualización de diferentes componentes?

No sé mucho sobre la creación de RPM de origen, pero sospecho que es la información disponible. Si hay recursos especialmente buenos para crear RPM de origen, también los agradecería.

El sistema es ESX 4 Actualización 1, si es que importa.

Gracias!

ACTUALIZACIÓN: También Nunca se me ocurrió que la distribución de los huevos de Python o incluso usando setup.py es una solución viable para la distribución de contenidos. Me interesaría saber sobre eso también.

Respuesta

3

Los paquetes de Python se distribuyen normalmente con setuptools/distribute. En general, puede instalar cada paquete python (y sus dependencias) con easy_install <package_name> (opcionalmente con un número de versión específico). Yo recomiendo que utilice setuptools como nuestro método de distribución primaria, debido a que:

  • funciona en todas las plataformas
  • es la forma preferida para los paquetes de Python en general
  • .rpm o .deb instalar scripts pueden reutilizar partes de ella demasiado
  • puede instalar estos paquetes dentro de un virtualenv sin necesidad de privilegios de root, del resto de las aplicaciones web instaladas en el servidor libres de conflicto

Un buen recurso para leer es Deploying with Distribute. Se centra en Flask (otro framework web), pero simplemente reemplazando "Flask" con "Django" hará el truco :)

Otra herramienta de python que es excelente para distribuir e implementar cosas es fabric, que puedes usar además para distribuir (o sin él, como quieras). Con Fabric puede, por ejemplo, arrancar e instalar su aplicación (dependencias inclusivas) en N servidores a la vez, administrar varios servidores de desarrollo, prueba y producción y actualizarlos todos al mismo tiempo con un solo comando.

Este artículo podría ayudarle a empezar con la tela: Deploying with Fabric

Y, además, también recomendaría a publicar su repositorio (o espejo de uno ya existente) en github o bitbucket para las personas que desean obtener la última fuentes manualmente e instale su aplicación con python setup.py install después. El script de instalación setup.py es parte de la distribución que he mencionado anteriormente.

+0

¿Cómo funcionaría mi manage.py runserver? ¿Dónde debería especificarlo? –

2

Ya hay disponibles RPM de python 2.6 y django, por lo que al menos son (relativamente) fáciles de instalar e instalar mediante RPM. Para crear un RPM para su proyecto, escriba algunos de los detalles usando Distutils, que se relaciona con los detalles de lo que necesita en un archivo de especificación y lo que usted invoca para que ocurra.

También hay una nota sobre la creación de RPM de python en StackOverflow en Creating Python RPM que también tiene un toque de detalle.

Por experiencia, empaquetar python en sí mismo como un RPM es el más travieso de los bichos, por lo que aprovechar algo que ya existe es algo que definitivamente recomendaría. Para algunos programas donde he visto esto hecho, tenemos un Makefile (sí, vieja escuela) ejecute el comando setup.py bdist_rpm en un servidor de integración continua, haciendo que el RPM esté disponible como resultado de esa compilación y disponible de inmediato en el Servidor de CI

+0

La pregunta se refiere a la creación de un número de revoluciones de una aplicación Django que desarrolló usted mismo, no se trata de la creación de un rpm de django –

4

En la parte superior de todas las normales problemas encontrados al empaquetar el código Python, proyectos Django tienen unos otros cuestiones que deben ser manejados:

  • jugar agradable con rutas del sistema
  • Jugar bonito con las instalaciones del sistema
  • Manejo de traducciones
  • Aleatorización de la clave secreta

que tuvieron que resolver estas cuestiones para el envasado de Transifex, y lo recomiendo a investigar los diversos fragmentos que han puesto en marcha con el fin de hacer que funcione:

  • instalarse bajo /usr/share/<projectname>
  • Uso execfile() para cargar configuración de /etc/<projectname>
  • la enorme runaround traducción de manejo de
  • reemplazo de la clave secreta en el post-script de instalación
  • Todos los demás cambios sangrientos y fudges que se requirieron
+0

No instalaría una aplicación web en una ruta del sistema, ya que podría tener problemas con versiones diferentes que se ejecutan a la vez o dependencias conflictivas. Además, la asignación aleatoria de la clave secreta debe realizarse durante la configuración y no la instalación (crear imágenes de varios servidores que se ejecutan en un clúster ...). – tux21b

+0

Si tiene un clúster, entonces va a utilizar una herramienta como marioneta para implementar de todos modos, por lo que terminarán con la misma clave independientemente. Y estar bajo la ruta del sistema está bien, ya que debe hacer todo lo posible para obtener más de una versión de un paquete instalado en primer lugar. –

3

Consulte chapter 5 of the Python documentation. Mostrará cómo tratar con la utilidad bdist Python. Con él, podrás generar paquetes (o, como dice, "distribución construida") de varios tipos, incluyendo RPM.

2

I've written up a blog post on how to use setuptools and it's bdist_rpm comando para crear las rpm para usted. De hecho, use setuptools, pero de hecho, distribuya su aplicación como rpm. Hay algunas capturas y cosas poco documentadas en las herramientas de configuración que puede usar para finalmente terminar en un buen flujo de trabajo.

La clave es que necesita un post script de instalación que ejecuta las migraciones y recoge sus archivos estáticos, que es ejecutado después el número de revoluciones se instala

export DJANGO_SETTINGS_MODULE=accountpage.settings 
mkdir -p /var/www/django/static && chown apache:apache /var/www/django/static 
runuser -m apache -c 'echo "yes" | django-admin collectstatic' 
django-admin migrate 
service httpd restart 

y se puede decir setuptools añadir esto al archivo de especificaciones antes de crear el número de revoluciones por dar esta opción en la configuración de la llamada:

options = {'bdist_rpm':{'post_install' : 'bdist_rpm_post_install.sh'}},

Ver el enlace de arriba para un script setup.py de trabajo completo, después de instalar el gancho, y una batería de pruebas que trabaja con python setup.py test que instalará todas sus dependencias localmente y ejecutará las pruebas django.

Para que el número de revoluciones también se instala automáticamente sus dependencias, crear un archivo setup.cfg que cuenta bdist_rpm sobre sus dependencias

[bdist_rpm] 
requires = python >= 2.7 
      django >= 1.8 
      httpd 
      Django-Select2 >= 4.3.1 
      django-easy-select2 
      django-model-utils 
      pytz 
      django-oauth-toolkit 
+0

El enlace a la publicación de blog está muerto. – kkurian

Cuestiones relacionadas