2015-02-13 18 views
14

Ich habe eine Spring Boot-Anwendung, die auf eingebetteten Tomcat Servlet-Container mvn spring-boot:run ausgeführt wird. Und ich möchte das Projekt nicht als separaten Krieg zu Standalone Tomcat bereitstellen.Wie SpringBoot Maven-Anwendung mit Jenkins bereitstellen?

Immer, wenn ich Code zu BitBucket/Github push, läuft ein Hook und löst Jenkins Job (läuft auf Amazon EC2), um die Anwendung bereitzustellen.

Der Jenkins-Job hat eine Post-Build-Aktion: mvn spring-boot:run, das Problem ist, dass der Job hängt, wenn Post-Build-Aktion abgeschlossen ist.

Es sollte einen anderen Weg geben, dies zu tun. Jede Hilfe wäre willkommen.

+0

Wenn das alles ist, was Sie ausführen, dann wird es hängen. Es hört sich so an, als müsste man nur 'nohup' verwenden, um es als Hintergrundprozess zu verwenden. – Steve

+0

Warum führen Sie Ihre Anwendung von der Quelle über Maven anstatt 'java -jar' das verpackte Artefakt ein? – kryger

+0

@kryger Ich werde die laufende Methode so bald wie möglich ändern. Auf diese Weise sollte der alte Prozess (eingebettete Tomcat-Instanz) entfernt werden, um den neuen bereitzustellen. Ich sollte es eleganter machen. – azizunsal

Antwort

17

Das Problem ist, dass Jenkins doesn't handle spawning child process from builds very well. Umgehung von @Steve im Kommentar vorgeschlagen (nohup ing) nicht das Verhalten in meinem Fall ändern, aber eine einfache Abhilfe war Zeitplan Start der App unter Verwendung des at Unix-Befehl:

> echo "mvn spring-boot:run" | at now + 1 minutes 

Auf diese Weise Jenkins Schließt den Job ohne Zeitüberschreitung erfolgreich ab.


Wenn Sie Ihre Anwendung von einer .jar Datei über java -jar app.jar bewusst sein, laufen am Ende, dass Boot breaks if the .jar file is overwritten, werden Sie die Anwendung vornehmen müssen sicherstellen, dass vor dem Kopieren das Artefakt gestoppt wird. Wenn Sie ApplicationPidListener verwenden können Sie überprüfen, ob die Anwendung ausgeführt wird (und es zu stoppen, wenn es) durch die Ausführung dieses Befehls fügt hinzu:

> test -f application.pid && xargs kill < application.pid || echo 'App was not running, nothing to stop' 
+2

'echo" mvn Spring-Boot: run "| jetzt (ohne die 1 Minute Verspätung) funktioniert auch gut in meinem Fall. – Abdull

+0

@Abdull, das hängt wahrscheinlich von der Version von Unix ab; Unter Ubuntu würde "jetzt" um 00 Sekunden der aktuellen Minute (d. h. potenziell sogar in der Vergangenheit) einplanen. Ich habe gerade 'jetzt + 1 Minuten' auf einem Mac probiert und beklagt, dass" Pluralisierung falsch ist ": - | – kryger

+0

Sie müssen installieren (es. Sudo apt-get install at) –

4

finde ich sehr nützlich, zuerst die Artefakte zu einem bestimmten Bereich kopieren auf Der Server überwacht die bereitgestellten Artefakte und startet die Anwendung nicht aus dem jenkins-Auftragsordner. Erstellen Sie dann eine Server-Protokolldatei und beginnen Sie, diese im jenkins-Fenster abzurufen, bis der Server gestartet wurde.

zu tun, dass ich einen kleinen Shell-Skript entwickelt, die Sie here

Sie finden auch einen kleinen Artikel erklärt, wie zu konfigurieren, um das Projekt auf jenkins finden.

Bitte lassen Sie mich wissen, wenn für Sie gearbeitet. Thnaks

2

Ich gehe davon aus haben Sie einen Jenkins-Benutzer auf dem Server und dieser Benutzer ist der Besitzer des Jenkins-Service:

  1. Anmeldung auf dem Server als root an.
  2. Lauf sudo visudo
  3. add "jenkins ALL = (ALL) NOPASSWD: ALLE" am Ende (jenkins = Ihre Jenkins-user)
  4. Einloggen in Jenkins und Ihre Jobs wählen und
  5. konfigurieren klicken Sie auf Auswählen "Execute Shell" in dem "Post Build-Schritt"
  6. Kopieren und einfügen:
service=myapp 
    if ps ax | grep -v grep | grep -v $0 | grep $service > /dev/null 
    then 
     sudo service myapp stop 
     sudo unlink /etc/init.d/myapp 
     sudo chmod +x /path/to/your/myapp.jar 
     sudo ln -s /path/to/your/myapp.jar /etc/init.d/myapp 
     sudo service myapp start 
    else 
     sudo chmod +x /path/to/your/myapp.jar 
     sudo ln -s /path/to/your/myapp.jar /etc/init.d/myapp 
     sudo service myapp start 
    fi 

speichern und Ihre Arbeit ausführen, sollte der Dienst automatisch gestartet.

1

Die nohup und die at now + 1 minutes funktionierten nicht für mich. Da Jenkins den im Hintergrund gesponnenen Prozess beendete, stellte ich sicher, dass der Prozess nicht beendet wurde, indem eine falsche BUILD_ID für diese Jenkins-Aufgabe festgelegt wurde. Dies ist, was die Jenkins Shell Aufgabe ausführen wie folgt aussieht:

BUILD_ID=do_not_kill_me 
java -jar -Dserver.port=8053 /root/Deployments/my_application.war & 
exit 

Wie here diskutiert.