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
3
4
5
6
7
8
# Ubuntu/Debian
sudo apt update && sudo apt install openjdk-11-jdk -y

# CentOS/RHEL
# sudo yum install java-11-openjdk-devel -y

# 验证JDK
java -version # 显示openjdk 11.x.x即成功

步骤 2:安装 Jenkins

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 添加Jenkins官方源
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null

# 2. 更新源并安装
sudo apt update && sudo apt install jenkins -y

# 3. 启动Jenkins并设置开机自启
sudo systemctl start jenkins
sudo systemctl enable jenkins

# 4. 验证Jenkins状态(显示running即成功)
sudo systemctl status jenkins

步骤 3:初始化 Jenkins

  1. 访问 Jenkins 页面:浏览器访问 http://服务器IP:8080(Jenkins 默认端口8080);
  2. 解锁 Jenkins
    • 执行命令获取初始密码:sudo cat /var/lib/jenkins/secrets/initialAdminPassword
    • 复制密码粘贴到解锁页面,点击「继续」;
  3. 安装插件:选择「安装推荐的插件」(自动安装Git、Maven、Pipeline等核心插件);
  4. 创建管理员账户:设置用户名、密码(如 admin/admin123,生产环境需复杂密码);
  5. 配置实例:确认 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
代码提交到Git → Jenkins触发构建 → 拉取源码 → 安装依赖 → 打包构建 → 上传到Nginx服务器 → 重启Nginx(可选)

2. 前置准备

  • 源码仓库:将前端项目推送到 Git 仓库(GitHub/Gitee/GitLab);
  • 部署服务器:准备一台安装 Nginx 的服务器(或与 Jenkins 同一服务器);
  • Jenkins 配置:
    • 配置 Git:Jenkins → 系统管理 → 全局工具配置 → Git → 填写 Git 路径(通常 /usr/bin/git);
    • 配置 Node.js:全局工具配置 → Node.js → 新增 Node.js,选择版本(如 18.x),命名为 node18

3. 步骤 1:配置 SSH 凭据(部署服务器)

为避免手动输入密码,配置 Jenkins 免密登录部署服务器:

  1. Jenkins 首页 → 「凭据」→ 「系统」→ 「全局凭据」→ 「添加凭据」;
  2. 类型选择「SSH Username with private key」;
  3. 填写:
    • 用户名:部署服务器的登录用户名(如 root);
    • 私钥:粘贴 Jenkins 服务器的私钥(~/.ssh/id_rsa,若没有则执行 ssh-keygen -t rsa 生成,公钥需复制到部署服务器 ~/.ssh/authorized_keys);
  4. 点击「确定」,记下图凭据 ID(如 ssh-deploy-server)。

4. 步骤 2:创建 Jenkins 任务(自由风格项目)

  1. Jenkins 首页 → 「新建任务」→ 输入任务名(如 frontend-deploy)→ 选择「自由风格软件项目」→ 「确定」;
  2. 源码管理
    • 选择「Git」;
    • 填写仓库 URL(如 https://gitee.com/xxx/frontend-project.git);
    • 选择分支(如 */main);
    • 若为私有仓库,需配置 Git 凭据(添加「用户名+密码」凭据);
  3. 构建环境
    • 勾选「Provide Node & npm bin/ folder to PATH」;
    • 选择之前配置的 node18
  4. 构建步骤
    • 选择「执行 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/
  5. 构建后操作
    • 选择「Send files or execute commands over SSH」;
    • 配置 SSH 服务器:
      • Name:自定义(如 nginx-server);
      • Hostname:部署服务器 IP;
      • Username:部署服务器用户名;
      • 选择之前配置的 SSH 凭据;
    • 「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
  6. 点击「保存」。

5. 步骤 3:触发部署

  • 手动触发:Jenkins 任务页面 → 「立即构建」,查看「控制台输出」确认是否成功;
  • 自动触发(推荐):配置 Git 钩子,实现「代码提交自动部署」:
    1. Jenkins 任务 → 「构建触发器」→ 勾选「GitHub hook trigger for GITScm polling」(Gitee/GitLab 需对应插件);
    2. 登录 Git 仓库 → 项目设置 → 「WebHooks」→ 添加 WebHook URL:http://JenkinsIP:8080/github-webhook/(Gitee 为 http://JenkinsIP:8080/gitee-webhook/);
    3. 测试 WebHook:提交代码到 Git 仓库,Jenkins 会自动触发构建部署。

6. 后端项目部署示例(Java + SpringBoot)

流程与前端类似,核心差异在「构建步骤」和「部署命令」:

构建步骤(执行 shell)

1
2
3
4
cd ${WORKSPACE}
# Maven 打包(需配置 Maven 全局工具)
mvn clean package -DskipTests
# 打包后的 JAR 包路径:target/*.jar

部署命令(Exec command)

1
2
3
4
5
6
# 停止原有服务
ps -ef | grep springboot-project | grep -v grep | awk '{print $2}' | xargs kill -9
# 复制 JAR 包到部署目录
cp /tmp/springboot-project-1.0.jar /opt/app/
# 后台启动服务
nohup java -jar /opt/app/springboot-project-1.0.jar > /opt/app/logs/app.log 2>&1 &

四、推荐方式:Jenkins Pipeline(流水线部署)

Pipeline 是 Jenkins 推荐的部署方式,通过 Jenkinsfile 定义整个部署流程,支持版本控制、复杂逻辑(分支判断、并行部署),核心优势是「流程即代码」。

1. Pipeline 基础语法

Pipeline 使用 Groovy 语法,核心结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
pipeline {
agent any // 任意Jenkins节点执行
tools {
nodejs 'node18' // 引用全局配置的Node.js
}
stages {
stage('拉取源码') { // 阶段1:拉取源码
steps {
git url: 'https://gitee.com/xxx/frontend-project.git', branch: 'main'
}
}
stage('安装依赖&构建') { // 阶段2:构建
steps {
sh 'npm install --registry=https://registry.npmmirror.com'
sh 'npm run build'
sh 'tar -zcvf dist.tar.gz dist/'
}
}
stage('部署到服务器') { // 阶段3:部署
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'nginx-server', // SSH服务器名称
transfers: [
sshTransfer(
sourceFiles: 'dist.tar.gz',
remoteDirectory: '/tmp',
removePrefix: '',
execCommand: '''
systemctl stop nginx
mv /usr/share/nginx/html /usr/share/nginx/html.bak
mkdir -p /usr/share/nginx/html
tar -zxvf /tmp/dist.tar.gz -C /usr/share/nginx/html --strip-components=1
systemctl start nginx
rm -rf /tmp/dist.tar.gz
'''
)
]
)
]
)
}
}
}
post { // 构建后操作
success {
echo '部署成功!'
}
failure {
echo '部署失败!'
// 可添加邮件通知、钉钉通知等
}
}
}

2. 使用 Pipeline 部署

  1. Jenkins 新建任务 → 选择「流水线」→ 「确定」;
  2. 「流水线」配置 → 选择「Pipeline script from SCM」(推荐将 Jenkinsfile 放到 Git 仓库);
  3. 填写 Git 仓库 URL 和 Jenkinsfile 路径(如 Jenkinsfile);
  4. 保存并构建,Pipeline 会自动执行定义的流程。

五、Jenkins 自动化部署关键优化

1. 凭据管理(核心安全)

  • 禁止在脚本中硬编码密码/密钥,全部通过 Jenkins 凭据管理;
  • 生产环境使用「凭据加密」,定期轮换密钥。

2. 多环境部署(开发/测试/生产)

通过 Pipeline 分支判断实现多环境部署:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
stage('部署到对应环境') {
steps {
script {
if (env.BRANCH_NAME == 'dev') {
// 部署到开发环境
sshPublisher(configName: 'dev-server', ...)
} else if (env.BRANCH_NAME == 'test') {
// 部署到测试环境
sshPublisher(configName: 'test-server', ...)
} else if (env.BRANCH_NAME == 'main') {
// 生产环境需手动确认
input message: '确认部署到生产环境?', ok: '确认'
sshPublisher(configName: 'prod-server', ...)
}
}
}
}

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 避免兼容性问题。

六、总结

关键点回顾

  1. CI/CD 核心:CI 是频繁集成代码并自动测试,CD 是自动交付/部署,核心目标是自动化、快速反馈;
  2. Jenkins 部署流程:源码拉取 → 构建打包 → 自动化测试 → 部署到目标服务器,可通过 Pipeline 实现「流程即代码」;
  3. 核心配置
    • 工具配置(Git/Node.js/Maven)保证构建环境;
    • 凭据管理保证部署安全;
    • WebHook 实现代码提交自动触发部署;
  4. 最佳实践
    • 生产环境部署前添加人工确认;
    • 部署前备份、部署后验证;
    • 使用 Pipeline 管理复杂部署流程,便于版本控制和维护。

Jenkins 是实现 CI/CD 最成熟的工具,掌握其核心流程后,可适配前端、后端、移动端等各类项目的自动化部署,大幅提升研发效率,降低手动操作风险。


CICD 持续集成持续交付
https://cszy.top/20201230-持续集成-Jenkins/
作者
csorz
发布于
2020年12月30日
许可协议