Pregunta

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 usando Capistrano con Ruby, así como algunos scripts básicos de shell.

Antes de sumergirme de cabeza 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.

¿Fue útil?

Solución

Para PHP, SVN con Phing los scripts de compilación 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 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 provisional.
  • 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, cambiando el dominio a un " En construcción " página
  • 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 que los proyectos web sean honestos.

Otros consejos

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 que sea seguro).

Utilizamos 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 varios niveles, como por etapa, y registra los resultados de cada implementación, opcionalmente enviándola por correo.

Aunque Capistrano y Webistrano son aplicaciones de Ruby, la sintaxis de las 'recetas' de implementación es lo suficientemente fácil y potente como para que cualquier programador de PHP la entienda. 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 un svn copia de trabajo en caché en el servidor remoto, y luego enlaza el resultado.

Utilizo Apache Ant para implementar en diferentes objetivos (dev, QA y live). Ant está diseñado para funcionar en la implementación de Java, pero proporciona una solución de caso general bastante útil para implementar 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 verifica 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.

Hago cosas manualmente usando Git. Un repositorio para el desarrollo, que obtiene git push --mirror 'editado a un repositorio público, y el servidor en vivo es un tercer repositorio extraído de eso. Supongo que esta parte es igual a 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, voltee 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.

Sé que Phing se ha mencionado algunas veces, pero he tenido mucha suerte con < a href = "http://www.phpundercontrol.org/about.html" rel = "nofollow noreferrer"> phpUnderControl . Para nosotros nosotros

  1. Vea copias individuales de sucursales en máquinas locales
  2. Las ramas se prueban y luego se fusionan en Troncal
  3. Los compromisos con Trunk son creados automáticamente por phpUnderControl, 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 fusionó con nuestra rama estable
  5. Nuevamente, phpUnderControl crea automáticamente Stable, ejecuta pruebas y genera documentación y actualiza 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 manualmente para asegurarnos de que alguien esté viendo la promoción.

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 en un 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

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

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.

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

Tengo una copia de trabajo de una rama de lanzamiento 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.

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.

http://controltier.org/wiki/Main_Page

lo vamos a usar para implementaciones de servidores múltiples & amp; mantenimiento.

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 producción al final de una iteración, después de ejecutar 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.

En mi trabajo, mi equipo y yo hemos desarrollado un reemplazo orientado a Phing para la implementación de capistrano y también hemos incorporado algunos de los beneficios disponibles en phing como PHPUnit testing, phpcs y PHPDocumentor. Lo hemos convertido 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 dijeron que a veces lo vamos a abrir en código abierto, así que no dude en ponerse en contacto conmigo si está interesado o si tiene alguna pregunta sobre la automatización de su implementación con phing y git.

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

Necesita abrir el acceso SVN para todo el mundo

tiene 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.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top