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

How to deploy SpringBoot Maven application with Jenkins ?

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

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

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

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

问题是 Jenkins doesn't handle spawning child process from builds very well。 @Steve 在评论中建议的解决方法 (nohuping) 并没有改变我的行为,但一个简单的解决方法是 schedule 应用程序开始使用 at unix 命令:

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

这样 Jenkins 就成功完成了作业,没有超时。


如果您通过 java -jar app.jar.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'

我发现首先将工件复制到服务器上的指定区域以跟踪部署的工件而不是从 jenkins 作业文件夹启动应用程序非常有用。然后在那里创建一个服务器日志文件并开始在 jenkins 上收听它 window 直到服务器启动。

为此,我开发了一个小 shell 脚本,您可以找到 here

您还会找到一篇小文章,解释如何在 jenkins 上配置项目。

如果对您有用,请告诉我。特纳克斯

我假设您在服务器上有一个 Jenkins 用户,并且这个用户是 Jenkins 服务的所有者:

  1. 以 root 身份登录服务器。
  2. 运行 sudo visudo
  3. 在末尾添加 "jenkins ALL=(ALL) NOPASSWD:ALL"(jenkins=你的 Jenkins 用户)
  4. 登录 Jenkins 并选择您的作业并点击配置
  5. 在 "Post build step"
  6. 中选择 "Execute Shell"
  7. 复制并粘贴:
   service=myapp
   if ps ax | grep -v grep | grep -v [=10=] | 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

保存并运行您的作业,服务应该会自动启动。

nohupat now + 1 minutes 对我不起作用。 由于 Jenkins 正在终止在后台旋转的进程,我通过为该 Jenkins 任务设置一个假的 BUILD_ID 来确保该进程不会被终止。这是 Jenkins 执行 shell 任务的样子:

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

正如所讨论的 here

这对我在 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