Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)

Linux 虚拟机安装

由于我们是在测试环境实现 jenkins 的,这里我们直接使用 VMware 安装 CentOs7 的虚拟机,安装的方法可以直接参考我分享的这篇文章:https://blog.csdn.net/wuhuayangs/article/details/125295937?spm=1001.2014.3001.5502

jenkins 安装方式

Jenkins 安装支持 docker 和 war 两种方式,这里我们只讲 war 方式进行安装,docker 安装留在下一篇讲,一步步来嘛。

下载 jenkins

下载 jenkins 有两种方式:

  • 使用命令:wget https://get.jenkins.io/war-stable/2.303.2/jenkins.war
  • 直接请求下载 http://mirrors.jenkins.io/war-stable/latest/jenkins.war
如果下载较慢,建议采用迅雷下载,然后上传。

创建 Jenkins 用户

在我们部署 jenkins 的时候一定要记得不能使用 root 的用户去部署我们的 jenkins ,因为使用 root 去部署的话,会出现各类权限等问题,因此我们创建一个 ci 的组,同时创建一个 jenkins 用户,用于部署我们的 jenkins 。

# 配置 ci 用户组,创建 jenkins 用户,并且指定 ci 组
groupadd ci
useradd jenkins -g ci

# 设置 jenkins 用户密码
passwd jenkins

# 删除用户和组
userdel ci
groupdel jenkins

# 创建存放 jenkins 工具的目录,并指定权限,因 jenkins 后期构建比较占用磁盘,此处建议先挂载磁盘
mkdir -p /data/software
chown -R jenkins:ci /data/software

# 切换 jenkins 用户,进入到 software 目录,并下载 jenkins.war
su jenkins
cd /data/software/
wget https://get.jenkins.io/war-stable/2.303.2/jenkins.war

下载会有点慢,如果出现以下界面,说明下载成功了。

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第1张图片

设置网络端口放行

我们首先需要让我们的服务器的防火墙对 8777 端口放行,要不我们的浏览器无法访问到我们的 jenkins,我们直接使用以下的命令放行 8777 端口:

firewall-cmd --zone=public --add-port=8777/tcp --permanent

使配置生效

firewall-cmd --reload

启动 Jenkins

# 使用 nohup 命令启动
nohup java -jar /data/software/jenkins.war  --httpPort=8777 --httpsPort=8778 > /data/software/jenkins.log 2>&1 &

由于网络的原因可能我们会在第一次启动的时候一直卡在我们的初始化页面一直无法跳出 jenkins 的解锁页面,使用 tail 命令查看启动日志,日志中会输出 jenkins 密码,如下:

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第2张图片

访问 jenkins

外网或宿主机访问浏览器地址 http://192.168.2.128:8777/,这时候会弹出 jenkins 页面,输入上面日志中的密码,点击继续
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第3张图片
直接选择安装推荐插件

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第4张图片
安装插件需要时间,如果按照失败,则需要更新相关依赖,手动安装,安装成功会跳转到如下页面:
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第5张图片
创建完用户进入到实例配置页面,这里是默认获取到的,不需要改动
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第6张图片
到这步已经安装完 jenkins,可以正常使用了,点击开始使用 jenkins 进入。
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第7张图片
这里就是 jenkins 的工作台
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第8张图片
由于 jenkins 的所有插件安装后需要重启才能生效,jenkins 国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址,这里推荐使用清华大学源:

第一步:进入 Manage Jenkins -》 Manage Plugin -> Advanced 最下面有 Update Site 设置为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第9张图片

第二步:修改服务器配置,进入 jenkins 安装目录 ,找到 /updates/default.json文件 ,我的在 /root/.jenkins/updates/default.json,

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第10张图片
将其中的 updates.jenkins-ci.org/download 替换为 mirrors.tuna.tsinghua.edu.cn/jenkins ,然后把 www.google.com 修改为 www.baidu.com。

打开 default.json 文件数据太多,我们使用下面的命令执行:

sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json 

替换后使用 http://192.168.2.128:8777/restart 重启 jenkins

接下来我们安装一个插件来试试下载效果

安装主题并重新启动 jenkins,Manage Jenkins–> Manage Plugins。单击 “可选插件” 选项卡并搜索 simple theme 插件
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第11张图片

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第12张图片
下载还是很快的,因为 jenkins 不刷新,可以手动刷新看结果。

JDK 集成

1、卸载已有的 open-jdk

1.1、查看目前已有的 JDK

rpm -qa | grep jdk

如果存在,比如下面一条.

java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64

1.2、执行删除命令

 rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64

1.3、再次查看确认

rpm -qa | grep jdk

2、安装 jdk

2.1、准备好 xxx.tar.gz 文件,并使用解压命令 tar -zxvf xxx.gz.tar 将其解压
在这里插入图片描述

2.2、使用 vim/vi 命令编辑 /etc/profile 文件,在最后一行追加如下内容

export JAVA_HOME=/usr/local/java/jdk1.8.0_291
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

2.3、使JDK配置生效,并查看版本号

source /etc/profile
java -version

下面在 jenkins 中配置 JDK 路径:

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第13张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第14张图片

凭证配置

凭据就是用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便 jenkins 可以和这些第三方的应用进行交互,这里需要先安装凭证插件 Credentials Binding

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第15张图片
该插件默认在一开始就会被安装,安装后在 jenkins -> 系统管理 -> 安全 -> 管理凭据中查看到,若没有需要安装插件并重启。
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第16张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第17张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第18张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第19张图片
凭证类型:

  • Username with password(常用):用户名和密码
  • GitHub APP
  • SSH Username with private key(常用): 使用SSH用户和密钥
  • Secret file:需要保密的文本文件,使用时Jenkins会将文件复制到一个临时目录中,再将文件路径 设置到一个变量中,等构建结束后,所复制的Secret file就会被删除。
  • Secret text:需要保存的一个加密的文本串,如钉钉机器人或Github的api token
  • Certificate:通过上传证书文件的方式

接下来我们使用 Git 工具到 Gitlab 拉取项目源码为例,演示 Jenkins 如何管理 Gitlab 的凭证。

集成Git

为了 jenkins 能够拉取代码,需要安装 Git 环境和 jenkins 对应的 Git 插件。

1、CentOS 7上安装 Git 环境:

--安装
yum install git -y
--查看版本
git --version

2、jenkins 安装 Git 插件:

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第20张图片
3、jenkins 配置 Git 环境:

此处无需在 jenkins 中配置 Git 环境,采用默认生成的即可。
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第21张图片
4、拉取 Gitee 代码首先需要配置凭证

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第22张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第23张图片

5、Gitee上创建一个仓库
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第24张图片
6、测试凭据是否能够使用
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第25张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第26张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第27张图片

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第28张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第29张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第30张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第31张图片
进入 jenkins 的工作空间查看文件是否拉取下来,所有拉取的文件都会存放在 jenkins 工作空间中

[root@mycentos /]# cd /root/.jenkins/workspace
[root@mycentos workspace]# ll
总用量 0
drwxr-xr-x. 3 root root 55 617 09:56 test_gitee
drwxr-xr-x. 2 root root  6 617 09:56 test_gitee@tmp
[root@mycentos workspace]# cd test_gitee
[root@mycentos test_gitee]# ll
总用量 8
-rw-r--r--. 1 root root 832 617 09:56 README.en.md
-rw-r--r--. 1 root root 921 617 09:56 README.md
[root@mycentos test_gitee]# 

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第32张图片
到此通过用户名密码方式的凭证已经可以获取到 Gitee 的代码了。

Maven集成

在 jenkins 上发布 Java 项目时需要使用 Maven 来进行构建打包

1、下载安装

# 进入
cd /usr/local/

# 创建一个 maven 目录
mkdir maven

#从阿里云上下载 maven 安装包
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

# 解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz

2、环境配置

# 执行命令
vi /etc/profile
# 添加如下配置
export MAVEN_HOME=/usr/local/maven/apache-maven-3.6.3
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第33张图片
3、使配置生效并查看安装情况

source /etc/profile
mvn -version

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第34张图片
4、jenkins 配置 Maven
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第35张图片
5、安装 Maven 插件
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第36张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第37张图片
安装 Maven 插件成功,在构建任务这里会出来构建一个 Maven 项目选项
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第38张图片

6、使用 jenkins 用户在 /data/software 目录下新建一个 repository 文件夹,用来作为 Maven 的仓库

cd /data/software
mkdir repository

7、修改 Maven 的 settings.xml 文件,这里指定仓库目录和阿里云镜像

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  
  <!--本地仓库-->          
  <localRepository>/data/software/repository</localRepository>
  
  <mirrors>
    <!--阿里云镜像-->
    <mirror>
      <id>aliyun-maven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven mirror</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/
    </mirror>
  </mirrors>
    ...
    ...
</settings>

8、Maven 测试项目构建

接下来创建一个 Java 项目传到 Gitee 上供 jenkins 拉取打包,这里如果运维人员不懂 Java 代码,可以让开发人员给一个上传代码的 Gitee 地址、用户名和密码。

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第39张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第40张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第41张图片

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第42张图片
9、在 Gitee 上建一个项目
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第43张图片

10、使用 Git 上传到码云

# 进入到本地的项目文件夹初始化仓库
$ git init

# 添加文件至工作区并提交
$ git add .
$ git commit -m "初始化提交"

# 关联 Gitee 远程仓库
$ git remote add origin https://gitee.com/WUHUAYANG/jenkins-project.git

# 将本地仓库推送到远程仓库的 master 分支,此处会弹出用户名密码交互
$ git push -u origin master

## 如果 push 报错可以先拉取一下,会有新的 gitee 生成的文件拉下来,然后重新添加提交并 push
$ git pull origin master --allow-unrelated-histories
$ git add .
$ git commit -m "拉取下来合并后再次提交"
$ git push -u origin master

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第44张图片
11、jenkins 添加 Maven 项目任务

构建任务
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第45张图片
连接 Git 仓库
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第46张图片

编写 Maven 编译命令

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第47张图片
保存后,点击立即构建,然后进入日志控制台查看日志

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第48张图片
从日志可以看到代码已经在拉取了,而且走的是阿里云仓库,第一次拉取过程会比较长。
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第49张图片
这里报了个错,我这边是重复构建几次就好了,这里有可能是因为我的网络问题
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第50张图片
构建成功后查看 jenkins 的 workspace 目录下的 jar 包
在这里插入图片描述

通过查看 /data/software/repository 可以看到有存放拉取的 jar 包
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第51张图片
从这两个可以证明 settings.xml 文件配置成功且有效的,到此 Maven 集成完毕

构建发布 SpringBoot 项目

这里以我上面创建的项目为例,添加应用访问的接口和端口,并将代码提交至 Gitee

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第52张图片

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第53张图片
浏览器访问本地的服务是否启动成功

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第54张图片

下面将代码提交并且推送至 Gitee

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第55张图片
在 Gitee 上检查到代码推送成功

这里发布项目启动还需要配置很重要的一部分,就是配置 Post Steps,选中执行 shell
在这里插入图片描述
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第56张图片
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第57张图片

shell中加入如下发布脚本:

#!/bin/bash

echo "部署的目录和项目名称"
DIR="/home/webapps"
projectName="demo-0.0.1-SNAPSHOT"


echo "拷贝jar包到/home/webapps目录"
cp /root/.jenkins/workspace/jenkins-project/target/${projectName}.jar /home/webapps

echo "切换到启动脚本目录"
cd ${DIR}

BUILD_ID=dontKillMe

echo "停止服务"
sh stop.sh

echo "停止服务"
sh start.sh 

echo "success"

在上面命令中还有两个启动脚本 stop.sh 和 start.sh,这里 切换到 /home/webapps 目录下创建脚本

创建启动脚本 start.sh

touch start.sh
vi start.sh

将下面代码粘贴到 start.sh 中

#!/bin/bash
set -e #任何命令出错就退出
set -o pipefail

APP_ID=demo-0.0.1-SNAPSHOT
APP_DIR="/home/webapps"

nohup java -Dspring.profiles.active=dev -jar ${APP_DIR}/${APP_ID}.jar > release_out.log &
start_ok=false
if [[ $? = 0 ]];then
        sleep 3
        tail -n 10 release_out.log
        sleep 5
        tail -n 50 release_out.log
fi
aaa=`grep "Started" release_out.log | awk '{print $1}'`
if [[ -n "${aaa}" ]];then
    echo "Application started ok"
    exit 0
else
    echo "Application started error"
    exit 1
fi

创建停止脚本 stop.sh:

touch stop.sh
vi stop.sh

将下面代码粘贴到 stop.sh 中

#!/bin/bash

APP_ID=demo-0.0.1-SNAPSHOT
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh

下面在 jenkins 中点击构建进行启动和停止测试,查看日志输出是否正常,但是首先需要先把端口开放出来

1、如果是虚拟机则需要给防火墙添加 9100 端口
2、如果是 ECS 则需要在安全组中开放 9100 端口

以下是虚拟机:

# 开启防火墙 9100 端口
$ firewall-cmd --zone=public --add-port=9100/tcp --permanent
# 使配置生效
$ firewall-cmd --reload

下面执行构建成功
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第58张图片
我们本地访问服务项目看是否生效,请求 http://192.168.2.128:9100/index
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第59张图片
为什么还不能访问到呢?端口也开放了啊,其实不是端口没有开放的问题,解决办法其实非常容易,只需要在执行 .sh 文件之前,加上 BUILD_ID=dontKillMe 即可。

如上连接已经更换为:https://wiki.jenkins.io/display/JENKINS/Spawning+processes+from+build 。 原因:jenkins 在构建结束后会把额外启动的进程杀死

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第60张图片
重新构建请求 http://192.168.2.128:9100/index
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第61张图片
结果成功了。

下面我们把代码修改重新提交看会不会变化

Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第62张图片
jenkins 重新构建以后请求成功了
Jenkins 自动化构建部署 Spring Boot 项目(从零到搭建完成)_第63张图片

到此一个简单的 SpringBoot 项目发布完成,但企业中的发布往往比这要复杂很多,相信大家有了基础之后更加复杂的环境都能解决。

这里还要讲下,由于 jenkins 构建消耗内存极大,一般 jenkins 是一台单独配置的服务器,Java 项目一般在其他的服务器上,通过 ssh 免密登录进行 jar 拷贝,这个免密登录非常容易,网上也有很多文章,我工作的公司都是 jenkins 和 jar 分开搞。

下一篇文章将讲解 Docker、Jenkins、Git 自动化部署 SpringBoot 项目

你可能感兴趣的:(Linux,Jenkins,jenkins,自动化,运维)