2009-11-02 15 views
7

He creado una aplicación web PHP.¿Cómo debo mover mi código de dev a producción?

Tengo 3 entornos: DEV, TEST, PROD.

¿Qué es una buena herramienta/práctica comercial para mover mi código PHP de aplicación web de DEV a TEST al entorno de PROD?

Al darse cuenta de que mi entorno TEST aún solo se conecta a mi base de datos TEST; mientras que, necesito un entorno PROD para conectarme a mi base de datos PROD. Así que el código es en su mayoría lo mismo, excepto que necesito cambiar mi código de PRUEBA una vez trasladado a PROD para conectarlo a la base de datos PROD y no a la base de datos TEST.

He oído hablar de gente que está utilizando Apache de tal manera que no permite nuevas conexiones y una vez que todas las conexiones existentes están inactivas, simplemente baja el servidor web.

Luego las personas copian manualmente el código y luego actualizan manualmente los archivos de configuración de la aplicación PHP para señalar también la instancia de PROD.

Eso parece terriblemente peligroso.

¿Existe una mejor práctica?

+0

me acabo de enterar de que Teddy parece haberse ido :-) esta pregunta se hizo hace 5 meses, por lo que probablemente no acepte una respuesta. Es un buen hilo, cualquier cosa. – user89021

Respuesta

3

Utilice los archivos de configuración para determinar a qué base de datos se está conectando. Es decir, tiene un archivo de configuración DEV, un archivo de configuración de PRUEBA y un archivo de configuración de PROD. En general, es la mejor manera de evitar errores costosos y frustrantes.

+0

¿Cómo se migra el código? ¿Simplemente copiándolo? – Teddy

+1

Sí. El objetivo del diseño es que el código pueda ejecutarse en cualquier entorno, con archivos de configuración que describen las diferencias en cada entorno. – mob

1
  1. Tenga su código en un sistema de control de revisiones (prefiero Subversion (svn)). Esto hace que sea fácil mantener sus entornos DEV, TEST y PROD sincronizados, no es necesario que realice un seguimiento de los archivos que modificó. Una vez que esté satisfecho con sus modificaciones en DEV, debe confirmar los cambios en svn y luego ejecutar "svn update" en el TEST y eventualmente después de probar en el servidor PROD. La mayoría de los proveedores de alojamiento de Linux tienen instalado el cliente svn o puede instalarlo usted mismo.

  2. No me gusta tener una versión diferente de un archivo de configuración para cada sitio porque requiere cambiar manualmente el nombre de un archivo y eliminar los otros dos. Prefiero tener configuraciones DEV, TEST y PROD en el mismo archivo de configuración. En el archivo de configuración, determino en qué servidor se está ejecutando el código marcando el nombre de host o la URL de solicitud. Entonces puedo tener la instrucción "if" o "switch" que cargaría la configuración según el servidor que está ejecutando actualmente el código.

  3. Es posible que también necesite sincronizar la estructura de la base de datos entre sus servidores. Yo uso sqlyog para este propósito, tiene una herramienta de sincronización de estructura de base de datos integrada que compara 2 estructuras de base de datos y prepara SQL para sincronizarlas.

3

En realidad, no veo ninguna razón por la entorno de prueba debe migrar a milagrosamente PROD sin paradas servidor. La producción de prueba se supone que es para fines de prueba. E incluso si está PROBANDO realmente en el servidor de producción, baje (Apache apache), cambie una línea en su archivo de configuración principal, que es determinar qué conjunto de archivos menores de configuración usar y vuelva a abrirlo (inicie apache). Esto tomará no más de 1-3 minutos para completar y ya que seguramente no vas a hacer eso doce veces al día, estarás bien.

6

1) Configuración separada del resto del código. El resto del código debería poder ejecutarse en las 3 ubicaciones sin modificaciones.Un archivo de configuración típica podría ser:

<? 
$db = "main_db"; $db_user="web1"; $db_pass = "xyz123"; 
$site ="example.com"; 
$htroot = "/var/www/prod/htdocs" 
?> 

Y para el entorno de prueba:

<? 
$db = "test_db"; $db_user="web1"; $db_pass = "xyz123"; 
$site ="test.example.com"; 
$htroot = "/var/www/test/htdocs" 
?> 

No incluya los archivos de configuración con las contraseñas en la base de código. La base de código puede copiarse a través de conexiones inseguras o almacenarse en servidores de hospedaje de código de terceros más adelante (ver a continuación). Y es posible que no quiera sus contraseñas en todos sus discos de copia de seguridad del código.

También puede crear un archivo de configuración única y utilizar un interruptor en función del entorno se ejecuta el código:

<? 
$site = $_SERVER["HTTP_HOST"]; 

if ($site == "example.com";) { 
    $db = "main_db"; $db_user="web1"; $db_pass = "xyz123"; 
    $htroot = "/var/www/prod/htdocs"; 
} 
if ($site == "test.example.com") { 
    $db = "test_db"; $db_user="web1"; $db_pass = "xyz123"; 
    $htroot = "/var/www/test/htdocs"; 
} 
?> 

Pero ahora usted podría tener la tentación de ponerlo de nuevo en la base de código, que es menos seguro como se explicó anteriormente. Y si no lo colocas allí, tienes que actualizar 3 archivos, o usar una ubicación fija por servidor, y debes asegurarte de que el código encuentre el archivo en cada servidor. Yo personalmente prefiero la solución de un archivo por sitio desde arriba.

2) Ya tiene "versiones". Hay una versión corriendo en prod ahora. Dale un nombre y número únicos, que nunca volverán a cambiar. Puede usar ese nombre de versión cuando haga una copia de seguridad del código y cuando se refiera a la versión o cuando la mueva a algún lugar, debe nombrar el subdiectorio que lo contendrá después de la versión.

La versión que colocará en prod en un futuro próximo es una versión diferente, y si realiza cambios de nuevo, esta también es una versión diferente.

Como regla general: aumente el número de versión cuando mueva o exporte el código, cuando intercambia o cambia o actualiza entre ubicaciones, cuando hace una demostración, y después de cada función o hito y cada vez que lo hace una copia de seguridad completa.

Tenga en cuenta que los archivos de configuración (3, uno para prod, test y dev) NO son parte de las versiones. Entonces puedes "mover las versiones" pero no los archivos de configuración. Si puede, coloque los archivos de configuración FUERA del árbol con el resto del código, para que no tenga que separarlos y tenga cuidado cuando pase las versiones más adelante. Puede mover el directorio config one "arriba" y acceder a ellos desde los archivos como este:

"include ../config.php";

3) Si desea usar sistemas de control de versiones, hacen un gran trabajo, pero necesita tiempo para acostumbrarse y si tiene prisa con su actualización probablemente no sea el momento adecuado para comenzar en vivo. con eso ahora. Pero en el futuro recomendaría utilizar un sistema de control de versiones distribuidas de última generación. Distribuido significa que no necesita configurar un servidor y muchas más ventajas. Voy a nombrar bazar, si es necesario actualizar a través de ftp puede hacerlo. Tenga en cuenta que un sistema de control de versiones hace que el intercambio de una versión sea muy rápido, ya que solo se escriben las diferencias entre las versiones. Bazar tiene una comunidad y documentación que hace que sea fácil comenzar. También está Git, que tiene el sitio de alojamiento comercial más actualizado: http://github.com. Puede ver el código en línea y comparar entre las versiones y hay muchas más funciones útiles, incluso si usted es el único programador, pero en un grupo es incluso mejor. La elección entre los sistemas no es fácil. No puedo recomendar CVS, que está desactualizado. Además SVN no es la última generación del sistema de control de versiones distribuidas, no recomendaría su uso si no hay una razón específica, y contaminará todos sus subdirectores con subdirectorios especiales, lo que puede ser molesto. Para gente que ya está acostumbrada y que ya tiene código, está bien, pero para empezar, yo diría que no.

Hay también Mercurial y Darcs entre los sistemas de control de versión de código distribuidos y abiertos. Mercurial también tiene un gran sitio comercial para la colaboración y la vista de código en línea (http://bitbucket.org).

4) Mientras no uses un sistema de control de versiones, ¿qué tal si usas enlaces simbólicos?

Puede tener un directorio en el servidor src/versions/somewhere y colocar las versiones nombradas allí, cada una en su propio subdirectorio. Solo agregará versiones (porque una versión que existe no se cambiará, si la cambia se convierte en una nueva versión)

Puede tener src/versions/v001/src/versions/v002/src/versions/v003/o cualquier esquema de nombres que use.

Ahora aquí viene el truco:/var/www/prod/htdocs es un enlace simbólico a src/versiones/V001/

Cuando se actualiza a v002 que acaba de hacer lo siguiente:

  • apagado Apache
  • eliminar los viejos enlace simbólico/var/www/prod/htdocs (en este punto el Webroot Apache se ha ido!)
  • crear el nuevo enlace simbólico/var/www/prod/htdocs ser un enlace a src/versiones/v002
  • s Apache tarta

También puede escribir un guión para esto con parámetros y lo llaman así:

upgrade-web prod 002 

Esto hace que la brecha aún más corto.

A veces hay que hacer un "retroceso", cuando descubres que la nueva versión tiene errores en la producción y tienes que volver atrás. Esto sería fácil (porque no eliminas los directorios anteriores, simplemente dejas apache, borras el enlace simbólico y lo vuelves a crear en la ubicación anterior, en este caso src/versions/v001)

Y si prueba y dev está en el mismo servidor, puede, por supuesto, vincular simbólicamente los mismos directorios, por lo que no habría ninguno para mover o copiar.

5) Si lo hace manualmente sin enlaces simbólicos, ¿por qué no se mueve en lugar de copiar?

(Cuando los archivos no están aún en el mismo servidor, puede copiarlos en algún lugar cercano, y luego comenzar con la migración, por lo que no tiene que detener el servidor por un tiempo tan ling)

Si hay varios directorios en el nivel raíz del proyecto, puede moverlos uno a la vez. Asegúrese de NO MOVER los archivos de configuración. O encuentra alguna estrategia para traerles bakc.Flujo de trabajo sería:

  • Parar Apache
  • quite todos los directorios prod actuales y los archivos en el directorio raíz, excepto archivo (s) de configuración
  • Mover todos los nuevos directorios prod y archivos a nivel de la raíz, excepto el archivo de configuración (s)
  • iniciar Apache

6) tratar de encontrar su archivo individuo perfecto y la estructura de directorios y flujo de trabajo perfecto. Esto lleva algún tiempo y algo de reflexión, pero vale la pena. Hazlo en una hoja de papel hasta que encuentres la mejor solución. Esto podría significar que tiene que refactorizar su código y cambiar los archivos de configuración del servidor, pero para el futuro su vida es más fácil cuando realiza la administración y las actualizaciones. Desde mi experiencia: no esperes tanto con este paso. Su diseño debe hacer que sea fácil y seguro actualizarlo. Actualizar no es algo extraordinario, es una rutina y debe ser seguro y simple de hacer.

7) Si nombra sus entornos de servidor y estación de trabajo (supongo que el sistema operativo del servidor es linux, pero ¿es un servidor alojado o raíz, tiene acceso ftp o también shell (ssh), o sftp? ¿dónde se desarrolla, en una máquina de Windows o en un Mac?), entonces las personas pueden nombrar las herramientas para copiar y mover. También es interesante: ¿el servidor de prueba y el de desarrollo son la misma máquina? Si no es así, ¿cómo están conectados o no? De lo contrario, realizaría una transferencia de 3 vías (cópielo en su estación de trabajo local y luego en el servidor).

8) Piense en los permisos de archivos. Si mueve los archivos o los copia, tal vez los permisos de los archivos cambien, y si la aplicación depende de algunos de ellos, debería haber una manera de verificar y quizás cambiar. Ejemplo: algunas aplicaciones necesitan directorios modificables donde colocan archivos cargados o archivos de sesión o caché de plantillas. Otras aplicaciones no permiten que algunos archivos de seguridad sean escribibles.

+0

El código que se basa en HTTP_HOST no es seguro en este formulario. HTTP_HOST es igual al encabezado 'Host:' enviado por el cliente. Esto puede ser fácilmente falsificado, y si HTTP_HOST no coincide con 'example.com' o' test.example.com', las variables '$ db' y' $ htroot' ** no estarán definidas **. – Lekensteyn

0

Cuando empujamos actualiza en tiempo real, no es a menudo tenemos que reiniciar Apache. Esto puede ser un efecto secundario de no tener sitios de alto tráfico (< 1M pagedraws al mes).

Tenemos 3 ramas, para varias etapas de desarrollo/QA: alpha (borde sangrado pero disponible para ver por no desarrolladores y probadores), beta (algo congelado para una versión particular, fase de control de calidad final) y live (producción)

migren de una rama a otra, llevamos a cabo una fusión entre decir alfa y beta, que se comprometen fusión. A continuación, ejecute un script de implementación que actualice la rama de SVN en nuestra máquina de desarrollo, luego rsync los servidores web de código en la raíz del documento beta.

Como ya se ha mencionado otros, cada rama puede contener su propio archivo de configuración con los ajustes apropiados para atender a las diferencias de entorno.

Estamos en el proceso de migración a git para suavizar el proceso de fusión de la rama, que puede ser un poco traumático en SVN para grandes proyectos/comunicados.

Cuestiones relacionadas