Как развернуть приложение SpringBoot Maven с Jenkins?

У меня есть приложение загрузки Spring, которое выполняется на встроенном контейнере сервлетов Tomcat mvn spring-boot:run. И я не хочу разворачивать проект как отдельную войну на автономный Tomcat.

Всякий раз, когда я нажимаю код на BitBucket/Github, крючок запускает и запускает работу Jenkins (работает на Amazon EC2) для развертывания приложения.

У задания Jenkins есть действие post post: mvn spring-boot:run, проблема в том, что работа зависает, когда действие post build завершено.

Должен быть другой способ сделать это. Любая помощь будет оценена.

Ответы

Ответ 1

Проблема в том, что Jenkins не справляется с тем, что процесс генерации дочернего процесса от создания очень хорошо. Обходное решение, предложенное @Steve в комментарии (nohup ing), не изменило поведение в моем случае, но простым обходным путем было запланировать запуск приложения с помощью команды at unix:

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

Таким образом, Дженкинс успешно завершает работу без тайм-аута.


Если вы закончите запуск приложения из файла .jar через java -jar app.jar, помните, что Boot breaks, если файл .jar перезаписан, вы будете перед копированием артефакта необходимо убедиться, что приложение остановлено. Если вы используете ApplicationPidListener, вы можете убедиться, что приложение запущено (и остановить его, если оно есть), добавив выполнение этой команды:

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

Ответ 2

Мне очень полезно сначала скопировать артефакты в указанную область на сервере, чтобы отслеживать развернутые артефакты, а не запускать приложение из папки заданий jenkins. Затем создайте там файл журнала сервера и начните прослушивать его в окне jenkins до запуска сервера.

Для этого я разработал небольшую оболочку script, которую вы можете найти здесь

Вы также найдете небольшую статью, объясняющую, как настроить проект на jenkins.

Пожалуйста, дайте мне знать, если сработаете для вас. Thnaks

Ответ 3

Я предполагаю, что у вас есть пользователь Jenkins на сервере, и этот пользователь является владельцем Jenkins-сервиса:

  • Войдите в систему на сервере как пользователь root.
  • run sudo visudo
  • добавить "jenkins ALL = (ALL) NOPASSWD: ALL" в конце (jenkins = ваш пользователь Jenkins)
  • Войдите в Jenkins и выберите свои задания и нажмите, чтобы настроить
  • Выберите "Выполнить оболочку" в разделе "Шаг после сборки"
  • Скопируйте и вставьте это:
   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

Сохраните и запустите свое задание, служба должна запуститься автоматически.

Ответ 4

nohup и at now + 1 minutes не работали для меня. Поскольку Дженкинс убивал процесс, закрученный в фоновом режиме, я гарантировал, что процесс не будет убит, установив поддельный BUILD_ID на эту задачу Дженкинса. Это то, что выглядит задача оболочки Jenkins Execute:

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

Как обсуждалось здесь.