2008-10-21 11 views
14

¿Cómo puedo configurar mejor mi entorno de desarrollo PHP (LAMP) para que tenga servidores de desarrollo, almacenamiento en etapas y producción? Una implementación de "clic" para cualquiera de ellas, así como una reversión con un solo clic a cualquier revisión. La reversión también debe retrotraer el esquema y la información de la base de datos a cómo estaba cuando ese código fuente era actual.Configuración de un proyecto web PHP, la infraestructura

Ahora he hecho todo esto (excepto la capacidad de retrotracción de DB) para una aplicación que utiliza scripts de shell. Tengo curiosidad por saber cómo se configuran los entornos de los demás, y también si hay herramientas genéricas o mejores prácticas para seguir en lo que respecta al diseño.

Entonces, ¿cómo haces esto? ¿Qué herramientas existentes usas?

Gracias!

ACTUALIZACIÓN:. Solo para aclarar que existe cierta confusión acerca de lo que me interesa

Realmente quiero que la gente interrumpiría con la forma en su entorno está configurado.

Si ejecuta un proyecto de PHP y tiene su esquema de base de datos en control de versiones, ¿cómo lo hace? ¿Qué herramientas usas? ¿Están en la empresa o todos podemos encontrarlos en la web en algún lugar?

Si ejecuta un proyecto PHP y realiza pruebas automáticas en commit (y/o nocturno), ¿cómo lo hace? ¿Qué sistema de control de versiones de origen usas? ¿Usas SVN y ejecutas tus pruebas en ganchos post-commit?

Si ejecuta un proyecto de PHP con varios servidores de desarrollo, un servidor de ensayo y servidor (es) de producción, ¿cómo los organiza y cómo se implementa?

Lo que espero obtener de esto es una buena idea de cómo los demás pegan todo junto.

+0

Tu pregunta es errónea. CI describe más una cuestión de control de calidad. P.ej. pruebas unitarias, comprobación de la cobertura de códigos, documentación de construcción, comprobación de estilo de codificación, PMS, etc. ¿Realmente está buscando asesoramiento sobre la implementación? – Till

+0

He eliminado la integración continua, porque eso no es lo que está pidiendo. – Till

Respuesta

12

Nuestro entorno de producción incluye lo siguiente:

  • 3 interfaces que sirven a nuestro sitio web
  • 2 backends de bases de datos (Master-Slave, replicación)
  • 1 mixto que ejecuta httpd y la base de datos para la publicación de datos

Nuestro entorno de desarrollo es un servidor único que ejecuta bases de datos y httpd, en cuanto a la configuración, tenemos diferentes espacios de trabajo para todos los usuarios y nuestro VC es subversión. La estadificación es bastante simple también: se ejecuta en una de las interfaces.

base de datos cambia

Inicialmente pasamos mucho tiempo en el diseño de bases de datos y parece que realmente han dado sus frutos. No hemos cambiado nada importante en cinco meses. La mayoría de los cambios que implementamos están en la interfaz. Ahora, hasta ahora, ejecutamos todos los cambios en la base de datos de forma manual y siempre escribí un pequeño script para revertir.

Si tuviera más de esos, usaría Doctrine y Migrations aquí. Nunca he tenido la oportunidad de usarlos en producción, pero ya los jugué mucho y parecen ser muy poderosos.

despliegue

Así que cuando hacemos uso de una nueva versión creamos una etiqueta del código que nos la salida en la puesta en escena, a continuación, pasar por un par de listas de cheques, etc., y luego desplegar el código en el Fronteras de producción. Para hacer todo el despliegue, tengo un par de configuraciones de tareas en Capistrano.

Salida esta muestra capfile:

role :www, "web01", "web02", "web03" 
role :web, "web01", "web02", "web03", "web04" 
role :db, "db01", "db02" 

desc "Deploy sites" 
task :deploy, :roles => :www do 
    run "cd /usr/www/website && sudo svn --username=deploy --password=foo update" 
end 

Capistrano también le permite ejecutar cualquier otro comando sin definir una tarea:

cap invoke COMMAND="uptime" ROLES=web 

(Requiere la papel "web" para ser configurado . Vea el ejemplo anterior.)

Estilo y documentación de codificación

Nos adherimos bastante al PEAR Coding standard, que comprobamos usando PHP_CodeSniffer (phpcs). Cuando digo más o menos, me refiero a que bifurqué los olfateos provistos y agregué algunas excepciones de mi propio gusto.

Además del estilo de codificación, phpcs también verifica la documentación en línea. Esta documentación es creada por phpDocumentor al final.

CI

tengo tanto de esas herramientas de configuración en nuestro CI-servidor (continua integración), que es phpUnderControl usando lo anterior y climatizador, phpUnit, Xdebug (un código pareja métricas .. .), etc.

pruebas de la unidad es algo que actualmente nos falta. Pero lo que hacemos ahora es que con cada error que encontramos en nuestro motor de análisis sintáctico (analizamos el texto en ciertos formatos), escribimos una prueba para asegurarnos de que no vuelva a aparecer. También escribí algunas pruebas básicas para verificar el enrutamiento de URL y la API XMLRPC interna, pero esto está realmente sujeto a mejoras. Empleamos tanto las pruebas de estilo phpUnit como phpt también.

El servidor de CI construye una nueva versión un par de veces al día, genera gráficos, documentos y todo tipo de informes.

Además de todas las herramientas mencionadas, también utilizamos Google Apps (principalmente para correo electrónico) y guardamos una wiki de Google Sites con toda la demás documentación. Por ejemplo, procedimiento de implementación, listas de prueba de QA, etc.

+0

¡Esto es * exactamente * lo que me interesó! No tengo tiempo para leerlo en este momento, pero gracias, no puedo esperar para sentarme y leerlo correctamente. –

+0

De nada. Avíseme si tiene alguna otra pregunta. – Till

1

Noté que esto no estaba recibiendo mucha exposición. También es algo que me interesa. ¿Conoce Phing? ¿Lo has probado?

Andrew

+0

¡Gracias por la respuesta! Conozco a Phing pero aún no lo he probado. El sistema de compilación, ya sea Phing, simples scripts de shell u otra cosa, es parte de lo que me interesa. La otra parte es cómo los chicos PHP están manejando las versiones de bases de datos y si hay alguna herramienta para eso. –

0

@andrew: He intentado con Phing y terminé con phpUnderControl. El problema con Phing es que para administrar la cobertura del código, realmente debe incluir todos los archivos en su proyecto, lo cual para nuestro proyecto simplemente no lo hace. El enfoque de CruiseControl funcionó mejor para nosotros. Pruébelas, son fáciles de instalar, el trabajo duro es construir las pruebas ...

1

Para los cambios de base de datos, tenemos un directorio en el VCS:

+ dbchanges 
|_ 01_database 
|_ 02_table 
|_ 03_data 
|_ 04_constraints 
|_ 05_functions 
|_ 06_triggers 
|_ 07_indexes 

Cuando se realiza un cambio en la base de datos se pone el archivo sql en el directorio correcto y ejecutar la secuencia de integración que pasa por estos directorios en orden, e importar cada cambio en el db.

Los archivos sql tienen que comenzar con un comentario, que se muestra al usuario cuando los scripts de integración importan el cambio, describiendo lo que hace. Registra cada nombre de archivo SQL importado en un archivo, por lo que cuando ejecute el script la próxima vez, no volverá a aplicar el mismo cambio.

De esta manera, todos los desarrolladores pueden simplemente ejecutar el script para actualizar el db.

+0

, pero ¿puede deshacer fácilmente los cambios de esquema? – philfreo

+0

Lamentablemente, no. También debe almacenar lo contrario de la operación, si lo desea, pero eso no es posible para declaraciones como DELETE. –

Cuestiones relacionadas