¿Cómo combino los cambios de una copia de desarrollo del sitio al sitio en vivo sin perder contenido nuevo?

40

¿Cuál es el mejor procedimiento para combinar el trabajo realizado en una copia de desarrollo de un sitio con la copia de producción en vivo? Muchas veces se ha agregado una gran cantidad de contenido nuevo al sitio desde que comenzó el desarrollo de las funciones más recientes. Y la mayoría de las adiciones a un sitio implicarán cambios en la base de datos. Copiar cualquier archivo nuevo es fácil, pero ¿qué pasa con la base de datos? ¿Cómo combina sus cambios con la base de datos de producción existente sin perder el nuevo contenido que se agregó desde la última vez que actualizó el sitio de producción? ¿Hay algún módulo que ayude con esto?

Chaulky
fuente
2
Eliminar la confusión: Fusionar y migrar son dos palabras diferentes. Usaste ambos en tu pregunta. Si el sitio en vivo está vacío, debe migrar la copia de desarrollo al sitio / host en vivo. Si el sitio en vivo ya tiene contenido, es necesario fusionar nuevos contenidos desde la copia de desarrollo al sitio en vivo (la fusión es algo difícil). ¿Qué es lo que hay que hacer?
user931

Respuestas:

16

Para ver los tipos de contenido, las vistas y los cambios de estructura en el sitio de desarrollo, utilice las Características para exportar la base de datos a código.

Para la migración de contenido hay muchas opciones, pero no una sola solución sólida. Un ejemplo es la suite de implementación .

Budda
fuente
la suite Demployment definitivamente parece interesante, aunque todavía está en Dev (ni siquiera una Beta por el momento). ¿Lo has usado tú mismo? ¿Sabes de algo que no cubriría?
Chaulky
2

He adoptado básicamente dos escuelas de pensamiento aquí (una tercera escuela de pensamiento, haciendo diferencias en la base de datos, no discutiré porque la complejidad es bastante alta).

1) Implemente soltando la base de datos de producción e importando un mysqldump de la base de datos de desarrollo. Opcionalmente, ejecute una búsqueda / reemplazo de expresiones regulares de antemano en cualquier enlace absoluto codificado que haga referencia a la URL del desarrollador en el volcado de SQL. Después de importar el dev db en prod, ejecute automáticamente instrucciones SQL (generalmente a través de script) para cambiar cualquier configuración que sea diferente para prod que para dev (por ejemplo, tal vez tenga en la tabla de variables algunas configuraciones de conexión para conectarse a sistemas externos que necesita cambie para apuntar a sistemas externos prod en lugar de a la versión de desarrollo).

2) Use el módulo Características , como lo menciona budda, para la configuración de administración, y use el módulo Exportar nodo para la exportación / importación de contenido en combinación con el módulo Eliminar todo . Entonces el flujo de trabajo es:

  1. use node_export y características para exportar nodos / características a archivos
  2. Opcionalmente (y con suerte) control de versiones
  3. Cargar archivos en el sistema prod
  4. Use la interfaz drush o admin para cargar funciones
  5. Utilice la interfaz drush delete-all o admin para eliminar todos los nodos de los tipos que desea importar
  6. Use drush ne-import o la interfaz de administración para importar los nodos del archivo de nodos que exportó.

Una nota, sugeriría adoptar un flujo de trabajo estándar, donde el contenido va solo en una dirección. O Dev -> Prod o Prod -> Dev (prefiero este).

He hecho esto, y lo estoy haciendo en algunos sistemas grandes, con resultados bastante buenos, pero siempre habrá muchas formas de cortar esta manzana, elija la que mejor funcione para usted.

coderintherye
fuente
En la opción 1, ¿cómo está recreando el contenido que se ha agregado al sitio en vivo que no está en el sitio de desarrollo? Parece que está sobrescribiendo todo con el dev db y luego tal vez cambiando algunas configuraciones / variables. Además, ¿qué escuela de pensamiento está utilizando en sus sitios actualmente? ¿Alguna ventaja y desventaja de cada enfoque?
Chaulky
En la opción 1, ahora usamos node_export para enviar regularmente el contenido (habiendo eliminado el contenido anterior). Solíamos hacer cambios de contenido tanto en desarrollo como en producción. Esto es realmente un escenario común en algunos lugares que he visto, aunque obviamente no es ideal. Es por eso que agrego, adopto una dirección y me quedo con ella, ya sea que el contenido vaya a dev -> prod o prod -> dev, pero trate de no hacer ambas cosas. Y sí, básicamente sobrescribimos, aunque más bien borramos y reconstruimos. En mi nuevo trabajo hacemos el # 2, en mi trabajo anterior hicimos el # 1 pero nos estamos moviendo al # 2 (todavía estoy consultando por ellos).
coderintherye
1

Bases de datos de volcado de copia de sitio en vivo y copia de desarrollo de sitio en archivo SQL (use los mismos parámetros y configuraciones para ambos volcados).
Luego, compare ambos archivos SQL utilizando una pequeña herramienta de comparación ExamDiff . Mostrará las diferencias de archivos lado a lado con diferentes colores. También puede saltar directamente a las diferencias (sin desplazarse). Examine las diferencias y agregue / edite líneas al archivo SQL del sitio en vivo. Asegúrese de que no haya una ruta / URL absoluta del entorno de desarrollo en ese archivo. ¡Eso esta terminado! Hora de restaurar la base de datos para el sitio en vivo.
Haz tu vida más fácil:En el primer paso, volcar solo las tablas que se cambian. Por ejemplo, si ha editado un módulo en la copia de desarrollo que se dirige a una tabla separada, volcar solo esta tabla. Si no está seguro acerca de una tabla en particular, todo el volcado de la base de datos está bien.

usuario931
fuente
Esta técnica tiene limitaciones severas en algunas circunstancias importantes. Por ejemplo, si el sitio de desarrollo tiene nuevos nodos, sus dos bases de datos contendrán entradas con los mismos identificadores de nodo, y no será posible resolver referencias y fusionarlas desde un volcado de texto de la base de datos SQL. Este tipo de operación se maneja mejor a través de características y despliegue, como se menciona en otras respuestas.
greg_1_anderson