【CI/CD】持续集成入门与 Jenkins 基础:从概念到第一个 Pipeline
🔑 关键词:CI/CD、Jenkins、Pipeline、Jenkinsfile、持续集成、自动化构建
一、什么是 CI/CD?
1.1 三个核心概念
| 概念 | 英文 | 含义 |
|---|---|---|
| 持续集成(CI) | Continuous Integration | 频繁地将代码合并到主干,每次合并自动触发构建和测试 |
| 持续交付(CD) | Continuous Delivery | 在 CI 基础上,代码随时可以手动触发部署到生产环境 |
| 持续部署(CD) | Continuous Deployment | 在持续交付基础上,通过测试后自动部署到生产环境,无需人工干预 |
代码提交 → 自动构建 → 自动测试 → 自动部署
↑ ↑ ↑ ↑
CI CI CD(交付) CD(部署)
1.2 为什么需要 CI/CD?
没有 CI/CD 的痛点:
- 手动打包、手动部署,容易出错
- 集成问题到了上线前才发现,修复成本极高
- 环境不一致导致"在我电脑上能跑"
- 部署依赖某个人,请假就没人能发布
有了 CI/CD 之后:
- 每次提交自动触发构建和测试,问题早发现
- 构建、测试、部署全流程自动化,减少人为失误
- 保证每次发布的产物都是一致的
- 任何人都能触发部署,不依赖特定人员
二、主流 CI/CD 工具对比
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Jenkins | 开源免费、插件生态丰富、高度可定制 | 企业级项目,需要高度定制 |
| GitLab CI | 与 GitLab 深度集成、YAML 配置 | 使用 GitLab 托管的项目 |
| GitHub Actions | 与 GitHub 深度集成、Marketplace 丰富 | 开源项目、GitHub 托管项目 |
| Drone | 轻量级、容器原生 | 小型团队、容器化项目 |
💡 选择建议:企业私有化部署选 Jenkins;代码在 GitLab 选 GitLab CI;代码在 GitHub 选 GitHub Actions。本系列以 Jenkins 为主。
三、Jenkins 简介
Jenkins 是一款开源的自动化服务器,用于执行 CI/CD 流水线。
3.1 核心能力
- 构建:编译代码、打包应用
- 测试:运行单元测试、集成测试
- 部署:部署到测试/生产环境
- 调度:定时任务、Webhook 触发
- 通知:邮件、钉钉、Slack 通知
3.2 安装方式
Docker 安装(推荐):
bash
# 拉取 Jenkins 镜像
docker pull jenkins/jenkins:lts
# 启动容器
docker run -d \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
# 查看初始密码
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
直接安装:
bash
# Ubuntu/Debian
sudo apt-get install jenkins
# CentOS/RHEL
sudo yum install jenkins
# macOS
brew install jenkins-lts
3.3 初始化配置
首次访问 http://localhost:8080,按以下步骤完成初始化:
- 解锁 Jenkins:输入初始管理员密码
- 安装插件:选择「安装推荐的插件」
- 创建管理员账户
- 配置 Jenkins URL
四、Pipeline 核心概念
Pipeline 是 Jenkins 的核心功能,用代码定义整个 CI/CD 流程。
4.1 两种 Pipeline 语法
| 类型 | 说明 | 推荐度 |
|---|---|---|
| Declarative(声明式) | 结构化语法,更易读易维护 | ✅ 推荐 |
| Scripted(脚本式) | 基于 Groovy 脚本,更灵活 | 复杂场景使用 |
4.2 关键术语
| 术语 | 说明 |
|---|---|
| Pipeline | 整个流水线,定义完整的 CI/CD 流程 |
| Stage | 阶段,如 Build、Test、Deploy |
| Step | 步骤,每个阶段内的具体操作 |
| Node/Agent | 执行任务的节点 |
| Jenkinsfile | 定义 Pipeline 的文件,放在项目根目录 |
五、第一个 Jenkinsfile
5.1 最简 Pipeline
groovy
// Jenkinsfile
pipeline {
agent any
stages {
stage('构建') {
steps {
echo '正在构建...'
sh 'echo "Build complete"'
}
}
stage('测试') {
steps {
echo '正在运行测试...'
sh 'echo "Tests passed"'
}
}
stage('部署') {
steps {
echo '正在部署...'
sh 'echo "Deployed successfully"'
}
}
}
}
5.2 Java 项目 Pipeline
groovy
pipeline {
agent any
tools {
maven 'Maven-3.9'
jdk 'JDK-21'
}
stages {
stage('编译') {
steps {
sh 'mvn clean compile'
}
}
stage('单元测试') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('打包') {
steps {
sh 'mvn package -DskipTests'
}
}
stage('部署') {
steps {
sh 'scp target/*.jar deploy@server:/app/'
sh 'ssh deploy@server "systemctl restart myapp"'
}
}
}
post {
success {
echo '✅ 构建成功!'
}
failure {
echo '❌ 构建失败!'
}
}
}
六、Freestyle vs Pipeline
| 对比 | Freestyle 项目 | Pipeline 项目 |
|---|---|---|
| 配置方式 | Web 界面点击配置 | Jenkinsfile 代码定义 |
| 可追溯 | 配置不可追溯 | 随代码一起版本管理 |
| 可复用 | 难以复用 | Pipeline 可复用、可共享 |
| 复杂逻辑 | 难以实现 | 支持条件、并行、循环 |
| 推荐度 | ❌ 不推荐 | ✅ 推荐 |
💡 建议:新项目直接用 Pipeline,老 Freestyle 项目逐步迁移。
七、凭据管理
7.1 为什么需要凭据管理?
Pipeline 中需要访问 Git 仓库、部署服务器、数据库等,这些都需要密码、Token 或密钥。不能明文写在 Jenkinsfile 中。
7.2 添加凭据
Jenkins → Manage Jenkins → Credentials → System → Global credentials
添加类型:
- Username with password:用户名密码
- SSH Username with private key:SSH 密钥
- Secret text:Token/Secret
- Secret file:证书文件
7.3 在 Pipeline 中使用
groovy
pipeline {
agent any
environment {
// 引用凭据
GIT_CREDENTIALS = credentials('git-credentials-id')
DB_PASSWORD = credentials('db-password-id')
}
stages {
stage('拉取代码') {
steps {
// 使用凭据访问 Git
git credentialsId: 'git-credentials-id',
url: 'https://gitlab.com/xxx/project.git'
}
}
stage('连接数据库') {
steps {
sh """
mysql -h db-host -u root -p${DB_PASSWORD} -e "SELECT 1"
"""
}
}
}
}
八、构建触发器
8.1 触发方式
| 方式 | 说明 | 场景 |
|---|---|---|
| 手动触发 | 点击「Build Now」 | 调试、紧急发布 |
| 定时触发 | Cron 表达式 | 定时构建、日报 |
| Webhook | 代码推送时自动触发 | CI/CD 核心场景 |
| 轮询 SCM | 定时检查代码变化 | GitLab/GitHub Webhook 不可用时的备选 |
8.2 定时触发配置
groovy
pipeline {
agent any
triggers {
// 每天晚上 10 点构建
cron('0 22 * * *')
// 每 4 小时构建一次
// cron('H H/4 * * *')
}
stages {
stage('构建') {
steps {
sh 'mvn clean package'
}
}
}
}
8.3 Webhook 触发(GitLab)
1. Jenkins 安装 GitLab 插件
2. 在 Jenkins Pipeline 配置中勾选「Build when a change is pushed to GitLab」
3. 复制 Webhook URL
4. 在 GitLab 项目 → Settings → Webhooks 中粘贴 URL
5. 测试 Webhook 是否正常
九、面试高频问题
Q1:CI 和 CD 的区别?
答:CI(持续集成)关注代码合并后的自动构建和测试;CD 有两个含义------持续交付(Continuous Delivery)是代码随时可部署到生产环境,但需要手动触发;持续部署(Continuous Deployment)是测试通过后自动部署,无需人工干预。
Q2:Jenkins Pipeline 和 Freestyle 的区别?
答:Freestyle 通过 Web 界面配置,配置不可追溯、难以复用;Pipeline 通过 Jenkinsfile 代码定义,随代码一起版本管理,支持条件判断、并行执行、循环等复杂逻辑,推荐优先使用 Pipeline。
Q3:如何在 Jenkins 中安全地管理密码和密钥?
答 :使用 Jenkins 凭据管理功能(Credentials),将密码、Token、密钥等存储在全局或项目级凭据中,Pipeline 中通过
credentials()函数引用,避免明文写入代码。
十、总结
| 知识点 | 核心要点 |
|---|---|
| CI/CD | 持续集成→持续交付→持续部署 |
| Jenkins | 开源自动化服务器,支持构建/测试/部署 |
| Pipeline | 用 Jenkinsfile 定义 CI/CD 流程 |
| 关键术语 | Stage、Step、Agent、Node |
| 凭据管理 | 密码/Token 不要明文写在 Jenkinsfile |
| 触发器 | 手动/定时/Webhook/轮询 |
📝 下一篇预告:《Jenkins 实战与进阶》,详解多分支 Pipeline、参数化构建、Docker 集成与通知配置。