一、CI/CD
1、CI/CD 概念:
CI/CD 是一种软件开发和交付方法,旨在加速应用程序的开发、测试和部署过程,以提高软件交付的质量和效率。
(1) 持续集成 (CI Continuous Integration):
持续集成是开发团队频繁集成其代码更改的过程。开发者将其代码合并到共享代码库(如Git仓库)后,CI工具(例如Jenkins、Travis CI、CircleCI等)将自动构建、测试和部署应用程序。(代码合并、构建、部署、测试在一起不断执行,并对结构反馈)
(2) 持续交付 (CD Continuous Deployment):
持续交付是一种将应用程序的构建版本自动部署到测试环境的实践。在持续交付流程中,每次通过CI测试的代码变更都可以自动部署到一个测试环境,使团队能够快速验证新功能、修复和改进。(把代码部署到测试环境)
(3) 持续部署 (CD Continuous Delivery):
将通过 CI 生成的新代码或软件的变更自动部署到生产环境,不需要人工干预。
2、版本交付策略:
(1) 平滑发布:
在发布过程中系统不会因为更新代码而停止服务,不会造成用户短暂的无法访问;
(2) 灰度发布:
灰度发布是一种的策略,先让一小部分用户使用新版本,然后收集用户反馈,再将新版本引入生产环境;
(3) A/B 发布:
A/B 发布是一种将两个或多个不同版本的应用程序同时发布到不同的用户群体中的策略。
二、Jenkins
1、jenkins 概述:
jenkins 是一个开源的自动化服务器和持续集成/持续交付(CI/CD)工具,用于自动化和管理软件项目的构建、测试和部署过程;
jenkins 原名 Hudson,后来成为开源项目;
jenkins 是基于 Java 编写的,它的核心是一个可扩展的插件系统;
jenkins 可在 Tomcat 等流行的 servlet 容器中运行,也可独立运行。
2、jenkins 作用:
① 实现持续集成(CI):jenkins 的主要目标是支持持续集成实践,确保代码更改频繁地集成到共享代码库,自动构建和测试。
② 自动化构建和部署:编译、打包、测试,以及自动化部署到各个环境。
③ 提供灵活性:jenkins 的架构和插件系统为用户提供了广泛的自定义和扩展选项,以适应不同项目和工作流的需求。
3、jenkins 环境部署(192.168.198.131,内存4G):
(1) 部署 git:
在 jenkins 中,使用 git 用于管理项目的源代码。
① 安装依赖包:
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
② 安装 git:
make prefix=/usr/local/git all :编译git源码包
make prefix=/usr/local/git install :指定安装目录
③ 修改环境变量:
vim /etc/bashrc
PATH=$PATH:$HOME/bin:/usr/local/git/bin
source /etc/bashrc
测试是否安装成功:
(2) 部署 jdk(jdk11):
在 jenkins 中,jdk 用于构建和运行 Java 项目。
jdk 官网:Java Downloads | Oracle
① 解压安装:
tar xvzf jdk-11.0.21_linux-x64_bin.tar.gz -C /usr/local/
② 修改环境变量:
vim /etc/bashrc
JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
(3) 部署 Maven:
在 jenkins 中,Maven 可以自动化项目的构建过程,将源代码编译、测试、打包、发布等步骤整合到一起。
① 下载解压:
② 修改环境变量:
vim /etc/bashrc
export M2_HOME=/usr/local/maven
export M2=$M2_HOME/bin
PATH=$M2:$PATH:$HOME/bin:/usr/local/git/bin
export JAVA_HOME=/usr/local/jdk
export PATH
(4) 部署 Tomcat:
在 jenkins 部署中,Tomcat 用于部署和运行 Web 应用程序。
① 下载解压:
② 修改环境变量:
vim /erc/profile
CATALINA_HOME=/usr/local/tomcat
export CATALINA_HOME
source /etc/profile
③ 启动并测试 tomcat:
开启 tomcat:/usr/local/tomcat/bin/startup.sh
关闭 tomcat:/usr/local/tomcat/bin/shutdown.sh
(5) 部署 jenkins:
① 在官网选择版本 2.426:
jenkins.war
② 将 jenkins.war 拷到 tomcat 的工作目录下:
③ 启动 tomcat:
启动 tomcat 后会自动解压 webapps 下的 war 包
/usr/local/tomcat/bin/startup.sh
④ 登录 jenkins:
管理员默认的初始化密码在 /root/.jenkins/secrets/initialAdminPassword 下
选择安装社区推荐的插件:
创建用户:
访问地址:http://192.168.198.131:8080/jenkins/
4、jenkins 插件管理:
(1) 安装插件:
在 “系统管理” 中选择 “插件管理”,点击 Available plugins,搜索插件名
① 安装 Deploy to container:
作用:将 Web 应用程序部署到 Tomcat 容器的开发工具插件。
② 安装 Maven Integration:
作用:jenkins 利用 maven 进行编译,测试,打包。
③ 安装 git 相关插件:
GitHub Authentication
GitHub Branch Source
GitHub Organization Folder(jenkins已配置)
④ 安装 Publish Over SSH:
作用:在构建过程中通过 SSH 协议上传或下载文件
(2) jenkins 系统设置:
配置 jdk,git,maven 的根目录,在 “系统管理” 中找到 “全局配置工具” 进行修改
① 配置 jdk:
② 配置 git:
③ 配置 maven:
● 配置 maven 镜像:
在 maven 服务器中配置 settings.xml,找到 <mirrors> 配置阿里镜像
/usr/local/maven/conf/settings.xml
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
(3) SSH 设置:
jenkins服务器(192.168.198.131) 与远程 tomcat 服务器(192.168.198.130)通过 ssh 进行连接
① jenkins 准备密钥:
ssh-keygen
ssh-copy-id -i 192.168.198.130
② 在 jenkins 上配置 ssh 信息:
cat ~/.ssh/id_rsa :查看 jenkins服务器(131)的密钥
在 “系统管理” 中找到 “系统配置”,在 “Publish over SSH” 下进行配置
5、jenkins 任务:
jenkins 提供管理和监控界面,用于设置和配置构建任务,以及查看构建日志和结果;
maven 的作用是执行构建任务,根据项目的 POM(Project Object Model)文件定义,下载所需的依赖,编译源代码,运行单元测试,打包应用程序等;
GitHub 是代码托管平台,用于存储和管理项目的源代码。
(1) 创建任务:
点击 “新建任务”,输入任务名,选择构建 maven 项目
(2) 设置 maven:
① 描述:
选择“丢弃旧的构建”:每一次构建都会下载数据包,勾选 "丢弃旧的构建" 可以释放磁盘空间,删除旧的构建数据,从而防止磁盘空间不足。
② 选择版本控制器和仓库地址(公有仓库):
https://github.com/bingyue/easy-springmvc-maven
从这个仓库中拉取代码
③ 设置构建:
clean package -Dmaven.test.skip=true
这是一个 Maven 命令,用于清理项目残留的旧文件、执行打包过程,并快速构建项目,跳过运行测试阶段。
④ 构建后操作:
在 “构建后操作步骤” 中选择:send build artifacts over ssh(通过SSH发送构建工件)
● Source files:源文件
在任务构建后,jenkins 服务器上会创建一个 war 包(路径:/root/.jenkins/jobs/job1/builds/target/*.war),Source files 的作用是指明需要传递给远程 tomcat 服务器(tomcat1)的 war 包的位置;
● Remove prefix:删除路径前缀
Remove prefix 与 Source files 配合,只拷贝 war 包,不拷贝整个 target 文件夹下的内容;
● Remote directory:远程服务器文件夹的位置
远程 tomcat 服务器上用来存放源码的位置,需要自行创建;
● Exec command:提前写好脚本,在源代码传递过来后,执行该脚本,若成功执行脚本说明源代码拷贝成功
注:此实验旨在进行任务的创建过程,并未对远程 tomcat 服务器真正进行部署
(3) 构建任务:
在远程 tomcat 服务器上查看脚本是否执行:
war 包已成功拷贝到远程服务器