背景
本机:MacBook Air M1,Big Sur 11.2
服务器:CentOS Linux release 7.4.1708 (Core)
项目:SpringBoot 2.1.4,使用 Git 版本控制
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
项目代码在本机编写,每次都要手动打jar包,上传到服务器,再去服务器上启动,故使用 jenkins 自动化部署工具。
step1 在服务器上下载工具
已存在 ssh、vim、jdk、yum
服务器上已经有了这些工具:
$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 2 2017 00:45:39)
$ java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
$ yum --version
3.4.3
已安装: rpm-4.11.3-25.el7.x86_64 在 2017-10-15 15:19
构建 :CentOS BuildSystem <http://bugs.centos.org> 在 2017-08-03 03:48
已提交:Panu Matilainen <pmatilai@redhat.com> ,共 2017-03-17
已安装: yum-3.4.3-154.el7.centos.noarch 在 2017-10-15 15:19
构建 :CentOS BuildSystem <http://bugs.centos.org> 在 2017-08-05 19:13
已提交:CentOS Sources <bugs@centos.org> ,共 2017-08-01
已安装: yum-plugin-fastestmirror-1.1.31-42.el7.noarch 在 2017-10-15 15:19
构建 :CentOS BuildSystem <http://bugs.centos.org> 在 2017-08-11 10:23
已提交:Valentina Mukhamedzhanova <vmukhame@redhat.com> ,共 2017-03-21
下载 maven 3.8.3
在本机上下载了 apache-maven-3.8.3-bin.tar.gz, 放到服务器上解压安装。配置 ~/.bash_profile:
# Maven environment
MAVEN_HOME=/usr/local/maven3
PATH=${PATH}:${MAVEN_HOME}/bin
$ mvn -v
Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739)
下载并配置 git 1.8.3.1
在服务器上使用yum下载git
$ yum install git
下载后的git版本:
$ git --version
git version 1.8.3.1
在服务器上用 ssh-keygen -t rsa 生成密钥,把公钥放到 Github 的相应位置,具体可看 Github 中的教程,或文章使用 Jenkins 部署 Spring Boot 项目的第三步。
step2 在服务器上下载 jetkins
在服务器上用 wget 在 http://mirrors.jenkins-ci.org/ 下载 war 包,运行 wget 命令的位置即为下载位置。
一开始下载的是 war-stable/2.303.3 版本的 war 包,但是后续下载插件时提示需要升级才能用,因此后来在浏览器中升级成了 war/2.321 。
全过程:
1、在服务器上下载 war-stable/2.303.3 版本的 war 包:
wget http://mirrors.jenkins-ci.org/war-stable/2.303.3/jenkins.war
2、在浏览器上下载插件时,根据提示升级成了 2.321 版本(估计是war,非war-stable):
如果想直接下载 2.321 版本,避免后续升级,猜测应该直接运行命令:
wget http://mirrors.jenkins-ci.org/war/2.321/jenkins.war
step3 在服务器上运行 jetkins
1 运行 jenkins
在服务器上,cd 到 jetkins war 包所在位置,运行命令,使 jetkins 在后台启动,端口为自定义的8090 (此处要把服务器的8090端口打开),且日志记录到当前目录的 nohup.out 文件内:
# 更改 jenkins.war 包权限,使其可读可写可执行
$ chmod 777 jenkins.war
# 运行 jenkins.war 包
$ nohup java -jar jenkins.war --httpPort=8090 > ./nohup.out 2>&1 &
后续因为这一步频繁报错,手动重启 jetkins 太麻烦,于是写了个脚本,运行脚本即可重启 jetkins:
#!/bin/bash
PID=`ps -ef |grep jenkins |grep -v "grep" |awk '{print $2}'`
echo ${PID}
if test -z ${PID}
then
echo "进程没有启动!"
else
echo "will shutdown this process"
kill -9 ${PID} && echo "PID $PID killed."
sleep 2
fi
rm nohup.out
nohup java -jar jenkins.war --httpPort=8090 > ./nohup.out 2>&1 &
afterPID=`ps -ef | grep jenkins | grep -v grep | awk '{print $2}'`
echo ${afterPID}
sleep 2
if test -z ${afterPID}
then
echo "部署失败"
else
echo "部署成功"
fi
2 访问 jenkins, 解决报错
然后在本机的浏览器中访问:服务器ip:端口号,如果一切正常的话,应该出现以下界面(别人的图片):
但是本人运行的时候没有出现这个界面,用 vim 查看 nohup.out 发现若干个报错。
1 换源 update-center
参考:
https://www.cnblogs.com/whm-blog/p/10448096.html
https://www.cnblogs.com/jpinsz/p/13359381.html
修改 /root/.jenkins/hudson.model.UpdateCenter.xml 文件,更换为 http 开头(解决没有合法证书而不能查看 https 的问题),更换为清华源(解决下一步插件安装失败的问题)。
$ vim /root/.jenkins/hudson.model.UpdateCenter.xml
将里面的内容换成如下:
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>
2 解决 unable to find valid certification, PKIX path building failed, SSLHandshakeException 等报错
参考:https://www.cnblogs.com/tanghu/p/12869658.html
在 nohup.out 里发现了这些报错信息(别人的图片):
在 nohup.out 里发现了这些报错信息,尝试了很多方法都没用,最后找到了上面那个参考链接,此处完全按照参考链接里的步骤做:
第一步:下载这个SSLPoke.class文件:
$ wget https://confluence.atlassian.com/kb/files/779355358/779355357/1/1441897666313/SSLPoke.class
第二步:用下载的SSLPoke工具验证你的ssl网站;此处网址替换成jenkins更新中心的站点,用https,发现报错:
第二步的报错,证明证书路径有问题。
$ $JAVA_HOME/bin/java SSLPoke updates.jenkins.io 443
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
... # 此处省略
第三步,搜索服务器上是否还有其他名为cacerts的证书(此处用的是本人服务器上的搜索结果,非参考链接中的结果)
发现确实有两个cacerts文件,由于查找资料时发现默认证书用的是:"%JAVA_HOME%\jre\lib\security\cacerts"这个路径,也就是说在本人服务器上,默认应该用的是第二个证书:/usr/java/jdk1.8.0_65/jre/lib/security/cacerts
$ find / -type f -name cacerts
/etc/pki/ca-trust/extracted/java/cacerts
/usr/java/jdk1.8.0_65/jre/lib/security/cacerts # 默认用的应该是这个证书
第四步,修改证书(此处用的是本人服务器上的修改结果,非参考链接中的结果)
# 首先进入默认路径
$ cd /usr/java/jdk1.8.0_65/jre/lib/security/
# 将原来的默认证书做备份
$ mv cacerts cacerts.bak
# 把上面搜索到的证书,复制一个到默认路径
$ cp /etc/pki/ca-trust/extracted/java/cacerts ./
# 最后测试下证书是否可用,结果证明可用
$ $JAVA_HOME/bin/java SSLPoke updates.jenkins.io 443
Successfully connected
发现ssl已经验证成功,于是我重启了jenkins,发现不再有以上报错。
3 解决报错后,继续访问 jetkins
参考:
https://www.cnblogs.com/tangbohu2008/p/14489741.html
https://www.cnblogs.com/zsh-blogs/p/10508656.html
进入 Unlock Jenkins 界面,输入密码
解决以上报错后,在服务器中重启 jetkins 服务(用 java 运行 war 包)。
在本机的浏览器中访问:服务器ip:端口号(本人用的是8090端口启动的 jetkins 服务)。
如果一切正常的话,应该出现以下界面(别人的图片):
用 vim 查看 nohup.out 找到密码,填写到浏览器中(别人的图片,红框圈起来的是密码):
进入 Customize Jenkins 界面,安装插件
然后进入插件安装选择,选择 Install suggested plugins,安装官方推荐的插件。
如果没有换源,应该会安装失败(换源去改 /root/.jenkins/hudson.model.UpdateCenter.xml 文件),如果换清华源成功应该都能安装成功。

进入 Create First Admin User 界面
填个用户名密码,可以填 admin 之类的,然后完成注册
step 4 登陆并配置项目信息
1 下载 Git, Maven Integration 插件
用刚刚注册的用户名密码登陆到 Jetkins 上。
选择 Manage Jetkins 中的 Manage Plugins。
依次搜索下载 Git plugin、Maven Integration plugin 安装。
本人安装 Git plugin 时失败,换源以及升级 Jenkins 版本后解决,可参考文章【Jenkins】Jenkins插件安装失败处理方法.

2 配置 JDK, Git, Maven工具
进入 Manage Jenkins 中的 Global Tool Configuration
分别配置 JDK, Git, Maven 在服务器上的环境变量



3 部署项目
1 New Item - 新建项目
点击 New item
输入项目名称,选择 Maven project
(如果你没有第二个选项,需要安装 Maven Integration 插件)
2 General - Discard old builds
勾选丢弃旧的构建,选择是否备份被替换的旧包。我这里选择备份最近的10个
3 Source Code Mangement - 配置 Git
Repository URL 填入 Github 上的仓库地址(本人是私有仓库)。
Credentials 选 Add - Jetkins,Kind 选 Username with password,然后填自己登陆 Github 时的用户名和密码。
填好之后,在 Credentials 里选自己刚 Add 进去的 用户名/密码。
Branches to build,我选了 master。
4 Build
本人跳过了 Build Triggers, Build Environment, Pre Steps 等步骤的配置。
Build 里面填项目依赖和 Build 时执行的 Maven 命令。
5 Post Steps
Build 之后,可以运行一段脚本,比如把构建的 jar 包部署在服务器上。
本人选中 Run only if build succeeds,只在成功时运行。
点击Add post-build step,选择 Excute Shell
插入 Build 成功后要运行的脚本:
注意 Build 成功后的 jar 包一般放在 /root/.jenkins/workspace/项目名称/target/项目名称.jar 里
# stop
# 查找正在运行的项目,如果查到了正在运行,就停止
# projectname.jar 需要换成自己的项目名称
pid=`ps -ef | grep projectname.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
echo "Stopping old SpringBoot Application"
kill -9 $pid
fi
# start
# 运行项目
# 查找 jar 包,如果存在 jar 包,就做个备份
# file 需要换成自己的 jar 包所在路径
file="/var/www/project/projectname.jar"
if [ -f "$file" ]
then
# 做备份
echo "Creating Backup"
mv /var/www/project/projectname.jar /var/www/project/projectname.jar.`date +%Y%m%d%H%M%S`
fi
# 把默认生成的 jar 包放到自己想放的位置
mv /root/.jenkins/workspace/project/target/myjavaproject-1.0-SNAPSHOT.jar /var/www/project/projectname.jar
# 准备启动 jar 包
echo "Staring new SpringBoot Application"
# 修改 jar 包权限,使其可运行
chmod 755 /var/www/project/projectname.jar
# 启动 jar 包,此处使用了 -Dspring.config.additional-location 参数
BUILD_ID=dontKillMe nohup java -Xms400m -Xmx400m -XX:NewSize=200M -XX:MaxNewSize=200M -Dspring.config.additional-location=/var/www/project/application.properties -jar /var/www/project/projectname.jar &
# 判断是否启动成功
newpid=`ps -ef | grep projectname.jar | grep -v grep | awk '{print $2}'`
if [ -n "$newpid" ]
then
echo "Start Success in Pid: "
echo $newpid
fi
step 5 构建项目
项目配置完了之后,点进项目,选择 Build Now
第一次 Build 会下载很多东西,左下角有 Build History,可以点进去查看 Console Output

运行后,Console Output 会打印成功信息或者报错信息:
解决报错:Don’t work spring.config.additional-location
在脚本中,我原本执行项目用的是
BUILD_ID=dontKillMe nohup java -Xms400m -Xmx400m -XX:NewSize=200M -XX:MaxNewSize=200M -jar projectname.jar --spring.config.addition-location=/var/www/project/application.properties
但是发现-spring.config.addition-location这个配置没有成功,参考Don’t work spring.config.additional-location后改成-Dspring.config.additional-location:
BUILD_ID=dontKillMe nohup java -Xms400m -Xmx400m -XX:NewSize=200M -XX:MaxNewSize=200M -Dspring.config.additional-location=/var/www/project/application.properties -jar /var/www/project/projectname.jar &
后记
1、一台服务器 or 两台:
翻了很多教程,本文中 jenkins 和应用服务器在一个服务器上。如果部署在两台服务器上,或许也应该用 ssh 工具和插件来部署。
2、maven test
此外,项目中没有用到 test,看别人的教程里maven命令排除了test,本文没有用到。
3、nginx
没有弄 nginx 相关的东西,如果弄了的话,jetkins也要做相关的设置估计。
4、build trigger
这个还没有仔细研究,现在都是手动build。