wake-up-neo.com

Jenkins - Abrufen der vollständigen Konsolenausgabe während des Erstellungsschritts

Ich habe das Internet seit Tagen durchsucht, ich habe ein ähnliches Problem wie this .

Ich muss die Konsolenausgabe in unformatiertem (einfachem) Text abrufen. Aber wenn ich es in HTML bekommen kann, ist das auch in Ordnung, ich kann es immer analysieren. Die einzige Sache ist, dass ich es während des Erstellungsschritts bekommen muss, was ein Problem ist, da der Ort, an dem es verfügbar sein sollte, abgeschnitten wird ...

Ich habe versucht, die Konsolenausgabe von den folgenden URLs (relativ zum Job) abzurufen:

  • /consoleText
  • /logText/progressiveText
  • /logText/progressiveHTML

Die beiden Texte sind einfacher Text und wären perfekt, wenn nicht für die Kürzung, das gleiche gilt für die HTML-Datei ... genau das, was ich brauche - nur die Kürzung ...

Ich bin mir sicher, dass es möglich ist, diese Informationen auf irgendeine Weise abzurufen, da beim Anzeigen von /consoleFull ein Echtzeit-Update der Konsole erfolgt, ohne dabei zu kürzen oder zu puffern.

Bei der Untersuchung dieser Webseite fand ich jedoch nicht den gewünschten Inhalt, sondern fand den Code dort, wo er hätte sein sollen (ich habe den vollständigen Seitencode nicht beigefügt, da er meistens irrelevant wäre und ich glaube, die Antwortenden wären in der Lage herausfinden und wissen, was da alleine sein sollte)

      new Ajax.Request(href,{
          method: "post",
          parameters: {"start":e.fetchedBytes},
        requestHeaders: headers,
          onComplete: function(rsp,_) {

          var stickToBottom = scroller.isSticking();
          var text = rsp.responseText;
          if(text!="") {
            var p = document.createElement("DIV");
            e.appendChild(p); // Needs to be first for IE
            // Use "outerHTML" for IE; workaround for:
            // http://www.quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html
            if (p.outerHTML) {
              p.outerHTML = '<pre>'+text+'</pre>';
              p = e.lastChild;
            }
            else p.innerHTML = text;
            Behaviour.applySubtree(p);
            if(stickToBottom) scroller.scrollToBottom();
          }

          e.fetchedBytes     = rsp.getResponseHeader("X-Text-Size");
          e.consoleAnnotator = rsp.getResponseHeader("X-ConsoleAnnotator");
            if(rsp.getResponseHeader("X-More-Data")=="true")
              setTimeout(function(){fetchNext(e,href);},1000);
          else
              $("spinner").style.display = "none";
          }
      });

Insbesondere hoffe ich, dass es einen Weg für mich gibt, den Inhalt von text abzurufen, was auch immer es ist. Ich bin mit dieser Sprache nicht vertraut und bin mir daher nicht sicher, wie ich den gewünschten Inhalt erhalten kann. Plugins helfen nicht, da ich diesen Inhalt abrufen möchte als Teil meines Skripts während des Erstellungsschritts

17
Inbar Rose

Sie haben schon ziemlich gute Nachforschungen angestellt. Ich kann nur Folgendes hinzufügen: Alle konsolenbezogenen Plug-Ins, die ich kenne, sind als Post-Build-Aktionen konzipiert. 

Das Log Trigger Plugin bietet eine Post-Build-Aktion, die Hudson .__ ermöglicht. Builds zum Durchsuchen des Konsolenprotokolls nach einem bestimmten regulären Ausdruck und Wenn gefunden, weitere nachgelagerte Jobs auslösen.

Anscheinend gibt es keine einfache Lösung für Ihr Problem. Ich kann die folgenden Optionen sehen:

1. Verwenden Sie tee oder etwas Ähnliches (gilt nur für Shell-Buildschritte)

Diese Lösung ist bei weitem nicht universell, bietet jedoch einen schnellen Zugriff auf die neueste Konsolenausgabe, die von einem Befehl oder Befehlssatz erzeugt wird. 

tee - Lesen von Standardeingaben und Schreiben in Standardausgabe und Dateien

Wenn Sie Synonyme auf der Systemebene verwenden, können andere Jenkins-Buildschritte geändert werden, um eine Konsolenausgabe zu erzeugen. Dateien mit Konsolenausgabe können über Jenkins oder auf andere Weise referenziert werden.

2. Jenkins-Code ändern

Sie können nur eine schnelle Korrektur für die interne Verwendung durchführen oder einen Patch mit spezifischen systemweiten Einstellungen bereitstellen. 

3. Verhalten von Mimic/Konsole

Code in Ihrem Beispiel wird verwendet, um Updates vom Jenkins-Server anzufordern. Wie zu erwarten, kann der Server Informationen mit einem gewissen Offset zurückgeben. Lass es mich zeigen.


Die Konsolenseite sendet regelmäßig Anfragen an den Server:

enter image description here


Parameter sind unkompliziert:

enter image description here


Response ist ein Teil der hinzuzufügenden Informationen:

enter image description here


Eine andere Anforderung mit aktualisiertem Offset-Wert (Startwert)

enter image description here


Sie können leicht verstehen, dass keine Daten vorliegen, indem Sie die Inhaltslänge analysieren.

enter image description here


Die Antwort lautet also: Verwenden Sie url/job-name/build-number/logText/progressiveHtml, geben Sie den Start-Offset an, senden Sie eine Anfrage und empfangen Sie ein Konsolen-Update.

19
Renat Gilmanov

Um einige Einblicke hinzuzufügen: Während der Jenkins-Build gerade lief, war die Antwort für die URL .../consoleText maximal 10000 Zeilen. Ich habe in Python das Paket "request ()" verwendet. Ich habe die gleiche URL mit curl ausprobiert und wieder nur die ersten 10K-Zeilen erhalten Nachdem der Build abgeschlossen ist, haben beide Methoden das vollständige Protokoll zurückgegeben (in meinem Fall> 22K-Zeilen).

Ich werde weiter recherchieren und hoffen, zurück zu berichten.

[2015-08-18] Update: Es scheint, dass dies ein bekanntes Problem ist ( siehe hier) und es wurde in Jenkins 1.618 und höher behoben. Ich arbeite immer noch mit 1.615, daher kann ich nicht überprüfen, ob Amir

1
Amir Katz

Ich hatte ein ähnliches Problem. Der letzte Teil meines Jenkinsfile-Build-Skripts muss das ConsoleLog auf bestimmte Fehlernachrichten analysieren, um einen E-Mail-Build-Bericht zu erstellen. 

Erster Versuch: http-Anfrage.
Es fühlte sich wie ein Hack an, es funktionierte meistens, aber es kam zu Problemen, als wir den Zugriff auf den Jenkins-Server blockierten und meine Build-Knoten keine Annon-http-Aufrufe mehr auf der Seite ausführen konnten

Zweiter Versuch: Verwenden Sie die APIs, um die Protokollzeilen aufzulisten.
Es fühlte sich an, als wäre es das Richtige, aber es schlug schrecklich fehl, da meine Knoten 30 Minuten brauchen würden, um die 100-Megabyte-Protokolldateien zu durchlaufen. Meine Vermutung ist, dass der Jenkins-Server die Datei nicht im Cache gespeichert hat. Daher musste bei jeder Anforderung die gesamte Datei bis zum letzten Lesevorgang erneut gelesen werden.

Dritte und erfolgreichste Lösung: Führen Sie grep auf dem Server aus. 

node('master') {  
  sh 'grep some_criteria $JENKINS_HOME/workspace/path/to/job/console.log'  
}

es war schnell, zuverlässig und es war egal, wie groß die Protokolldateien waren.

Ja, dies erforderte das Vertrauen des Jenkins-Administrators und die Kenntnis der Verzeichnispfade auf dem Jenkins-Server - aber da ich Administrator war, vertraute ich darauf, das Richtige zu tun. Ihre Laufleistung kann variieren.

0
Jason De Arte