本文介绍使用Jenkins自动打包发布spring boot项目,我们在没有使用持续集成工具的情况下,开发好的spring boot项目,通过maven打包,上传jar包到服务器上,通过java -jar的形式启动项目;现在我们将这样的流程交给Jenkins去做,那么Jenkins需要负责更新最新的代码以及打包和发布服务,Jenkins需要有实现这些功能的插件和软件才能去完成这些任务,所以前提条件是安装Jenkins的机器上本身就有安装jdk、git、maven等软件,如果是centos系统可以参考 centos7安装jdk、git、maven ,并且Jenkins中还需要安装maven集成插件、git插件等;全局插件配置中需要配置jdk、maven、git路径等等(因为Jenkins需要知道这些软件的路径然后去使用这些软件完成工作)。
Jenkins下载安装
一、准备工作
1.插件安装
在可选插件中搜索选中要安装的插件之后,页面最下方有两个安装按钮:分别是 Install without restart和Download now and install after restart;其中Install without restart会立刻安装并可以勾选自动重启,那么在jenkins中就可以立即感知到安装的插件,Download now and install after restart是立刻安装稍后重启,那么需要后面手动重启之后jenkins才能感知到安装的插件(有些新版本的Jenkins不需要重启也能感知到安装的插件)。
如果需要手动重启的话:
a、运行jenkins的时候未后台运行的情况下那么关闭终端或者ctril+c关闭jenkins服务
b、如果是后台运行jenkins的情况下则kill掉Jenkins的进程
再次执行java -jar jenkins.war命令启动jenkins服务,重新登录之后就可以看到刚刚安装的插件。
安装maven插件 Maven Integration/Maven Integration plugin
这一步是在Jenkins本身不能新建maven项目的任务的情况下才安装maven集成插件,如果你的Jenkins已经支持maven项目的任务的话就不需要进行安装即当你新建任务的时候有maven项目的选项就不需要安装(因为本文介绍的发布spring boot项目的方式采用的是Jenkins的 maven项目 的任务,所以需要安装 maven插件 ,如果采用比如 Pipeline 流水线等任务发布则可以不安装此maven插件):
没有的话进行安装:
选择 Install without restart 立即安装
可勾选如下多选框,进行自动重启Jenkins
重启Jenkins之后,就可以在已安装的插件里面搜索到刚刚安装的插件,并且创建任务时也有 maven项目 的选项:
GitHub/GitHub plugin安装
在开始使用Jenkins之前,我们进行了Jenkins推荐插件的安装,一般在那里就已经安装了github plugin,所以在已安装里面可以直接搜索到github plugin,如果没有的话则进行安装
GitLab/GitLab Plugin和Gitlab Hook/Gitlab Hook Plugin 两个插件安装 有些jenkins版本可能这两个插件都在GitLab/GitLab Plugin中,所以只需要安装这一个插件即可
2.全局插件配置
将jdk、git、maven配置好之后在页面的最下方有 保存 按钮
页面顶部maven配置默认即可不需要修改
jdk配置
a、自动安装:
提供了以下几种方式,可以选择从官网直接安装
b、选择本地目录安装-填写本地jdk目录(即环境变量中JAVA_HOME的路径)
如果是centos系统的话,JAVA_HOME是配置在 /etc/profile 文件中的,可以通过 vi/vim 打开。
如果centos中jdk采用的yum安装,并且没有在 /etc/profile 中配置JAVA_HOME的话,路径是 /usr/lib/jvm
git配置
也提供了自动安装和本地安装-本地安装填写到git.exe文件的路径
centos中采用tar.gz安装的git的话也在 /etc/profile 中配置了GIT_HOME即git的安装路径,这个路径下面的bin目录中的 git 所在的路径就是这里需要填写的路径;或者填写 /bin/git (centos安装git之后会在bin目录中加入git可执行文件,所以填写这个路径也可以)
maven配置
本地安装填写到maven根目录
centos中采用的tar.gz安装的maven的话,同样在 /etc/profile 中配置了MAVEN_HOME路径即解压maven压缩包之后的路径
二、新建任务
注意:这里只是采用的 maven项目 的任务完成spring boot项目的持续集成持续部署,也可以采用比如 Pipeline 流水线等任务实现。
1.新建maven项目的任务
2.配置git仓库
因为Jenkins需要拉取git上的代码,在Jenkins中配置git仓库的SSH地址即可
复制GitHub仓库中项目的SSH地址
Jenkins中填写SSH地址
如果填写GitHub仓库的SSH地址之后,出现如下错误:
An internal error occurred during form field validation (HTTP 403). Please reload the page and if the problem persists, ask the administrator for help.
按照提示刷新页面即可,只是刷新页面之前填写的数据会丢失,需要重新填写;一般来说刷新之后再次填写SSH地址之后,不会出现该错误了,但是有可能会出现如下的错误:
解决方式:
首先引起这个问题的原因可能是以下两个原因:
1.Jenkins中没有安装github插件或者Jenkins的全局插件配置没有配置到本机上的可执行的git文件目录(即git.exe的目录)- - -这两点的配置在前面准备工作中已做
2.未在git仓库中配置git账号的SSH公钥或者未在Jenkins中配置git账号的私钥即Credentials(可以选SSH私钥或者用户名密码模式)
Jenkins中配置Credentials:
选择SSH私钥(默认是用户名和密码形式即输入对应的GitHub账号和密码):
输入Credentials名称和粘贴私钥:
Windows上的git公私钥地址一般在 C:\Users\Administrator.ssh
centos上的git公私钥地址一般在 /root/.ssh/
保存之后可以看到有刚刚添加的Credentials,选择这个Credentials,鼠标移开过会儿错误提示就会消失
选择对哪个分支进行构建/build
一般是对master分支进行构建
3.maven设置
Pre Steps即在bulid项目之前需要做的操作,比如执行shell脚本,不需要的话就不选择
设置maven命令即build项目的命令,不设置Jenkins也会执行maven打包,我设置的 clean install -Dmaven.test.skip=true
勾选Add timestamps to the Console Output之后Jenkins会将构建项目的日志输出在Jenkins的控制台
Maven Version出现如下提示的话需要在全局插件配置中设置本地maven的目录-在前面准备工作中已做
全局插件配置中设置好maven之后,错误提示消失
如果在pom.xml下面提示未找到pom.xml的话先不用管,后面执行任务会成功,再来看这里的时候,错误提示会消失。
Post Steps即在bulid项目之后需要做的操作,比如执行shell脚本,不需要的话就不选择
因为我们发布的是spring boot的项目,我们需要在构建完成后执行启动spring boot项目的脚本命令,选择Run only if build succeeds(仅在构建成功时运行) -> Execute shell(执行shell)
在输入框里面写入需要执行的脚本命令
mv /root/.jenkins/workspace/Test01/my-test-member/my-test-member-biz/target/my-test-member-biz-0.0.1-SNAPSHOT.jar /usr/project/member/my-test-member-biz-0.0.1-SNAPSHOT.jar
cd /usr/project/member/
BUILD_ID=dontKillMe nohup java -Xms512m -Xmx512m -jar my-test-member-biz-0.0.1-SNAPSHOT.jar &
这里的三条命令:
第一条命令:将Jenkins打包成功后生成的 my-test-member-biz-0.0.1-SNAPSHOT.jar 包,移动到 /usr/project/member/ 目录下,所以需要先创建好 /usr/project/member/ 目录
第二条命令:切换到 /usr/project/member/ 目录下
第三条命令:BUILD_ID=dontKillMe执行启动命令,nohup java -Xms512m -Xmx512m -jar my-test-member-biz-0.0.1-SNAPSHOT.jar &,如果不写BUILD_ID=dontKillMe则不会将后面的java启动命令当作是启动项目的命令执行,可能会遇到项目启动后自动关闭不进行后台运行
注意: 第一条命令 /root/.jenkins/workspace/Test01 是我的项目Jenkins打包之后存放jar包的路径,根据任务的名称不一样这个路径也不一样,/usr/project/member 是我想将启动的jar包统一放在该目录下,所以也根据自己情况来。
如果不清楚Jenkins打包之后的jar包路径,这里可以先不写,直接进行后面打包操作,在控制台中看jar包存放的路径。
4.项目构建后发送邮件
需要发送邮件的话就填写
5.手动执行
在My Views中找到刚刚创建的任务,点击右边的执行按钮,执行任务
执行成功-如果安装Jenkins的机器上的maven没有build过这个项目,第一次build的话需要下载很多的包,时间会长一些
点进去该任务->工作空间 可以看到构建之后的项目结构
Jenkins构建的项目jar包的位置
点击对应的构建记录
查看控制台输出
或者在控制台输出的最下方,有每个jar包的具体目录
如果前面配置了项目构建完成后执行的shell脚本的话,控制台输出的最下面可以看到执行shell脚本的日志:
前面只是实现了简单的项目发布(只是实现了手动执行Jenkins任务拉取项目、打包、启动项目的操作,比如项目jar包的备份、启动服务之前先停止之前的服务等都没有),下面实现项目的启动、关闭、jar包备份以及实现Jenkins自动在master分支发生变化时部署项目。
6.实现项目的启动、关闭、jar包备份
上面的 shell 中实现了项目的启动,这里增加项目关闭及jar包的备份
关闭已运行的该服务的进程
filename=my-test-member-biz-0.0.1-SNAPSHOT.jar
PID=$(ps -ef | grep $filename | grep -v grep | awk '{ print $2 }')
if [ ${PID} ];
then
echo 'Application is stpping...'
echo kill $PID DONE
kill -9 $PID
else
echo 'Application is already stopped...'
fi
备份jar包
filename=my-test-member-biz-0.0.1-SNAPSHOT.jar
var=$(date +%Y%m%d%H%M)
cp $filename $var$filename
echo "backup jar success!"
将项目关闭、启动、备份的脚本合并如下
filename=my-test-member-biz-0.0.1-SNAPSHOT.jar
PID=$(ps -ef | grep $filename | grep -v grep | awk '{ print $2 }')
if [ ${PID} ];
then
echo 'Application is stpping...'
echo kill $PID DONE
kill -9 $PID
else
echo 'Application is already stopped...'
fi
mv /root/.jenkins/workspace/Test01/my-test-member/my-test-member-biz/target/$filename /usr/project/member/$filename
cd /usr/project/member/
BUILD_ID=dontKillMe nohup java -Xms512m -Xmx512m -jar $filename &
var=$(date +%Y%m%d%H%M)
cp $filename $var$filename
echo "backup jar success!"
脚本内容太多的话,可以考虑在服务器上创建一个或多个脚本(vim 脚本名称.sh),写入上面的内容,然后赋予这些脚本可执行权限(chmod +x 脚本名称.sh);那么在Jenkins中只需要执行对应的脚本即可(sh 脚本名称.sh(注意路径,最好写需要执行的脚本的绝对路径如:sh /usr/jenkins/jenkins.sh))。
7.实现master分支提交代码,Jenkins自动更新
实现此功能需要在git远程仓库中进行如下配置,码云、GitHub、gitlab都支持该功能,只是设置的地方不同而已,这里以GitHub为例。
a、设置 Webhooks
选中GitHub中该项目的远程仓库 Settings->Webhooks->Add webhook
填写Jenkins中对应任务的地址
地址在Jenkins中的位置:
b、GitHub生成token
页面末尾点击创建
重新进入到 Personal access tokens 页面确认下生成的token确实存在GitHub中(上面点击 Generate token 之后,正常就已经保存了,没有看到刚刚生成的token则重新生成下)
c、将GitHub中生成的token配置在Jenkins中
找到GitHub
输入信息并且添加GitHub生成的token
填入token信息
d、修改任务配置
点击对应任务 -> Configure
勾选 GitHub hook trigger for GITScm polling 选项并应用保存
到此 GitHub和Jenkins中关于实现GitHub远程仓库提交了代码通知Jenkins执行对应的任务完成。
确认下GitHub中配置的 webhook 是否正常
如果配置的地址如下(绿色的勾)则说明这个地址正常,那么GitHub可以通知Jenkins执行对应任务,也就是配置成功。
如果配置的地址如下(红色的感叹号)则说明这个地址异常,需要解决这个问题GitHub才能正常通知Jenkins。
如上提示403,解决方案如下:
上面的配置中除了在GitHub中配置 webhook 以及 生成token之外,在Jenkins中 勾选了对应任务的 GitHub hook trigger for GITScm polling 选项 以及 将GitHub中生成的token配置在Jenkins中,所以再检查一遍这些工作是否都做了(有可能做了但是未保存);如果都有配置还是403,那么再次设置Jenkins中的这两处设置(因为已经确定设置好了所以不需要再次设置只需要进入对应的设置页面重新点击 Apply 和 Save 即可)
然后GitHub中点击 webhook 中对应地址右边的 Edit 按钮,不需要修改地址,点击 Update webhook 更新即可。
再次查看 webhook 应该会看到两个地址,第二个地址是可以正常通知的地址(绿色的勾),这个地址就是上面 Update webhook 之后GitHub自动更新的地址,此时就可以正常GitHub中提交了代码通知Jenkins中对应任务执行了。(第一个地址是我们自己填写的地址还是红色感叹号可以点击右边 Delete 删除掉)
还有可能是 防止跨站点请求伪造 的影响,可以在Jenkins中将这个勾选去掉。
删除任务:
三、可能遇到的问题
1、stderr: remote: Invalid username or password.
错误原因:拉取代码使用的https的仓库地址,然后没有配置github账号和密码或者账号或密码错误。
解决方案:配置正确的github账号和密码,或者采用SSH的仓库地址(推荐使用SSH)
2、 mvn: 未找到命令
错误原因:我们在全局插件配置中设置了maven根目录,一般情况是可以使用mvn命令的,但是通过shell脚本执行mvn命令的时候(比如:流水线即Pipeline的任务中使用shell脚本执行mvn命令),是从/usr/bin目录中找 mvn 命令的,然后在/usr/bin目录中未找到mvn命令所以报错。
解决方案:为mvn命令创建软链接
ln -s/-T mvn命令目录 /usr/bin/mvn #mvn命令目录,比如:/usr/maven/apache-maven-3.8.1/bin/mvn
3、错误: 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launcher
错误原因:在设置了全局插件配置中的maven根目录以及创建mvn软链接之后,正常情况下是可以使用mvn命令的,但是创建软链接的时候,mvn命令目录,未配置为maven中的bin目录下的mvn的话就会出现这个错误。
解决方案:创建软链接时设置为maven中bin目录下的mvn即可
4、Please make sure you have the correct access rights and the repository exists.
错误原因:之前执行过这个任务并且未构建成功,然后因为在/root/.jenkins/workspace目录下已存在该任务的文件夹所以失败。
解决方案:将/root/.jenkins/workspace目录下的该任务的文件夹删除,再次执行任务即可