Wie starte, teste und beende ich einen HTTP-Server mit Jenkins?

9

Ich arbeite an einem Team, das einen RESTful-HTTP-Service erstellt. Wir haben Probleme beim Einrichten eines Jenkins-CI-Jobs, der den Dienst erstellt, im Hintergrund ausführt, einige Tests ausführt und dann die Server beendet.

Besonderheiten

  • Der Server ist in Node.js unter Verwendung des hapi-Frameworks gebaut und hat einige Komponententests, die in mocha geschrieben sind.
  • Die Tests werden in Java mit Maven geschrieben. (Warum nicht node.js-basierte Tests? Weil unsere Testabteilung Zeit in die Erstellung eines Java-basierten REST-Test-Frameworks investiert hat.)
  • Der Build sollte fehlschlagen, wenn die knotenbasierten Komponententests fehlschlagen oder die Java-Tests fehlschlagen.
  • Unsere Jenkins-Box wird von einem Support-Team an anderer Stelle im Unternehmen betrieben. Unsere Builds laufen auf einem Linux-Slave.

Aktueller Versuch

Wir haben etwas, das gerade jetzt funktioniert, aber es ist unzuverlässig. Wir verwenden 3 Build-Schritte:

Der erste Build-Schritt ist ein Execute Shell -Schritt mit den folgenden Befehlen:

%Vor%

Zweitens machen wir einen Invoke Maven 3 -Schritt, der auf den Test pom.xml zeigt.

Und drittens führen wir Invoke Standalone Sonar Analysis aus, um statische Code-Analysen durchzuführen.

Das funktioniert meistens, aber wir sind auf Jenkins ProcessTreeKiller angewiesen, um die Dienste nach Abschluss des Jobs zu stoppen . Wir erhalten immer die Warnungen: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+buildfor more information

Leider gab es Fälle, in denen der Dienst zu früh beendet wurde (bevor die Tests abgeschlossen wurden) oder der Dienst überhaupt nicht beendet wurde (wodurch nachfolgende Builds fehlschlagen, weil der Port bereits verwendet wird).

Also brauchen wir etwas zuverlässiger.

Fehlgeschlagener Versuch

Wir haben versucht, ein einzelnes Shell-Skript zu erstellen, das das Starten des Dienstes, das Ausführen von maven, das Beenden des Dienstes und die Ausgabe eines Beendigungscodes behandelt. Dies hat jedoch nicht funktioniert, da der Befehl mvn in der Befehlszeile nicht verfügbar war. Unsere Jenkins hat mehrere Maven-Versionen (und auch jdks) verfügbar und ich weiß nicht, wo sie auf den Sklaven leben oder wie man sie erreicht, ohne den Invoke Maven 3 Build-Schritt zu benutzen.

Ideen

Wir haben mit einigen Ideen herumgespielt, um dieses Problem zu lösen, aber wir hoffen, einige Hinweise von anderen zu bekommen, die ähnliche Probleme mit Jenkins gelöst haben könnten.

  1. Lassen Sie den Dienst nach einiger Zeit automatisch beenden. Problem ist herauszufinden, wie lange man sie laufen lassen kann.
  2. Fügen Sie einen Build-Schritt hinzu, um die Dienste zu beenden, nachdem wir fertig sind. Problem ist, dass wenn die Ausführung des Maven fehlschlägt, nachfolgende Schritte nicht ausgeführt werden. (Und wenn wir sagen, dass maven Testfehler ignorieren soll, wird der Build nicht als fehlerhaft angezeigt, wenn sie fehlschlagen.)
  3. Versuchen Sie, einen vorhandenen Dienstprozess als ersten und letzten Schritt des Builds zu beenden. Das Problem ist, dass andere Teams auch diese Jenkins-Slaves benutzen, also müssen wir sicherstellen, dass der Dienst beendet wird, wenn wir mit unserem Build fertig sind.
  4. Starten und stoppen Sie die node.js-Dienste über Maven und machen Sie so etwas wie diesen Blog schlägt vor . Das Problem ist, dass wir nicht wissen, ob Jenkins die erzeugte Hintergrund-Aufgabe als "durchgesickerten Datei-Deskriptor" identifizieren und sie töten wird, bevor wir mit dem Testen fertig sind.

Es wäre schön, wenn Jenkins eine "Post-Build-Aktion" hätte, mit der Sie ein Bereinigungsskript ausführen könnten. Oder wenn es einen Erstellungsschritt "Hintergrundprozess ausführen" hatte, der die Hintergrundelemente am Ende des Builds beenden würde. Aber ich kann nichts dergleichen finden.

Hat jemand es geschafft, Jenkins dazu zu bringen, etwas Entferntes so zu machen?

    
Allan 15.04.2014, 19:57
quelle

1 Antwort

2

Brainstorming:

  • Sie können Jenkins ProcessTreeKiller entweder global oder per Aufruf deaktivieren. Ich bin mir nicht sicher, warum das keine Option für dich ist.

  • Als Antwort auf # 2, mehrere Optionen:

    1. Post-Build-Aktionen werden ausgeführt, unabhängig davon, ob die Build-Schritte fehlgeschlagen sind oder nicht. Dies wäre ein guter Weg, um eine "Service Cleanup" -Aufgabe auszulösen, die unabhängig vom Build-Status ausgeführt wird.
    2. Sie können jeden Build-Schritt als Post-Build-Aktion einrichten, indem Sie Any verwenden Build Step Plugin, oder Sie können Post Build Tasks verwenden , bietet das letztere sogar Optionen zum Definieren von Auslösekriterien.
  • Sie können den Build-Status basierend auf RegEx-Kriterien mit Text ändern -Finder-Plugin

  • Sie können Bedingte Build-Schritte . Die "Bedingung" könnte sogar ein Ergebnis einer Skriptausführung sein

Slav 17.04.2014, 13:47
quelle

Tags und Links