web-dev-qa-db-fra.com

Comment déployer l'application Spring Boot Maven avec Jenkins?

J'ai une application Spring Boot qui s'exécute sur le conteneur de servlets Tomcat intégré, mvn spring-boot:run. Et je ne veux pas déployer le projet en tant que guerre séparée à Tomcat autonome. 

Chaque fois que j'expédie du code vers BitBucket/Github, un hook s'exécute et déclenche le travail Jenkins (exécuté sur Amazon EC2) pour déployer l'application. 

Le travail Jenkins a une action de post-génération: mvn spring-boot:run, le problème est que le travail se bloque lorsque l'action de post-génération est terminée. 

Il devrait y avoir un autre moyen de le faire. Toute aide serait appréciée.

17
azizunsal

Le problème est que Jenkins ne gère pas très bien le processus de génération d’enfants . La solution suggérée par @Steve dans le commentaire (Nohuping) n'a pas modifié le comportement dans mon cas, mais une solution simple consistait à démarrer schedule app à l'aide de la commande at unix:

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

De cette façon, Jenkins termine le travail avec succès sans dépasser le délai imparti.


Si vous finissez par exécuter votre application à partir d'un fichier .jar via Java -jar app.jar, sachez que Le démarrage est rompu si le fichier .jar est écrasé , vous devez vous assurer que l'application est arrêtée avant de copier l'artefact. Si vous utilisez ApplicationPidListener, vous pouvez vérifier que l'application est en cours d'exécution (et l'arrêter si c'est le cas) en ajoutant l'exécution de cette commande:

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

Je trouve très utile de copier d’abord les artefacts dans une zone spécifiée du serveur pour garder une trace des artefacts déployés et non pour démarrer l’application à partir du dossier de travail Jenkins. Créez ensuite un fichier journal du serveur et commencez à l’écouter dans la fenêtre Jenkins jusqu’à ce que le serveur démarre.

Pour ce faire, j'ai développé un petit script Shell que vous pouvez trouver ici

Vous trouverez également un petit article expliquant comment configurer le projet sur Jenkins.

S'il vous plaît laissez-moi savoir si travaillé pour vous. Thnaks

5
Rogerio Coli

Je suppose que vous avez un utilisateur Jenkins sur le serveur et que cet utilisateur est le propriétaire du service Jenkins:

  1. connectez-vous sur le serveur en tant que root.
  2. exécuter Sudo visudo
  3. ajoute "jenkins ALL = (ALL) NOPASSWD: ALL" à la fin (jenkins = votre utilisateur Jenkins)
  4. Connectez-vous à Jenkins et choisissez vos emplois, puis cliquez pour le configurer.
  5. Choisissez "Exécuter Shell" dans la "Étape de construction"
  6. Copier et coller ceci:
   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

Enregistrez et exécutez votre travail, le service doit démarrer automatiquement.

2
Anatole Nkwadjo

La Nohup et le at now + 1 minutes ne fonctionnaient pas pour moi… .. Puisque Jenkins était en train de tuer le processus en arrière-plan, j'ai veillé à ce que le processus ne soit pas tué en définissant un faux BUILD_ID pour cette tâche Jenkins. Voici à quoi ressemble la tâche Jenkins Execute Shell:

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

Comme discuté ici .

1
Sujay Anjankar