Como implementar a Implantação Contínua em projetos Angular, API PHP e Ansible?

7

Estou trabalhando em um projeto Angular2 com o Yii2 (PHP / MySQL) como ponto de API. Precisamos implantar o aplicativo Angular em diferentes idiomas para diferentes clientes (usando a compilação AOT do angular-cli).

Qual é a melhor maneira de conseguir isso? Estou olhando para Docker ou Ansible (contêiner) para fazer isso funcionar. Mas os exemplos são principalmente para uma configuração 1: 1. Mas eu precisaria de 1: n, algo como:

deploy app-de new_costomer prod_server

Além disso, quando uma nova versão do aplicativo está disponível, desejo atualizar toda a rede com o novo aplicativo (que exige o upload dos scripts de migração src / pasta AOT compilados e de migração de banco de dados no lado Yii2).

Idealmente, ele faria algo como:

deploy update network-all prod_server

Alguma ideia?

Para esclarecer: Eu tenho vários clientes, cada cliente deve ter seu próprio contêiner (janela de encaixe, através do contêiner ansible). Há o material Angular compilado pela AOT (apenas JS) e o back-end do PHP com o MySQL.

Cada cliente obtém essa configuração em um servidor (portanto, 3 clientes = 3 contêineres de encaixe com o Angular + PHP + MySQL).

Enviamos atualizações para Angular e PHP com bastante frequência (ou seja, toda a pasta DIST precisa ser carregada ou, pelo menos, um diff, scripts de migração para o back-end PHP / MySQL precisa ser executado etc.).

E isso a partir de um comando (porque eu obviamente não quero ter SSH em cada contêiner para fazer tudo isso semi- manualmente).

Como nunca fiz esse tipo de configuração antes, gostaria de ter algumas idéias sobre como isso pode ser alcançado com coisas como Ansible (ou algo semelhante).

axtho
fonte
Não está muito claro o que você está pedindo. Parece que seu problema geral é a internacionalização. Isso geralmente é um problema de design de aplicativo, não um problema de implantação. Você pode implantar idiomas diferentes como contêineres separados, mas não tenho certeza de que seria a solução mais simples ou mais eficiente.
Dave Swersky
2
Parece uma pergunta copiada e colada de outro site, incluindo os links e ícones do SE em torno da pergunta. Corrija a formatação e deixe esta pergunta clara para entender e responder.
Evgeny
11
Hey @Evgeny, sim, foi copiado do meu post no Stackexchange, onde alguém comentou sobre isso e me disse para levá-lo aqui. Daí a duplicação. Eu atualizei o problema acima.
axtho
@axtho A postagem cruzada geralmente é desencorajada - você deve ter a postagem neste site ou no Stack Overflow, não as duas. É provavelmente por isso que sua pergunta não foi recebida muito bem.
Aurora0001
Melhor com a edição, não especifique "editar" olhando para a revisão, podemos saber o que foi adicionado e na fila de revisão as alterações são destacadas. votando para reabrir
Tensibai 03/03

Respostas:

7

Vamos supor que você tenha o seguinte cenário: Você tem muitos clientes, mas a maioria usa exatamente o mesmo aplicativo, exceto por algumas alterações na configuração. Você gostaria que cada um dos seus clientes recebesse o mais recente do aplicativo o mais rápido possível.

Se esse for o seu cenário, tente alterar tudo que precisa ser diferenciado entre os aplicativos. Você cria um (ou um conjunto de) contêineres de encaixe que podem lidar com qualquer um dos seus clientes com base na configuração que foi fornecida. No momento da implantação, você simplesmente fornece as configurações adequadas para esse contêiner para cada um de seus clientes.

O benefício dessa abordagem é que você não incorre em despesas gerais enormes quando chega um novo cliente. Você gera a configuração deles, cria os novos servidores, adiciona algumas entradas a um arquivo de inventário e, da próxima vez que implantar, ele também será acessado. Quanto mais o seu pipeline de CDs estiver configurado, mais você poderá automatizar qualquer um desses processos.

Então, como seria o fluxo geralmente:

  1. Você tem a base de código do aplicativo, que pode atender a todos os seus clientes
  2. Você cria o contêiner do docker para seu aplicativo (um para o front-end, outro para o back-end, possivelmente mais alguns de suporte)
  3. Você tem um script de implantação que usa um arquivo de configuração para determinar onde implantar e o quê.
  4. Você executa esse script de implantação. Ele examinará todos os seus clientes e simplesmente implantará a versão mais recente do seu aplicativo com a configuração apropriada.

Se você tem um novo cliente, o único local que precisa ser alterado é o arquivo de configuração de implantação. Se você estiver usando o ansible, provavelmente precisará alterar seu inventário e seu arquivo vars. Digamos que você tenha um novo cliente, que gostaria que o aplicativo fosse executado no idioma espanhol e tenha acesso aos recursos beta. A configuração deste cliente talvez tenha a seguinte aparência:

config.js:

SETTINGS = { locale: 'es', beta: true };

config.php:

define('CUSTOMER_LOCALE','es');
define('CUSTOMER_BETA','true');

Depois, verifique se, durante a implantação, seu contêiner obtém esses arquivos montados na inicialização.

SztupY
fonte
Obrigado. Isso é, principalmente, o que eu preciso e um bom ponto de partida. Por curiosidade: por que você sugeriria muitas imagens do docker para um cliente?
axtho
@axtho não obrigatória, apesar de ser geralmente uma boa prática para separar cada preocupação (interface, backend, base de dados, etc.) para um recipiente separado, para que eles possam ser implantados e dimensionado independentemente
SztupY