Wir haben einen Python-Fabric-Befehl, der parallel auf mehreren Hosts ausgeführt wird.
$ fab --hosts=prod1.server,prod2.server,prod3.server --parallel copy_cache
Dadurch wird der Cache auf die parallel aufgelisteten Produktionsserver kopiert. Während des gesamten Vorgangs werden verschiedene Protokollierungen durchgeführt, um anzuzeigen, wie weit wir sind, da es Stunden dauern kann, bis die XXgig-Cache-Verzeichnisse verfügbar sind. Da gleichzeitig kopiert wird, wird die Ausgabe in der Befehlszeile interlaced in Echtzeit wie folgt zurückgegeben:
[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.
Wenn die Aufgabe jedoch über Jenkins ausgeführt wird, wird die Konsolenausgabe erst angezeigt, wenn alle Aufgaben erledigt sind, da Jenkins die Ausgabe nach dem Zusammenführen der Threads gruppiert, wenn alle Threads abgeschlossen sind. Sobald alle Befehle abgeschlossen sind, sieht die Ausgabe folgendermaßen aus:
[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.
Dies ist zwar besser lesbar, aber nicht ideal, da wir den Status des Prozesses verfolgen möchten, indem wir die Konsolenausgabe in Echtzeit lesen. Beachten Sie, dass die Konsolenausgabe in Echtzeit erfolgt , wenn dieser Fabric-Befehl ohne die --parallel
Option ausgeführt wird. Dies ist jedoch offensichtlich nicht möglich, da die Ausführung des seriellen Prozesses viel länger dauert.
Ich konnte in Jenkins keine Einstellung finden, die diese Thread-Gruppierung deaktiviert. Hat jemand irgendwelche Ideen?
VarChar
broiled Charcoal Black - Wie zufrieden sind Sie mit der Unterstützung von Superuser.com bei der Beantwortung dieser Frage? Benötigen Sie noch zusätzliche Aufmerksamkeit? Vielleicht gibt es noch weitere Möglichkeiten, die wir für Sie erkunden können. Sie könnten in Erwägung ziehen, den Titel in einen attraktiveren Titel zu ändern, um die Aufmerksamkeit auf sich zu ziehen. Was schadet es, es zu versuchen?
PYTHONUNBUFFERED=1 && fab ...
hilft ein wenig, indem jeder Server beim Abschluss angezeigt wird, anstatt auf den Abschluss aller Server zu warten. Möchte trotzdem eine komplett Echtzeitlösung finden.