jenkins+linux+gitee+maven自动化集成部署项目
jenkins+linux+gitee+maven自动化集成部署项目
一、jenkins概述
1.1 Jenkins介绍与优势
Jenkins是一个基于Java开发的开源的、易操作的CI/CD工具软件,其主要用于持续、自动的构建/测试/部署软件项目、监控外部任务的运行。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行(Jenkins通常作为一个独立的应用程序在其自己的流程中运行,内置Java servlet容器/应用程序服务器)。
Jenkins作为一个第三方独立的CI/CD系统,具有开源、简单、可视化web管理、跨平台部署(Windows/Linux/Docker)、功能/插件丰富等优势(注意Jenkins本身是不具备任何功能的,只提供CI/CD管理环境,Jenkins中所有的功能全部来自于插件)。另一个比较流行的CI/CD工具是GitLab Runner(可与Gitlab完美集成,此处不用耦合性高)。
1.2 CI/CD整合实现思路
(1)开发者将新版本代码 push 到 GitLab 远程仓库上;
(2)随后 GitLab 会通知 Jenkins 来进行拉取最新代码到本地(通过 Web Hook 或定时检测);
(3)最后 Jenkins 会根据事先配置好的任务脚本执行进行Build和部署;
(4)返回结果信息给GitLab/其他Web服务器;
(5)GitLab/其他服务器发送邮件通知给开发者/测试人员,提示结果信息;
二、环境
服务器:linux系统
java环境:jdk11
代码管理:gitee
项目jar包管理:apache-maven-3.8.8
自动化部署工具:jenkins-2.415-1.1.noarch.rpm
打包方式:jar包
三、Linux部署安装jenkins
1、安装
官网下载jenkins,我们选择rpm包进行安装:
地址:https://mirrors.jenkins-ci.org/redhat/
https://get.jenkins.io/redhat-stable/ 以及 https://pkg.jenkins.io/redhat-stable/
下载好的rpm包上传到服务器,执行命令安装:
rpm -ivh jenkins-2.415-1.1.noarch.rpm
2、配置
修改jenkins配置文件:
vim /etc/sysconfig/jenkins
主要是修改两个地方:
第一个是账户:因为Jenkins默认的账户是jenkins的账户,这个账户我们没有,而且为了不因为权限出现各种问题,这里直接使用root,当然你也可以创建一个名叫jenkins的账户
第二个是端口:Jenkins的默认端口是8080,为了避免端口冲突,我们将它改掉
JENKINS_HOME="/var/lib/jenkins" ##jenkins工作目录
JENKINS_USER="root" ##启动jenkins的用户
JENKINS_PORT="8082" ##jenkins服务监听端口
注意:修改/etc/init.d/jenkins脚本,修改do_start函数的check_tcp_port命令,将端口8080改为8182,最新版本中端口号已经从配置文件中动态获取,无需修改。
如果第一次成功启动后,后续需要修改端口号,请修改这里
vim /usr/lib/systemd/system/jenkins.service
修改
Environment="JENKINS_PORT=8082"
# 重新加载配置文件
systemctl daemon-reload
配置jenkins 启动信息:
vim /etc/init.d/jenkins #编辑jenkins启动配置
#修改candidates部分增加java可选路径:/usr/java/jdk1.8.0_333/bin/java
candidates="
/etc/alternatives/java
/usr/lib/jvm/java-1.8.0/bin/java
/usr/lib/jvm/jre-1.8.0/bin/java
/usr/lib/jvm/java-11.0/bin/java
/usr/lib/jvm/jre-11.0/bin/java
/usr/lib/jvm/java-11-openjdk-amd64
/usr/bin/java
#以上是原来的,下面是新增本地的
/usr/local/java/jdk1.8.0_333/bin/java
修改权限
[root@centos100 ~]# chmod -R 777 /var/lib/jenkins
[root@centos100 ~]# chmod -R 777 /var/cache/jenkins
[root@centos100 ~]# chmod -R 777 /var/log/jenkins
修改完之后重新加载一下配置文件,使其生效:
systemctl daemon-reload
3、启动
jenkins启动,并且加入开机启动
[root@centos100 data]# firewall-cmd --zone=public --add-port=8182/tcp --permanent
success
[root@centos100 data]# systemctl reload firewalld
[root@centos100 data]# systemctl daemon-reload
[root@centos100 data]# systemctl enable jenkins
[root@centos100 data]# systemctl start jenkins
安装踩坑:
#(1)方法一: 直接使用脚本启动jenkins(可行,猜测jenkins没法识别/激活自定义的java环境) #进入 /etc/init.d ./jenkins start 开启jenkins ./jenkins status 查看状态 ./jenkins stop 停止jenkins #(2)方法二: https://blog.csdn.net/zwjzone/article/details/125170820 #(3)方法三: 离线安装(先下载在上传也可)--没试 wget https://pkg.jenkins.io/redhat/jenkins-2.156-1.1.noarch.rpm rpm -ivh jenkins-2.156-1.1.noarch.rpm #修改配置 vim /etc/sysconfig/jenkins #(4)方法4: 官网推荐步骤安装,使用open-jdk(https://www.jenkins.io/doc/book/installing/linux/#red-hat-centos)(可行) 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包,不升级软件和系统内核,软件和内核保持原样。 sudo yum upgrade # Add required dependencies for the jenkins package sudo yum install java-11-openjdk sudo yum install jenkins sudo systemctl daemon-reload #(5)方法5: 添加软连接配置。(可行,初次启动较慢,多试几次) ln -s /usr/local/java/jdk1.8.0_333/bin/java /usr/bin/java
4、jenkins使用
在浏览器输入:ip:8082,直接访问jenkens
密码存储位置:/var/lib/jenkins/secrets/initialAdminPassword
系统自动创建的用户 jenkins 1qaaxsw6
5、安装Jenkin相关插件
- 三个插件
Gitee
Maven Integration
Pipeline Maven Integration
- 安装Jenkin相关插件
# 安装Jenkin相关插件
# 作用:在Jenkins中辅助相关功能的实现,插件的实现一般还需要调用并配合本地程序,并在全局配置中声明本地程序信息,让插件知道本地程序在哪。
Credentials # 签名证书管理插件
Gitlab # 安装后从 GitLab 获取代码
Git 和 Git Client # 用于 Jenkins 在 GitLab 中拉取源码
Generic Webhook Trigger #GitLab 触发 Jenkins 构建项目, Gitlab Hook这个插件被代替了
Gitlab Authentication # GitLab 和 Jenkins 认证插件
SSH Plugin # 进程执行 Shell 脚本
Publish Over SSH # 用于通过 SSH 部署应用
6、卸载
6.1、rpm卸载
rpm -e jenkins
6.2、检查是否卸载成功
rpm -ql jenkins
6.3、彻底删除残留文件:
find / -iname jenkins | xargs -n 1000 rm -rf
原文链接:https://blog.csdn.net/weixin_43804995/article/details/126801501
四、Jenkins环境设置
4.1、jenkins全局环境设置
•设置位置: 设置 - Global Tool Configuration - 配置:其实际的操作过程相当于配置全局的环境变量,以便Jenkins能够通过对应插件调用该工具,然后进行本地操作。
•插件作用: 在Jenkins中辅助相关功能的实现,插件的实现还需要调用并配合本地程序,因此本地也需要安装相关程序,并在Jenkins中配置信息(也可以在Jenkins中配置自动安装)。比如Git插件:git插件为Jenkins项目提供基本的git交互操作。它可以轮询、获取、签出、分支、列表、合并、标记和推送存储库。
4.2、Java全局环境设置
4.3、Git全局环境设置
注意: 这里的git位置必须是可执行文件的地址,即是git/bin/下的可执行文件 git的目录地址!不配置git本地程序的话,无法创建执行任务,拉取程序到本地管理。
4.4、maven全局环境设置
五、jenkins创建新任务
5.1、新建item:即新建一个任务,进入后会出现下面的界面
在这个地方,我们会发现没有maven的项目,所以我们需要去安装一个插件
进入Plugin Manager,在这里面去安装我们所需要的一些插件
回到之前新建item那个页面,便可以去创建一个maven的item了
5.2、创建maven任务
General:项目概述,在这个里面去进行一些项目说明
源码管理:我们需要使用git去拉源代码,所以需要配置git的一些选项
在Jenkins的服务器(Linux)上,也需要去安装git,在服务器上直接yum便可以完成安装
yum install -y git
Credentials:这个选项里面是添加凭证,有一些项目不是公开的,所以需要去添加一些凭证,我在这里选择的是公共的项目,公开的,所以便不需要去添加
构建触发器:默认勾选上的是下面的选项:Jenkins将会去寻找之前已经构建过的pom依赖(如果有之前构建过的相同的pom文件),直接使用之前的镜像,便不会再去重新的解析了,暂时便先保持默认的,不去进行修改
构建环境:在这里面,勾选上对应的内容,将去做一些额外的处理,在这里也是想保持默认的,什么都不去勾选
Pre Steps:这个配置说明的是在构建之前可以做的那些操作,在这个选项里面可以去添加一系列的脚本,在这里,我们也是先保持默认的选项
Build:
Root POM:这个pom,是相对于git的整体的目录的,
如下,如果我们的项目的pom文件地址在下面这个目录
则,我们需要将Root POM 修改为
Goals and options:这个选项我们也暂时先不去管,保持默认的空即可
Post Steps:这个配置,说明的是:在项目构建完成之后,接下来需要做的内容
在这里,我们需要将构建完的项目,打成的包传到我们的测试服务器上,也是在这里去进行配置的
其他:剩下的两个配置,便先暂时不去配置,直接保存
六、构建自动化脚本
将启动的shell脚本和停止的shell脚本,写到服务器的文件夹中(和发布的项目在一起)
#!/bin/sh export GATEWAY=les-gateway.jar export AUTH=les-auth.jar export WMS=modules-wms-system.jar export MASTERDATA=les-modules-masterData.jar export LES=modules-les-system.jar export JOB=les-modules-job.jar export FILE=les-modules-file.jar export GATEWAY_port=8080 export AUTH_port=9205 export WMS_port=9201 export MASTERDATA_port=8085 export LES_port=9203 export JOB_port=9211 export FILE_port=9300 case "$1" in start) ## 启动gateway echo "--------开始启动GATEWAY---------------" nohup java -jar $GATEWAY >/dev/null 2>&1 & GATEWAY_pid=`lsof -i:$GATEWAY_port|grep "LISTEN"|awk '{print $2}'` until [ -n "$GATEWAY_pid" ] do GATEWAY_pid=`lsof -i:$GATEWAY_port|grep "LISTEN"|awk '{print $2}'` done echo "GATEWAY pid is $GATEWAY_pid" echo "---------GATEWAY 启动成功-----------" ## 启动auth echo "--------开始启动AUTH---------------" nohup java -jar $AUTH >/dev/null 2>&1 & AUTH_pid=`lsof -i:$AUTH_port|grep "LISTEN"|awk '{print $2}'` until [ -n "$AUTH_pid" ] do AUTH_pid=`lsof -i:$AUTH_port|grep "LISTEN"|awk '{print $2}'` done echo "AUTH pid is $AUTH_pid" echo "---------AUTH 启动成功-----------" ## 启动MASTERDATA echo "--------MASTERDATA 开始启动--------------" nohup java -jar $MASTERDATA >/dev/null 2>&1 & MASTERDATA_pid=`lsof -i:$MASTERDATA_port|grep "LISTEN"|awk '{print $2}'` until [ -n "$MASTERDATA_pid" ] do MASTERDATA_pid=`lsof -i:$MASTERDATA_port|grep "LISTEN"|awk '{print $2}'` done echo "MASTERDATA pid is $MASTERDATA_pid" echo "--------MASTERDATA 启动成功--------------" ## 启动LES echo "--------开始启动LES---------------" nohup java -jar $LES >/dev/null 2>&1 & LES_pid=`lsof -i:$LES_port|grep "LISTEN"|awk '{print $2}'` until [ -n "$LES_pid" ] do LES_pid=`lsof -i:$LES_port|grep "LISTEN"|awk '{print $2}'` done echo "LES pid is $LES_pid" sleep 10 echo "---------LES 启动成功-----------" ## 启动WMS echo "--------开始启动WMS---------------" nohup java -jar $WMS >/dev/null 2>&1 & WMS_pid=`lsof -i:$WMS_port|grep "LISTEN"|awk '{print $2}'` until [ -n "$WMS_pid" ] do WMS_pid=`lsof -i:$WMS_port|grep "LISTEN"|awk '{print $2}'` done echo "WMS pid is $WMS_pid" echo "---------WMS 启动成功-----------" ## 启动FILE echo "--------开始启动FILE---------------" nohup java -jar $FILE >/dev/null 2>&1 & FILE_pid=`lsof -i:$FILE_port|grep "LISTEN"|awk '{print $2}'` until [ -n "$FILE_pid" ] do FILE_pid=`lsof -i:$FILE_port|grep "LISTEN"|awk '{print $2}'` done echo "FILE pid is $FILE_pid" echo "---------WMS 启动成功-----------" ## 启动JOB echo "--------开始启动JOB---------------" nohup java -jar $JOB >/dev/null 2>&1 & JOB_pid=`lsof -i:$JOB_port|grep "LISTEN"|awk '{print $2}'` until [ -n "$JOB_pid" ] do JOB_pid=`lsof -i:$JOB_port|grep "LISTEN"|awk '{print $2}'` done echo "JOB pid is $JOB_pid" echo "---------JOB 启动成功-----------" echo "===startAll success===" ;; stop) P_ID=`ps -ef | grep -w $GATEWAY | grep -v "grep" | awk '{print $2}'` if [ "$P_ID" == "" ]; then echo "===GATEWAY process not exists or stop success" else kill -9 $P_ID echo "GATEWAY killed success" fi P_ID=`ps -ef | grep -w $FILE| grep -v "grep" | awk '{print $2}'` if [ "$P_ID" == "" ]; then echo "===FILE| process not exists or stop success" else kill -9 $P_ID echo "FILE| killed success" fi P_ID=`ps -ef | grep -w $AUTH | grep -v "grep" | awk '{print $2}'` if [ "$P_ID" == "" ]; then echo "===AUTH process not exists or stop success" else kill -9 $P_ID echo "AUTH killed success" fi P_ID=`ps -ef | grep -w $WMS | grep -v "grep" | awk '{print $2}'` if [ "$P_ID" == "" ]; then echo "===WMS process not exists or stop success" else kill -9 $P_ID echo "WMS killed success" fi P_ID=`ps -ef | grep -w $MASTERDATA | grep -v "grep" | awk '{print $2}'` if [ "$P_ID" == "" ]; then echo "===MASTERDATA process not exists or stop success" else kill -9 $P_ID echo "MASTERDATA killed success" fi P_ID=`ps -ef | grep -w $LES | grep -v "grep" | awk '{print $2}'` if [ "$P_ID" == "" ]; then echo "===LES process not exists or stop success" else kill -9 $P_ID echo "LES killed success" fi P_ID=`ps -ef | grep -w $JOB | grep -v "grep" | awk '{print $2}'` if [ "$P_ID" == "" ]; then echo "===JOB process not exists or stop success" else kill -9 $P_ID echo "JOB killed success" fi echo "===stop success===" ;; restart) $0 stop sleep 2 $0 start echo "===restart success===" ;; esac exit 0
七、构建
进入Dashboard的首页后,会将我们之前创建的任务直接显示在这个地方
点击右边的“播放”按钮,手动去构建一下,点击后的情况如下
左边的“构建执行状态”便会显示如下
点击红框内容,进入界面,选择“控制台输出”,便可以查看构建的过程,知道现在在做什么
构建成功:在这里可以知道当前打成的jar包的位置等信息
最后:部署中遇到的问题
1、jenkins部署后应用不启动
在jenkins控制台看启动脚本执行(start.sh)完毕,ps查看进程发现没有对应进程,在linux服务器上直接执行start.sh发现可以启动成功。Jenkins默认会在Build结束后Kill掉所有的衍生进程,用官方的话来说就是:
To reliably kill processes spawned by a job during a build, Jenkins contains a bit of native code to list up such processes and kill them.
解决方法:
Jenkins-->Manage Jenkins-->Configure System 在Global properties下,新增新的环境变量,然后保存。
key=BUILD_ID
value=allow_to_run_as_daemon start_my_service
参考链接:
https://blog.csdn.net/qq_40772692/article/details/125715726
https://blog.csdn.net/weixin_43804995/article/details/126801501
https://blog.csdn.net/xxxxssss12/article/details/102455021
https://blog.csdn.net/Q17532573105/article/details/129345051