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 集成与通知配置。

相关推荐
运维行者_5 小时前
应用性能监控怎么选?从调用链到用户体验的五个能力维度
运维·服务器·数据库·人工智能·mysql·性能优化·应用性能监控
考虑考虑9 小时前
nginx路由重写
运维·后端·自动化运维
Zenova EdgeOS11 小时前
Linux 内核日志 dmesg 进阶实战:从现场过滤到持久化闭环
linux·运维·服务器
郝亚军12 小时前
ec_private.pem的生成方法
linux·运维·服务器
NendoZen12 小时前
Arch Linux解决Grub无法SAVEDEFAULT问题(uki启动问题)
linux·运维·服务器
Elastic 中国社区官方博客13 小时前
Elasticsearch:安装自行管理的 Elastic Stack 集群
大数据·运维·服务器·数据库·elasticsearch·搜索引擎·全文检索
忆挽篱笙歌13 小时前
进程控制管理
linux·运维·服务器
fengkai454515 小时前
3、Kubernetes的Namespace&Contexts&Pod&YAML格式
运维·容器·kubernetes·k8s·namespace·yaml·pod
戴西软件15 小时前
制造研发中的AI视觉与仿真:戴西工程图纸智能审图智能体、戴西3DViz_CAE AI集成与戴西3DViz_CAD AI集成
大数据·运维·人工智能·3d·自动化·制造·rpa
javaDocker15 小时前
1800 亿科技投入砸下去,多数机构平的只是服务器,不是能力
运维·服务器·人工智能·科技·研发效能·金融科技