文章目录
前言
1、概述
2、系统架构
2.1、主节点
2.2、代理节点
2.3、插件系统
2.4、存储与日志系统
2.5、用户界面与API
2.6、通信协议
3、功能模块
3.1、主节点模块
3.1.1、用户管理
3.1.2、系统配置
3.1.3、任务调度
3.1.4、数据存储
3.2、代理节点模块
3.2.1、构建执行
3.2.2、通信模块
3.3、插件系统模块
3.3.1、源码管理插件
3.3.2、构建工具插件
3.3.3、流水线插件
3.3.4、测试工具插件
3.3.5、通知与报告插件
3.3.6、部署工具插件
3.4、存储与日志系统模块
3.4.1、存储系统
3.4.2、日志管理
3.5、用户界面与API模块
3.5.1、Web界面
3.5.2、REST API
3.5.3、CLI工具
4、业务流程
4.1、安装Jenkins
4.1.1、安装JDK
4.1.2、安装Maven
4.1.3、安装Git
4.1.4、安装Jenkins
4.1.5、启动Jenkins
4.2、 基本配置
4.2.1、安装插件
4.2.2、工具设置
4.3、测试用例
4.3.1、定时拉取并部署项目
4.3.1.1、下载安装Tomcat
4.3.1.2、安装相关插件
4.3.1.3、构建测试项目
4.3.1.3.1、创建新项目
4.3.1.3.2、设置构建目标
4.3.1.3.3、设置定时触发器
4.3.1.4、查看构建结果
4.3.2、预处理操作
4.3.3、自动发送邮件
5、原理分析
5.1、Web框架
5.1.1、Stapler简介
5.1.2、Stapler的主要组件
5.1.3、Stapler与Jenkins的集成
5.1.4、根据请求定位后端代码
5.2、高级视图
5.2.1、数据流架构
5.2.2、架构组成
5.3、可扩展性
5.3.1、基本概念
5.3.2、具体实现
5.4、安全性
5.4.1、安全架构
5.4.2、插件的安全性
5.4.3、检查Jelly文件的权限
5.4.4、认证方式
5.4.5、认证流程
5.5、流水线
5.5.1、流水线概述
5.5.2、流水线语法
5.5.2.1、流水线语法概述
5.5.2.2、声明式流水线
5.5.2.3、脚本化流水线
5.5.3、流水线功能扩展
5.5.3.1、分支和Pull Request支持
5.5.3.2、Docker集成
5.5.3.3、共享库
5.5.4、流水线开发工具
5.5.5、流水线示例
5.6、单/多节点架构
5.6.1、单节点架构
5.6.2、多节点架构
6、参考文献
总结
前言
本博客的主要内容为Jenkins的部署、使用与原理分析。本博文内容较长,因为涵盖了Jenkins的几乎全部内容,从部署的详细过程到如何使用Jenkins进行持续集成(Continuous Integration,CI)和持续交付/部署(Continuous Delivery/Deployment,CD),并对Jenkins的原理进行了详细分析,相信认真读完本博文,各位读者一定会对Jenkins有更深的了解。以下就是本篇博客的全部内容了。
1、概述
Jenkins是一个功能强大的开源自动化服务器,广泛应用于软件开发中的持续集成(Continuous Integration,CI)和持续交付/部署(Continuous Delivery/Deployment,CD)。它通过自动化构建、测试、发布流程,帮助团队加速软件开发生命周期,提升软件质量和交付效率。
核心特点
跨平台支持 Jenkins基于Java开发,支持运行在多种操作系统上,包括Windows、Linux和macOS,适合不同开发环境。
丰富的插件生态系统 Jenkins的强大之处在于其插件生态系统,目前拥有1800多种插件,支持与常见工具和平台的集成,例如:
版本控制系统:Git、SVN、Mercurial等。
构建工具:Maven、Gradle、Ant等。
容器化:Docker、Kubernetes。
通知系统:Slack、Email、Webhooks。
测试框架:JUnit、Selenium等。
分布式构建 Jenkins支持分布式构建,可以将任务分配给多个节点(代理服务器)执行,提升构建效率,适合大规模项目。
灵活的任务触发
支持多种任务触发方式,包括代码提交、定时调度、手动触发等。
可根据具体需求自定义触发条件。
直观的Web界面 Jenkins提供用户友好的Web界面,便于配置任务、查看构建状态、分析日志和生成报告。
支持多语言开发 Jenkins可以构建和测试多种编程语言(如Java、Python、C/C++、Go等)的项目,适合跨语言开发团队。
适用场景
持续集成(CI) 通过监控代码仓库中的变更(如Git提交),自动触发构建和测试,及时发现代码缺陷,确保代码的稳定性。
持续交付/部署(CD) 自动将经过测试的代码部署到开发、测试或生产环境,缩短软件交付周期。
分布式开发与构建 在多个代理节点上并行执行任务,加速复杂项目的构建和测试。
DevOps流程支持 与DevOps工具链无缝集成,实现从代码提交到部署上线的自动化工作流。
优势
开源免费:任何人都可以免费使用,企业也能定制开发以满足特定需求。
可扩展性强:通过插件扩展功能,满足多种使用场景。
社区支持:Jenkins社区活跃,拥有大量教程、文档和技术支持资源。
分布式支持:可以处理大型、复杂的多项目构建。
支持敏捷开发:帮助开发团队快速响应需求变化。
缺点
学习曲线陡峭:初学者需要一定时间熟悉其配置和插件管理。
维护成本高:复杂项目中需要手动调整任务和插件配置,可能导致管理成本上升。
插件依赖问题:部分插件可能存在兼容性问题,需要及时更新或更换。
界面现代化不足:相比一些现代CI/CD工具,Jenkins的用户界面显得稍显陈旧。
历史与背景 Jenkins的前身是Hudson,最初由Sun Microsystems于2004年推出。2010年,由于商标问题,Hudson社区的开发者决定分支项目并重命名为Jenkins。自那以后,Jenkins一直保持活跃开发,成为CI/CD领域的领导者。
总结 Jenkins是CI/CD工具的经典之作,以其稳定性、功能丰富性和灵活性在软件开发中占据重要地位。对于需要高度自动化和定制化的开发团队,Jenkins是一个非常值得信赖的选择。
2、系统架构
Jenkins的系统架构设计灵活且高度可扩展,支持分布式构建和大规模自动化任务管理。它的架构分为核心组件和功能模块,各部分协同工作,共同实现持续集成和持续交付。以下是Jenkins的系统架构详细介绍:
2.1、主节点
主节点是Jenkins的核心组件,负责管理系统的整体运行,是协调任务执行和系统配置的关键角色。主要功能包括:
用户界面 提供Web界面,供用户配置、管理和监控任务。
任务调度 负责将构建任务分发到合适的代理节点上执行。
系统管理 处理插件安装、用户权限管理和全局配置。
存储管理 保存任务的配置文件、构建结果以及系统运行日志。
插件加载 管理Jenkins系统中的插件加载与卸载,支持功能的动态扩展。
2.2、代理节点
代理节点是Jenkins的任务执行单元,主节点通过分布式管理将具体的构建任务分发到代理节点,从而提高系统的执行效率。
特点
分布式架构 代理节点可以运行在不同操作系统(如Windows、Linux或macOS)上,提供多样化支持。
隔离性 每个代理节点可以配置独立的环境(例如JDK、Docker容器),适应不同任务需求。
通信协议 主节点通过JNLP(Java Network Launch Protocol)、SSH或WebSocket与代理节点通信。
优势
提升系统的并行处理能力 通过多个代理节点并行执行任务,加速整体任务执行效率。
减轻主节点的计算压力 代理节点负责实际的构建任务,主节点仅负责管理和调度。
支持多种开发环境和构建工具 提供对不同开发语言、框架和工具的兼容性。
2.3、插件系统
插件系统是Jenkins的核心组成部分,支持几乎无限的功能扩展和系统集成。
功能扩展 通过插件支持版本控制系统(如Git、SVN)、构建工具(如Maven、Gradle)、通知服务(如Email、Slack)。
集成能力 支持与其他工具(如Docker、Kubernetes、JIRA)无缝集成,扩展系统能力。
插件管理 提供插件管理器,支持在线安装、更新和删除插件操作。
安全插件 提供权限管理和安全防护功能,增强系统安全性。
2.4、存储与日志系统
存储与日志系统是Jenkins用于持久化数据和记录系统运行情况的关键模块。
存储功能
构建历史 保存每次任务的构建状态、执行日志以及生成的工件(Artifacts)。
系统配置 记录任务配置文件、用户权限设置和插件配置。
支持外部存储 支持集成外部存储服务(如S3、NFS),扩展数据存储能力。
日志管理
构建日志 记录每次任务的执行细节,便于问题诊断和性能分析。
系统日志 记录Jenkins核心事件和系统错误信息。
日志轮转 支持日志轮转,防止日志文件过度增长占用磁盘空间。
2.5、用户界面与API
用户界面与 API模块提供了丰富的交互功能和编程接口,是 Jenkins 用户体验和自动化管理的核心所在。
用户界面
Web界面 提供任务管理、构建状态监控和日志查看的可视化界面。
扩展功能 支持与Blue Ocean插件结合,提供现代化的流水线视图。
API支持
REST API 提供通过HTTP请求进行任务触发、状态查询和数据获取的能力。
CLI工具 提供命令行操作方式,支持脚本化任务管理和快速批量操作。
2.6、通信协议
通信协议模块负责主节点与代理节点之间的通讯,为任务分发和数据同步提供底层支持。
协议类型
JNLP(Java Network Launch Protocol) 用于代理节点与主节点的通信,适合动态分配代理节点的场景。
SSH 通过安全通道连接代理节点,适合静态代理的稳定通信。
WebSocket 通过插件支持的现代通信方式,适合云端部署和高效传输需求。
总之,Jenkins的系统架构设计灵活、模块化,支持主节点管理和代理节点执行的分布式模式。通过插件系统扩展功能、支持多种通信协议和存储方式,Jenkins能够满足大规模、复杂项目的持续集成和持续交付需求。
3、功能模块
Jenkins的功能模块与其系统架构紧密关联,每个模块都为持续集成(CI)和持续交付/部署(CD)提供必要支持。以下是Jenkins的功能模块详细介绍。
3.1、主节点模块
主节点是Jenkins的核心,负责系统配置、用户管理、任务调度和数据存储等功能模块,确保整个系统的稳定运行。
3.1.1、用户管理
用户管理是Jenkins的核心基础,提供多角色支持、权限分配和认证机制,确保不同类型用户能够安全、高效地使用系统资源。
用户角色 支持管理员、开发者和访客等不同角色,能够针对不同用户类别灵活分配权限,满足团队协作需求。
权限控制 通过插件(如Role Strategy Plugin)实现精细化权限管理,允许基于用户或用户组设置权限,覆盖任务创建、构建触发、查看日志等操作。
认证方式
内置用户数据库:默认自带用户注册与管理功能,便于快速上手。
外部认证系统集成:支持连接LDAP、Active Directory等外部系统,实现企业级用户管理。
单点登录与第三方认证:支持通过SSO或OAuth插件进行认证,便于用户跨多个平台无缝登录。
3.1.2、系统配置
系统配置为Jenkins提供基础功能设置,包括全局参数配置、插件管理和安全设置,确保系统能够高效且安全地运行。
全局配置 提供设置系统范围内参数的能力,例如邮件通知服务器、JDK路径、构建工具版本等,确保任务执行环境统一。
插件管理
提供便捷的插件管理界面,支持从在线市场直接安装插件,也支持离线安装。
用户可以查看已安装插件的版本,更新插件至最新版本,或移除不再需要的插件。
安全配置
提供HTTPS支持,确保Web界面和API访问安全。
包括CSRF防护机制和API Token验证功能,保护系统免受恶意攻击。
3.1.3、任务调度
任务调度负责任务的分配与触发,是Jenkins主节点协调代理节点的重要组成。
任务分发
任务分发基于标签系统,自动选择最适合的代理节点执行任务。
支持动态资源分配,例如动态启动Docker容器作为代理节点,优化资源使用效率。
任务队列管理
提供任务队列监控功能,用户可以随时查看待执行任务的状态。
支持任务优先级插件,允许用户调整任务执行顺序。
触发方式
定时触发:支持使用Cron表达式设置任务的自动触发时间。
代码提交触发:通过Webhooks实现代码提交后自动构建。
手动触发:通过界面或REST API触发构建任务。
3.1.4、数据存储
数据存储用于保存任务构建数据和历史记录,为用户提供全面的任务执行数据参考。
构建数据 每次构建任务的配置、日志和结果都会保存,便于任务回溯和问题排查。支持对构建工件(如编译产物)的归档与下载。
历史记录
提供任务的执行历史状态和变更日志,支持任务执行的趋势图和统计分析。
用户可以通过图表查看任务的成功率、失败率及变更趋势。
3.2、代理节点模块
代理节点模块负责具体的任务执行,支持分布式构建和多环境运行,确保任务的高效执行与资源的充分利用。
3.2.1、构建执行
构建执行是代理节点的核心任务,支持多语言、多平台构建环境和动态资源分配。
任务执行
兼容多语言构建,包括Java、Python、C++等。
无缝集成常见构建工具(如Maven、Gradle、Ant)。
环境支持
运行在不同系统平台上,包括Windows、Linux 和macOS。
提供Docker容器化构建环境,实现任务隔离。
资源管理
动态分配计算资源,根据任务需求调整分配。
支持并发任务处理,提高任务执行效率。
3.2.2、通信模块
通信模块保证主节点与代理节点间的实时信息交互和任务协调。
协议支持
支持JNLP、SSH和WebSocket等协议,确保灵活可靠的通信。
支持防火墙后代理节点的反向连接。
状态报告
实时反馈代理节点任务执行状态,包括任务开始、执行进度和完成状态。
提供代理节点运行日志,便于调试和维护。
3.3、插件系统模块
Jenkins的插件系统是其功能扩展的核心,通过多种插件,满足用户在源码管理、构建、测试、部署等各环节的个性化需求。
3.3.1、源码管理插件
源码管理插件帮助Jenkins集成主流版本控制系统,支持任务的自动化触发和变更记录获取。
版本控制支持 集成多种版本控制工具,包括Git、SVN和Mercurial,满足不同开发团队的需求。
触发机制
集成Webhooks功能,在代码提交后自动触发构建任务。
支持针对特定分支、标签或变更记录设置触发条件。
功能扩展
提供代码分支选择、变更记录检索、子模块支持等功能,便于精确构建和版本追踪。
3.3.2、构建工具插件
构建工具插件为任务的构建流程提供全面支持,集成了多种主流的构建工具和依赖环境管理。
构建工具支持
Java项目:Maven、Gradle、Ant。
C/C++项目:CMake、Make。
前端项目:NPM、Yarn。
自动化依赖配置 自动检测构建工具的环境配置,并支持动态安装和依赖管理。
3.3.3、流水线插件
流水线插件用于定义和管理任务的自动化流程,从代码检出到部署全程覆盖。
Pipeline Plugin 提供脚本化定义构建流程的能力,用户可通过Groovy编写完整的流水线脚本。
Blue Ocean Plugin 提供直观的可视化编辑界面,简化复杂流水线的配置和监控。
Declarative Pipelin 用更简单的语法定义流水线,适合标准化的构建流程。
3.3.4、测试工具插件
测试工具插件提供测试框架集成和测试报告分析功能,帮助用户提升软件质量。
集成测试框架
单元测试:JUnit、TestNG等。
自动化UI测试:Selenium。
测试报告与分析 自动生成测试报告,支持趋势分析,帮助用户快速定位测试失败原因。
3.3.5、通知与报告插件
通知与报告插件确保用户能够及时获取任务执行状态和构建结果。
通知方式
支持多渠道通知,包括邮件、Slack、Microsoft Teams等。
提供Webhooks,用于与其他系统集成。
报告功能
自动生成构建状态报告,支持导出为HTML、XML等格式,便于归档和共享。
3.3.6、部署工具插件
部署工具插件支持自动化部署和持续交付,集成主流云服务和容器管理平台。
云服务集成 支持AWS、Google Cloud、Azure等云平台,便于实现基于云的自动化部署。
容器化部署 集成Docker和Kubernetes,提供镜像管理和容器编排功能。
3.4、存储与日志系统模块
存储与日志模块是Jenkins数据持久化和问题调试的核心组件,为任务执行提供全面的记录支持。
3.4.1、存储系统
存储系统负责保存Jenkins的任务配置信息和构建生成的工件,为持续集成和部署提供数据基础。
构建工件存储
默认存储于主节点的本地文件系统中。
支持与外部存储服务(如NFS、Amazon S3)集成,满足大规模数据存储需求。
任务配置存储
每个任务的配置以XML文件保存,便于系统备份和迁移。
3.4.2、日志管理
日志管理模块提供任务执行和系统运行的详细记录,便于调试和安全性审计。
构建日志
记录每次任务执行的详细过程,便于问题排查和性能分析。
支持实时查看和日志文件导出。
系统日志
记录Jenkins核心事件、插件事件和系统错误。
提供日志轮转功能,防止日志文件无限增长占用磁盘空间。
审计日志
记录用户操作和权限变更,帮助提升系统的安全性和可追溯性。
3.5、用户界面与API模块
用户界面与API模块提供交互式操作界面和自动化管理接口,是Jenkins易用性和集成能力的关键部分。
3.5.1、Web界面
Web界面是Jenkins的主要交互方式,通过直观的可视化界面,用户可以轻松管理任务和监控系统状态。
仪表盘 展示任务列表、状态摘要和构建执行历史,便于用户总览系统状态。
任务详情页 提供任务配置、执行日志和工件下载入口,支持查看和分析任务执行过程。
流水线视图 显示任务流程图和执行状态,帮助用户直观了解任务流转情况。
管理界面 提供系统配置、用户管理、插件管理等功能入口,简化系统维护操作。
3.5.2、REST API
REST API提供编程接口,支持系统的自动化管理和与外部工具的集成。
功能支持 提供任务触发、状态查询、数据获取等接口,支持JSON或XML格式的返回数据。
用途
实现与外部系统的集成,例如自定义仪表盘和构建监控工具。
自动化执行Jenkins操作,提升管理效率。
3.5.3、CLI工具
CLI工具是Jenkins提供的一种命令行操作方式,适用于脚本化和自动化管理场景。
命令行支持 提供命令行工具,支持批量执行任务、查看状态等操作,适合脚本化管理和快速操作。
总之,Jenkins的功能模块设计覆盖了持续集成与交付的全流程,结合主节点的核心管理功能、代理节点的分布式任务执行能力,以及插件系统的灵活扩展,能够满足不同规模和复杂度的项目需求。
4、业务流程
4.1、安装Jenkins
4.1.1、安装JDK
首先更新软件列表:
$ sudo apt-get update
然后使用下面的命令来安装JDK:
$ sudo apt install openjdk-17-jdk -y
然后执行下面的命令来验证JDK是否安装成功:
$ java -version
出现如下图所示的内容即代表JDK安装成功:
然后执行下面的命令将安装好的JDK导出到环境变量中:
$ echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> ~/.bashrc
$ echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> ~/.bashrc
$ source ~/.bashrc
4.1.2、安装Maven
首先更新软件列表:
$ sudo apt-get update
然后使用下面的命令来安装Maven:
$ sudo apt-get install maven -y
然后执行下面的命令来验证Maven是否安装成功:
$ mvn -version
出现如下图所示的内容即代表Maven安装成功:
然后配置Maven的镜像源为国内镜像源:
$ sudo