我有一个Spring Boot应用程序,它运行在嵌入式Tomcat servlet容器mvn spring-boot:run
上。而且我不想将项目作为单独的战争部署到独立的Tomcat。
每当我将代码推送到BitBucket / Github时,钩子就会运行并触发Jenkins作业(在Amazon EC2上运行)来部署应用程序。
Jenkins作业有一个构建后操作:mvn spring-boot:run
,问题是当构建操作完成后作业挂起。
应该有另一种方法来做到这一点。任何帮助将不胜感激。
答案 0 :(得分:18)
问题在于詹金斯doesn't handle spawning child process from builds very well。 @Steve在评论(nohup
ing)中建议的解决方法并没有改变我的情况,但一个简单的解决方法是计划应用程序的使用开始at
unix命令:
> echo "mvn spring-boot:run" | at now + 1 minutes
这样Jenkins成功完成了这项工作而没有超时。
如果您最终通过.jar
文件通过java -jar app.jar
运行您的应用程序,请注意Boot breaks if the .jar file is overwritten,在复制工件之前,您需要确保应用程序已停止。如果您正在使用ApplicationPidListener
,则可以通过添加此命令的执行来验证应用程序是否正在运行(如果存在则将其停止):
> test -f application.pid && xargs kill < application.pid || echo 'App was not running, nothing to stop'
答案 1 :(得分:5)
我发现将工件首先复制到服务器上的指定区域以跟踪已部署的工件并且不从jenkins作业文件夹启动应用程序非常有用。然后在那里创建一个服务器日志文件,并开始在jenkins窗口上监听它,直到服务器启动。
为此,我开发了一个小shell脚本,您可以找到here
您还会找到一篇小文章,解释如何在jenkins上配置项目。
如果有效,请告诉我。 Thnaks
答案 2 :(得分:2)
我假设您在服务器上有一个Jenkins用户,而该用户是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
保存并运行您的作业,该服务应自动启动。
答案 3 :(得分:1)
nohup
和at now + 1 minutes
对我不起作用。
由于Jenkins正在杀死在后台运行的进程,因此我确保通过将伪BUILD_ID设置为Jenkins任务来杀死进程。这就是Jenkins Execute shell任务的样子:
BUILD_ID=do_not_kill_me
java -jar -Dserver.port=8053 /root/Deployments/my_application.war &
exit
正如here所述。
答案 4 :(得分:0)
这对我在Linux机器上的jenkins起作用
kill -9 $(lsof -t -i:8080) || echo "Process was not running."
mvn clean compile
echo "mvn spring-boot:run" | at now + 1 minutes
如果8080上没有任何处理,它将打印消息并继续。
确保在您的Linux机器上安装了at
。您可以使用
sudo apt-get install at
要安装at