前言

Jenkins是一个基于Java开发的开源的实现项目可持续集成的工具,解决了平时开发项目之后需要手动打包与发布项目的问题,将这个流程实现自动化;需要了解更多关于Jenkins的内容可以点击 官网

因为项目需要,近期要准备使用jenkins部署springboot单服务项目,详细记录一下其中遇到的问题和使用过程,留下脚印。

第一:前期准备1.打开官网首页便有下载按钮或者使用下载网址直接下载

如果是Linux安装直接下载第一个.war包即可,如果是Windows版本点击Windows框会直接下载一个.msi的可直接运行的文件,当然.war包在Linux和Windows环境都能运行,但war包有个前提是需要安装jre,直接终端中使用命令java -version查看是否安装jdk,并且jenkins构建还需要安装git环境和maven环境,具体安装过程请自行百度。

  1. 安装jdk
  2. 安装git
  3. 安装maven

注意:最好安装jdk8/jdk11,因为Jenkins的新版本需要jdk8才能支持,如果是jdk8以下的话可能会不兼容;

export JAVA_HOME=/usr/java/jdk1.8.0_341
export CLASSPATH=$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH

GIT_HOME=/usr/local/git
export PATH=$PATH:$GIT_HOME/bin

MAVEN_HOME=/home/zhaosj/maven_home/apache-maven-3.8.1
export PATH=${MAVEN_HOME}/bin:${PATH}

2.安装Jenkins

2.1 war包启动方式: Linux(本过程使用linux方式安装,其它方式请自行百度)

在Jenkins的官方文档中,找到关于war包的文档,里面有说安装Jenkins的最低硬件要求以及war包的启动方式即:java -jar jenkins.war即可启动,需要指定启动端口的话使用 java -jar jenkins.war --httpPort=26000 或者 nohup java -jar jenkins.war --httpPort=26000 & 第二种 nohup 的启动方式为后台启动即关闭该终端Jenkins服务不会关闭。

jenkins springboot shell脚本 jenkins启动springboot_Jenkins


jenkins springboot shell脚本 jenkins启动springboot_Jenkins_02


就是说Jenkins的初始密码是850a9ad6638640f8905c748adf1069c7或者在/root/.jenkins\secrets\initialAdminPassword文件中查看3.访问Jenkins

Jenkins启动后默认使用的8080端口,如果通过 --httpPort 参数指定了端口号,则使用指定的端口号;访问方式:安装jenkins服务的服务器ip:端口号;如:127.0.0.1:8080

如果不能访问的话,关闭终端,重新执行 java -jar jenkins.war 命令出现如下输出即启动成功:

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_03


如果有加载的界面出现等一会儿会来到这个界面,这里需要输入刚刚启动Jenkins的时候初始化的密码,

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_04


输入后我们安装推荐的插件即可:

jenkins springboot shell脚本 jenkins启动springboot_spring boot_05


等待安装完成(时间有点长):

jenkins springboot shell脚本 jenkins启动springboot_jar_06


完成后来到这个界面:

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_07


填写好信息后下一步:

jenkins springboot shell脚本 jenkins启动springboot_jenkins_08


点击保存并完成,点击开始:

jenkins springboot shell脚本 jenkins启动springboot_jenkins_09


到此Jenkins安装完毕。注意:如果是在Linux上使用war包形式启动的Jenkins服务,通过 Linux的 ip:Jenkins端口 无法访问到Jenkins的话,可能是因为Linux的防火墙开启的,如果你是本地虚拟机上安装的centos系统的话,可以直接将防火墙关闭:

关闭命令:systemctl stop firewalld.service

开启命令:systemctl start firewalld.service

查看防火墙状态命令:systemctl status firewalld.service

jenkins springboot shell脚本 jenkins启动springboot_jenkins_10


jenkins springboot shell脚本 jenkins启动springboot_java_11


关闭之后就可以访问到Jenkins了。

第二:配置过程

1.安装maven插件 Maven Integration/Maven Integration plugin

这一步是在Jenkins本身不能新建maven项目的任务的情况下才安装maven集成插件,如果你的Jenkins已经支持maven项目的任务的话就不需要进行安装即当你新建任务的时候有maven项目的选项就不需要安装(因为本文介绍的发布spring boot项目的方式采用的是Jenkins的 maven项目 的任务,所以需要安装 maven插件 ,如果采用比如 Pipeline 流水线等任务发布则可以不安装此maven插件):

jenkins springboot shell脚本 jenkins启动springboot_jar_12


没有的话进行安装:

jenkins springboot shell脚本 jenkins启动springboot_jar_13


选择 Install without restart 立即安装

jenkins springboot shell脚本 jenkins启动springboot_jar_14


可勾选如下多选框,进行自动重启Jenkins

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_15


重启Jenkins之后,就可以在已安装的插件里面搜索到刚刚安装的插件,并且创建任务时也有 maven项目 的选项:

jenkins springboot shell脚本 jenkins启动springboot_jenkins_16

2.全局插件配置

将jdk、git、maven配置好之后在页面的最下方有 保存 按钮

jenkins springboot shell脚本 jenkins启动springboot_jar_17


jenkins springboot shell脚本 jenkins启动springboot_spring boot_18


jenkins springboot shell脚本 jenkins启动springboot_spring boot_19

3.新建任务

3.1 新建maven项目的任务

jenkins springboot shell脚本 jenkins启动springboot_java_20

3.2 配置git仓库

因为Jenkins需要拉取git上的代码,在Jenkins中配置git仓库的SSH地址即可

复制GitHub仓库中项目的SSH地址

jenkins springboot shell脚本 jenkins启动springboot_java_21


Jenkins中填写SSH地址

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_22


如果填写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地址之后,不会出现该错误了,但是有可能会出现如下的错误:

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_23


解决方式:

首先引起这个问题的原因可能是以下两个原因:

1.Jenkins中没有安装github插件或者Jenkins的全局插件配置没有配置到本机上的可执行的git文件目录(即git.exe的目录)- - -这两点的配置在前面准备工作中已做

2.未在git仓库中配置git账号的SSH公钥或者未在Jenkins中配置git账号的私钥即Credentials(可以选SSH私钥或者用户名密码模式)

Jenkins中配置Credentials:

jenkins springboot shell脚本 jenkins启动springboot_java_24


jenkins springboot shell脚本 jenkins启动springboot_java_25


选择SSH私钥(默认是用户名和密码形式即输入对应的GitHub账号和密码):

jenkins springboot shell脚本 jenkins启动springboot_jenkins_26


输入Credentials名称和粘贴私钥:

jenkins springboot shell脚本 jenkins启动springboot_jar_27


保存之后可以看到有刚刚添加的Credentials,选择这个Credentials,鼠标移开过会儿错误提示就会消失

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_28


选择对哪个分支进行构建/build

jenkins springboot shell脚本 jenkins启动springboot_spring boot_29

3.3 maven设置

Pre Steps即在bulid项目之前需要做的操作,比如执行shell脚本,不需要的话就不选择

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_30


设置maven命令即build项目的命令,不设置Jenkins也会执行maven打包,我设置的 clean install -Dmaven.test.skip=true

勾选Add timestamps to the Console Output之后Jenkins会将构建项目的日志输出在Jenkins的控制台

jenkins springboot shell脚本 jenkins启动springboot_jenkins_31


Maven Version出现如下提示的话需要在全局插件配置中设置本地maven的目录-在前面准备工作中已做在这里插入图片描述

jenkins springboot shell脚本 jenkins启动springboot_spring boot_32


全局插件配置中设置好maven之后,错误提示消失

jenkins springboot shell脚本 jenkins启动springboot_jar_33


如果在pom.xml下面提示未找到pom.xml的话先不用管,后面执行任务会成功,再来看这里的时候,错误提示会消失。Post Steps即在bulid项目之后需要做的操作,比如执行shell脚本,不需要的话就不选择

jenkins springboot shell脚本 jenkins启动springboot_jenkins_34


因为我们发布的是spring boot的项目,我们需要在构建完成后执行启动spring boot项目的脚本命令,选择Run only if build succeeds(仅在构建成功时运行) -> Execute shell(执行shell)

jenkins springboot shell脚本 jenkins启动springboot_Jenkins_35


在输入框里面写入需要执行的脚本命令

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包存放的路径。

3.4 手动执行

在My Views中找到刚刚创建的任务,点击右边的执行按钮,执行任务

jenkins springboot shell脚本 jenkins启动springboot_java_36


执行成功-如果安装Jenkins的机器上的maven没有build过这个项目,第一次build的话需要下载很多的包,时间会长一些

jenkins springboot shell脚本 jenkins启动springboot_jar_37


点进去该任务->工作空间 可以看到构建之后的项目结构

jenkins springboot shell脚本 jenkins启动springboot_spring boot_38


Jenkins构建的项目jar包的位置

点击对应的构建记录

jenkins springboot shell脚本 jenkins启动springboot_jenkins_39


查看控制台输出

jenkins springboot shell脚本 jenkins启动springboot_jenkins_40

3.5 实现项目的启动、关闭、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!"