最近公司使用的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