文章目录
- 前言
- 一、基础概念:理解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.1.1首先下载代码(克隆仓库)
- [5.2.1.2 修改代码](#5.2.1.2 修改代码)
- [5.2.1.3 提交代码](#5.2.1.3 提交代码)
- [5.2.1.4 在 GitLab 上测试查看](#5.2.1.4 在 GitLab 上测试查看)
- [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

-
获取初始管理员密码:
bashcat /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.service 的 JAVA_HOME |
| 启动失败,日志出现 "Failed to start" | Jenkins 解压 war 包失败 | 删除 /var/lib/jenkins/war 与 failed-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、验证:登录GitLab→devops_group→web_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 Key→Enter 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(分配角色):
-
创建
dev和ops用户(Manage Jenkins→Manage Users→新建用户)。


-
分配角色(
Manage Jenkins -> Manage and Assign Roles -> Assign Roles)dev用户绑定user和ItemA角色→只能访问A-开头的项目。ops用户绑定user和ItemB角色→只能访问B-开头的项目。


3、创建项目测试权限
-
新建Item → 创建两个项目,分别为
A-web1和B-web1


-
分别登录
dev和ops查看对应的项目


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 URL:git@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 files:target/*.war(Maven打包后的War包路径)。 -
Containers→Add Container→Tomcat 8.x Remote。

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

-
Tomcat URL:http://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 提示身份未设置,请配置用户名和邮箱:
bashgit 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、Build→Root POM:pom.xml(项目根目录的pom.xml)。
4、Goals and options:clean 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→插件管理→可选插件,搜索并安装Pipeline和Pipeline 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、SCM→Git,Repository URL:git@192.168.10.21:devops_group/web_demo.git,Credentials选择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 URL:http://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:Name:sonarqube。Server URL:http://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 server:smtp.qq.com(QQ邮箱SMTP服务器)。SMTP Port:465(SSL端口)。Credentials→添加→Username with password,用户名xxx@qq.com,密码为QQ邮箱授权码(需在QQ邮箱设置→账户→开启POP3/SMTP,获取授权码),描述email-auth。- 勾选
Use SSL,Default Recipients:960027936@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编排等高级功能,进一步提升部署效率。

