Nous avons une commande de structure Python qui s'exécute en parallèle sur plusieurs hôtes, quelque chose comme ceci:
$ fab --hosts=prod1.server,prod2.server,prod3.server --parallel copy_cache
Cela copiera le cache sur les serveurs de production répertoriés en parallèle. Il existe divers enregistrements qui se produisent tout au long du processus pour indiquer à quel point nous en sommes, car cela peut prendre des heures pour les répertoires de cache XXgig. Étant donné que la copie se produit simultanément, la sortie lorsqu'elle est exécutée sur la ligne de commande revient entrelacée en temps réel, comme suit:
[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.
Cependant, lorsque la tâche est exécutée via Jenkins, la sortie de la console ne s'affiche que lorsque toutes les tâches sont terminées car Jenkins regroupe la sortie APRÈS que les threads soient joints lorsque tous les threads sont terminés. Ainsi, une fois toutes les commandes terminées, la sortie ressemble à ceci:
[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.
Bien que cela soit plus lisible, ce n'est pas idéal car nous aimerions garder une trace de l'état du processus en lisant la sortie de la console en temps réel. Notez que lorsque cette commande Fabric est exécutée sans l' --parallel
option, la sortie de la console se produit en temps réel , mais cela n'est évidemment pas réalisable car le processus série prend beaucoup plus de temps à s'exécuter.
Je n'ai pas pu trouver un paramètre dans Jenkins qui désactivera ce regroupement de threads. Quelqu'un a-t-il une idée?
VarChar
broiled Charcoal Black - Dans quelle mesure êtes-vous satisfait de l'aide apportée par Superuser.com pour répondre à cette question? Avez-vous encore besoin d'une attention supplémentaire? Il y a peut-être d'autres options que nous pouvons explorer pour vous. Vous pourriez envisager de changer le titre en quelque chose de plus attrayant pour attirer l'attention, par exemple comme une tactique de réflexion rapide que vous pourriez appliquer; quel est le mal à essayer.
PYTHONUNBUFFERED=1 && fab ...
aide un peu en montrant chaque serveur comme il se termine au lieu d'attendre que tout se termine. J'aimerais toujours trouver une solution complètement en temps réel.