2008-11-26 24 views
6

Tengo la oportunidad de producir sitios web de Drupal utilizando entornos de desarrollo, montaje y producción. Mantener el código sincronizado entre los sitios es una tarea simple que utiliza subversión. Lo que no es tan simple es propagar cambios a los datos de la base de datos (no solo al esquema) entre las instalaciones.¿Cómo puedo mantener los datos sincronizados durante la implementación?

La razón de esto será familiar para cualquier desarrollador de Drupal. Drupal almacena ciertas configuraciones en la base de datos, específicamente relacionadas con campos CCK, Vistas y otros módulos que permiten que las cosas se configuren dinámicamente usando la interfaz de administración. Simplemente sincronizar el esquema no es suficiente: la información esencial también está en los datos.

Lo que estoy buscando es una forma de sincronizar estos cambios de base de datos para que si un desarrollador hace cambios de campo CCK en el servidor de etapas, se puedan propagar a entornos de desarrollo locales para más trabajo y, finalmente, hasta el entorno de producción.

¿Hay alguna herramienta que haga esto? ¿Cuál es su proceso para manejar desarrolladores individuales o múltiples en un proyecto como este?

+0

posible duplicado de [Estrategia de control de código fuente de Drupal?] (Http://stackoverflow.com/questions/282858/drupal-source-control-strategy) – gnat

+0

Ver [respuestas anteriores a esta pregunta] (http://stackoverflow.com/questions/282858/drupal-source-control-strategy) – Eli

Respuesta

2

Por aquí, hemos relegado bastante a CCK para usarlo en prototipos y tipos de nodos simples. No vale la pena el dolor de cabeza de tratar de separar la 'configuración' del 'contenido' en la base de datos. Hay muchas maneras en las que puede tratar de mantener las cosas sincronizadas, pero, en resumen, a menos que estén en un archivo o le den la opción de exportar a uno, le hará daño. (Como una ventaja adicional, exportar sus vistas a un archivo va a ser un poco más rápido que extraerlo de la base de datos cada vez que se usa.)

Usted menciona Dev, Staging & Servidores en vivo - si tiene desarrolladores haciendo Cambios no documentados en la Etapa, estás jodido. Si tiene la organización sincronizada regularmente con Live & indique que la política (de sentido común) de que los únicos cambios realizados en la clasificación por etapas son cosas que se han resuelto en Dev & se están probando antes de su traslado a Live, puede tener más éxito.

5

Para la sincronización de datos básica: Yo uso mysqldump para volcar todos los datos en un archivo .sql cada noche. El script luego lo verifica en el sistema de control de versiones. Esto está sincronizado en un simple script bash, pero podrías hacer algo similar en casi cualquier plataforma ...

Acabo de leer un poco más y no estoy seguro si mi método ayudará. Nunca tuve que fusionar un volcado de SQL por lo que no puedo comentar sobre la eficacia con la que se gestiona.

Si bien debería poder enviar los cambios (esquema, datos nuevos) al servidor de producción/producción, es posible que tenga más cambios de extracción de problemas en dev. Como digo, la fusión puede o no ser posible. Simplemente no sé.

+0

¿De verdad ha usado mysqldump para dev-> staging-> production en una instalación de Drupal? Realmente se esfuerza por combinar el contenido y la configuración en la base de datos, lo que hace prácticamente imposible utilizar los volcados de bases de datos de esta manera ... Si has logrado esto en Drupal, me gustaría saber cómo lo hiciste:) –

0

Usar el sistema de control de versiones de la base de datos. Para esto necesita una tabla VersionInfo en la base de datos y todas sus consultas sql ddl y dml en formato xml junto con la información de la versión. Ahora solo tiene una herramienta .net simple que verificará la tabla VersionInfo y ejecutará todas las consultas desde xml que se agreguen después de esa versión y actualizará la versión a la actual en versionInfo.

1

Intenté responder cómo hago esto en otra pregunta. Lo publicaré aquí también

Creo que una buena estrategia aquí es usar la API de perfil de instalación. Con la API de perfil de instalación puedes hacer la mayoría de las cosas que hacen las herramientas de administración de Drupal. La mayoría de las formas básicas simplemente configuran variables en la tabla de variables. Para poder realizar una versión sensata de los contenidos de su base de datos no contenida, es decir, la configuración, es aconsejable usar las funciones de actualización.

En mi sitio tenemos el módulo "ec" que hace muy poco aparte de tener su archivo ec.install que contiene funciones de actualización, p. ec_update_6001()

Su función de instalación principal puede encargarse de ejecutar realmente las actualizaciones en cualquier instalación nueva que realice para actualizar sus módulos.

function ec_install() { 
    $ret = array(); 
    $num = 0; 
    while (1) { 
    $version = 6000 + $num; 
    $funcname = 'ec_update_' . $version; 
    if (function_exists($funcname)) { 
    $ret[] = $funcname(); 
    $num++; 
    } else { 
    break; 
    } 
    } 
return $ret; 
} 

una función de actualización de la muestra o dos de nuestro archivo real ahora siguen

// Create editor role and set permissions for comment module 
function ec_update_6000() { 
    install_include(array('user')); 
    $editor_rid = install_add_role('editor'); 
    install_add_permissions(DRUPAL_ANONYMOUS_RID, array('access comments')); 
    install_add_permissions(DRUPAL_AUTHENTICATED_RID, array('access comments', 'post comments', 'post comments without approval')); 
    install_add_permissions($editor_rid, array('administer comments', 'administer nodes')); 
    return array(); 
} 
// Enable the pirc theme. 
function ec_update_6001() { 
    install_include(array('system')); 
    // TODO: line below is not working due to a bug in Install Profile API. See http://drupal.org/node/316789. 
    install_enable_theme('pirc'); 
    return array(); 
} 

// Add the content types for article and mtblog 
function ec_update_6002() { 
    install_include(array('node')); 
    $props = array(
    'description' => 'Historical Movable Type blog entries', 
); 
    install_create_content_type('mtblog', 'MT Blog entry', $props); 
    $props = array(
    'description' => 'Article', 
); 
install_create_content_type('article', 'Article', $props); 
return array(); 
} 

Efectivamente, esto resuelve el problema la mayoría de versiones con bases de datos y código de Drupal. Lo usamos ampliamente Nos permite promocionar un nuevo código que cambia la configuración de la base de datos sin tener que volver a importar la base de datos o realizar cambios en vivo. Esto también significa que podemos probar adecuadamente las versiones sin temor a cambios ocultos en la base de datos.

Finalmente, cck y views admiten este enfoque. Ver este fragmento de código

// Enable CCK modules, add CCK types for Articles in prep for first stage of migration, 
// enable body for article, enable migration modules. 
function ec_update_6023() { 
    $ret = array(); 
    drupal_install_modules(array('content', 'content_copy', 'text', 'number', 'optionwidgets')); 
    install_include(array('content', 'content_copy')); 
    install_content_copy_import_from_file(drupal_get_path('module', 'ec') . '/' . 'article.type', 'article'); 
    $sql = "UPDATE {node_type} SET body_label='Body', has_body=1 
    WHERE type = 'article'"; 
    $ret[] = update_sql($sql); 
    return $ret; 
} 
Cuestiones relacionadas