jenkins+linux+gitee+maven自动化集成部署项目

发布时间 2023-07-26 00:03:35作者: QianTM

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