Jenkins sortie de la console pas en temps réel
Assez nouveau pour Jenkins et j'ai pourtant simple problème gênant. Quand j'ai exécuter le travail (Build) sur Jenkins, je suis le déclenchement de ruby commande à exécuter mon script de test.
Problème est Jenkins n'est pas de l'affichage de sortie en temps réel à partir de la console. Voici déclencher journal.
Building in workspace /var/lib/jenkins/workspace/foo_bar
No emails were triggered.
[foo_bar] $ /bin/sh -xe /tmp/hudson4042436272524123595.sh
+ ruby /var/lib/jenkins/test-script.rb
Fondamentalement, il se bloque sur cette sortie jusqu'à ce build est terminée, qu'il montre à pleine puissance. La chose drôle est que ce n'est pas un comportement cohérent, parfois, il fonctionne comme il se doit. Mais la plupart du temps il n'y a pas de réel temps de sortie de la console.
Jenkins version: 1.461
- Quel est le serveur que vous exécutez sur et combien de temps ce script pour exécuter? Cela sonne comme de retard dû à une surcharge du serveur à moi. J'ai vu des symptômes similaires lorsque mon Jenkins master est en cours d'exécution à pleine capacité.
- Merci pour les intérêts, qui fait réellement sens. Dans ce cas, nous parlons d'instance EC2
small
, aws.amazon.com/ec2/instance-types mais c'est seulement processus en cours d'exécution. Pourrait-il être vous avez besoin de plus que cela? - Il dépend du nombre de tâches en cours d'exécution, mais oui, je m'attends à voir de retard si vous avez plus de quelques travaux en cours d'exécution sur une petite instance simultanément.
- J'ai un problème similaire, cependant, la machine est plus spec'd et sous-utilisés. Également en cours d'exécution d'un script python à l'extérieur de jenkins fonctionne en temps réel comme prévu.Le travail appelle un script python qui queues le fichier de log d'un autre processus. Le fichier de log des mises à jour en temps réel, le jenkins sortie est déversé dans les blocs comme si il est en attente pour remplir un tampon.
- Salut Craig, vous étiez en droit de mise en mémoire tampon de sortie a été un problème. À l'aide de
STDOUT.sync=true
résolu le problème. - J'ai le même défi avec maven. La sortie d'un maven appel n'est rincé, une fois l'appel terminé. Quelqu'un d'autre a cette?
Vous devez vous connecter pour publier un commentaire.
Afin de clarifier certaines réponses.
ruby
oupython
ou n'importe quelle langage de script sera le tampon de sortie; c'est dans le but de minimiser les IO; l'écriture sur le disque est lent, l'écriture de la console est lent...flush()
'ed automatiquement après que vous avez suffisamment de données dans la mémoire tampon avec un traitement spécial pour les retours à la ligne. par exemple, l'écriture d'une chaîne sans saut de ligne puissleep()
ne serait pas écrire quoi que ce soit jusqu'à ce que après lasleep()
est terminée (je suis seulement en utilisantsleep
comme un exemple, libre à vous de remplacer avec un autre cher appel système).par exemple, ce serait d'attendre 8 secondes, l'impression d'une ligne, d'attendre plus de 5 secondes, l'impression d'une deuxième ligne.
pour
ruby
,STDOUT.sync = true
, tourne laautoflush
sur; toutes les écritures àSTDOUT
sont suivis parflush()
. Cela permettrait de résoudre votre problème, mais le résultat en plus de IO.pour
python
, vous pouvez utiliserpython -u
ou la variable d'environnementPYTHONUNBUFFERED
de fairestdin/stdout/stout
pas de mise en mémoire tampon, mais il y a d'autres solutions qui ne changent passtdin
oustderr
pour
perl
, vous avezautoflush
Assurez-vous que votre script est de rinçage stdout, stderr.
Dans mon cas, j'ai eu un polissage problème similaire à ce que vous décrivez, mais j'ai été en utilisant python.
Le python code suivant résolu pour moi:
Je ne suis pas un code Ruby mais google révèle les éléments suivants:
STDOUT.flush
ou$stdout.flush
fonctionne. Le problème, c'est que vous aurez besoin de mettre beaucoup de ces commandes auge le script pour vider tampon en cas de besoin. Je vais poster la solution qui couvre l'essentiel synchronisés tampon de chasse à la sortie.Il me semble que
python -u
fonctionne aussi bien.E. g. Dans la commande de traitement par lots
Solution la plus simple ici est d'activer la synchronisation de la mémoire tampon de sortie. Quelque chose que @Craig l'a écrit dans sa réponse, mais une solution en ligne qui permettra de couvrir l'ensemble du script, et vous demande pas de vous rincer tampon de nombreuses fois.
Il suffit d'écrire
La logique derrière est simple, pour éviter d'utiliser des opérations d'e /s à de nombreuses reprises de sortie est mis en mémoire tampon. Pour désactiver cette utilisation
C'est Ruby solution de l'ofc.
Les uns des autres réponses est spécifique à un programme ou à un autre, mais j'ai trouvé une manière plus générale la solution ici:
https://unix.stackexchange.com/a/25378
Vous pouvez utiliser
stdbuf
de modifier la mise en mémoire tampon le comportement de n'importe quel programme.Dans mon cas, j'ai été la tuyauterie de sortie à partir d'un script shell par
tee
etgrep
pour séparer les lignes en soit la console ou d'un fichier basé sur le contenu. La console a été la pendaison comme décrit par l'OP. Cette résolu:Finalement, j'ai découvert que je pouvais seulement passer
--line-buffered
de grep pour le même résultat:Les autres réponses sont correctes, en disant que vous avez besoin pour assurer la sortie standard n'est pas mis en mémoire tampon.
L'autre chose à prendre en compte est que Jenkins lui-même ne fait ligne par ligne de mise en mémoire tampon. Si vous avez un lent processus en cours d'exécution qui émet de caractères simples (par exemple, une suite de test nunit résumé qui imprime une
.
pour la réussite d'un test et d'unE
pour une erreur), vous ne verrez rien jusqu'à la fin de la ligne.[Vrai pour mon Jenkins 1.572 en cours d'exécution sur une machine Windows.]
Pour certaines commandes, y compris
tee
un le meilleur choix pour unbuffering est un programme appeléannuler les tampons
deattendre
paquet.Exemple d'utilisation:
au lieu de
somecommand | tee /some/path
ne
somecommand | unbuffer -p tee /some/path
Sources et plus d'infos:
Le Système d'Exploitation est mise en mémoire tampon de sortie de données par la nature, afin d'économiser du CPU, et donc ne Jenkins.
Dirait que vous êtes à l'aide d'une commande shell pour exécuter votre script Ruby -
Je vous conseille d'exécuter votre script Ruby directement via le plugin:
Jenkins Ruby Plugin
(peut-être besoin de l'installer)
Python tamponnée sa sortie de traces et de l'imprimer à la fin de script afin de minimiser l'écriture sur la console comme l'écriture dans la console est lente.
Vous pouvez utiliser la commande suivante après vos traces. Il sera effacé toutes les traces de la console, qui sont en file d'attente avant que la commande.