¿Cuál es su estrategia de implementación de php preferida? [cerrado]


161

Estoy comenzando un nuevo proyecto en PHP y me encantaría recibir comentarios de otros desarrolladores sobre su estrategia preferida para la implementación de PHP. Me encantaría automatizar un poco las cosas para que, una vez que se confirmen los cambios, puedan migrarse rápidamente a un servidor de desarrollo o producción.

Tengo experiencia con implementaciones utilizando Capistrano con Ruby, así como algunos scripts de shell básicos.

Antes de sumergirme por mi cuenta, sería genial escuchar cómo otros han abordado esto en sus proyectos.

Más información

Actualmente, los desarrolladores trabajan en instalaciones locales del sitio y envían cambios a un repositorio de subversión. Las implementaciones iniciales se realizan exportando una versión etiquetada de svn y cargándola al servidor.

Los cambios adicionales generalmente se hacen poco a poco cargando manualmente los archivos modificados.


Cute :) Gracias por editar splattne.
GloryFish

1
@ Paul Tomblin: ¡Dios mío, no puedo parar de reír! No hay mejor manera :)
Andrei Rînea

Alguien esta respuesta puede por favor - stackoverflow.com/questions/36034277/...
Sandeepan Nath

Respuestas:


109

Para PHP, SVN con scripts de compilación Phing son el camino a seguir. Phing es similar a ANT pero está escrito en PHP, lo que hace que sea mucho más fácil para los desarrolladores de PHP modificar según sus necesidades.

Nuestra rutina de implementación es la siguiente:

  • Todos se desarrollan en el mismo servidor local en el trabajo, cada desarrollador también tiene un pago en su máquina en casa.
  • Las confirmaciones desencadenan un enlace posterior a la confirmación que actualiza un servidor intermedio.
  • Las pruebas se ejecutan en el servidor provisional, si pasan, continúe.
  • Se ejecuta el script de compilación de Phing:
  • Elimina el servidor de producción y cambia el dominio a una página "En construcción"
  • Ejecuta la actualización de SVN al finalizar la producción
  • Ejecuta script de deltas de esquema
  • Ejecuta pruebas
  • Si las pruebas fallan, ejecute el script de reversión
  • Si las pruebas pasan, el servidor vuelve a la caja de producción

También hay phpUnderControl , que es un servidor de integración continua. No me pareció muy útil para los proyectos web para ser honesto.


Estaba a punto de publicar una lista de lo que hago en mi tienda Windows / .NET, pero es más o menos lo que tienes aquí. +1
Daniel Schaffer

¿Ha encontrado alguna desventaja por tener un svn co como entorno de producción? Realmente no puedo pensar en ninguna desventaja, pero no parece "limpio" tener un svn co como producción? ¿Por qué no una exportación svn o rsync?
ChrisR

Debido a la diferencia básica entre un co y una exportación: no puede impulsar cambios específicos, debe exportar toda la aplicación nuevamente. Es una diferencia muy importante que hace la vida mucho más fácil
Eran Galperin

36
¿Por qué poner el sitio abajo de la pantalla? Si ejecuta un directorio de lanzamientos /, y apunta liveSite / a través de un enlace simbólico a su carpeta en lanzamientos /, entonces puede verificar completamente el sitio en una nueva publicación / carpeta y voltear el enlace simbólico instantáneamente una vez que el co se hace. No hay necesidad de tiempo de inactividad (a menos que sea un sollozo pobre que hace una solicitud durante ese cambio de enlace simbólico).
Joseph Lust

2
¿Quién es responsable de hacer todas esas tareas, como la actualización de SVN en producción y el enlace simbólico en la nueva versión? ¿Es phing? ¿Es Jenkins?
Daniel Ribeiro

24

Actualmente estoy implementando PHP usando Git . Una simple producción de git push es todo lo que se necesita para actualizar mi servidor de producción con la última copia de Git. Es fácil y rápido porque Git es lo suficientemente inteligente como para enviar solo los diferenciales y no todo el proyecto nuevamente. También ayuda a mantener una copia redundante del repositorio en el servidor web en caso de falla de hardware de mi parte (aunque también presiono a GitHub para estar seguro).


He estado haciendo lo mismo durante años en proyectos pequeños y medianos también. Debo decir que me ha funcionado muy bien. Tienes que amar la simplicidad de este enfoque.
Chris Allen Lane

3
¿Cómo maneja la base de datos con este enfoque?
32423hjh32423

1
@neilc A mano, desafortunadamente. Cualquier cambio en la base de datos debe realizarse manualmente antes del envío.
Kyle Cronin

Por lo general, incluyo () un archivo PHP que contiene la configuración de base de datos y coloco manualmente el archivo en el servidor o la máquina de prueba. De esa manera no está almacenando contraseñas en git y tampoco está operando accidentalmente en una base de datos de producción.
Matt

¿Cómo configuras git para que haga esto por ti? ¿Hay alguna guía / tutorial? Gracias de antemano.
Miguel Stevens

14

Usamos Webistrano , una interfaz web para Capistrano, y estamos muy contentos con él.

Webistrano permite implementaciones de múltiples etapas y entornos múltiples desde SVN, GIT y otros. Tiene soporte de reversión incorporado, soporte para roles de servidor separados como web, db, aplicación, etc., y se implementa en paralelo. Le permite anular los parámetros de configuración en múltiples niveles, como por etapa, y registra los resultados de cada implementación, opcionalmente enviándola por correo.

A pesar de que Capistrano y Webistrano son aplicaciones de Ruby, la sintaxis de las 'recetas' de implementación es lo suficientemente fácil y potente como para ser entendida por cualquier programador de PHP. Originalmente, Capistrano se creó para proyectos de Ruby on Rails, pero se adapta fácilmente a proyectos PHP.

Una vez configurado, es incluso bastante fácil de usar por personas que no son programadores, como los probadores que implementan una versión provisional.

Para proporcionar la implementación más rápida posible, instalamos el método fast_remote_cache , que actualiza una caché de copia de trabajo svn en el servidor remoto y luego vincula el resultado.


7

Utilizo Apache Ant para implementar en diferentes objetivos (dev, QA y live). Ant está diseñado para funcionar para la implementación de Java, pero proporciona una solución de caso general bastante útil para la implementación de archivos arbitrarios.

La sintaxis del archivo build.xml es bastante fácil de aprender: usted define diferentes objetivos y sus dependencias que se ejecutan cuando llama al programa ant en la línea de comandos.

Por ejemplo, tengo objetivos para dev, QA y live, cada uno de los cuales depende del objetivo de cvsbuild que comprueba la última revisión de cabeza de nuestro servidor CVS, copia los archivos apropiados en el directorio de compilación (usando la etiqueta del conjunto de archivos), y luego rsyncs el directorio de compilación al servidor apropiado. Hay algunas peculiaridades para aprender, y la curva de aprendizaje no es totalmente plana, pero lo he estado haciendo durante años sin problemas, por lo que lo recomendaría para su situación, aunque tengo curiosidad por saber qué otras respuestas tengo. Veré en este hilo.


6

Hago cosas manualmente usando Git. Un repositorio para el desarrollo, que se git push --mirrorenvía a un repositorio público, y el servidor en vivo es un tercer repositorio extraído de eso. Esta parte, supongo, es lo mismo que su propia configuración.

La gran diferencia es que uso ramas para casi todos los cambios en los que estoy trabajando (tengo alrededor de 5 en este momento), y tiendo a alternar entre ellos. La rama maestra no se cambia directamente, excepto para fusionar otras ramas.

Ejecuto el servidor en vivo directamente desde la rama maestra, y cuando termine con otra rama y esté listo para fusionarlo, volteo el servidor a esa rama por un tiempo. Si se rompe, volver a ponerlo en master toma segundos. Si funciona, se fusiona en maestro y el código en vivo se actualiza. Supongo que una analogía de esto en SVN sería tener dos copias de trabajo y señalar la en vivo a través de un enlace simbólico.


3

Phing ha sido mencionado varias veces, pero he tenido mucha suerte con phpUnderControl . Para nosotros nosotros

  1. Consulte copias individuales de sucursales en máquinas locales
  2. Las ramas se prueban y luego se fusionan en Trunk
  3. PhpUnderControl crea los compromisos con Trunk automáticamente, ejecuta pruebas y crea toda la documentación, aplica deltas de bases de datos
  4. Trunk se ejecuta a través de pruebas de calidad y luego se fusiona en nuestra rama estable
  5. Una vez más, phpUnderControl crea automáticamente Stable, ejecuta pruebas y genera documentación y actualizaciones de la base de datos.
  6. Cuando estamos listos para pasar a producción, ejecutamos un script rsync que realiza una copia de seguridad de Producción, actualiza la base de datos y luego empuja los archivos hacia arriba. El comando rsync se invoca a mano para asegurarnos de que alguien esté viendo la promoción.

55
phpUnderControl está muerto: |
m02ph3u5

3

una alternativa a las secuencias de comandos de implementación caseras es implementar en una plataforma como servicio que abstraiga gran parte de ese trabajo para usted. Un PaaS generalmente ofrecerá su propia herramienta de implementación de código, así como escalamiento, tolerancia a fallas (p. Ej., No se cae cuando falla el hardware), y generalmente un excelente conjunto de herramientas para monitoreo, verificación de registros, etc. También existe el beneficio de implementar buena configuración conocida que se mantendrá actualizada con el tiempo (un dolor de cabeza menos para usted).

El PaaS que recomendaría es dotCloud , además de PHP ( vea su inicio rápido de PHP ) también puede implementar MySQL, MongoDB y un montón de servicios adicionales. También tiene buenas características como implementación de tiempo de inactividad cero, reversión instantánea, soporte completo para SSL y websocket, etc. Y hay un nivel gratuito que siempre es bueno :)

¡Por supuesto que soy un poco parcial ya que trabajo allí! Otras opciones que vale la pena ver además de dotCloud son Pagodabox y Orchestra (ahora parte de Engine Yard).

¡Espero que esto ayude!

Salomón


2

Que realice cambios de forma automática y ciega de un repositorio a servidores de producción parece peligroso. ¿Qué pasa si su código comprometido contiene un error de regresión, por lo que su aplicación de producción se vuelve defectuosa?

Pero, si desea un sistema de integración continua para PHP, supongo que Phing es la mejor opción para PHP. Sin embargo, no lo he probado yo mismo, ya que hago cosas de forma manual, por ejemplo, scp.


2

Llego tarde a la fiesta, pero pensé que compartiría nuestros métodos. Utilizamos Phing con Phingistrano , que proporciona una funcionalidad similar a Capistrano a Phing a través de archivos de compilación preconstruidos. Es muy bueno, pero solo funciona si usas Git en este momento.


1

Tengo una copia de trabajo de una rama de lanzamiento de SVN en el servidor. Actualizar el sitio (cuando no hay cambios de esquema) es tan fácil como emitir un comando de actualización SVN. Ni siquiera tengo que desconectar el sitio.


1
entonces tienes directorios .svn dispersos por todo el sitio? mi cerebro purista va en contra de esto :)
Stann

Esto solo se encarga del código fuente. Las implementaciones a menudo requieren otras acciones: cambios en la base de datos aplicados, cachés borrados, etc.
Leonid Mamchenkov

1

Phing es probablemente su mejor opción, si puede soportar el dolor de los archivos de configuración xml. El marco de Symfony tiene su propio puerto de rastrillo (pake), que funciona bastante bien, pero está bastante unido al resto de Symfony (aunque probablemente podría separarlos).

Otra opción es usar Capistrano. Obviamente, no se integra tan bien con PHP, como lo hace con Ruby, pero aún puede usarlo para muchas cosas.

Por último, siempre puedes escribir scripts de shell. Hasta ahora, eso es lo que he hecho.



1

Un año tarde pero ... En mi caso, la implementación no es automática. Me resulta peligroso implementar código y ejecutar scripts de migración de base de datos automáticamente.

En cambio, los ganchos de subversión se usan para implementar solo en el servidor de prueba / preparación. El código se implementa en la producción al final de una iteración, después de haber realizado pruebas y asegurarse de que todo funcione. Para la implementación en sí, utilizo un Makefile personalizado que usa rsync para transferir archivos. El Makefile también puede ejecutar los scripts de migración en el servidor remoto, pausar / reanudar servidores web y de bases de datos.


1

En mi trabajo, mi equipo y yo hemos desarrollado un reemplazo orientado a Phing para el despliegue de capistrano y también hemos incorporado algunos de los beneficios disponibles en phing como PHPUnit testing, phpcs y PHPDocumentor. Lo convertimos en un repositorio de git que se puede agregar a un proyecto como un submódulo en git y funciona muy bien. Lo adjunté a un puñado de proyectos y es lo suficientemente modular como para que sea fácil hacer que funcione con cualquier proyecto en cualquiera de nuestros diversos entornos (puesta en escena, pruebas, producción, etc.).

Con los scripts de compilación de phing, puede ejecutarlos desde la línea de comandos manualmente, y también he tenido éxito automatizando las rutinas de compilación / implementación con Hudson y ahora Jenkins ci.

No puedo publicar ningún enlace ahora porque el repositorio aún no es público, pero me han dicho que a veces abriremos el código abierto, así que no dude en ponerse en contacto conmigo si está interesado o si tiene cualquier pregunta sobre la automatización de su implementación con phing y git.


0

Supongo que la implementación de SVN no es muy buena. Porque:

Necesita abrir el acceso SVN para todo el mundo

tener muchos .svn en los servidores web de producción

Creo que Phing para producir una rama + combinar todos los js / css + reemplazar stage config + ssh upload a todos los servidores www es la mejor manera.

El servidor ssh a 10 www y svn up también es un problema.


¡Abrir mi servidor svn a todo el mundo, de ninguna manera! Simplemente use su firewall y autenticación a través de SSL para limitar quién puede ver su código.
Shadok
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.