Jenkins windows本地远程部署SpringBoot项目到服务器

3 篇文章 0 订阅
3 篇文章 0 订阅

最近公司使用的Jenkin自动部署的项目,Jenkins介绍就不多讲了。安装配置等一大堆,网上很多

运行Jenkins后,安装插件:

Publish Over SSH用于连接远程服务器

Deploy to container插件用于把打包的应用发布到远程服务器

点击系统管理,选择插件管理

我这里已经安装了,所以没显示,如果没安装的会显示。然后直接安装

配置环境(JDK/MAVEN/GIT/DOCKER等):

系统设置==》全局工具设置

配置SSH:

如果安装了Publish Over SSH插件,会显示以下配置,图一和图二配置:

注意部分信息需要点击配置右下角有个高级按钮

Passphrase                服务器的密码(必须)

Path to key                  连接远程服务器密钥文件的路径

Key                             密钥文件的内容 

Name                         自定义服务器名(必须),在下面会用到,构建项目部署选择的服务器

HostName                  服务器IP外网地址(必须)

UserName                  服务器用户名(必须)

Remote Directory     传输文件的目录(必须) 存放在服务器的哪个路径。如果不是SpringBoot项目,或者需要放在tomcat,就是放在tomcat目录的下webapps目录下。或者tomcat目录下,在构建项目可以再加到webapps路径下

记得保存

构建项目:

项目名称必须写,项目名称就是jenkins目录下workspace目录下的项目名称,构建的项目也放在这里面。

构建一个maven项目

构建项目==》源码管理:

点击窗口顶部导航栏的源码原理。填入相应的git链接,我这里是https的,没有使用SSH方式,git用的码云

Credentials 用户凭据。用户名和密码,要自行添加,自己源码托管平台的用户信息

添加 Credentials。jenkins主页 点击凭据==》系统==》全局凭据

用户和密码必填,其他可以不填,下图点击添加按钮,选择Credentials。就是刚才添加的凭据。源码托管平台的用户信息

构建触发器:

警告忽略,实际情况自己填写

1.定时构建

定时构建就是没隔一段时间就是构建1次任务

0 * * * *   代表每小时0分的时候构建1次项目

 第1个代表分,第2个代表时,第3个代表日,第4个代表月,第5个代表周

2.轮询SCM

轮询SCM就是查看源码管理的代码有没有更新,如果更新了就去构建,没有更新就不会构建

*/5 * * * * 代表每5分钟就去查看源码有没有更新

Build:

package -Dmaven.test.skip=ture  或者clean install  package -Dmaven.test.skip=true或者 clean install 反正不要在前面加mvn  jenkins已经自动给加了mvn 命令符

注意自己的pom.xml文件的位置是不是从github、gitlab、gitee拉下来就在一级目录下,路径要正确。一般默认pom.xml不动就行

构建后设置:

点击 增加构建后操作步骤按钮  点击Send build artifacts over SSH  也就是最开始让安装的插件所带的功能

Name  最开始配置的SSH,可以配置多个,这里选服务器的名称

Source files     项目构建后的目录  一般来说会加上target,maven打包后基本都是target目录下生成的jar或者war

Remove prefix    去前缀

Remote directoty 发布的目录  这里/即可,如果是tomcat,在最开始SSH配置的是到tomcat目录,这里就是/webapps

Exec command     发布完执行的命令,我这边写的是一个脚本,构建以后停止服务器的SpringBoot项目,不然起不来,端口这些会冲突

miniprogram.sh:

#!/bin/bash
echo "Restarting SpringBoot miniprogram  Application"
pid=`ps -ef | grep miniprogram.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
   kill -9 $pid
   echo "关闭进程:"$pid
fi

echo "授予当前用户权限"
chmod 777 /usr/local/miniprogram/miniprogram.jar
echo "执行....."
#java -jar /usr/local/miniprogram/miniprogram.jar
nohup java -jar /usr/local/miniprogram/miniprogram.jar &

不要用java -jar /usr/local/miniprogram/miniprogram.jar这个命令,jenkins会报错。

java -jar xxx.jar如果直接执行的话,控制台的输出会显示到前台,并且该远程连接不能关闭,否则该进程会自动杀死,当Jenkins执行到此脚本的时候,报错了。具体原因不明,大概就是Jenkins肯定不可能是长期连接,当Jenkins完成自己的工作后后面会断开,项目就停了,然后我也试验了,确实没有跑起来,然后Jenkins接受到的返回时间超过了设置的timeout,就报错了。

要想后台运行,我们想随时关闭窗口,这里使用到的是nohup命令,通常与&一起使用,这里的命令为

nohup java -jar /usr/local/miniprogram/miniprogram.jar &

 

nohup

用途:不挂断地运行命令。

语法:nohup Command [ Arg … ] [ & ]

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

  如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

  如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

退出状态:该命令返回下列出口值:   
  126 可以查找但不能调用 Command 参数指定的命令。   
  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。   
  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。
&

用途:在后台运行

一般两个一起用

nohup command &

 

注意给文件可执行权限   chmod +x  文件名

到这里基本就完了,配置和文件名称以及路径改成自己的就行了。

最后说下遇到的一个问题。Maven打包一般给项目打包是有版本号的。比如我的打成了miniprogram-0.0.1-SNAPSHOT.war,最开始没有注意这个,然后服务器一直没有这个jar,是因为我在Source files留的是miniprogram.jar。这个看自己情况。我是把项目名称的版本给去了

​​​​​​Maven打包后,jar或war文件名里带有版本号信息,如cloud-0.0.1-SNAPSHOT.war等。
如果想要去掉版本号,打开项目pom.xml文件,在<build>  </build>标签内加入如下内容:

<build>
  <!-- 产生的构件的文件名,默认值是${artifactId}-${version}。 -->  
        <finalName>projectname</finalName>
</build>

 

踩到的坑:

在服务器直接运行jar包或者shell脚本没问题,可以跑起来,也能访问。用jenkins部署就不行,不管任何办法都不能跑起来

各项部署都没问题,项目也打包发送到了服务器,但是项目就是启动不成功。

网上的说法是Jenkins在build以后默认把子进程给杀死了,所以在执行了shell启动项目脚本之前加入

export BUILD_ID=dontkillme   这一行,必须加。如果是tomcat跑的Jenkins,就要修改tomcat里面cataline.sh的配置

当我加了 BUILD_ID=dontKillMe这个还是不行。我是java -jar运行的jenkins。还试了其他很多办法,都不行。

各种办法都试了,还是不行,先留着,后期研究

 

忙完了其他事情,这个问题继续来,一直困扰,虽然工作中没有遇到,在自己服务器机器上面遇到了,不解决心里面不舒服

按照网上的解决方式:

先是看了Jenkin官方的解释,也就是以下几种方式

1、脚本加上export BUILD_ID=dontkillme 无效

2、启动Jenkins的时候加上-Dhudson.util.ProcessTree.disable=true参数  无效 

3、把jenkins放在tomcat里面跑,修改tomcat的cataline.sh文件的参数  脚本开始前加上JAVA_OPTS="$JAVA_OPTS -Dhudson.util.ProcessTree.disable=true";Windows系统修改catalina.bat,在环境变量的说明后,脚本开始前加上set JAVA_OPTS=%JAVA_OPTS% "-Dhudson.util.ProcessTree.disable=true";    无效

4、安装daemonize防止被进程被杀,脚本最后一行执行命令 daemonize -E BUILD_ID=dontKillMe  nohup java -jar /usr/local/miniprogram/miniprogram.jar &   无效

5、按照官方进行配置BUILD_ID,启动-Dhudson.util.ProcessTree.disable=true参数等  无效

 

到此为止,本人已经崩溃,生活已不能自理,网上的解决都是这里拷贝那里,全是复制大神们

问了群里面一个曾经在阿里工作的大神,让我在shell脚本最上方加上source /etc/profile,感觉又有了一线生机。

然后试了一下,居然可以了,详情看下图

当看到SpringBoot启动的时候,我就知道基本上已经成事了。问题解决

最终的miniprogram.sh:

source /etc/profile
#!/bin/bash
echo "Restarting SpringBoot miniprogram  Application"
pid=`ps -ef | grep miniprogram.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
   kill -9 $pid
   echo "closed process"$pid
fi
echo "grant auth to miniprogram.jar"
chmod 777 /usr/local/miniprogram/miniprogram.jar
echo "execute startup commands"
#java -jar /usr/local/miniprogram/miniprogram.jar
nohup java -jar /usr/local/miniprogram/miniprogram.jar &

原来在一台服务器远程链接另一台服务器的时候,即便是存在BUILD_ID=dontKillMe,必须使用source /etc/profile,使其在B终端内有效,不然默认还是A终端,导致无法正常启动。

我也没有加什么BUILD_ID=dontKillme

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值