Antecedentes
Estoy trabajando en la creación de un nuevo proceso de desarrollo para un pequeño equipo web de aproximadamente 4 programadores y 4 diseñadores, con el evidente potencial de hacer crecer el equipo en el futuro. Nuestro producto es una aplicación central que impulsa sitios web de clientes que también diseñamos y alojamos.
Anteriormente, todos trabajábamos a través de FTP en un servidor de desarrollo, con una única base de datos de desarrollo. "Funcionó" * por un tiempo, pero nos estamos moviendo en una nueva dirección, por lo que es hora de madurar nuestro proceso.
Usamos Percona Server 5.5, pero esto debería ser independiente de la base de datos, con la idea de mantener los costos bajos.
Objetivos :
Estoy pensando en crear un proceso de integración continua (CI) para el desarrollo de bases de datos con lo siguiente en mente:
- Los desarrolladores tienen una copia local de datos para ejecutar el código de desarrollo en
- Capaz de revertir la estructura de la base de datos a un conjunto de cambios anterior
- Capaz de separar los nuevos cambios en el esquema de características frente a los cambios en el diseño del esquema
- Capaz de modificar la estructura de la base de datos localmente para probar
Concepto inicial
He esbozado un proceso a continuación usando SVN y LiquiBase, aunque se elimina por completo #4
.
- crear una rama de "desarrollo" desde el tronco
- el servidor de base de datos de 'desarrollo' se ejecuta fuera de la rama de 'desarrollo'
- Los desarrolladores locales se configuran como esclavos de la rama de desarrollo (se proporciona más
#1
arriba)- Los conjuntos de cambios de liquibase se comprometen regularmente con la rama de desarrollo, que ejecuta un enlace posterior al compromiso para actualizar la base de datos de desarrollo central (que se filtrará a las máquinas locales que se ejecutan como esclavos de este servidor de desarrollo) (liquibase proporciona más
#2
arriba)- cuando las características o las correcciones de esquema están listas para pasar al control de calidad, DBA (me) fusionará los cambios apropiados de la rama de desarrollo en el tronco. Este acto creará un script sql para aplicar a un servidor de base de datos provisional.
- El servidor de ensayo debe reflejar TRUNK, que debe tener la misma estructura que Production, más los cambios que se encuentran en QA
- después de ejecutar el script sql en el servidor de ensayo, realice un control de calidad en los cambios.
- Si todo se ve bien, etiqueta la estructura. Esto generará el script .sql para que el DBA lo ejecute en producción manualmente (para las horas de menor actividad si es necesario)
Este proceso requiere que todos los desarrolladores se ejecuten en la misma rama de "desarrollo", lo que significa que solo hay una versión del esquema de la base de datos en un momento dado (no estoy seguro de querer esto).
También significa que cualquier cambio en el esquema no puede probarse localmente y podría afectar a otros desarrolladores si no se hace correctamente. En nuestro entorno, los desarrolladores pueden agregar nuevas tablas pero rara vez modifican la estructura existente. Como DBA, las correcciones de diseño las hago yo. Pero la imposibilidad de probar las soluciones localmente es mi mayor problema del proceso.
¿Cómo se puede ajustar el proceso anterior para permitir el desarrollo local, mientras se mantiene una copia de datos relativamente actualizada (como lo proporciona la replicación en mi proceso propuesto)? No necesito que los datos estén actualizados hasta la última semana.
* Por 'trabajado', quiero decir que fue suficiente pero fue un PITA.