从零开始搭建 Jenkins CI/CD 流水线:从安装到自动部署
在现代软件开发中,我们经常需要重复执行 “代码提交 -> 编译打包 -> 部署测试” 这一系列流程。如果每次都手动操作,不仅效率低下,还容易出错。为了解决这个问题,我们引入了 CI/CD(持续集成 / 持续交付)的理念。
Jenkins 是目前最流行的开源 CI/CD 自动化服务器。本文将带你从零开始,学习如何安装 Jenkins,配置环境,创建任务,并最终实现一个从 GitHub 拉取代码、自动构建 Spring Boot 项目并部署到远程服务器的完整流水线。
一、 Jenkins 简介与安装
1. 核心概念
Jenkins 是一个独立的 Java 程序,包含内置的 Jetty 服务器。它通过丰富的插件生态系统,支持各种构建工具(如 Maven, Gradle)和版本控制系统(如 Git, SVN)。
2. 环境准备
- Java (JDK): Jenkins 对 Java 版本有严格要求。
- Jenkins 2.357+ / 2.361+: 需要 Java 11 或 Java 17。
- 旧版本(如 2.303.x): 支持 Java 8。
- 操作系统: Windows, Mac, Linux 均可。
3. 安装方式
Jenkins 提供了多种安装方式,这里推荐两种最常用的:
方式 A:使用 WAR 包(跨平台通用)
这是最灵活的方式,适用于任何有 Java 环境的机器。
- 下载
jenkins.war文件。 - 在命令行执行:
bash运行
java -jar jenkins.war --httpPort=8080 - 访问
http://localhost:8080,根据提示输入初始密码(通常在~/.jenkins/secrets/initialAdminPassword)。
方式 B:使用 Docker(推荐学习 / 测试)
使用 Docker 可以避免环境依赖问题,且数据持久化方便。
- 拉取镜像:
bash运行
docker pull jenkins/jenkins:lts - 创建网络(方便与其他容器通信):
bash运行
docker network create jenkins-net - 运行容器:
bash运行
docker run -d --name jenkins \ --network jenkins-net \ -p 8080:8080 -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ jenkins/jenkins:lts
二、 初识 Jenkins 界面与任务创建
1. 插件安装
首次登录后,建议安装 “推荐的插件”。如果遇到网络问题导致安装失败,可以后续在 “系统管理 -> 插件管理” 中手动搜索安装,或者配置国内镜像源。
2. 创建第一个 Freestyle 任务
Freestyle(自由风格)项目适合简单的任务。
- 点击 “新建任务”,输入名称(建议不要有空格),选择 “自由风格软件项目”。
- 构建步骤: 选择 “执行 Shell”(Linux/Mac)或 “执行 Windows 批处理命令”。
- 示例命令:
bash运行
echo "Hello Jenkins" echo "Build Success" > result.txt
- 示例命令:
- 点击 “立即构建”,在 “控制台输出” 中查看结果。
3. 目录结构简介
Jenkins 的所有数据(配置、工作空间、插件)都存储在
JENKINS_HOME 目录下:jobs/: 存放所有任务的配置。workspace/: 任务的工作目录,代码会拉取到这里。plugins/: 存放已安装的插件(.jpi 文件)。
三、 构建触发器 (Triggers)
触发器决定了 Jenkins 何时开始构建。
- 定时构建 (Build periodically):
- 类似 Linux 的 Cron 表达式。
- 语法:
分 时 日 月 周。 - 示例:
H/3 * * * *(每 3 分钟构建一次)。
- 轮询 SCM (Poll SCM):
- 定时检查代码仓库是否有更新。如果有新提交,才触发构建。
- 示例:
H/5 * * * *(每 5 分钟检查一次)。
- Webhook (远程触发):
- 代码提交时,由 GitHub/GitLab 主动发送请求通知 Jenkins 构建。最实时、高效。
四、 进阶:Pipeline (流水线)
Pipeline 是 Jenkins 的核心功能,它允许你用代码(Groovy 语言)来定义整个构建流程。
1. Pipeline 语法
有两种语法风格:
- 声明式 (Declarative): 推荐,结构清晰,易于阅读。
- 脚本式 (Scripted): 灵活性高,类似传统编程。
声明式示例:
groovy
pipeline {
agent any // 在任何可用节点上运行
stages {
stage('Build') {
steps {
echo 'Building...'
// sh 'mvn clean package'
}
}
stage('Test') {
steps {
echo 'Testing...'
}
}
stage('Deploy') {
steps {
echo 'Deploying...'
}
}
}
}
2. Blue Ocean 插件
安装
Blue Ocean 插件可以获得现代化的 UI 界面,可视化展示流水线的执行进度。五、 实战:自动化构建与部署 Spring Boot 项目
下面我们将演示一个完整的 CI/CD 流程:
- 从 GitHub 拉取 Spring Boot 代码。
- 使用 Maven 构建项目。
- 通过 SSH 将 Jar 包部署到远程服务器。
步骤 1:准备代码与仓库
在 GitHub 上创建一个仓库,并推送你的 Spring Boot 项目代码。
步骤 2:配置 Jenkins 凭证
Jenkins 需要权限拉取代码和登录服务器。
- 配置 GitHub 凭证:
- SSH 密钥: 在 Jenkins 服务器(或容器)上生成 SSH Key (
ssh-keygen), 将公钥添加到 GitHub 的Settings -> SSH and GPG keys。 - 或者 Personal Access Token (PAT): 在 GitHub 设置中生成 Token,在 Jenkins 中添加 “用户名 / 密码” 凭证,密码填 Token。
- SSH 密钥: 在 Jenkins 服务器(或容器)上生成 SSH Key (
- 配置服务器 SSH 免密登录:
- 在 Jenkins 容器内执行
ssh-copy-id user@remote-server-ip,将 Jenkins 的公钥复制到目标服务器,实现免密登录。
- 在 Jenkins 容器内执行
步骤 3:配置全局工具
进入
系统管理 -> 全局工具配置:- JDK: 自动安装或指定路径。
- Maven: 自动安装或指定路径。
步骤 4:编写 Jenkinsfile
在项目根目录创建
Jenkinsfile,这是流水线即代码的关键。groovy
pipeline {
agent any
tools {
maven "Maven 3.9.5" // 名称需与全局配置一致
jdk "JDK 17"
}
stages {
stage('Checkout') {
steps {
git url: 'git@github.com:your-username/your-repo.git', branch: 'main'
echo '代码拉取成功'
}
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
echo '项目构建成功'
}
}
stage('Test') {
steps {
sh 'mvn test'
echo '测试完成'
}
}
stage('Deploy') {
steps {
echo '开始部署...'
// 1. 停止远程服务器旧应用 (假设使用脚本 stop.sh)
sh 'ssh user@192.168.1.100 "~/scripts/stop.sh"'
// 2. 上传新 Jar 包
sh 'scp target/*.jar user@192.168.1.100:/opt/app/'
// 3. 启动新应用
sh 'ssh user@192.168.1.100 "~/scripts/start.sh"'
echo '部署成功!'
}
}
}
}
步骤 5:创建 Pipeline 任务
- 新建任务,选择 “流水线”。
- 在 “流水线” 部分,选择 “Pipeline script from SCM”。
- SCM 选择 Git,填写仓库地址,并选择之前配置的凭证。
- 脚本路径填写
Jenkinsfile。 - 保存并点击 “立即构建”。
步骤 6:验证结果
构建成功后,访问远程服务器的端口(例如
http://server-ip:8081),你应该能看到最新的应用界面。六、 扩展:节点与分布式构建 (Agents)
当项目增多,单台 Jenkins 服务器(Master)可能会不堪重负。此时可以使用 Agent (从节点) 来分担工作。
- Master: 负责调度和管理。
- Agent: 负责实际执行构建任务。
配置 Docker Agent (动态节点):
- 安装
Docker和Docker Pipeline插件。 - 在
系统管理 -> 节点和云管理 -> 配置云中添加 Docker 云。 - 指定 Docker Host URL(如
tcp://docker:2375)。 - 配置 Agent 模板,使用官方镜像
jenkins/inbound-agent。 - 在 Pipeline 中指定标签:
groovy
agent { label 'docker-agent' }
这样,每次构建时,Jenkins 会自动启动一个 Docker 容器作为 Agent,构建完成后自动销毁。
总结
通过本文的学习,你应该已经掌握了 Jenkins 的核心用法:
- 如何安装和初始化 Jenkins。
- 如何使用 Freestyle 项目进行简单的任务自动化。
- 如何使用 Pipeline 定义复杂的构建流程。
- 如何结合 GitHub 和 SSH 实现自动部署。
Jenkins 的生态非常庞大,建议大家在实际项目中根据需求探索更多插件(如 SonarQube 代码质量检查、Docker 镜像构建等),打造属于自己的 DevOps 平台。