Jenkins 持续集成与部署指南
Jenkins 持续集成与部署指南
1. 简介
Jenkins 是一个开源 CI&CD 软件,提供友好操作界面的持续集成(CI)工具。
- 起源:起源于 Hudson(Hudson 是商用的)
- 主要功能:持续、自动地构建/测试软件项目、监控外部任务的运行
- 技术特性:用 Java 语言编写,可在 Tomcat 等流行的 servlet 容器中运行,也可独立运行
- 集成能力:通常与版本管理工具(SCM)、构建工具结合使用
常用工具
版本控制工具:
- SVN
- GIT
构建工具:
- Maven
- Ant
- Gradle
官网:https://www.jenkins.io/zh
1.1 SVN 介绍
SVN 是 subversion 的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。
1.2 Maven 介绍
Maven 就是构建 Java 里面的一个 war 包的软件项目管理工具。
- 项目对象模型(POM):可以通过一小段描述信息来管理项目的构建、报告和文档
- 特色功能:除了以程序构建能力为特色之外,还提供高级项目管理工具
- 优势:由于 Maven 的缺省构建规则有较高的可重用性,常常用两三行 Maven 构建脚本就可以构建简单的项目
- 应用广泛:许多 Apache Jakarta 项目发文时使用 Maven,公司项目采用 Maven 的比例在持续增长
1.3 Ant 介绍
Ant 是一个将软件编译、测试、部署等步骤联系在一起的自动化工具。
- 主要用途:构建 Java 应用程序
- 内置任务:提供了许多内置的任务,可以编译、组装、测试和运行 Java 应用程序
- 扩展应用:还可以有效地用于构建非 Java 应用程序,例如 C 或 C++ 应用程序
1.4 Gradle 介绍
Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具。
- 功能:工程的管理,帮我们做了依赖、打包、部署、发布、各种渠道的差异管理等工作
1.5 Jenkins 工作原理
将源代码从 SVN/Git 版本控制系统中拷贝一份到本地,然后根据设置的脚本进行 build(构建)。整个系统的关键就是 build 脚本,build 脚本告诉 Jenkins 在一次集成中需要执行的任务。
1.6 Jenkins 特点
- 易安装:仅仅一个 Jenkins.war,从官网下载该文件后,直接运行,无需额外的安装,更无需安装数据库
- 易配置:提供友好的 GUI 配置界面
- 变更支持:Jenkins 能从代码仓库(SVN/Git)中获取并产生代码更新列表,并输出到编译输出信息中
- 支持永久链接:用户是通过 Web 来访问 Jenkins 的,而这些 Web 页面的链接地址都是永久链接地址
- 集成 E-Mail/RSS/IM:当完成一次集成时,可通过这些工具实时收取集成结果
- JUnit/TestNG 测试报告:用以图表等形式提供详细的测试报表功能
- 支持分布式构建:Jenkins 可以把集成构建等工作分发到多台计算机中完成
- 文件指纹信息:Jenkins 会保存构建集成所产生的 jars 文件、集成构建使用了哪个版本
- 支持第三方插件:Jenkins 支持第三方插件,这使得 Jenkins 功能变得越来越强大
2. CI/CD 概念解析
2.1 CI 持续集成
简介
CI 持续集成(全称:Continuous Integration),中文意思是持续集成,是一种软件开发实践。
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试;根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。
工作流程示例:
假设一个应用程序,其代码存储在 GitLab 的 Git 仓库中。开发人员每天都要多次推送代码更改。对于每次向仓库的推送,可以创建一组脚本来自动构建和测试应用程序,从而减少向应用程序引入错误的机会。
CI 工作模式
持续集成的优势
(1)易于定位错误:
每一次的代码集成都需要执行相关的测试工作,持续集成频繁的集成次数天然的将复杂的代码逻辑切割为了小块,使得错误更容易被定位。
(2)易于控制开发流程:
更为细致的工作提交意味着更容易判断当前的工作进度,为管理者规划开发流程提供有效参考。
2.2 CD 持续交付
简介
CD 持续交付(全称:Continuous Delivery),是在 CI 持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。
流程:完成单元测试后,可以把代码部署到连接数据库的 Staging 环境中进行更多测试,如果代码没有问题,可以继续手动部署到生产环境。
CD 工作模式
2.3 CD 持续部署
简介
CD 持续部署(全称:Continuous Deployment),是 CI 持续集成、CD 持续交付的延伸。
- 功能:自动将交付的应用部署到生产环境
- 优势:能及时收到用户反馈,降低部署风险
- 目标:代码在任何时刻都是可部署的,并可自动进入到生产环境
工作模式
3. 使用 Tomcat 容器安装 Jenkins
3.1 部署 Tomcat
下载 Tomcat:
https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat
(此时下载 9.0 版本的,10 版本部署有 bug,无法实现)
环境准备:
# 卸载 CentOS 7 中自带的 JDK
rpm -qa | grep java
rpm -e java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64 --nodeps
rpm -e java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64 --nodeps# 安装 JDK
yum -y install java-11-openjdk# 将Tomcat包拖入,解压 Tomcat 并部署安装
tar -xzf apache-tomcat-9.0.67.tar.gz -C /usr/local/
ln -s apache-tomcat-9.0.67/ tomcat# 启动 Tomcat,测试能否访问 Tomcat 首页
cd tomcat/
bin/startup.sh
3.2 部署 Jenkins
下载 Jenkins:
# 下载 jenkins 到 /usr/local/tomcat/webapps/ 目录下
cd /usr/local/tomcat/webapps
wget http://mirrors.jenkins.io/war-stable/2.346.3/jenkins.war# 下载下来后会自动解压
ls
# 显示:docs examples host-manager jenkins jenkins.war manager ROOT# 启动服务
bin/catalina.sh stop
bin/catalina.sh start
访问 Jenkins:
获取初始密码:
cat /root/.jenkins/secrets/initialAdminPassword
# 输出:b17a0e359ce14220bbfbab934ccc29dd
3.3 自定义 Jenkins
插件安装:
选择"无",进行安装,后期需要什么插件就安装什么插件
创建管理员用户:
- 用户名:admin
- 密码:admin
[图示:创建管理员用户界面]
配置国内源:
- 点击 Advanced → 更新为国内源 → Submit
源地址:
- 原国外插件源地址:https://updates.jenkins.io/update-center.json
- 国内插件源地址:https://mirrors.huaweicloud.com/jenkins/updates/update-center.json
安装 Git 相关插件:
- GitHub
- GitLab
- Gitee
安装简体中文插件:
安装完成后,会重启 Jenkins
用户界面:
[图示:Jenkins 主界面]
任务管理:
全局工具配置:
安装 JDK
节点管理:
[图示:节点管理界面]
4. Jenkins 流水线项目发布流程
环境规划
主机名称 | IP 地址 | 需要的应用服务 | 工具包 | 系统 |
---|---|---|---|---|
Node1 | 192.168.100.10 | tomcat、jenkins | git、maven | RHEL8 |
Node2 | 192.168.100.20 | tomcat | 无 | RHEL8 |
4.1 基础环境准备
-
关闭防火墙和 SELinux
-
在 Node1 上部署服务 Tomcat 和 Jenkins
(上面已经部署),重新部署,登录 Web 界面时选择安装推荐的插件,部署好后,设置国内源 -
在 Node1 主机上生成密钥,传给 Node2 主机
ssh-keygen ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.100.20
-
在 Node2 上部署 Tomcat
yum -y install java-11-openjdk tar -xzf apache-tomcat-9.0.67.tar.gz -C /usr/local/ cd /usr/local/ ln -s apache-tomcat-9.0.67/ tomcat ls tomcat/
4.2 在 Node1 中配置 Jenkins
创建任务
创建流水线任务
发布流水线的方法有两种:
- 脚本方式
- 使用文本参数的方式
环境准备:
首先需要在 Jenkins 所在服务器(Node1)中安装 git 和 maven
# 下载对应java的maven
# 查看maven版本
yum search maven
yum -y install git maven
示例代码仓库:
- https://github.com/Ken-Song/tomcat-java-demo.git
- https://github.com/devopsbyhari/JenkinsTomcatExample.git
方法一:使用脚本
第一阶段:拉取代码
pipeline {agent anystages {stage('pull code') {steps {git 'https://github.com/devopsbyhari/JenkinsTomcatExample.git'}}}
}
蓝色为正在构建
绿色为构建成功
也可以看构建日志
在构建历史中可以看到构建情况
构建日志中记录这pull到哪里了
第二阶段:打包构建
pipeline {agent anystages {stage('pull code') {steps {git 'http://github.com/lizhenliang/tomcat-java-demo.git'}}stage('package') {steps {sh """mvn cleanmvn package"""}}}
}
构建结果:
- 第二次构建是为了安装软件包,生成站点
- 站点位置:
/root/.jenkins/workspace/test/target/
- 生成文件:
ly-simple-tomcat-0.0.1-SNAPSHOT.war
第三阶段:部署
pipeline {agent anystages {stage('pull code') {steps {git 'http://github.com/lizhenliang/tomcat-java-demo.git'}}stage('package') {steps {sh """mvn cleanmvn package"""}}stage('deploy') {steps {sh """scp target/ly-simple-tomcat-0.0.1-SNAPSHOT.war root@192.168.100.20:/usr/local/tomcat/webapps/ssh root@192.168.100.20 '/usr/local/tomcat/bin/catalina.sh stop && /usr/local/tomcat/bin/catalina.sh start'"""}}}
}
验证部署:
# 在 Node2 上验证
cd /usr/local/tomcat/webapps
ls
# 显示:docs host-manager ly-simple-tomcat-0.0.1-SNAPSHOT.war ROOT examples ly-simple-tomcat-0.0.1-SNAPSHOT manager
方法二:使用文本参数实现流水线项目发布
创建新的流水线项目
配置参数
-
添加 Git 下载信息文本参数
- 参数:
git_url
- 值:
http://github.com/lizhenliang/tomcat-java-demo.git
- 参数:
-
添加 Maven 打包字符参数
- 参数:
maven_package
- 值:
ly-simple-tomcat-0.0.1-SNAPSHOT
- 参数:
-
添加 Tomcat 路径字符参数
- 参数:
tomcat_path
- 值:
/usr/local/tomcat
- 参数:
-
添加客户端 IP 文本参数
- 参数:
client_ip
- 值:
192.168.100.20
- 参数:
编写流水线脚本
pipeline {agent anystages {stage('pull code') {steps {git "${git_url}"}}stage('package') {steps {sh """mvn cleanmvn package"""}}stage('deploy') {steps {sh """scp target/${maven_package}.war root@${client_ip}:${tomcat_path}/webapps/ssh root@${client_ip} '${tomcat_path}/bin/catalina.sh stop && ${tomcat_path}/bin/catalina.sh start'"""}}}
}