CICD_01_持续集成与Jenkins入门

【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,按以下步骤完成初始化:

  1. 解锁 Jenkins:输入初始管理员密码
  2. 安装插件:选择「安装推荐的插件」
  3. 创建管理员账户
  4. 配置 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 集成与通知配置。

相关推荐
硅基手札1 小时前
MCP 实战 —— 从零写一个 CRC16 服务器(保姆级)
运维·服务器·ai
今年下半年1 小时前
【运维】windows虚拟机安装arm(aarch64)服务器
运维·windows·arm·虚拟机·aarch64
杨云龙UP1 小时前
TDengine Community 超级表建表实战:统一21个TAG与DOUBLE/字符串数据模板
运维·服务器·数据库·时序数据库·tdengine·涛思数据·stable建表
高山有多高2 小时前
【Linux笔记】冯诺依曼体系结构
linux·运维·笔记
筑梦之路2 小时前
Alibaba Cloud Linux 4 IPXE全自动安装(直连官方源)——筑梦之路
linux·运维·服务器·国产化·阿里云操作系统
Pointer Pursuit2 小时前
make / Makefile
linux·运维·服务器
ZhangJun952 小时前
Linux常用命令笔记,中高级运维高频指令,并附上vim常见操作
linux·运维·centos·云计算·vim
逐流人3 小时前
Ceph对象存储与文件系统存储管理:从RADOS网关、S3与Swift到CephFS快照同步
linux·运维·ceph·云原生·云计算·swift·rados
分布式存储与RustFS3 小时前
日志目录的预算是 2 GiB:轮转、保留和压缩这三件事
运维·云原生·开源·对象存储·分布式存储·s3·性能基准