由于我们是在测试环境实现 jenkins 的,这里我们直接使用 VMware 安装 CentOs7 的虚拟机,安装的方法可以直接参考我分享的这篇文章:https://blog.csdn.net/wuhuayangs/article/details/125295937?spm=1001.2014.3001.5502
Jenkins 安装支持 docker 和 war 两种方式,这里我们只讲 war 方式进行安装,docker 安装留在下一篇讲,一步步来嘛。
下载 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
下载会有点慢,如果出现以下界面,说明下载成功了。
我们首先需要让我们的服务器的防火墙对 8777 端口放行,要不我们的浏览器无法访问到我们的 jenkins,我们直接使用以下的命令放行 8777 端口:
firewall-cmd --zone=public --add-port=8777/tcp --permanent
使配置生效
firewall-cmd --reload
# 使用 nohup 命令启动
nohup java -jar /data/software/jenkins.war --httpPort=8777 --httpsPort=8778 > /data/software/jenkins.log 2>&1 &
由于网络的原因可能我们会在第一次启动的时候一直卡在我们的初始化页面一直无法跳出 jenkins 的解锁页面,使用 tail 命令查看启动日志,日志中会输出 jenkins 密码,如下:
外网或宿主机访问浏览器地址 http://192.168.2.128:8777/,这时候会弹出 jenkins 页面,输入上面日志中的密码,点击继续
直接选择安装推荐插件
安装插件需要时间,如果按照失败,则需要更新相关依赖,手动安装,安装成功会跳转到如下页面:
创建完用户进入到实例配置页面,这里是默认获取到的,不需要改动
到这步已经安装完 jenkins,可以正常使用了,点击开始使用 jenkins 进入。
这里就是 jenkins 的工作台
由于 jenkins 的所有插件安装后需要重启才能生效,jenkins 国外官方插件地址下载速度非常慢,所以可以修改为国内插件地址,这里推荐使用清华大学源:
第一步:进入 Manage Jenkins -》 Manage Plugin -> Advanced 最下面有 Update Site 设置为:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
第二步:修改服务器配置,进入 jenkins 安装目录 ,找到 /updates/default.json文件 ,我的在 /root/.jenkins/updates/default.json,
将其中的 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 不刷新,可以手动刷新看结果。
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 路径:
凭据就是用来存储需要密文保护的数据库密码、Gitlab 密码信息、Docker 私有仓库密码等,以便 jenkins 可以和这些第三方的应用进行交互,这里需要先安装凭证插件 Credentials Binding
该插件默认在一开始就会被安装,安装后在 jenkins -> 系统管理 -> 安全 -> 管理凭据中查看到,若没有需要安装插件并重启。
凭证类型:
接下来我们使用 Git 工具到 Gitlab 拉取项目源码为例,演示 Jenkins 如何管理 Gitlab 的凭证。
为了 jenkins 能够拉取代码,需要安装 Git 环境和 jenkins 对应的 Git 插件。
1、CentOS 7上安装 Git 环境:
--安装
yum install git -y
--查看版本
git --version
2、jenkins 安装 Git 插件:
此处无需在 jenkins 中配置 Git 环境,采用默认生成的即可。
4、拉取 Gitee 代码首先需要配置凭证
进入 jenkins 的工作空间查看文件是否拉取下来,所有拉取的文件都会存放在 jenkins 工作空间中
[root@mycentos /]# cd /root/.jenkins/workspace
[root@mycentos workspace]# ll
总用量 0
drwxr-xr-x. 3 root root 55 6月 17 09:56 test_gitee
drwxr-xr-x. 2 root root 6 6月 17 09:56 test_gitee@tmp
[root@mycentos workspace]# cd test_gitee
[root@mycentos test_gitee]# ll
总用量 8
-rw-r--r--. 1 root root 832 6月 17 09:56 README.en.md
-rw-r--r--. 1 root root 921 6月 17 09:56 README.md
[root@mycentos test_gitee]#
到此通过用户名密码方式的凭证已经可以获取到 Gitee 的代码了。
在 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
source /etc/profile
mvn -version
4、jenkins 配置 Maven
5、安装 Maven 插件
安装 Maven 插件成功,在构建任务这里会出来构建一个 Maven 项目选项
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 地址、用户名和密码。
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
编写 Maven 编译命令
从日志可以看到代码已经在拉取了,而且走的是阿里云仓库,第一次拉取过程会比较长。
这里报了个错,我这边是重复构建几次就好了,这里有可能是因为我的网络问题
构建成功后查看 jenkins 的 workspace 目录下的 jar 包
通过查看 /data/software/repository 可以看到有存放拉取的 jar 包
从这两个可以证明 settings.xml 文件配置成功且有效的,到此 Maven 集成完毕
这里以我上面创建的项目为例,添加应用访问的接口和端口,并将代码提交至 Gitee
下面将代码提交并且推送至 Gitee
这里发布项目启动还需要配置很重要的一部分,就是配置 Post Steps,选中执行 shell
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
下面执行构建成功
我们本地访问服务项目看是否生效,请求 http://192.168.2.128:9100/index
为什么还不能访问到呢?端口也开放了啊,其实不是端口没有开放的问题,解决办法其实非常容易,只需要在执行 .sh 文件之前,加上 BUILD_ID=dontKillMe 即可。
如上连接已经更换为:https://wiki.jenkins.io/display/JENKINS/Spawning+processes+from+build 。 原因:jenkins 在构建结束后会把额外启动的进程杀死
重新构建请求 http://192.168.2.128:9100/index
结果成功了。
下面我们把代码修改重新提交看会不会变化
到此一个简单的 SpringBoot 项目发布完成,但企业中的发布往往比这要复杂很多,相信大家有了基础之后更加复杂的环境都能解决。
这里还要讲下,由于 jenkins 构建消耗内存极大,一般 jenkins 是一台单独配置的服务器,Java 项目一般在其他的服务器上,通过 ssh 免密登录进行 jar 拷贝,这个免密登录非常容易,网上也有很多文章,我工作的公司都是 jenkins 和 jar 分开搞。
下一篇文章将讲解 Docker、Jenkins、Git 自动化部署 SpringBoot 项目