【盗心社区】jenkins + gitee + springboot 自动化部署

665 阅读9分钟

0. 前言

还是之前做实训,那时候买了台服务器玩了下,把SpringBoot项目部署到服务器上。每次部署都要在本地用IDEA把项目打包,发到服务器上,杀掉之前部署的项目,再部署新的项目,到后面部署的越来越频繁,一直循环着机械操作可痛苦。实训结束前一周发现隔壁组在弄jenkins,问了下是再整自动化部署。当时就心动了,那时候的项目时间来不及了,手动部署就手动部署吧。但这回一定要整点活!!!


这回要弄的是gitee + jenkins + springboot,预期结果就是每次本地代码推送到gitee上,jenkins检测到,将代码拉到服务器,编译打包,再移动到/root目录下,按测试环境部署。

1.软件安装及配置

服务器环境

CentOS 8


我这里软件安装全都是能用YUM安装全都用YUM安装,比较方便省事。

安装java

找openjdk 1.8

yum search java
# java-1.8.0-openjdk.x86_64 : OpenJDK 8 Runtime Environment
yum install -y java-1.8.0-openjdk.x86_64

yum默认安装的话,JAVA_HOME的大概路径是在/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.312.b07-2.el8_5.x86_64。可以用java -version测试下java环境。

安装maven

安装maven的方式与上面差不多,maven的默认路径比较好找,直接mvn -version就出来了。然后接着肯定是换下镜像源本地仓库地址了。

进到 /usr/share/maven/conf 下,修改 settings.xml 文件

<!--修改本地仓库地址-->
<localRepository>/home/maven/repository</localRepository>

<!--更换镜像源-->
<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
  <mirrorOf>central</mirrorOf>
</mirror>

配置环境变量

vim ~/.bash_profile

#追加如下内容
export M3_HOME=/usr/share/maven
export PATH=$M3_HOME/bin:$PATH

安装jenkins

jenkins官网 稳定版安装

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install -y jenkins

默认安装主目录是在 /var/lib/jenkins/

修改jenkins权限(这里是个坑,先改权限就对了)

vim /etc/sysconfig/jenkins
# 找到这个JENKINS_USER,改成下面的
JENKINS_USER="root"

启动jenkins

systemctl start jenkins 
# 下面是重启,没准会用到
# systemctl restart jenkins 

配置jenkins

启动完后就可以用自己电脑去访问 jenkins,http://服务器IP:8080/,默认端口是8080,如果想改端口,在上面那个可以修改jenkins权限的文件里就可以修改端口。记得把服务器端口开放下。

之后就是按照流程初步配置,因为没截图,就文字大概讲下。

  1. 解锁jenkins,按照提示去服务器上把密码复制过来就可以。
  2. 接着是创建管理员用户。
  3. 预安插件,我直接按照推荐的安装了。(之前在自己电脑上弄过jenkins,插件都是安装不全的,还是服务器流批,全都给装上了)。
  4. 然后就是配置实例,这些应该就是刚才提到的那个文件的配置。

前面步骤可能有乱掉的,但无伤大雅。

配置Maven

可以先配置一下maven,因为之后会用到。

系统管理===>全局工具配置:配置下maven的文件

image-20211123195654809.png

配置java

java就在maven下面

image-20211123200051413.png

2. 开始正文

按照gitee上给的教程差不多就会弄好,但是难免中途碰到几个坑,这也是写这篇文章的原因吧。

不过这里只写下我自己用的一些选项,没写出来的就是按照默认的。

前面安装插件配置插件按照官方的来就可以了,这里就不CV了。之后就是新构建一个Maven项目,如果新建项目那里没有Maven项目的话,去装一个Maven Integration plugin

image-20211123184602732.png

image-20211123184659639.png

General

这里官方教程中配置的链接

image-20211123184759296.png

源码管理

填上仓库的地址,这里有点要注意,如果是https的话,下面的令牌用gitee的账号密码就行。如果是ssh的话,就要配置服务器的ssh了。我直接用https更方便点。如果仓库是开源的话就不用凭证了。

凭据Credentials 中请输入 git 仓库 https 地址对应的 用户名密码凭据,或者 ssh 对应的 ssh key 凭据,注意 Gitee API Token 凭据不可用于源码管理的凭据,只用于 gitee 插件的 API 调用凭据。

Name和Refspec照着官方给的填,我的需求也只有当push的时候才要jenkins帮我构建,所以这样就行了。

image-20211123190745768.png

类型选择 Username with password 即可。然后就是用户名=>gitee账号,密码=>gitee密码。ID和描述就随便填了,

image-20211123190317226.png

一开始我用的是ssh,但我以为用gitee账号密码也可以,没认真看官方手册,裂开。

更裂开的是我一开始用户名就直接写了个lkzc19,我不知道那是要写gitee账号的,我是**好吧TAT!

构建触发器

这里就点一个Gitee webhook,之后出来就按默认的来,然后这里有个URL,等下配置Gitee webhook有用。

image-20211123192330163.png

这里点击生成密码,

image-20211123192223925.png

然后去gitee仓库的webhook上配置webhook

image-20211123192129151.png

新建一个,将刚才的URL和密码粘过来,测试一下。这边应该不会有什么问题,毕竟没有什么人比我还更倒霉蛋吧TAT。

image-20211123192508629.png

Build

然后直接到构建这里,前面还有两步,官方也没介绍,要看的话应该要去jenkins官网上看。我稍微看了下,好像是关于在构建之前要不要把之前的工作空间给删了什么的,这里暂时没需求,就不弄了(快点写完睡觉啊!)。

这里的意思就是,从远端仓库拉取完代码后就对项目编译打包(跳过测试),打包完后的项目就在这个项目的target文件夹下。

不过在这之前要配置下jenkins的Maven。还有就是给jenkins权限。

通过yum安装的jenkins权限是不够的,这就是之前留下的坑。我在这又裂开了,构建时一直报这个错:

Failed to transfer Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:2.5.6 from/to alimaven

我一直以为是我的maven没配好,然后我去maven中心仓库看了下有没有这个依赖(这肯定有啊,想啥呢),然后我又手动打包了下,发现可以的,我*你先人,这是为啥啊。经过一番面向百度后,知道原来是jenkins权限不足。

我之前有看到说关于那个文件可以改权限和端口,我想端口默认应该就好了,权限和端口一起说,那应该也不是什么重要的东西,然后就被我跳过了TAT。

image-20211123192822296.png

image-20211123193737185.png

Post Steps

这里就是我的最后一步了,加上构建之后的shell脚本。

image-20211124112943094.png

完整的shell脚本

#!/bin/bash 

echo '开始整活'

# 防止进程被jenkins杀了!!!
export BUILD_ID=dontKillMe

# 定义jar包将存放的位置
xor_path=/root

# 定义jar包原来的位置
xor_origin_path=/var/lib/jenkins/workspace/StealHeart-XOR/target

# 进入jar包所在路径
cd ${xor_origin_path}

# 文件名
xor_name=`ls | grep xor- | grep -v original`

# 需要注意的是,初次构建时并没有对应的pid,所以需要判断一下是否存在该文件
# 获取运行编译好的进程ID,便于我们在重新部署项目的时候先杀掉以前的进程
if [ -f "/root/xor.pid" ]
then
  pid=$(cat /root/xor.pid)
  #杀掉以前可能启动的项目进程
  kill -9 ${pid}
fi

# 进入jar包将存放的位置
cd ${xor_path}

# 删除上次的jar包
rm -rf ./${xor_name}

# 把jar包复制到目标位置
cp ${xor_origin_path}/${xor_name} ${xor_path}

# 启动jar包
nohup java -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -jar ${xor_name} --spring.profiles.active=test &

# 将进程号写入文件
echo $! > /root/xor.pid

shell脚本现学了点,因为linux基础不够出了好多问题,靠着面向百度,一把梭哈终于是完成了。列举下碰到的问题:

  1. cp: cannot stat '/var/lib/jenkins/workspace/StealHeart-XOR/target/xor-0.0.1-SNAPSHOT.jar': No such file or directory

    这个是Jenkins控制台输出的信息,很明显找不到文件,我还以为又是权限的问题,后面看下,原来是我把定义的三个变量名给搞错了,我是**好吧TAT。

  2. 部署完之后,我用postman测试接口,结果报错:Error: socket hang up

    查了下进程,发现没有这个进程,想起export BUILD_ID=dontKillMe,去查了下这句是干啥的,原来是jinkens在执行完脚本后会把子进程(项目)给杀了,虽然我看到别人文章上写了这一句,但是我还是没加上(因为我不知道到这句是啥意思)。整活是吧?TAT。

最后

放下jinkens的成功的信息吧

# 拉取代码
# 。。。略
# maven构建
# 。。。略
# 开始执行脚本
[StealHeart-XOR] $ /bin/bash /tmp/jenkins4077499137055654188.sh
开始整活
/tmp/jenkins4077499137055654188.sh: line 26: kill: (35219) - No such process

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.6)

Process leaked file descriptors. See https://www.jenkins.io/redirect/troubleshooting/process-leaked-file-descriptors for more information
Finished: SUCCESS

3. 结束

网上很多关于自动化部署的,但是没找到关于jenkins + gitee + springboot的自动化部署,虽然步骤都差不多,但还是给自己写一篇总结吧。之后看下帮前端Vue项目也弄个自动化部署。

4. 补充:jenkins构建速度慢解决

问题

在写【盗心社区】添加钉钉机器人通知 时发现jenkins构建的非常慢,而且在构建期间jenkins界面基本就进不去。我在12点08分的时候推送,钉钉在2点30分给我发了部署成功。jenkins构建花了2小时22分钟。

分析与解决

jenkins一共干了三件事:拉取代码、maven构建、执行shell脚本。

去看了下jenkins的控制台输出,maven构建花了2小时21分钟,那么拉取代码和执行脚本最多就花了2分钟。

image.png

那就是maven的问题。我只是推送了一个markdown文件做个测试,所以不会再下载依赖可以排除镜像源的问题。jenkins页面进不去的时候我总是怀疑是不是服务器宕(2核2G)机了,所以登录阿里云看了下服务器。发现在构建的时候内存监控出现一点问题。

image.png

红框里的内存细节看不了,且这个走势很奇怪。我感觉是内存不够用了,平时就一直都是一直占1.4G。所以我想在maven构建之前先把正在运行java程序给kill了,先释放资源给mavan使用,看看这样会不会更快。

image.png

只是把原本在maven构建后的Post Steps中kill之前java程序放到Pre Steps中。为了看到效果我还弄了对照。

image.png

image.png

第29次构建,是提前杀了进程,控制台输出maven构建花了7秒多。

第30次构建,又改成后杀进程,页面又变得很卡,且构建好几分钟还没构建完,看内存监控出现了一个顶峰。然后我停止了构建。

第31次构建,改成提前杀进程,控制台输出7秒多。

最后

粗略了判断了一下,是内存不足的问题。没办法,连服务都是白嫖的 (得加钱) 。所以可以在maven构建前先杀了之前部署程序,先释放资源。



参考:

从零学习Jenkins部署SpringBoot项目(GitLab)

0914-Jenkins yum安装默认jenkins用户权限问题 导致maven编译权限错误 (Permission denied)