我有一个Spring Boot应用程序,它运行在嵌入式Tomcat servlet容器mvn spring-boot:run
上。我不想将该项目作为独立的战争部署到独立的Tomcat。
每当我将代码推送到BitBucket/Github时,就会运行一个钩子并触发Jenkins作业(在AmazonEC2上运行)来部署应用程序。
Jenkins作业有一个构建后操作:mvn spring-boot:run
,问题是当构建后操作完成时,作业挂起。
应该有另一种方法来做到这一点。如有任何帮助,我们将不胜感激。
问题是Jenkins不能很好地处理构建的派生子进程。@Steve在评论中建议的解决方法(nohup
ing)并没有改变我的行为,但一个简单的解决方法是使用at
unix命令安排应用程序的启动:
> echo "mvn spring-boot:run" | at now + 1 minutes
这样,詹金斯成功地完成了这项工作,没有超时。
如果您最终通过java -jar app.jar
从.jar
文件运行应用程序,请注意,如果.jar文件被覆盖,则Boot会中断,您需要确保在复制工件之前停止应用程序。如果您使用ApplicationPidListener
,您可以通过添加以下命令的执行来验证应用程序是否正在运行(如果正在运行,则停止它):
> test -f application.pid && xargs kill < application.pid || echo 'App was not running, nothing to stop'
我发现首先将工件复制到服务器上的指定区域非常有用,以跟踪部署的工件,而不是从jenkins作业文件夹启动应用程序。然后在那里创建一个服务器日志文件,并开始在jenkins窗口上侦听它,直到服务器启动。
为了做到这一点,我开发了一个小外壳脚本,你可以在这里找到
您还会发现一篇小文章,解释如何在jenkins上配置项目。
如果对你有用,请告诉我。Thnaks
nohup
和at now + 1 minutes
对我不起作用。由于Jenkins正在杀死后台旋转的进程,我通过为Jenkins任务设置一个假BUILD_ID来确保进程不会被杀死。这就是Jenkins Execute shell任务的样子:
BUILD_ID=do_not_kill_me
java -jar -Dserver.port=8053 /root/Deployments/my_application.war &
exit
正如这里所讨论的。
我假设服务器上有一个Jenkins用户,这个用户是Jenkins服务的所有者:
- 以root用户身份登录服务器
- 运行
sudo visudo
- 在末尾添加"jenkinsALL=(ALL)NOPASSWD:ALL"(jenkins=您的jenkins用户)
- 登录Jenkins并选择您的工作,然后单击进行配置
- 在"后期构建步骤"中选择"执行Shell"
- 复制并粘贴此:
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
保存并运行您的作业,服务应自动启动。
这对我在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上没有进程,它将打印消息并继续。
确保at
已安装在您的linux机器上。你可以使用
sudo apt-get install at
安装at