Tenemos un comando de tejido Python que se ejecuta en paralelo en varios hosts, algo como esto:
$ fab --hosts=prod1.server,prod2.server,prod3.server --parallel copy_cache
Esto copiará el caché a los servidores de producción listados en paralelo. Hay varios registros que ocurren durante todo el proceso para indicar qué tan avanzado estamos, ya que puede tomar horas para los directorios de caché XXgig. Dado que la copia se realiza simultáneamente, la salida cuando se ejecuta en la línea de comando vuelve a entrelazarse en tiempo real, así:
[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.
Sin embargo, cuando la tarea se ejecuta a través de Jenkins, la salida de la consola no se muestra hasta que todas las tareas se realizan porque Jenkins agrupa la salida DESPUÉS de que los hilos se unen cuando todos los hilos están completos. Entonces, una vez que todos los comandos están completos, la salida se ve así:
[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.
Si bien esto es más legible, no es ideal porque nos gustaría realizar un seguimiento del estado del proceso leyendo la salida de la consola en tiempo real. Tenga en cuenta que cuando este comando de estructura se ejecuta sin la --parallel
opción, la salida de la consola se produce en tiempo real , sin embargo, obviamente, esto no es viable porque el proceso en serie tarda mucho más en ejecutarse.
No he podido encontrar una configuración en Jenkins que deshabilite esta agrupación de hilos. ¿Alguien tiene alguna idea?
VarChar
broiled Charcoal Black - ¿Qué tan satisfecho está con que Superuser.com le ayude a responder esta pregunta? ¿Todavía necesitas atención adicional? Quizás hay más opciones que podemos explorar para usted. Podría considerar cambiar el título a algo más atractivo para llamar la atención, por ejemplo, como una táctica de pensamiento rápido que podría aplicar; ¿Cuál es el daño al intentarlo?
PYTHONUNBUFFERED=1 && fab ...
ayuda un poco al mostrar cada servidor a medida que se completa en lugar de esperar a que todos se completen. Sin embargo, todavía me gustaría encontrar una solución completamente en tiempo real.