De tempos em tempos, isso ocorre em várias de nossas equipes de desenvolvimento, sem que tenhamos descoberto o caminho "certo":
Usamos muitos aplicativos da Web baseados em reação que "compilam" em sites estáticos que são apenas alguns arquivos html, js e css.
No entanto, a "construção" desses aplicativos utiliza várias variáveis que ativam / desativam sinalizadores de recursos, configuram URLs de back-end etc. Isso significa que não podemos "construir" um binário no sentido tradicional e apenas aplicar um arquivo de configuração no deploy- time - o "build" em si precisa ter essas variáveis específicas do ambiente definidas e, portanto, o único momento em que podemos "build" é no momento da implantação.
Por enquanto, resolvemos isso injetando as variáveis de ambiente necessárias no contêiner do Docker e executamos um cmd inicial ao longo das linhas de
npm build && nginx run
Isso tem algumas desvantagens:
- O processo de compilação requer muita CPU / memória em relação aos requisitos de tempo de execução do contêiner. Isso significa que precisamos escalar o contêiner para o processo de compilação em vez dos requisitos de tempo de execução - o que parece errado
- Falhas de construção são difíceis de "rastrear". Podemos usar verificações de saúde no Kubernetes, mas se uma compilação levar 2 minutos, ainda temos que esperar 3 minutos (1 extra por segurança) antes de começarmos a testar o ponto de extremidade de verificação de saúde do contêiner para ver se está vivo.
- As implantações podem demorar muito: se configurarmos o Kubernetes para fazer uma implantação "serial", ele iniciará cada pod e aguardará o período "initialDelay" de 2 a 3 minutos antes de iniciar o próximo. Isso significa que observamos facilmente um tempo de implantação de 10 minutos se a implantação for dimensionada para 3-4 pods.
Tudo isso me parece muito abaixo do ideal. Eu ficaria muito interessado em saber como a comunidade resolve o dilema "compilar no momento da implantação" com os modernos aplicativos javascript.
Percebo que, para o Kubernetes, poderíamos usar "init-containers" que executam a construção, colocar os artiacts em armazenamento persistente e fazer com que os contêineres de aplicativos simplesmente retirassem do armazenamento persistente durante a inicialização, mas isso ainda parece mais "contornar" o problema do que resolvendo o problema raiz.
npm build
é apenas um comando arbitrário. Pode ser react build
ou o sanity build
que a estrutura JS espera. Somos forçados a fazê-lo na implantação de contêineres, porque é quando conhecemos o ambiente build
.
npm build
em tempo de execução e não durante a construção do contêiner?