python - crear - virtualenv ubuntu
¿Cómo se usa pip, virtualenv y Fabric para manejar la implementación? (2)
Las "mejores prácticas" dependen mucho del contexto, por lo que no afirmaré que mis prácticas son las mejores, sino que funcionan para mí. Trabajo en sitios pequeños en su mayoría, por lo que no hay implementaciones de servidores múltiples, CDN, etc. Necesito apoyar la implementación de alojamiento compartido de Webfaction, ya que algunos clientes necesitan el hosting más barato que puedan encontrar. A menudo tengo que implementar sitios varias veces en diferentes entornos, por lo que los despliegues repetibles con guiones son críticos.
- No uso paquetes de pip, los instalo desde un requirements.txt. Tengo mi propio servidor chishop con sdists de todo lo que necesito, por lo que no hay múltiples puntos únicos de falla en el proceso de compilación. También uso PIP_DOWNLOAD_CACHE en mis máquinas de desarrollo para acelerar los entornos de proyecto bootstrapping, ya que la mayoría de los requisitos de mis proyectos se superponen bastante.
- Tengo scripts de Fabric que pueden configurar y configurar automáticamente y configurar nginx + Apache / mod_wsgi en un Ubuntu VPS, o configurar el equivalente en el alojamiento compartido de Webfaction , y luego implementar el proyecto.
- No utilizo --no-site-packages con virtualenv, porque prefiero tener paquetes compilados de movimiento lento (Python Imaging Library, psycopg2) instalados a nivel del sistema; demasiado lento y problemático para hacer dentro de cada virtualenv. No he tenido problemas con paquetes contaminados del sitio del sistema, porque generalmente no los contaminé. Y en cualquier caso, puede instalar una versión diferente de algo en el virtualenv y tendrá prioridad.
- Cada proyecto tiene su propio virtualenv. Tengo algunos scripts bash (no virtualenvwrapper , aunque mucha gente lo usa y me encanta) que automatizan el despliegue del virtualenv de un proyecto determinado en una ubicación conocida e instalan los requisitos de ese proyecto en él.
- Todo el proceso de implementación, desde un servidor de Ubuntu desnudo VPS o la cuenta de alojamiento compartido de Webfaction a un sitio web en ejecución, se crea mediante scripts utilizando Fabric.
- Los scripts de tela son parte del árbol fuente del proyecto, y los ejecuto desde un proceso de pago de desarrollo local.
- No necesito SCons (que yo sepa).
Despliegue
Por el momento, una nueva implementación se divide en estos pasos:
-
fab staging bootstrap
(instalación del servidor e implementación del código inicial) -
fab staging enable
(habilita la configuración de Apache / nginx para este sitio) -
fab staging reload_server
(recargar la configuración de Apache / nginx).
Esos, por supuesto, se pueden combinar en una única línea de comando fab staging bootstrap enable reload_server
.
Una vez que se realizan estos pasos, la actualización de la implementación con un nuevo código es simplemente una fab staging deploy
.
Si necesito revertir una actualización, la fab staging rollback
. Nada particularmente mágico en el retroceso; simplemente retrotrae el código a la última versión implementada y migra la base de datos al estado anterior (esto requiere registrar algunos metadatos sobre el estado de migración de la base de datos posterior a la implementación, solo lo hago en un archivo de texto).
Ejemplos
No he utilizado los scripts de Fabric descritos en esta respuesta durante algunos años, por lo que no se mantienen en absoluto y rechazo la responsabilidad de su calidad :-) Pero puede verlos en https://bitbucket.org/carljm/django-project-template - en fabfile.py
en la raíz del repositorio, y en el subdirectorio deploy/
.
¿Cuáles son sus configuraciones, sus trucos y, sobre todo, su flujo de trabajo?
Estas herramientas son geniales, pero todavía no hay prácticas recomendadas para su uso, por lo que no sé cuál es la forma más eficiente de usarlas.
- ¿ pip paquetes de pip o siempre descargas?
- ¿Configura usted a mano Apache / Cherokee / MySQL o tiene un script para eso?
- ¿ virtualenv todo en virtualenv y usas
--no-site-packages
? - ¿Usas un virtualenv para varios proyectos?
- ¿Para qué usa Fabric for (qué parte de su implementación hace script)?
- ¿Pones tus scripts Fabric en el cliente o el servidor?
- ¿Cómo maneja la migración de archivos de bases de datos y medios?
- ¿Alguna vez necesita una herramienta de compilación como SCons ?
- ¿Cuáles son los pasos de su implementación? ¿Con qué frecuencia realiza cada uno de ellos?
- etc.
Uso Fabric para construir e implementar mi código y asumir un sistema ya configurado para eso. Creo que una herramienta como puppet es más apropiada para automatizar la instalación de cosas como apache y mysql, aunque todavía tengo que incluirla en mi flujo de trabajo.
Además, generalmente tengo un virtualenv diferente por proyecto. Se crean a partir de una instalación ''base'' de python donde, como señaló Carl, puedes dejar algunas bibliotecas globales de python.
Entonces, en términos de flujo de trabajo sería:
- marioneta para instalar los servicios requeridos (servidor web, base de datos, servidor ssh, ...)
- marioneta para configurar usuarios requeridos y carpetas base
- tela para crear virtualenv para la aplicación
- tela para pip instalar desde requirements.txt
- tela para implementar su aplicación
- tela para implementar archivos de configuración (servidor web, ...)