CI/CD(三)—— 【保姆级实操】Jenkins+Docker GitLab+Tomcat 实现微服务CI/CD全流程部署

文章目录

  • 前言
  • 一、基础概念:理解CI/CD与Jenkins核心逻辑
    • [1.1 软件开发生命周期(SDLC)](#1.1 软件开发生命周期(SDLC))
    • [1.2 传统开发模型:瀑布模型的局限](#1.2 传统开发模型:瀑布模型的局限)
    • [1.3 敏捷开发:迭代与增量的核心](#1.3 敏捷开发:迭代与增量的核心)
    • [1.4 CI/CD流程:自动化的核心](#1.4 CI/CD流程:自动化的核心)
    • [1.5 Jenkins概述:CI/CD的"自动化引擎"](#1.5 Jenkins概述:CI/CD的“自动化引擎”)
  • 二、环境准备:部署GitLab、Jenkins与测试服务器
    • [2.1 192.168.10.21:GitLab(Docker版)部署](#2.1 192.168.10.21:GitLab(Docker版)部署)
    • [2.2 192.168.10.22:Jenkins 2.528.1安装(适配JDK21)](#2.2 192.168.10.22:Jenkins 2.528.1安装(适配JDK21))
      • [2.2.1 安装 JDK21](#2.2.1 安装 JDK21)
      • [2.2.2 安装 Jenkins 2.528.1](#2.2.2 安装 Jenkins 2.528.1)
      • [2.2.3 配置 Jenkins(用户、端口、JDK路径)](#2.2.3 配置 Jenkins(用户、端口、JDK路径))
      • [2.2.4 启动 Jenkins 并初始化](#2.2.4 启动 Jenkins 并初始化)
      • [2.2.5 优化插件源(解决国内网络问题)](#2.2.5 优化插件源(解决国内网络问题))
      • [2.2.6 常见问题与解决](#2.2.6 常见问题与解决)
    • [2.3 192.168.10.18:应用测试服务器配置(Tomcat)](#2.3 192.168.10.18:应用测试服务器配置(Tomcat))
      • [2.3.1 安装JDK1.8](#2.3.1 安装JDK1.8)
      • [2.3.2 安装Tomcat8.5](#2.3.2 安装Tomcat8.5)
      • [2.3.3 配置Tomcat远程部署权限](#2.3.3 配置Tomcat远程部署权限)
  • 三、GitLab仓库配置:创建项目与上传源码
    • [3.1 创建GitLab组、用户与项目](#3.1 创建GitLab组、用户与项目)
      • [3.1.1 创建组(devops_group)](#3.1.1 创建组(devops_group))
      • [3.1.2 创建用户(simon)](#3.1.2 创建用户(simon))
      • [3.1.3 将用户添加到组](#3.1.3 将用户添加到组)
      • [3.1.4 创建项目(web_demo)](#3.1.4 创建项目(web_demo))
    • [3.2 上传源码到GitLab](#3.2 上传源码到GitLab)
      • [3.2.1 本地配置Git(以Linux为例)](#3.2.1 本地配置Git(以Linux为例))
      • [3.2.2 上传源码](#3.2.2 上传源码)
  • 四、Jenkins核心配置:凭据、权限与全局工具配置
    • [4.1 凭据管理:安全存储敏感信息](#4.1 凭据管理:安全存储敏感信息)
      • [4.1.1 配置"用户名密码"凭据(GitLab)](#4.1.1 配置“用户名密码”凭据(GitLab))
      • [4.1.2 配置"SSH密钥"凭据(GitLab免密访问)](#4.1.2 配置“SSH密钥”凭据(GitLab免密访问))
    • [4.2 用户权限管理:基于Role插件](#4.2 用户权限管理:基于Role插件)
      • [4.2.1 安装插件](#4.2.1 安装插件)
      • [4.2.2 开启角色授权](#4.2.2 开启角色授权)
      • [4.2.3 创建角色与分配用户](#4.2.3 创建角色与分配用户)
    • [4.3 全局工具配置:Maven配置](#4.3 全局工具配置:Maven配置)
      • [4.3.1 自动安装 Maven(推荐方式)](#4.3.1 自动安装 Maven(推荐方式))
      • [4.3.2 验证配置是否生效](#4.3.2 验证配置是否生效)
  • 五、Jenkins构建项目:从自由风格到Pipeline
    • [5.1 自由风格项目:Web_demo_freestyle](#5.1 自由风格项目:Web_demo_freestyle)
      • [5.1.1 新建项目](#5.1.1 新建项目)
      • [5.1.2 配置源码管理(拉取GitLab代码)](#5.1.2 配置源码管理(拉取GitLab代码))
      • [5.1.3 配置编译打包(Maven)](#5.1.3 配置编译打包(Maven))
      • [5.1.4 配置部署到Tomcat](#5.1.4 配置部署到Tomcat)
      • [5.1.5 测试构建](#5.1.5 测试构建)
    • [5.2 Maven项目:Web_demo_maven](#5.2 Maven项目:Web_demo_maven)
      • [5.2.1 修改源码并提交到 GitLab(Windows 方式)](#5.2.1 修改源码并提交到 GitLab(Windows 方式))
      • [5.2.2 安装 Maven Integration 插件](#5.2.2 安装 Maven Integration 插件)
      • [5.2.3 新建Maven项目](#5.2.3 新建Maven项目)
    • [5.3 Pipeline项目:Web_demo_pipeline(推荐)](#5.3 Pipeline项目:Web_demo_pipeline(推荐))
      • [5.3.1 安装Pipeline插件](#5.3.1 安装Pipeline插件)
      • [5.3.2 编写Jenkinsfile(核心)](#5.3.2 编写Jenkinsfile(核心))
      • [5.3.3 上传Jenkinsfile到GitLab](#5.3.3 上传Jenkinsfile到GitLab)
      • [5.3.4 新建Pipeline项目](#5.3.4 新建Pipeline项目)
      • [5.3.5 测试Pipeline](#5.3.5 测试Pipeline)
    • [5.4 参数化构建:动态选择分支](#5.4 参数化构建:动态选择分支)
      • [5.4.1 配置参数](#5.4.1 配置参数)
      • [5.4.2 测试参数化构建](#5.4.2 测试参数化构建)
  • [六、自动化触发:GitLab Webhook](#六、自动化触发:GitLab Webhook)
    • [6.1 配置Jenkins接收Webhook](#6.1 配置Jenkins接收Webhook)
    • [6.2 配置GitLab Webhook](#6.2 配置GitLab Webhook)
    • [6.3 测试Webhook](#6.3 测试Webhook)
  • [七、代码审查:Jenkins + SonarQube](#七、代码审查:Jenkins + SonarQube)
    • [7.1 SonarQube安装(以192.168.10.23为例)](#7.1 SonarQube安装(以192.168.10.23为例))
    • [7.2 Jenkins集成SonarQube](#7.2 Jenkins集成SonarQube)
    • [7.3 Pipeline集成SonarQube审查](#7.3 Pipeline集成SonarQube审查)
  • 八、邮件通知:构建结果实时推送
    • [8.1 安装Email Extension插件](#8.1 安装Email Extension插件)
    • [8.2 配置SMTP](#8.2 配置SMTP)
    • [8.3 测试邮件通知](#8.3 测试邮件通知)
  • 总结

前言

在现代软件开发中,持续集成(CI)与持续部署(CD) 是提升团队效率、保障代码质量的核心手段。Jenkins作为开源CI/CD工具的标杆,凭借其灵活的插件生态和强大的流程编排能力,成为企业级自动化部署的首选。

本文基于实际生产环境需求,详细讲解从环境搭建到全流程自动化部署的完整步骤,重点解决"部署落地"问题。文中环境规划如下:

  • 192.168.10.21 :GitLab服务器(Docker版 twang2218/gitlab-ce-zh:latest,中文社区版,方便国内用户使用)
  • 192.168.10.22:Jenkins服务器(版本2.528.1,适配JDK21,避免新版本兼容性问题)
  • 192.168.10.18:应用测试服务器(部署Tomcat,用于接收Jenkins构建的应用包)

全文涵盖Jenkins安装配置、GitLab仓库管理、Maven项目构建、Pipeline流水线编排、Webhook自动触发、SonarQube代码审查等核心环节,所有步骤均经过实操验证,修改处会明确标注,确保新手也能顺利复现。

一、基础概念:理解CI/CD与Jenkins核心逻辑

在动手部署前,先理清核心概念,避免"知其然不知其所以然"。

1.1 软件开发生命周期(SDLC)

SDLC(Software Development Life Cycle)是软件从需求到退役的完整流程,核心阶段包括:

1、需求分析 :收集业务需求(如用户需要"添加用户"功能),评估可行性、预算和目标,输出《需求规格说明书》。

2、设计 :拆分系统架构(如前后端分离、微服务拆分),定义模块接口,输出设计文档(如数据库ER图、接口文档)。

3、实现 :开发人员根据设计文档编写代码,按模块交付(如用户模块、订单模块),周期随项目复杂度从数周到数月不等。

4、测试 :测试人员执行功能测试(验证"添加用户"是否正常)、压力测试(模拟1000人同时访问)、代码测试(检查语法错误),输出测试报告并修复Bug。

5、进化:上线后根据用户反馈迭代功能(如新增"删除用户")、修复线上Bug、优化性能,持续维护产品生命周期。

1.2 传统开发模型:瀑布模型的局限

瀑布模型是早期线性开发模型,流程为:产品设计 → 代码开发 → 功能测试 → 运维上线,仅适用于简单项目,缺点明显:

  • 阶段固定,需求变更成本高(如开发中途改功能需推翻重来);
  • 用户需等到流程末期才能看到产品,风险集中;
  • 文档冗余,工作量大(每个阶段需输出大量文档)。

现代开发已很少使用纯瀑布模型,更多采用敏捷开发+CI/CD的组合。

1.3 敏捷开发:迭代与增量的核心

敏捷开发的核心是迭代开发 (拆分大周期为小周期)+ 增量开发 (每个周期交付可用功能),优势如下:

1、迭代开发 :如开发"电商系统",不一次性开发所有功能,而是先做"商品展示"(迭代1),再做"购物车"(迭代2),最后做"支付"(迭代3),每个迭代都重复"需求→设计→开发→测试"流程。

2、增量开发:每个迭代交付"可使用的完整功能",如迭代1交付"能浏览商品的页面",而非"只搭好商品模块的骨架"。

敏捷开发能快速响应用户需求,降低风险,是CI/CD的理念基础。

1.4 CI/CD流程:自动化的核心

  • 持续集成(CI):开发人员频繁提交代码(如一天多次),Jenkins自动拉取代码、编译、测试,确保新代码与主干兼容。核心是"频繁集成+自动化测试",避免代码冲突和隐藏Bug。
  • 持续交付(CD) :CI通过后,自动将应用部署到测试/预生产环境(如192.168.10.18的Tomcat),供测试人员验证,不直接上线生产。
  • 持续部署(CD) :测试通过后,自动将应用部署到生产环境,全程无需人工干预(需谨慎,通常配合灰度发布)。

CI/CD流程示意图:开发提交代码 → GitLab仓库 → Jenkins拉取编译 → 自动化测试 → 部署到测试服务器 → (手动/自动)部署到生产

1.5 Jenkins概述:CI/CD的"自动化引擎"

Jenkins是Java开发的开源CI/CD工具,核心功能包括:

  • 自动化构建:支持Maven、Gradle等工具,自动编译代码、打包成Jar/War包;
  • 分布式构建:多台服务器(Agent节点)协同工作,分担Master节点压力;
  • 插件生态:支持Git、Docker、K8s、SonarQube等工具集成,通过插件扩展功能;
  • 流水线(Pipeline):用代码(Jenkinsfile)定义部署流程,支持版本控制和复杂逻辑(如分支、并行执行)。

Jenkins官网:https://www.jenkins.io/,中文文档:https://www.jenkins.io/zh/

二、环境准备:部署GitLab、Jenkins与测试服务器

按规划搭建基础环境,重点解决Docker GitLab配置、Jenkins JDK21适配问题。

服务器列表

代码托管服务器 192.168.10.21 Gitlab
持续集成服务器 192.168.10.22 Jenkins2.528.1,JDK21,Maven,Git
应用测试服务器 192.168.10.18 JDK1.8,Tomcat8.5

2.1 192.168.10.21:GitLab(Docker版)部署

参考博客CI/CD(一)------ 从零搭建 GitLab 全流程(Docker 部署 + 实战指南)


2.2 192.168.10.22:Jenkins 2.528.1安装(适配JDK21)

Jenkins 2.528.1 为稳定版本,兼容 JDK21(新版本 Jenkins 可能要求更高的 JDK)。

本文在 192.168.10.22 服务器上安装 Jenkins,并使用清华源加速插件下载。


2.2.1 安装 JDK21

1、下载 JDK21 压缩包(可从 Oracle 官网下载):
https://www.oracle.com/java/technologies/downloads/#java21

将下载好的 jdk-21_linux-x64_bin.tar.gz 上传到 /opt 目录。

2、解压并配置环境变量:

bash 复制代码
# 解压 JDK 并移动到标准路径
tar zxvf jdk-21_linux-x64_bin.tar.gz -C /usr/local/
mv /usr/local/jdk-21.0.9 /usr/local/jdk21

# 配置环境变量
vim /etc/profile
# 添加以下内容(此处路径为JDK21安装路径)
export JAVA_HOME=/usr/local/jdk21
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

# 立即生效
source /etc/profile

# 验证安装(显示java version "21.x.x"即为成功)
java -version

2.2.2 安装 Jenkins 2.528.1

1、添加 Jenkins 官方源并导入密钥:

bash 复制代码
# 下载 Jenkins repo
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo --no-check-certificate

# 导入公钥
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

# 安装 EPEL 源(解决依赖)
yum install epel-release -y

2、安装指定版本 Jenkins(锁定为 2.528.1):

bash 复制代码
yum install jenkins-2.528.1-1.1.noarch -y

2.2.3 配置 Jenkins(用户、端口、JDK路径)

修改 Jenkins 服务文件(适配 JDK21):

bash 复制代码
vim /usr/lib/systemd/system/jenkins.service
# 修改以下参数
[Unit]
Description=Jenkins Continuous Integration Server
After=network.target

[Service]
User=root
Group=root

# 指定 JDK21 环境变量
Environment="JAVA_HOME=/usr/local/jdk21"
# 指定 Jenkins 端口(替换默认8080)
Environment="JENKINS_PORT=8888"
# Jenkins 主目录(默认即可)
Environment="JENKINS_HOME=/var/lib/jenkins"
# 如果最小化安装,服务器无UI界面加上这一句
Environment="JENKINS_JAVA_OPTIONS=-Djava.awt.headless=true"

# Jenkins 启动命令(由官方脚本 /usr/bin/jenkins 管理)
ExecStart=/usr/bin/jenkins

# 避免 Jenkins 启动超时报错
TimeoutStartSec=300
SuccessExitStatus=143
Restart=always

[Install]
WantedBy=multi-user.target

/etc/sysconfig/jenkins 在 2.528.1 版本中为空或被弃用,不再生效。

所以不用修改 /etc/sysconfig/jenkins/etc/init.d/jenkins,所有配置都在 .service 文件中完成。


2.2.4 启动 Jenkins 并初始化

1、启动 Jenkins 服务并设置开机自启:

bash 复制代码
# 如果最小化安装,安装字体支持库
yum install -y fontconfig dejavu-sans-fonts liberation-fonts

systemctl daemon-reload
systemctl start jenkins
systemctl enable jenkins

2、验证 Jenkins 是否运行成功:

bash 复制代码
# 查看服务状态
systemctl status jenkins

# 验证 8888 端口监听(出现 java 进程即为成功)
netstat -lnutp | grep 8888

3、等待 Jenkins 第一次启动(约 2~3 分钟)。

首次启动后会自动创建 /var/lib/jenkins 配置目录,结构如下:

复制代码
/var/lib/jenkins/
├── config.xml
├── hudson.model.UpdateCenter.xml
├── secrets/
├── plugins/
├── jobs/
└── updates/

4、访问初始化页面并登录:

  • 浏览器访问:
    http://192.168.10.22:8888

  • 获取初始管理员密码:

    bash 复制代码
    cat /var/lib/jenkins/secrets/initialAdminPassword
  • 粘贴密码后选择 "安装推荐的插件"(若失败可重试)

  • 创建管理员用户(示例):

    复制代码
    用户名:simon
    密码:simon@123
    邮箱:simon@example.com
  • 确认 Jenkins URL:

    默认 http://192.168.10.22:8888/

    点击 "保存并完成"。


2.2.5 优化插件源(解决国内网络问题)

⚠️ 注意:以下文件需在 Jenkins 启动并初始化后才会生成。

1、替换默认插件源为清华镜像:

bash 复制代码
vim /var/lib/jenkins/hudson.model.UpdateCenter.xml
# 将原url替换为
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>

2、替换 Google 检查地址为百度(避免连接超时):

bash 复制代码
sed -i 's#https://www.google.com#https://www.baidu.com#' /var/lib/jenkins/updates/default.json

3、重启 Jenkins 使修改生效:

bash 复制代码
systemctl restart jenkins

2.2.6 常见问题与解决

问题现象 可能原因 解决方法
端口8888未监听 JDK 路径错误或 Jenkins 启动失败 检查 /usr/lib/systemd/system/jenkins.serviceJAVA_HOME
启动失败,日志出现 "Failed to start" Jenkins 解压 war 包失败 删除 /var/lib/jenkins/warfailed-boot-attempts.txt 后重启
插件源文件不存在 Jenkins 尚未初始化 启动一次 Jenkins 生成文件
访问缓慢或插件下载失败 国内网络问题 使用清华源并重启 Jenkins
网页访问被防火墙阻断 防火墙未放行 firewall-cmd --add-port=8888/tcp --permanent && firewall-cmd --reload

至此,Jenkins 2.528.1(JDK21版)安装完成,可正常通过 8888 端口访问。

下一步可进行 GitLab 集成、Pipeline 构建任务配置等操作。

2.3 192.168.10.18:应用测试服务器配置(Tomcat)

应用测试服务器用于部署Jenkins构建的War包,需安装JDK1.8(Tomcat8.5适配JDK1.8,避免JDK21兼容性问题)和Tomcat8.5。

2.3.1 安装JDK1.8

也可以执行yum install java -y直接使用openjdk

bash 复制代码
# 解压JDK1.8(上传压缩包到/opt)
tar zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_171 /usr/local/jdk1.8

# 配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin:$PATH

# 生效并验证
source /etc/profile
java -version  # 显示1.8.0_171即为成功

2.3.2 安装Tomcat8.5

1、下载Tomcat8.5(官网:https://tomcat.apache.org/download-80.cgi),上传到/opt目录。

2、解压并启动:

bash 复制代码
tar zxvf apache-tomcat-8.5.35.tar.gz
mv /opt/apache-tomcat-8.5.35 /usr/local/tomcat

# 启动Tomcat
/usr/local/tomcat/bin/startup.sh
# 验证(访问http://192.168.10.18:8080,显示Tomcat主页即为成功)

2.3.3 配置Tomcat远程部署权限

默认情况下 Tomcat 没有配置用户角色权限。

验证方法:可浏览器访问 http://192.168.10.18:8080 ,点击 Managing Tomcat 下的 manager webapp ,发现返回 403 页面。

但是后续 Jenkins 部署项目到 Tomcat 服务器,需要用到 Tomcat 的用户进行远程部署,因此需要修改配置,添加用户及权限:

1、修改用户权限文件:

bash 复制代码
vim /usr/local/tomcat/conf/tomcat-users.xml
# 在</tomcat-users>前添加(标注处为新增用户)
43 -->    #添加 tomcat 用户角色权限,指定用户和密码都是 tomcat ,并授予权限
   <role rolename="tomcat"/>
   <role rolename="role1"/>
   <role rolename="manager-script"/>
   <role rolename="manager-gui"/>
   <role rolename="manager-status"/>
   <role rolename="admin-gui"/>
   <role rolename="admin-script"/>
   <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>
</tomcat-users>

2、允许远程访问Tomcat管理页面:

bash 复制代码
vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
# 注释掉Valve配置(标注处为注释,允许外部IP访问)
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

3、重启Tomcat:

bash 复制代码
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
# 验证:访问http://192.168.10.18:8080/manager/html,用tomcat/tomcat登录,能进入管理页即为成功

三、GitLab仓库配置:创建项目与上传源码

GitLab是代码仓库,需创建组、用户和项目,用于存储开发代码,供Jenkins拉取。

3.1 创建GitLab组、用户与项目

3.1.1 创建组(devops_group)

1、登录GitLab(http://192.168.10.21,root用户)。

2、点击左上角GitLab→新建群组

  • 群组名称:devops_group
  • 群组URL:devops_group(自动填充)
  • 可见性级别:私有(避免外部访问)
  • 点击创建群组

3.1.2 创建用户(simon)

1、点击顶部扳手图标(管理区域)→新建用户

  • 姓名:simon
  • 用户名:simon
  • 电子邮箱:simon@example.com
  • 点击创建用户

2、设置用户密码:点击用户右侧Edit,密码设为simon@123,点击Save changes

3.1.3 将用户添加到组

1、进入devops_group群组→左侧成员

2、添加成员到devops_group:搜索simon,角色权限选择Owner(拥有组内所有权限),点击添加到群组

3.1.4 创建项目(web_demo)

1、点击 【新建项目】:

  • 群组选项:devops_group
  • 项目名称:web_demo
  • 项目描述:web_demo(简单说明)
  • 可见性级别:私有
  • 点击创建项目

3.2 上传源码到GitLab

使用simon用户上传Web项目源码(如包含index.jsp的简单Web项目),步骤如下:

3.2.1 本地配置Git(以Linux为例)

bash 复制代码
# 配置全局用户(与GitLab用户一致)
git config --global user.name "simon"
git config --global user.email "simon@example.com"

# 克隆GitLab项目到本地
cd /root
git clone http://192.168.10.21/devops_group/web_demo.git
# 输入用户名simon,密码simon@123

3.2.2 上传源码

1、将Web项目源码(如web_demo.zip)上传到/opt目录,解压并移动到克隆目录:

bash 复制代码
cd /opt
unzip web_demo.zip
mv web_demo/* /root/web_demo/  # /root/web_demo是克隆后的目录

2、提交并推送代码:

bash 复制代码
cd /root/web_demo
# 添加所有文件到暂存区
git add .
# 提交(备注初始化项目)
git commit -m "init web_demo"
# 推送到GitLab(输入用户名和密码)
git push -u origin master

3、验证:登录GitLabdevops_groupweb_demo,能看到上传的源码(如pom.xml、src目录)即为成功。

四、Jenkins核心配置:凭据、权限与全局工具配置

Jenkins需配置凭据(访问GitLab、Tomcat的账号密码)、用户权限(不同角色各司其职)和Maven(编译Java项目),为后续构建做准备。

4.1 凭据管理:安全存储敏感信息

Jenkins支持多种凭据类型,以下是常见的凭据类型:

凭据类型 用途 生活举例
Username with password 登录需要用户名和密码的服务 登录网银
SSH Username with private key 免密连接远程服务器 用私人钥匙解锁保险箱
Secret file 使用敏感文件(临时共享) 快递员临时用你的快递单号
Secret text 保存加密文本信息 快递取件码或 API Token
Certificate 使用证书认证身份 办公单位盖章的文件

我们常用的有用户名密码SSH密钥,此处配置访问GitLab的两种凭据。

4.1.1 配置"用户名密码"凭据(GitLab)

1、Manage Jenkins → Credentials → System → Global credentials (unrestricted)

2、选择Username with password类型:

  • 用户名:simon(GitLab用户名)
  • 密码:simon@123(GitLab密码)
  • 描述:gitlab-auth-password(便于识别)
  • 点击确定

3、测试凭据是否可用

  • 创建一个FreeStyle项目:新建Item -> 任务名称(test01) FreeStyle Project -> 确定

  • 点击源码管理

    • 选择 Git,Repository URL:http://192.168.10.21/devops_group/web_demo.git(可从 Gitlab 使用 HTTP 克隆)
    • Credentials 下拉选择 gitlab-auth-password,点击 保存。
  • 点击 Bulid Now 开始构建,查看控制台输出可以看到构建成功,构建后的包会生成在服务器的 /var/lib/jenkins/workspace/test01 目录中。

4.1.2 配置"SSH密钥"凭据(GitLab免密访问)

1、在Jenkins服务器(192.168.10.22)生成SSH密钥:

bash 复制代码
# 生成密钥(无密码,直接回车)
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 查看公钥(复制输出内容)
cat /root/.ssh/id_rsa.pub


2、将公钥添加到GitLab:

  • 登录GitLab(root用户)→右上角头像→设置→SSH密钥
  • 粘贴公钥内容,标题设为root@jenkins,点击添加密钥

3、在Jenkins添加SSH凭据:

  • 添加凭据→选择SSH Username with private key
  • 用户名:root(Jenkins服务器的root用户,与密钥生成用户一致)
  • Private KeyEnter directly→粘贴/root/.ssh/id_rsa的内容(私钥)。
  • 描述:gitlab-auth-ssh
  • 点击确定
  • Jenkins服务器上手动执行一次ssh git@192.168.10.21,输入yes,在 ~/.ssh/known_hosts 里记录主机指纹。


4、测试凭据是否可用

  • 创建一个FreeStyle项目:新建Item -> 任务名称(test02) FreeStyle Project -> 确定
  • 点击源码管理
    • 选择 Git,Repository URL:git@192.168.10.21:devops_group/web_demo.git(可从 Gitlab 使用SSH 克隆)
    • Credentials 下拉选择 gitlab-auth-ssh,点击 保存。
  • 点击 Bulid Now 开始构建,查看控制台输出可以看到构建成功,构建后的包会生成在服务器的 /var/lib/jenkins/workspace/test02 目录中。

4.2 用户权限管理:基于Role插件

Jenkins使用Role-based Authorization Strategy插件实现角色权限控制(如开发只能看A项目,运维只能看B项目)。

4.2.1 安装插件

1、Jenkins→Manage Jenkins→插件管理→可选插件

2、搜索Role-based Authorization Strategy,勾选并点击安装(无需重启,安装完成后生效)。

4.2.2 开启角色授权

1、Manage Jenkins→全局安全设置→授权策略

2、选择Role-Based Strategy,点击保存

4.2.3 创建角色与分配用户

Global roles(全局角色):管理员等高级用户可以创建基于全局的角色
Item roles(项目角色):针对某个或者某些项目的角色
权限设置(权限类别)

  • Overall
    • Administer:管理员权限,允许对 Jenkins 进行完全管理。
    • Read:允许访问 Jenkins 界面(最基本的权限)。
  • Agent:管理 Jenkins 节点(代理)的权限。
  • Job:管理 Jenkins 任务的权限(如构建、删除、配置等)。
  • Run:管理任务运行的权限(如更新、删除工作区)。
  • View:管理视图的权限。

1、Manage Jenkins→Manage and Assign Roles→Manage Roles

  • Global roles(全局角色) :添加user角色,勾选Overall→Read(所有用户的基础访问权限)。

  • Item roles(项目角色)

    • 添加ItemA,Pattern填A-.*(匹配A-开头的项目),勾选Job下所有权限。
    • 添加ItemB,Pattern填B-.*(匹配B-开头的项目),勾选Job下所有权限。

2、Assign Roles(分配角色):

  • 创建devops用户(Manage Jenkins→Manage Users→新建用户)。

  • 分配角色(Manage Jenkins -> Manage and Assign Roles -> Assign Roles

    • dev用户绑定userItemA角色→只能访问A-开头的项目。
    • ops用户绑定userItemB角色→只能访问B-开头的项目。

3、创建项目测试权限

  • 新建Item → 创建两个项目,分别为 A-web1B-web1

  • 分别登录devops查看对应的项目

4.3 全局工具配置:Maven配置

Maven 是 Java 项目最常用的自动化构建工具,能够实现代码编译、依赖下载、测试与打包等一体化流程。

Jenkins 中,我们可以通过 全局工具配置(Global Tool Configuration) 来安装和管理 Maven,从而在构建任务中直接使用它进行 Web 项目的打包(如生成 .war 文件)。


4.3.1 自动安装 Maven(推荐方式)

当 Jenkins 服务器具备外网访问能力时,推荐使用 自动安装 Maven 的方式。

这种方式无需在系统中手动下载和配置环境变量,Jenkins 会在构建时自动从官方源下载安装 Maven。

操作步骤:

1、登录 Jenkins,进入:

复制代码
Manage Jenkins → Global Tool Configuration

2、找到 Maven 安装 区块,点击 「新增 Maven」 按钮。

3、在弹出的配置项中填写以下信息:

  • Name(名称)maven3
  • ✅ 勾选 "Install automatically"(自动安装)
  • 安装来源选择:Install from Apache

4、点击右下角的 「应用」→「保存」

💡 Jenkins 会在首次使用时自动从 Maven 官网下载并解压对应版本,

默认安装路径为:

/var/lib/jenkins/tools/hudson.tasks.Maven_MavenInstallation/maven3/


4.3.2 验证配置是否生效

1、点击项目 test02 → 配置 → 增加构建步骤 → Invoke top-level Maven targets

2、在出现的配置框中设置:

  • Maven Version:选择你在全局工具配置中添加的 maven3
  • Goals:clean package(清空原有的构建元素(插件、依赖包等target文件),再进行打包)

3、点击 保存

4、再次构建,如果可以把项目打成 war 包,代表 maven 环境配置成功。构建后的war包在/var/lib/jenkins/workspace/test02/target/下。


五、Jenkins构建项目:从自由风格到Pipeline

本章重点讲解三种项目构建方式:自由风格(简单项目)、Maven项目(Java项目)、Pipeline(复杂流程,推荐),所有项目均部署到192.168.10.18的Tomcat。

5.1 自由风格项目:Web_demo_freestyle

适合简单Web项目,步骤为拉取代码→编译打包→部署到Tomcat

5.1.1 新建项目

1、Jenkins→新建Item→输入任务名称web_demo_freestyle→选择Freestyle project确定

5.1.2 配置源码管理(拉取GitLab代码)

1、源码管理→选择Git

2、Repository URLgit@192.168.10.21:devops_group/web_demo.git(GitLab SSH地址)。

3、Credentials:选择gitlab-auth-ssh(之前配置的SSH凭据)。

4、Branches to build*/master(拉取master分支)。

5.1.3 配置编译打包(Maven)

1、配置增加构建步骤Invoke top-level Maven targets

2、在出现的配置框中设置:

  • Maven Version:选择你在全局工具配置中添加的 maven3
  • Goals:clean package

5.1.4 配置部署到Tomcat

Jenkins 本身无法实现远程部署到 Tomcat 的功能,需要安装 Deploy to container 插件实现。

1、安装Deploy to container插件:Manage Jenkins→插件管理→可选插件,搜索并安装该插件,重启Jenkins。

2、配置构建后操作增加构建后操作步骤Deploy war/ear to a container

3、配置部署参数:

  • WAR/EAR filestarget/*.war(Maven打包后的War包路径)。

  • ContainersAdd ContainerTomcat 8.x Remote

  • Credentials添加Username with password,用户名tomcat,密码tomcat,描述tomcat-auth,选择该凭据。

  • Tomcat URLhttp://192.168.10.18:8080(测试服务器Tomcat地址)。

4、点击应用→保存

5.1.5 测试构建

1、点击Build Now,查看控制台输出,显示Finished: SUCCESS即为成功。

2、验证:部署成功后,刷新http://192.168.10.14:8080/manager/html 页面,可以发现应用程序中多出一个项目,点击新项目进去访问 ,能看到index.jsp页面即为成功。

5.2 Maven项目:Web_demo_maven

专为Maven项目设计,无需手动写mvn命令,Jenkins自动识别pom.xml。

5.2.1 修改源码并提交到 GitLab(Windows 方式)

在 Windows 环境中,我们可以使用 Git Bash 工具完成代码的克隆、修改、提交与推送。以下步骤仓库地址
http://gitlab/devops_group/web_demo.git 为例进行演示。

5.2.1.1首先下载代码(克隆仓库)

1、进入你希望保存项目的目录,例如 C:\project,打开 Git Bash,:

2、执行克隆命令,将远程仓库下载到本地:

bash 复制代码
git clone http://192.168.10.21/devops_group/web_demo.git

3、克隆成功后,进入项目目录:

bash 复制代码
cd web_demo

💡 说明:

  • 如果提示输入用户名和密码,请输入你在 GitLab 上的账号和密码。
  • 若配置了 SSH 公钥方式访问,可改为:
    git clone git@gitlab:devops_group/web_demo.git

5.2.1.2 修改代码

1、打开项目目录,例如 web_demo 下的 src/main/webapp/index.jsp(根据你的项目结构)。

2、使用任意编辑器(推荐 VS Code / Notepad++ / IntelliJ IDEA)修改页面内容。

例如修改原来的测试页面:

修改前:

jsp 复制代码
如果看到此页面,代表项目部署成功啦!--这是master分支

修改后:

jsp 复制代码
如果看到此页面,代表项目部署成功啦!--页面已由Windows本地修改

5.2.1.3 提交代码

修改完成后,通过 Git Bash 执行以下命令提交更改。

1、查看当前修改状态:

bash 复制代码
git status

2、将修改的文件加入暂存区:

bash 复制代码
git add .

3、提交修改到本地仓库:

bash 复制代码
git commit -m "update index.jsp: 修改页面提示内容"

4、推送到远程仓库(master分支):

bash 复制代码
git push origin master

⚠️ 注意事项:

  • 首次提交时,如果 Git 提示身份未设置,请配置用户名和邮箱:

    bash 复制代码
    git config --global user.name "你的名字"
    git config --global user.email "你的邮箱@example.com"
  • 若使用 HTTP 方式,需要输入 GitLab 账号和密码。

    若 GitLab 启用了 Token 验证,请使用 Personal Access Token 代替密码。


5.2.1.4 在 GitLab 上测试查看

1、登录到 GitLab Web 页面:

访问 http://gitlab/devops_group/web_demo

2、进入仓库的 Repository → Files 页面,可以看到刚刚提交的 index.jsp 文件及更新记录。

3、点击提交记录(Commits)可查看你的提交信息与修改内容。

5.2.2 安装 Maven Integration 插件

Manage Jenkins→ 管理插件→可选插件→ 搜索 Maven Integration 插件选中直接安装即可


5.2.3 新建Maven项目

1、新建Item→任务名称web_demo_maven→选择构建一个maven项目确定

2、源码管理:同5.1.2,URL和凭据一致。

3、BuildRoot POMpom.xml(项目根目录的pom.xml)。

4、Goals and optionsclean package(编译打包命令,无需写mvn)。

5、构建后操作:同5.1.4,部署到Tomcat。

6、点击Build Now,验证方式同5.1.5。

如果构建失败,提示java.io.IOException: Cannot run program "java"

Manage Jenkins → 全局工具配置 → 配置JDK


5.3 Pipeline项目:Web_demo_pipeline(推荐)

用Jenkinsfile(代码)定义部署流程,支持版本控制和复杂逻辑(如分支判断、并行执行),是企业级部署的首选。

5.3.1 安装Pipeline插件

Manage Jenkins→插件管理→可选插件,搜索并安装PipelinePipeline Stage View插件,重启Jenkins。

5.3.2 编写Jenkinsfile(核心)

在GitLab的web_demo项目根目录创建Jenkinsfile,内容如下:

groovy 复制代码
pipeline {
    agent any  # 任意可用节点
    environment {
        branch = "master"  # 默认分支
    }
    stages {
        // 1、拉取代码
        stage('拉取代码') {
            steps {
                checkout scmGit(
                    branches: [[name: "*/${branch}"]],  // 动态分支,支持参数化构建
                    extensions: [],
                    userRemoteConfigs: [[
                        credentialsId: 'gitlab-auth-ssh',  // SSH凭据ID(需与Jenkins一致)
                        url: 'git@192.168.10.21:devops_group/web_demo.git'  // GitLab SSH地址
                    ]]
                )
            }
        }
        
        // 2、编译打包
        stage('编译构建') {
            steps {
                sh 'mvn clean package'  // Maven编译打包
            }
        }
        
        // 3、部署到Tomcat
        stage('项目部署') {
            steps {
                // 部署到测试服务器Tomcat
                deploy adapters: [
                    tomcat8(
                        credentialsId: 'tomcat-auth',  // Tomcat凭据ID
                        path: '',
                        url: 'http://192.168.10.18:8080'
                    )
                ],
                contextPath: null,
                war: 'target/*.war'
            }
        }
    }
    
    // 4、构建后发送邮件通知
    post {
        always {  // 无论成功失败都发送
            emailext(
                subject: '构建通知: ${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
                body: '${FILE,path="email.html"}',  // 邮件模板(需提前上传email.html到项目根目录)
                to: '18262623058@139.com'  // 收件人邮箱
            )
        }
    }
}

5.3.3 上传Jenkinsfile到GitLab

bash 复制代码
cd /root/web_demo
# 创建email.html(邮件模板,内容见下文)
vim email.html
# 提交并推送
git add Jenkinsfile email.html
git commit -m "add Jenkinsfile and email template"
git push -u origin master

5.3.4 新建Pipeline项目

1、新建Item→任务名称web_demo_pipeline→选择Pipeline确定

2、流水线定义Pipeline script from SCM(从GitLab拉取Jenkinsfile)。

3、SCMGitRepository URLgit@192.168.10.21:devops_group/web_demo.gitCredentials选择gitlab-auth-ssh

4、Branches to build*/master脚本路径Jenkinsfile(GitLab中Jenkinsfile的路径)。

5、点击应用→保存

5.3.5 测试Pipeline

1、Build Now,查看阶段视图,能看到拉取代码→编译构建→项目部署三个阶段依次执行,全部绿色即为成功。

2、验证:同5.1.5,访问Tomcat上的应用。

5.4 参数化构建:动态选择分支

支持手动选择构建分支(如master、v1),适用于多版本迭代场景。

5.4.1 配置参数

1、进入web_demo_pipeline项目→配置General→勾选This project is parameterized

2、添加参数String Parameter

  • 名称branch(参数名,与Jenkinsfile中的变量一致)。
  • 默认值master
  • 描述请输入分支名称(如master、v1)
    3、点击应用→保存

5.4.2 测试参数化构建

1、点击Build with Parameters,输入分支名称(如v1,需提前在GitLab创建v1分支),点击开始构建

2、验证:Jenkins会拉取v1分支代码并部署,访问Tomcat能看到v1分支的页面(需在v1分支修改index.jsp内容)。

六、自动化触发:GitLab Webhook

实现"代码提交即构建",无需手动点击Build Now,核心是GitLab触发Jenkins构建。

6.1 配置Jenkins接收Webhook

1、安装GitLab插件:Manage Jenkins→插件管理→可选插件,搜索并安装GitLab插件。

2、Manage Jenkins→Configure System→GitLab

  • 取消勾选 Enable authentication for '/project' end-point(解决权限问题,否则Webhook触发失败)。
  • 点击应用→保存

3、配置项目Webhook:

  • 进入web_demo_pipeline配置构建触发器→勾选Build when a change is pushed to GitLab
  • 复制GitLab webhook URLhttp://192.168.10.22:8888/project/web_demo_pipeline(Jenkins项目地址)。

6.2 配置GitLab Webhook

1、登录GitLab→devops_group→web_demo→设置→集成

2、URL:粘贴上述Jenkins Webhook URL。

3、Trigger:勾选Push events(代码提交触发)。

4、点击Add webhook

6.3 测试Webhook

1、本地修改web_demo项目的index.jsp(如添加"Webhook测试"文字)。

2、提交并推送代码:git add . && git commit -m "test webhook" && git push

3、验证:Jenkins自动触发构建,显示Started by Gitlab push by simon即为成功。

七、代码审查:Jenkins + SonarQube

SonarQube是代码质量检测工具,能发现Bug、重复代码、安全漏洞,与Jenkins集成实现自动化审查。

7.1 SonarQube安装(以192.168.10.23为例)

1、安装MySQL5.7(SonarQube需数据库存储数据),创建数据库:

sql 复制代码
create database sonar;
GRANT ALL PRIVILEGES ON sonar.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'abc123';
FLUSH PRIVILEGES;

2、安装SonarQube 6.7.4(适配JDK1.8):

bash 复制代码
# 解压SonarQube
unzip sonarqube-6.7.4.zip -d /usr/local/
mv /usr/local/sonarqube-6.7.4 /usr/local/sonar

# 创建sonar用户(不能用root启动)
useradd sonar
chown -R sonar:sonar /usr/local/sonar/

# 配置数据库连接
vim /usr/local/sonar/conf/sonar.properties
sonar.jdbc.username=root
sonar.jdbc.password=abc123
sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&useSSL=false
sonar.web.port=9000  # SonarQube端口

# 启动SonarQube
su sonar -c "/usr/local/sonar/bin/linux-x86-64/sonar.sh start"

3、访问http://192.168.10.23:9000,默认用户admin/admin,创建Token(My Account→Security→Generate Token),保存Token(如105c62e8c5f3f80a58331c1498733f38b58b56e3)。

7.2 Jenkins集成SonarQube

1、安装SonarQube Scanner插件:Manage Jenkins→插件管理,安装该插件。

2、Manage Jenkins→Global Tool Configuration→SonarQube Scanner

  • 新增SonarQube Scanner,Name填sonar-scanner,勾选Install automatically,选择版本(如2.6)。
    3、Manage Jenkins→Configure System→SonarQube servers
  • Namesonarqube
  • Server URLhttp://192.168.10.23:9000
  • Server authentication token添加Secret text,粘贴SonarQube Token,描述sonarqube-auth,选择该凭据。
    4、点击应用→保存

7.3 Pipeline集成SonarQube审查

1、在GitLab的web_demo项目根目录创建sonar-project.properties

properties 复制代码
sonar.projectKey=web_demo_pipeline
sonar.projectName=web_demo_pipeline
sonar.projectVersion=1.0
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.binaries=.
sonar.java.source=1.8
sonar.java.target=1.8
sonar.sourceEncoding=UTF-8
sonar.host.url=http://192.168.10.23:9000

2、修改Jenkinsfile,新增SonarQube代码审查阶段:

groovy 复制代码
stage('SonarQube代码审查') {
    steps {
        script {
            scannerHome = tool 'sonar-scanner'  // 引用SonarQube Scanner工具
        }
        withSonarQubeEnv('sonarqube') {  // 引用SonarQube服务器配置
            sh "${scannerHome}/bin/sonar-scanner"  // 执行审查
        }
    }
}

3、提交代码并触发构建,访问http://192.168.10.23:9000,能看到web_demo_pipeline项目的审查结果(如Bug数量、重复代码率)。

八、邮件通知:构建结果实时推送

构建成功/失败后,Jenkins自动发送邮件给相关人员,需配置SMTP服务器(以QQ邮箱为例)。

8.1 安装Email Extension插件

Manage Jenkins→插件管理,安装Email Extension Template插件,重启Jenkins。

8.2 配置SMTP

1、Manage Jenkins→Configure System→Jenkins Location

  • 系统管理员邮件地址xxx@qq.com(发件人邮箱)。

2、Extended E-mail Notification

  • SMTP serversmtp.qq.com(QQ邮箱SMTP服务器)。
  • SMTP Port465(SSL端口)。
  • Credentials添加Username with password,用户名xxx@qq.com,密码为QQ邮箱授权码(需在QQ邮箱设置→账户→开启POP3/SMTP,获取授权码),描述email-auth
  • 勾选Use SSLDefault Recipients960027936@139.com(收件人邮箱)。
    3、点击Test e-mail recipient,输入收件人邮箱,显示Email was successfully sent即为成功。

8.3 测试邮件通知

修改代码并推送,Jenkins构建后会自动发送邮件,包含构建状态、日志链接等信息。


总结

本文从环境搭建到全流程自动化,详细讲解了Jenkins 2.528.1 + Docker GitLab + Tomcat的CI/CD部署方案,核心要点如下:

1、环境适配 :JDK21适配Jenkins 2.528.1,Tomcat8.5适配JDK1.8,避免版本兼容性问题;GitLab用Docker版,轻量化且易部署。

2、核心流程GitLab存储代码→Jenkins拉取编译→部署到Tomcat→Webhook自动触发→SonarQube审查→邮件通知,全程自动化。

3、关键配置 :凭据管理(安全存储敏感信息)、Pipeline(代码化流程)、Webhook(自动触发),是企业级部署的核心。

4、问题排查:插件源改为清华源(解决离线)、Tomcat注释Valve(允许远程访问)、Jenkins取消Project认证(Webhook触发),这些是新手常踩的坑。

通过本文的步骤,你可以搭建一套稳定的CI/CD流水线,后续可扩展Docker容器化部署、K8s编排等高级功能,进一步提升部署效率。

相关推荐
维尔切3 小时前
ELK日志系统部署与使用(Elasticsearch、Logstash、Kibana)
elk·elasticsearch·jenkins·kibana·logstash
janthinasnail4 小时前
使用Docker搭建DOClever接口管理平台
docker·api接口文档
chinesegf10 小时前
Docker篇4-本地项目app.py与docker加载项目镜像的开发顺序
运维·docker·容器
CyreneSimon10 小时前
Docker 拉取配置教程:解决镜像拉取连接超时问题
运维·docker·容器
人间打气筒(Ada)13 小时前
Kubeadm快速部署k8s集群----1.20.0版本(基于centos7.9,因为k8s版本为1.24之下,所以可以直接使用docker)
docker·容器·kubernetes
xuhe215 小时前
🛠️ 深度解析我的 Overleaf 私有化部署:一份稳定、高兼容性的 `docker-compose.yaml`
linux·docker·科研·overleaf
白小云<16 小时前
docker镜像
docker·容器·eureka
何故染尘優16 小时前
docker学习笔记,从入门开始!
笔记·学习·docker
matrixcode117 小时前
CircleCI 让持续集成变得简单而高效的开源框架
其他·ci/cd·开源