Problemas quando rodar static content deploy com EFS
E este artigo é mais um artigo sobre como o Magento 2 pode ser irritante e como ele não foi feito para rodar de forma escalável.
Bom, estamos vendo vários errors quendo rodando o static content deploy com a opção --jobs:
magento setup:static-content:deploy --jobs 5
A opção --jobs foi feita para que vários temas sejam processados em paralelo. Se você colocar 5 jobs, irá processar 5 temas em paralelo.
No momento cada loja tem somente um tema sendo usado, mas eles dependem no tema base personalizado e também no tema Magento Blank. Quando você roda o comando sem a opção --jobs o Magento vai processar o tema blank, depois processa o tema base personalizado e finalmente o seu tema personalizado.
Mas se você tiver vários temas ou até somente um no EFS, a rede pode ser um bottleneck, assim como o EFS que é lento já que é tudo feito via conexão NFS, então não será tão rápido como fazer o deploy em um SSD local e é justamente ao adicionar a opção --jobs ajuda no deploy do conteúdo estático. Mas se você tiver vários arquivos para cada tema pode demorar vários minutos e você receberá este erro:
In Queue.php line 366:
Error while waiting for package deployed: 42; Status: 0
setup:static-content:deploy [-f|--force] [-s|--strategy [STRATEGY]] [-a|--area [AREA]] [--exclude-area [EXCLUDE-AREA]] [-t|--theme [THEME]] [--exclude-theme [EXCLUDE-THEME]] [-l|--language [LANGUAGE]] [--exclude-language [EXCLUDE-LANGUAGE]] [-j|--jobs [JOBS]] [--symlink-locale] [--content-version CONTENT-VERSION] [--refresh-content-version-only] [--no-javascript] [--no-css] [--no-less] [--no-images] [--no-fonts] [--no-html] [--no-misc] [--no-html-minify] [--] [<languages>...]
Até existe um issue aberto no repositório do Magento 2 e eu adicionei um comentário lá: https://github.com/magento/magento2/issues/21852
O problema pode ser causado por este código: https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/Deploy/Process/Queue.php#L391
E a função responsável pelo timeout: https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/Deploy/Process/Queue.php#L372
E tudo isso aponta para a const DEFAULT_MAX_EXEC_TIME = 400;
https://github.com/magento/magento2/blob/2.3-develop/app/code/Magento/Deploy/Process/Queue.php#L32
Então se o static content deploy roda por mais de 400 segundos, ele irá falhar. Mas o Magento consertou a ferramenta ECE deles adicionando uma opção para aumentar o timeout: https://github.com/magento/ece-tools/pull/418
Mas no momento o problema não foi corrigido no Magento Open Source ou Commerce Edition.
Então o que você pode fazer: Bom, no momento estamos colocando a informação do tema para cada loja em um microservice e quando há um deploy de código nós pegamos a informação do microservice e fazemos o deploy somente do tema associado à loja. Então por exemplo o tema MageBR/mytheme associado à sua loja poderia rodar assim:
magento setup:static-content:deploy --theme MageBR/mytheme
Desta forma irá acelerar o deploy do conteúdo estático e não aparecer erros.
Deploy using quick strategy
frontend/Magento/blank/en_US 2456/2456 ============================ 100% % 1 min
frontend/MageBR/base/en_US 2765/2765 ============================ 100% % 2 mins
frontend/MageBR/mytheme/en_US 2765/2765 ============================ 100% % 2 mins
Execution time: 483.77401208878
Mas seria muito melhor se puder rodar o comando com a opção --jobs para acelerar ainda mais o processo. Você pode fazer um teste adicionando a opção --jobs com a opção --theme e se não demorar muito o deploy, não haverá problema, mas seria uma boa ótimo ter uma opção para aumentar o timeout diretamente na linha de comand.
Espero que tenha gostado do artigo, deixe seu comentário e não se esqueça de compartilhar!