Как развернуть приложение 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
Как обсуждалось здесь.