CICD 持续集成持续交付
CI/CD 核心概念与 Jenkins 自动化部署全流程
系统了解 CI/CD 的核心概念,以及基于 Jenkins 实现自动化部署的完整流程。本文将从「CI/CD 本质定义 → Jenkins 环境搭建 → 自动化部署实战 → 流水线优化」四个维度,结合实战示例(前端/后端项目),帮你掌握 Jenkins 自动化部署的核心逻辑,适合新手快速落地。
一、CI/CD 核心概念解析
1. 什么是 CI/CD?
CI/CD 是「持续集成(Continuous Integration)+ 持续交付(Continuous Delivery)/ 持续部署(Continuous Deployment)」的统称,是DevOps 核心实践,目标是自动化软件交付流程,减少手动操作,提升发布效率和稳定性。
(1)持续集成(CI)
- 定义:开发人员频繁(通常每天)将代码合并到主干分支,每次合并后自动执行「编译、测试、代码检查」,快速发现集成错误。
- 核心目标:早发现代码冲突/BUG,保证代码库始终可构建、可测试。
- 关键动作:代码提交 → 自动拉取 → 编译 → 单元测试 → 代码扫描(如ESLint、SonarQube)。
(2)持续交付(CD)
- 定义:在 CI 基础上,将构建好的可部署包(如JAR、WAR、dist包)自动交付到测试/预发布环境,等待人工确认后部署到生产环境。
- 核心目标:保证代码随时可发布,缩短从开发到上线的周期。
(3)持续部署(CD)
- 定义:持续交付的进阶版,交付后的包自动部署到生产环境,无需人工干预(需完善的自动化测试保障)。
- 核心目标:实现代码提交到生产上线的全自动化。
2. CI/CD 核心价值
- 减少手动操作,降低人为失误;
- 快速反馈问题(代码合并后立即发现BUG);
- 缩短发布周期(从周/月级缩短到天/小时级);
- 提升代码质量(强制自动化测试、代码检查)。
3. CI/CD 典型流程
graph LR
A[开发人员提交代码到Git仓库] --> B[CI工具触发自动化构建]
B --> C[编译/打包/代码检查]
C --> D[自动化测试(单元测试/集成测试)]
D --> E{测试通过?}
E -- 否 --> F[反馈错误给开发人员]
E -- 是 --> G[生成可部署包]
G --> H[持续交付到预发布环境]
H --> I{人工确认?}
I -- 是 --> J[持续部署到生产环境]
I -- 否 --> K[暂停,等待确认]
二、Jenkins 基础:定位与环境搭建
1. Jenkins 核心定位
Jenkins 是开源的自动化服务器,是实现 CI/CD 最主流的工具,支持:
- 拉取源码(Git/SVN);
- 自动化构建(Maven/Gradle/Node.js);
- 自动化测试(JUnit/Mocha);
- 自动化部署(远程服务器、容器、云平台);
- 丰富的插件生态(覆盖源码管理、构建、部署全流程)。
2. 环境搭建(Linux Ubuntu 22.04 为例,CentOS 适配见备注)
前置条件
- Linux 服务器(推荐2核4G以上);
- JDK 11+(Jenkins 2.361+ 要求 JDK 11);
- Git(用于拉取源码)。
步骤 1:安装 JDK
1 | |
步骤 2:安装 Jenkins
1 | |
步骤 3:初始化 Jenkins
- 访问 Jenkins 页面:浏览器访问
http://服务器IP:8080(Jenkins 默认端口8080); - 解锁 Jenkins:
- 执行命令获取初始密码:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword; - 复制密码粘贴到解锁页面,点击「继续」;
- 执行命令获取初始密码:
- 安装插件:选择「安装推荐的插件」(自动安装Git、Maven、Pipeline等核心插件);
- 创建管理员账户:设置用户名、密码(如 admin/admin123,生产环境需复杂密码);
- 配置实例:确认 Jenkins URL(默认
http://服务器IP:8080),点击「完成」。
步骤 4:安装核心插件(补充)
Jenkins 插件是核心能力,推荐安装:
Git Plugin:Git 源码管理;Maven Integration Plugin:Maven 构建;NodeJS Plugin:Node.js 构建(前端项目);Publish Over SSH:通过SSH部署到远程服务器;Pipeline:流水线部署(推荐);SonarQube Scanner:代码质量检查(可选)。
安装方式:Jenkins 首页 → 「系统管理」→ 「插件管理」→ 「可选插件」→ 搜索插件 → 安装并重启 Jenkins。
三、Jenkins 自动化部署完整流程(实战)
以「Git 源码 + 前端项目(Vue/React) + Nginx 部署」为例,讲解核心步骤(后端项目流程类似)。
1. 流程总览
1 | |
2. 前置准备
- 源码仓库:将前端项目推送到 Git 仓库(GitHub/Gitee/GitLab);
- 部署服务器:准备一台安装 Nginx 的服务器(或与 Jenkins 同一服务器);
- Jenkins 配置:
- 配置 Git:Jenkins → 系统管理 → 全局工具配置 → Git → 填写 Git 路径(通常
/usr/bin/git); - 配置 Node.js:全局工具配置 → Node.js → 新增 Node.js,选择版本(如 18.x),命名为
node18。
- 配置 Git:Jenkins → 系统管理 → 全局工具配置 → Git → 填写 Git 路径(通常
3. 步骤 1:配置 SSH 凭据(部署服务器)
为避免手动输入密码,配置 Jenkins 免密登录部署服务器:
- Jenkins 首页 → 「凭据」→ 「系统」→ 「全局凭据」→ 「添加凭据」;
- 类型选择「SSH Username with private key」;
- 填写:
- 用户名:部署服务器的登录用户名(如 root);
- 私钥:粘贴 Jenkins 服务器的私钥(
~/.ssh/id_rsa,若没有则执行ssh-keygen -t rsa生成,公钥需复制到部署服务器~/.ssh/authorized_keys);
- 点击「确定」,记下图凭据 ID(如
ssh-deploy-server)。
4. 步骤 2:创建 Jenkins 任务(自由风格项目)
- Jenkins 首页 → 「新建任务」→ 输入任务名(如
frontend-deploy)→ 选择「自由风格软件项目」→ 「确定」; - 源码管理:
- 选择「Git」;
- 填写仓库 URL(如
https://gitee.com/xxx/frontend-project.git); - 选择分支(如
*/main); - 若为私有仓库,需配置 Git 凭据(添加「用户名+密码」凭据);
- 构建环境:
- 勾选「Provide Node & npm bin/ folder to PATH」;
- 选择之前配置的
node18;
- 构建步骤:
- 选择「执行 shell」,输入构建命令:
1
2
3
4
5
6
7
8# 进入项目目录
cd ${WORKSPACE}
# 安装依赖(跳过缓存,避免依赖问题)
npm install --registry=https://registry.npmmirror.com
# 打包构建
npm run build
# 打包dist目录为压缩包(方便传输)
tar -zcvf dist.tar.gz dist/
- 选择「执行 shell」,输入构建命令:
- 构建后操作:
- 选择「Send files or execute commands over SSH」;
- 配置 SSH 服务器:
- Name:自定义(如
nginx-server); - Hostname:部署服务器 IP;
- Username:部署服务器用户名;
- 选择之前配置的 SSH 凭据;
- Name:自定义(如
- 「Source files」:填写
dist.tar.gz(要上传的文件); - 「Remove prefix」:留空;
- 「Remote directory」:部署服务器临时目录(如
/tmp); - 「Exec command」:部署命令(解压+替换Nginx目录):
1
2
3
4
5
6
7
8
9
10
11# 停止Nginx(可选)
systemctl stop nginx
# 备份原有文件
mv /usr/share/nginx/html /usr/share/nginx/html.bak
# 解压新文件到Nginx目录
mkdir -p /usr/share/nginx/html
tar -zxvf /tmp/dist.tar.gz -C /usr/share/nginx/html --strip-components=1
# 启动Nginx
systemctl start nginx
# 删除临时文件
rm -rf /tmp/dist.tar.gz
- 点击「保存」。
5. 步骤 3:触发部署
- 手动触发:Jenkins 任务页面 → 「立即构建」,查看「控制台输出」确认是否成功;
- 自动触发(推荐):配置 Git 钩子,实现「代码提交自动部署」:
- Jenkins 任务 → 「构建触发器」→ 勾选「GitHub hook trigger for GITScm polling」(Gitee/GitLab 需对应插件);
- 登录 Git 仓库 → 项目设置 → 「WebHooks」→ 添加 WebHook URL:
http://JenkinsIP:8080/github-webhook/(Gitee 为http://JenkinsIP:8080/gitee-webhook/); - 测试 WebHook:提交代码到 Git 仓库,Jenkins 会自动触发构建部署。
6. 后端项目部署示例(Java + SpringBoot)
流程与前端类似,核心差异在「构建步骤」和「部署命令」:
构建步骤(执行 shell)
1 | |
部署命令(Exec command)
1 | |
四、推荐方式:Jenkins Pipeline(流水线部署)
Pipeline 是 Jenkins 推荐的部署方式,通过 Jenkinsfile 定义整个部署流程,支持版本控制、复杂逻辑(分支判断、并行部署),核心优势是「流程即代码」。
1. Pipeline 基础语法
Pipeline 使用 Groovy 语法,核心结构:
1 | |
2. 使用 Pipeline 部署
- Jenkins 新建任务 → 选择「流水线」→ 「确定」;
- 「流水线」配置 → 选择「Pipeline script from SCM」(推荐将 Jenkinsfile 放到 Git 仓库);
- 填写 Git 仓库 URL 和 Jenkinsfile 路径(如
Jenkinsfile); - 保存并构建,Pipeline 会自动执行定义的流程。
五、Jenkins 自动化部署关键优化
1. 凭据管理(核心安全)
- 禁止在脚本中硬编码密码/密钥,全部通过 Jenkins 凭据管理;
- 生产环境使用「凭据加密」,定期轮换密钥。
2. 多环境部署(开发/测试/生产)
通过 Pipeline 分支判断实现多环境部署:
1 | |
3. 日志与回滚
- 部署日志:Jenkins 控制台输出保存到文件,或集成 ELK 日志系统;
- 版本回滚:部署前备份原有文件,失败时执行回滚命令:
1
2
3
4
5# 回滚命令示例
systemctl stop nginx
rm -rf /usr/share/nginx/html
mv /usr/share/nginx/html.bak /usr/share/nginx/html
systemctl start nginx
4. 常见问题排查
- 构建失败:查看「控制台输出」,重点看报错信息(如依赖安装失败、打包错误);
- 部署失败:检查 SSH 连接(端口22是否开放、凭据是否正确)、部署命令权限(如 Nginx 目录权限);
- 插件冲突:卸载多余插件,使用 LTS 版本 Jenkins 避免兼容性问题。
六、总结
关键点回顾
- CI/CD 核心:CI 是频繁集成代码并自动测试,CD 是自动交付/部署,核心目标是自动化、快速反馈;
- Jenkins 部署流程:源码拉取 → 构建打包 → 自动化测试 → 部署到目标服务器,可通过 Pipeline 实现「流程即代码」;
- 核心配置:
- 工具配置(Git/Node.js/Maven)保证构建环境;
- 凭据管理保证部署安全;
- WebHook 实现代码提交自动触发部署;
- 最佳实践:
- 生产环境部署前添加人工确认;
- 部署前备份、部署后验证;
- 使用 Pipeline 管理复杂部署流程,便于版本控制和维护。
Jenkins 是实现 CI/CD 最成熟的工具,掌握其核心流程后,可适配前端、后端、移动端等各类项目的自动化部署,大幅提升研发效率,降低手动操作风险。
CICD 持续集成持续交付
https://cszy.top/20201230-持续集成-Jenkins/