Temos um comando de malha Python que é executado em paralelo em vários hosts, algo como isto:
$ fab --hosts=prod1.server,prod2.server,prod3.server --parallel copy_cache
Isso copiará o cache para os servidores de produção listados em paralelo. Existem vários registros que ocorrem ao longo do processo para indicar quanto tempo estamos, pois pode levar horas para os diretórios de cache do XXgig. Como a cópia está ocorrendo simultaneamente, a saída, quando executada na linha de comando, volta entrelaçada em tempo real, da seguinte forma:
[prod1.server] Executing task 'nginx_cache_copy'
[prod2.server] Executing task 'nginx_cache_copy'
[prod3.server] Executing task 'nginx_cache_copy'
2014-09-16 10:02:29.688243
[prod1.server] INFO: rsyncing cache dir
[prod1.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:29.716345
[prod2.server] INFO: rsyncing cache dir
[prod2.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:29.853275
[prod3.server] INFO: rsyncing cache dir
[prod3.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:29.984154
[prod1.server] INFO: Reloading nginx config
[prod1.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.025155
[prod2.server] INFO: Reloading nginx config
[prod2.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.100169
[prod1.server] SUCCESS: CACHE COPY COMPLETE
2014-09-16 10:02:30.181938
[prod2.server] SUCCESS: CACHE COPY COMPLETE
2014-09-16 10:02:30.331402
[prod3.server] INFO: Reloading nginx config
[prod3.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.559271
[prod3.server] SUCCESS: CACHE COPY COMPLETE
Done.
No entanto, quando a tarefa é executada no Jenkins, a saída do console não é exibida até que todas as tarefas sejam concluídas porque o Jenkins agrupa a saída APÓS os segmentos serem unidos quando todos os segmentos estiverem concluídos. Assim, quando todos os comandos estiverem concluídos, a saída será assim:
[prod1.server] Executing task 'nginx_cache_copy'
2014-09-16 10:02:29.688243
[prod1.server] INFO: rsyncing cache dir
[prod1.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:29.984154
[prod1.server] INFO: Reloading nginx config
[prod1.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.100169
[prod1.server] SUCCESS: CACHE COPY COMPLETE
[prod2.server] Executing task 'nginx_cache_copy'
2014-09-16 10:02:29.716345
[prod2.server] INFO: rsyncing cache dir
[prod2.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:30.025155
[prod2.server] INFO: Reloading nginx config
[prod2.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.181938
[prod2.server] SUCCESS: CACHE COPY COMPLETE
[prod3.server] Executing task 'nginx_cache_copy'
2014-09-16 10:02:29.853275
[prod3.server] INFO: rsyncing cache dir
[prod3.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:30.331402
[prod3.server] INFO: Reloading nginx config
[prod3.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.559271
[prod3.server] SUCCESS: CACHE COPY COMPLETE
Done.
Embora isso seja mais legível, não é o ideal, porque gostaríamos de acompanhar o estado do processo lendo a saída do console em tempo real. Observe que, quando esse comando de malha é executado sem a --parallel
opção, a saída do console ocorre em tempo real , no entanto, obviamente, isso não é viável porque o processo serial leva muito mais tempo para ser executado.
Não consegui encontrar uma configuração no Jenkins que desabilite esse agrupamento de threads. Alguém tem alguma idéia?
VarChar
Charcoal Black - Qual é o seu grau de satisfação com o Superuser.com, ajudando a fornecer uma resposta a esta pergunta? Você ainda precisa de atenção adicional? Talvez haja outras opções que possamos explorar para você. Você pode mudar o título para algo mais atraente para chamar a atenção, por exemplo, como uma tática de raciocínio rápido que você poderia aplicar; qual é o mal em tentar?
PYTHONUNBUFFERED=1 && fab ...
ajuda um pouco, mostrando cada servidor conforme ele é concluído, em vez de esperar que todos sejam concluídos. Ainda assim, gostaria de encontrar uma solução completamente em tempo real.