Como criar servidores de temporariedade para várias ramificações git?

8

Eu tenho que criar um novo processo de preparação para o nosso desenvolvimento e teste.

A qualquer momento, há apenas cerca de 4 ramos git sendo desenvolvidos e testados ativamente. Em cada ramificação git, pode haver scripts de evolução do banco de dados (SQL direto) que devem ser executados, bem como scripts de evolução do back-end para processamento mais pesado (essencialmente, essas são rotas HTTP que devem ser chamadas no aplicativo usando credenciais de administrador que executam o banco de dados migrações e outras alterações que seriam muito difíceis / impossíveis de script nos scripts simples de evolução SQL mencionados anteriormente).

Nosso banco de dados ao vivo tem tamanho moderado ~ 4,2 GB. Temos um novo servidor Dell PowerEdge que está pronto para ser configurado e está à minha disposição.

Gostaria de receber conselhos sobre as seguintes perguntas, bem como saber como o DevOps mais experiente abordaria isso:

  1. Como posso executar várias ramificações diferentes no servidor intermediário? Essas ramificações são exibidas e desaparecem frequentemente à medida que passam no controle de qualidade, são mescladas no mestre e são liberadas.

  2. Como eu configuraria o sistema de evolução do banco de dados para garantir que ele sempre tenha o banco de dados apropriado para cada filial? Cada ramificação pode fazer modificações no banco de dados de maneiras diferentes que não são necessariamente compatíveis entre si até serem mescladas.

  3. Como mantenho essas ramificações atualizadas? Existe uma maneira de puxar automaticamente confirmações em cada ramificação?

Gostaria muito de mais informações, pois estou um pouco perdido sobre como configurar tudo isso. O fluxo de trabalho atual é difícil para todos os envolvidos: os desenvolvedores têm uma cópia local completamente isolada do aplicativo em execução localmente e o controle de qualidade tem de três a quatro laptops em rotação que atuam como seus "servidores" temporários.

max1221
fonte
Talvez considere a integração contínua (verdadeira) - desenvolvimento baseado em tronco? Todo o pesadelo da ramificação desapareceria, todos estariam na mesma página, etc ... Mais simples, mais rápido, melhor.
Dan Cornilescu
Você está usando ou considerou uma ferramenta de versão de banco de dados? releasemanagement.org/2016/02/database-version-control-tools
mghicks

Respostas:

7

1) Como posso executar várias ramificações diferentes no servidor intermediário?

Docker

2) Como eu configuraria o sistema de evolução do banco de dados para garantir que ele sempre tenha o banco de dados apropriado para cada filial?

Isso depende de quanto você espera que seu banco de dados seja dimensionado. Você pode ficar muito louco com métodos para clonar dados do banco de dados, mas normalmente deseja uma cópia principal que não altera até que seu código seja lançado em produção - e mantenha bons backups quando fizer isso. Embora sua infraestrutura possa ser imutável e descartável, seus dados não são. Você só pode emular a disponibilidade com seus dados. 4,2 GB realmente não é muito para copiar. Você pode criar um script para gerar uma nova instância de banco de dados para que cada build opere e depois descartá-lo quando o teste for concluído.

3) Como mantenho essas ramificações atualizadas? Existe uma maneira de puxar automaticamente confirmações em cada ramificação?

Você pode considerar o uso de algo como git hooks para acionar uma compilação, forçar uma verificação de código ou começar a gerar um contêiner e clonar seu banco de dados. Você pode fazer uma chamada de API para um sistema de automação de construção como o Jenkins e / ou usá-lo para iniciar um sistema de gerenciamento de configuração como Puppet, Chef, Salt Stack, Ansible ou qualquer outra coisa. Seria mais um puxão automático do que um empurrão automático.

Pela redação da sua pergunta, fica claro que você está pensando em uma infraestrutura mutável, mas considere usar implantações de teste imutáveis .

James Shewey
fonte
2

Eu diria que isso não é realmente sobre servidores de teste. Um servidor de temporariedade imita o ambiente de produção e é para onde a liberação ocorre imediatamente antes da produção. Uma ramificação de recurso que não foi mesclada no mestre não será liberada diretamente para produção, portanto, não deve ser executada em um servidor intermediário.

Se reformularmos a pergunta como sendo sobre servidores de desenvolvimento compartilhados, você encontrará mais recursos à medida que pesquisa. Como você notou, o compartilhamento de recursos de desenvolvimento como esse causa vários problemas; portanto, talvez seja melhor concentrar-se na solução do problema subjacente: por que é difícil para todos os envolvidos nesse processo executar um servidor de desenvolvimento em seu local? máquina?


Agora, às vezes a situação é que você realmente precisa ter esses servidores compartilhados. Se você analisou e determinou o que realmente faz , existem várias técnicas que você pode adotar para simplificar o processo.

Como posso executar várias ramificações diferentes no servidor intermediário? Essas ramificações são exibidas e desaparecem frequentemente à medida que passam no controle de qualidade, são mescladas no mestre e são liberadas.

Uma das maneiras mais fáceis é usar parte da URL para alternar qual ramificação de código é executada (essa alteração faz parte do motivo pelo qual esse não é um ambiente de armazenamento temporário apropriado). Eu fiz isso no passado com um DNS curinga (para que qualquer foo.our-dev-domain.comredirecionasse para o mesmo servidor) e o código de roteamento carregado /our/release/directory/foono caminho de inclusão.

Você também pode ter um comando (usando algo como Ansible) que adiciona a configuração necessária para uma ramificação, conforme necessário. Isso provavelmente faria parte do processo de implantação, sobre o qual falarei em um minuto.

Como eu configuraria o sistema de evolução do banco de dados para garantir que ele sempre tenha o banco de dados apropriado para cada filial? Cada ramificação pode fazer modificações no banco de dados de maneiras diferentes que não são necessariamente compatíveis entre si até serem mescladas.

A coisa mais fácil a fazer é apenas viver com ela e incentivar as pessoas a ter galhos de vida curta.

Outra abordagem é usar o código de roteamento dinâmico para alternar para cópias separadas do banco de dados (em termos de RDBMS, um "banco de dados") com base no nome da ramificação.

Como mantenho essas ramificações atualizadas? Existe uma maneira de puxar automaticamente confirmações em cada ramificação?

Você pode empurrar ou puxar. Por exemplo:

  • pull - configure um trabalho cron que faça um git pull(ou provavelmente um a git fetche a git reset --hard) a cada poucos minutos
  • push - configure um webhook que é acionado por push e um pequeno serviço web na máquina que ouve e atualiza os repositórios conforme necessário
  • push - solicita que os desenvolvedores executem explicitamente um comando deploy para atualizar suas ramificações no servidor

Converse com seus usuários primeiro e reúna os requisitos para ver o que eles querem (eles podem não gostar de atualizar automaticamente enquanto estão testando algo), e isso informará sua decisão.


Mas novamente:

Os desenvolvedores têm uma cópia local completamente isolada do aplicativo em execução localmente e o controle de qualidade tem de três a quatro laptops em rotação que atuam como seus "servidores" temporários

O problema parece ser que o controle de qualidade gira laptops compartilhados em vez de apenas verificar uma ramificação específica da mesma maneira que os desenvolvedores.

Xiong Chiamiov
fonte
1

É isso que o gitlab faz melhor: considere mudar para o gitlab, configurar um cluster kube e implantar automaticamente. Isso implantará cada filial em um URL exclusivo para teste.

Danny Goossen
fonte