25

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

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

Jenkins 作业有一个 post build action: mvn spring-boot:run,问题是 post build action 完成后作业挂起。

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

4

5 回答 5

22

问题是 Jenkins不能很好地处理生成的子进程。@Steve 在评论 ( nohuping) 中建议的解决方法并没有改变我的行为,但一个简单的解决方法是使用unix 命令安排应用程序的启动:at

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

这样 Jenkins 就成功地完成了工作而不会超时。


如果您最终从.jar文件运行应用程序,请java -jar app.jar注意如果 .jar 文件被覆盖,则引导中断,您需要确保在复制工件之前停止应用程序。如果您正在使用ApplicationPidListener,您可以通过添加以下命令的执行来验证应用程序是否正在运行(如果是,则停止它):

> test -f application.pid && xargs kill < application.pid || echo 'App was not running, nothing to stop'
于 2015-02-13T14:24:17.890 回答
5

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

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

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

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

于 2015-09-11T20:57:52.723 回答
3

nohupat 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

正如这里所讨论的。

于 2017-04-06T09:21:58.527 回答
2

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

  1. 以 root 身份登录服务器。
  2. sudo visudo
  3. 最后添加“jenkins ALL =(ALL)NOPASSWD:ALL”(jenkins =您的Jenkins用户)
  4. 登录 Jenkins 并选择您的工作并点击配置
  5. 在“构建后步骤”中选择“执行 Shell”
  6. 复制并粘贴这个:
   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

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

于 2016-11-23T23:30:36.830 回答
1

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

于 2019-05-31T18:40:44.580 回答