如何使用Jenkins部署Spring Boot Maven应用程序?

时间:2015-02-13 12:51:45

标签: maven tomcat jenkins spring-boot microservices

我有一个Spring Boot应用程序,它运行在嵌入式Tomcat servlet容器mvn spring-boot:run上。而且我不想将项目作为单独的战争部署到独立的Tomcat。

每当我将代码推送到BitBucket / Github时,钩子就会运行并触发Jenkins作业(在Amazon EC2上运行)来部署应用程序。

Jenkins作业有一个构建后操作:mvn spring-boot:run,问题是当构建操作完成后作业挂起。

应该有另一种方法来做到这一点。任何帮助将不胜感激。

5 个答案:

答案 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服务的所有者:

  1. 以root用户身份登录服务器。
  2. 运行sudo visudo
  3. 在最后添加“jenkins ALL =(ALL)NOPASSWD:ALL”(jenkins =你的Jenkins用户)
  4. 登录Jenkins并选择您的工作并单击以配置
  5. 在“发布后步骤”
  6. 中选择“执行外壳”
  7. 复制并粘贴此内容:
  8.    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)

nohupat 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