2016-05-23 8 views
10

Ich möchte Jenkins Console Output als Post-Build-Schritt in demselben Job aufrufen und grep, der diese Ausgabe erstellt. Das Umleiten von Protokollen mit >> log.txt ist keine Lösung, da dies von meinen Build-Schritten nicht unterstützt wird.Jenkins "Console Output" Protokollspeicherort im Dateisystem

Körperbau:

echo "This is log" 

Beitrag Build-Schritt:

grep "is" path/to/console_output 

Wo ist die spezifische Protokolldatei im Dateisystem erstellt?

Antwort

16

@Bruno Lavit hat eine große Antwort, aber wenn Sie möchten, können nur das Protokoll zugreifen und sie als txt-Datei in Ihrem Arbeitsbereich von der URL des Job herunterladen:

${BUILD_URL}/consoleText 

Dann ist es nur eine Frage der Seite Download auf Ihren ${Workspace}

  • Sie verwenden können „Invoke ANT“ und verwenden Sie die GET Ziel
  • Unter Linux können Sie wget verwenden Sie es zu Ihrem Arbeitsbereich
  • usw.

Viel Glück zum Download!

Edit: Die tatsächliche Protokolldatei im Dateisystem befindet sich nicht auf dem Slave, aber in der Master-Maschine. Sie finden es unter: $JENKINS_HOME/jobs/$JOB_NAME/builds/lastSuccessfulBuild/log

Wenn Sie nach einem anderen Build suchen, ersetzen Sie einfach lastSuccessfulBuild mit dem Build, den Sie suchen.

+0

In der Vergangenheit habe ich die von @ Dvir669 vorgeschlagene Lösung ausprobiert, und der Befehl wget konnte nicht das vollständige Konsolenprotokoll abrufen. Deshalb habe ich die in meiner Lösung beschriebene Methode verwendet. Wenn Sie also an Ihrem Build-Protokoll in einer Post-Build-Schrittaktion arbeiten möchten, ist meine Lösung besser (denke ich). –

+0

Das scheitert bei meinem Jenkins, weil der Ordner nur 'lastSuccessful' heißt. Aber während ein Build ausgeführt wird, ist "lastSuccessful" ein früherer erfolgreicher Build, nicht der aktuelle Build. Der aktuelle Build wird nur dann zum letzten erfolgreichen, wenn er erfolgreich abgeschlossen wurde. –

+0

Dies schlägt auch fehl, wenn sich der Build-Job in einem Ordner befindet. JOB_NAME enthält nicht die Zwischenordner '/ jobs /', die in einem Ordner vorhanden sind. –

6

Sie können dieses Jenkins Console log Plugin installieren, um das Protokoll in Ihrem Arbeitsbereich als Post-Build-Schritt zu schreiben.

Sie müssen build the plugin yourself und install the plugin manually.

Als Nächstes können Sie einen Postbuildschritt wie das hinzufügen:

enter image description here

Mit einem zusätzlichen Beitrag Build-Schritt (Shell-Skript), können Sie Ihre Log-grep.

Ich hoffe, es :) half

+0

Es scheint jedoch wie ein kleines Plugin, ich denke immer noch, dass es ohne zusätzliche Installationen erreicht werden könnte. Es muss einen Weg geben, dass dieses Plugin eine Konsolenausgabe erhält. Aber wie und von wo? – Sayid

+0

Ich habe versucht, dieses Plugin zu installieren, habe zip in hpi geändert und versucht, von der erweiterten Option in Manage-Plugins hochzuladen, aber es gibt einen Fehler. Ein Problem ist bei der Verarbeitung der Anfrage aufgetreten. Bitte schauen Sie in unserem Bug Tracker nach, ob ein ähnliches Problem bereits gemeldet wurde. Wenn es bereits gemeldet wird, stimmen Sie bitte ab und geben Sie einen Kommentar ab, damit wir die Auswirkungen des Problems einschätzen können. Wenn Sie der Meinung sind, dass dies ein neues Problem ist, reichen Sie ein neues Problem ein. Wenn Sie ein Problem einreichen, stellen Sie sicher, dass Sie den gesamten Stack-Trace zusammen mit der Version von Jenkins und den entsprechenden Plugins hinzufügen. –

+0

@Sweety Haben Sie das Plugin vor dem Hochladen aus dem erweiterten Bereich erstellt? Sie müssen die Quelle von Github bekommen, dieses Plugin erstellen und die hpi-Datei hochladen. Es gibt einen Link zum Erstellen eines Jenkins-Plugins in meinem ursprünglichen Post. –

5

Jenkins speichert den Konsolen-Log-On-Master. Wenn Sie einen programmgesteuerten Zugriff auf das Protokoll wünschen und auf Master ausgeführt werden, können Sie auf das Protokoll zugreifen, das Jenkins bereits besitzt, ohne es in die Artefakte zu kopieren oder die HTTP-Job-URL abzurufen.

Von http://javadoc.jenkins.io/archive/jenkins-1.651/hudson/model/Run.html#getLogFile() gibt dies das Dateiobjekt für die Konsolenausgabe zurück (im jenkins-Dateisystem ist dies die "log" -Datei im Build-Ausgabeverzeichnis).

In meinem Fall verwenden wir einen verketteten (untergeordneten) Job zum Parsen und Analysieren des Builds eines übergeordneten Jobs.

Wenn Sie ein grooviges Skript in Jenkins verwenden, erhalten Sie ein Objekt namens "build" für den Lauf.Wir verwenden dies, um den http://javadoc.jenkins.io/archive/jenkins-1.651/hudson/model/Build.html für den Upstream-Job zu erhalten, und rufen dann die .getLogFile() -Aufgabe dieses Jobs auf.

Zusätzlicher Bonus; Da es sich nur um ein File-Objekt handelt, rufen wir .getParent() auf, um den Ordner zu erhalten, in dem Jenkins Build-Collaterals speichert (wie test xmls, Umgebungsvariablen und andere Dinge, die nicht explizit durch die Artefakte verfügbar gemacht werden), die wir auch analysieren können.

Doppelter Zusatzbonus; Wir verwenden auch Matrix-Jobs. Dies führt manchmal dazu, dass der Dateipfad auf dem System als ein Problem interpretiert wird. .getLogFile(). getParent() nimmt alle Schmerzen weg.

1

fand ich die Konsolenausgabe meiner Arbeit im Browser an folgenden Stelle:

http://[Jenkins URL]/job/[Job Name]/default/[Build Number]/console

2

Dieses für den Einsatz, wenn Sie einen Shell-Skript Build-Schritt haben. Verwenden Sie nur die ersten beiden Zeilen, um den Dateinamen zu erhalten.

Sie können die Konsolenprotokolldatei (mit bash Magie) für den aktuellen Build von einem Shell-Skript auf diese Weise erhalten und es für einige Fehlerzeichenfolge überprüfen, um den Job versagt, wenn gefunden:

logFilename=${JENKINS_HOME}/${JOB_URL:${#JENKINS_URL}} 
logFilename=${logFilename//job\//jobs\/}builds/${BUILD_NUMBER}/log 

grep "**Failure**" ${logFilename} ; exitCode=$? 
[[ $exitCode -ne 1 ]] && exit 1 

Sie müssen Erstellen Sie den Dateinamen, indem Sie JOB_URL abziehen, den führenden Hostnamen entfernen, den Pfad zu JENKINS_HOME hinzufügen, "/ job /" zu "/ jobs /" hinzufügen, um alle verschachtelten Ordner zu bearbeiten, die aktuelle Buildnummer und die Datei hinzufügen Name.

Das grep gibt 0 zurück, wenn die Zeichenfolge gefunden wird, und 2, wenn ein Dateifehler vorliegt. Eine 1 bedeutet also, dass die Fehleranzeige gefunden wurde. Das schlägt den Build fehl.

Verwandte Themen