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/javacandidates="/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 --permanentsuccess[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.rpmrpm -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.reposudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key#只升级所有本地yum包,不升级软件和系统内核,软件和内核保持原样。sudo yum upgrade# Add required dependencies for the jenkins packagesudo yum install java-11-openjdksudo yum install jenkinssudo 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相关插件

  • 三个插件
GiteeMaven IntegrationPipeline 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/shexport GATEWAY=les-gateway.jarexport AUTH=les-auth.jarexport WMS=modules-wms-system.jarexport MASTERDATA=les-modules-masterData.jarexport LES=modules-les-system.jarexport JOB=les-modules-job.jarexport FILE=les-modules-file.jar export GATEWAY_port=8080export AUTH_port=9205export WMS_port=9201export MASTERDATA_port=8085export LES_port=9203export JOB_port=9211export 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