Fundo
Estou trabalhando na criação de um novo processo de desenvolvimento para uma pequena equipe web de cerca de 4 programadores e 4 designers, com o óbvio potencial de crescimento da equipe no futuro. Nosso produto é um aplicativo central que alimenta sites de clientes que também projetamos e hospedamos.
Anteriormente, todos trabalhávamos via FTP em um servidor de desenvolvimento, com um único banco de dados de desenvolvimento. "Funcionou" * por um tempo, mas estamos caminhando para uma nova direção, então é hora de amadurecer nosso processo.
Usamos o Percona Server 5.5, mas deve ser independente do banco de dados, com a ideia de manter os custos baixos.
Objetivos :
Estou pensando em criar um processo de integração contínua (CI) para desenvolvimento de banco de dados com o seguinte em mente:
- Os desenvolvedores têm uma cópia local dos dados para executar o código de desenvolvimento
- Capaz de reverter a estrutura do banco de dados para um conjunto de alterações anterior
- Capaz de separar novas alterações de esquema de recurso versus alterações de correção de design de esquema
- Capaz de modificar a estrutura do banco de dados localmente para teste
Conceito inicial
Esbocei um processo abaixo usando SVN e LiquiBase, embora remova completamente #4
.
- crie uma ramificação de 'desenvolvimento' a partir do tronco
- servidor db 'desenvolvimento' central é executado fora do ramo 'desenvolvimento'
- desenvolvedores locais são configurados como escravos para o ramo de desenvolvimento (fornece
#1
acima)- Os conjuntos de alterações do liquibase são confirmados regularmente no ramo de desenvolvimento, que executa um gancho pós-confirmação para atualizar o banco de dados de desenvolvimento central (que será transferido para as máquinas locais executando como escravos para este servidor de desenvolvimento) (o liquibase fornece
#2
acima)- quando os recursos ou correções de esquema estiverem prontos para ir para o controle de qualidade, o DBA (eu) mesclará as alterações apropriadas da ramificação de desenvolvimento no tronco. Este ato criará um script sql para aplicar a um servidor de banco de dados temporário.
- O servidor Staging deve refletir o TRUNK, que deve ter a mesma estrutura da Produção, mais as alterações que estão no QA
- depois de executar o script sql no servidor de teste, faça algum controle de qualidade nas alterações.
- Se tudo parecer bom, MARQUE a estrutura. Isso irá gerar o script .sql para ser executado em produção manualmente pelo DBA (para horários fora de pico, se necessário)
Esse processo requer que todos os desenvolvedores executem a mesma ramificação de 'desenvolvimento', o que significa que há apenas uma versão do esquema do banco de dados a qualquer momento (não tenho certeza se quero isso).
Isso também significa que quaisquer alterações no esquema não podem ser testadas localmente e podem afetar outros desenvolvedores se não forem feitas corretamente. Em nosso ambiente, os desenvolvedores podem adicionar novas tabelas, mas raramente modificam a estrutura existente. Como DBA, as correções de design são feitas por mim. Mas a incapacidade de testar as correções localmente é meu maior problema no processo.
Como o processo acima pode ser ajustado para permitir o desenvolvimento local, mantendo uma cópia relativamente atualizada dos dados (conforme fornecido pela replicação em meu processo proposto)? Não exijo que os dados estejam atualizados até a última semana.
* Por 'funcionou', quero dizer que bastou, mas foi um PITA.