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.
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 (Nohup
ing) 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'
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
Je suppose que vous avez un utilisateur Jenkins sur le serveur et que cet utilisateur est le propriétaire du service Jenkins:
Sudo visudo
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.
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 .