【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 安装(推荐):
# 拉取 Jenkins 镜像dockerpull jenkins/jenkins:lts# 启动容器dockerrun-d\--namejenkins\-p8080:8080\-p50000:50000\-vjenkins_home:/var/jenkins_home\jenkins/jenkins:lts# 查看初始密码dockerexecjenkinscat/var/jenkins_home/secrets/initialAdminPassword直接安装:
# Ubuntu/Debiansudoapt-getinstalljenkins# CentOS/RHELsudoyuminstalljenkins# macOSbrewinstalljenkins-lts3.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
// Jenkinsfilepipeline{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
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 中使用
pipeline{agent any environment{// 引用凭据GIT_CREDENTIALS=credentials('git-credentials-id')DB_PASSWORD=credentials('db-password-id')}stages{stage('拉取代码'){steps{// 使用凭据访问 Gitgit 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 定时触发配置
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 集成与通知配置。