Jenkins
开源自动化 CI/CD 服务器 —— 持续集成、持续交付、自动化构建与部署
官网:https://www.jenkins.io | 文档:https://www.jenkins.io/doc | GitHub:https://github.com/jenkinsci/jenkins
发展历史
Jenkins 源自 Hudson 项目,是 CI/CD 领域最经典的自动化服务器:
| 时期 | 事件 | 时间 | 说明 |
|---|---|---|---|
| Hudson 诞生 | Hudson 发布 | 2005 | Sun 公司的 Kohsuke Kawaguchi(川口耕介)开发,是最早的 CI 工具之一 |
| Oracle 商标之争 | Jenkins 分支 | 2011 | Oracle 收购 Sun 后,Hudson 商标归 Oracle,社区分支出 Jenkins |
| 快速发展 | Jenkins 1.x | 2011–2016 | 插件生态爆发,1000+ 插件,成为 CI/CD 事实标准 |
| Pipeline 时代 | Jenkins 2.0 | 2016 | 引入 Pipeline as Code(Jenkinsfile),默认集成 Blue Ocean |
| 持续更新 | Jenkins 2.3xx | 2022 | LTS 版本持续发布,支持 Java 11/17,性能优化 |
| 当前版本 | Jenkins 2.4xx+ | 2024–2025 | 支持 Java 21,改进安全性和可用性,持续更新 LTS 基线 |
Jenkins vs 竞品
| 对比项 | Jenkins | GitLab CI | GitHub Actions | Drone CI |
|---|---|---|---|---|
| 安装方式 | 自托管(Java) | 自托管 / SaaS | SaaS(GitHub) | 自托管(Docker) |
| 插件生态 | 2000+ 插件,极其丰富 | 有限 | Marketplace | 有限 |
| Pipeline | Jenkinsfile(Groovy) | .gitlab-ci.yml(YAML) | .github/workflows(YAML) | .drone.yml(YAML) |
| 界面 | 传统 UI,稍显陈旧 | 现代 | 现代 | 简洁 |
| 运维成本 | 高(需维护 Jenkins 服务) | 中 | 低(托管) | 低 |
| 选择建议 | 复杂/存量项目、需要高度定制 | GitLab 生态首选 | GitHub 生态首选 | 轻量级场景 |
核心特性
| 特性 | 说明 |
|---|---|
| 开源免费 | 完全开源,MIT 许可证,可自由部署和定制 |
| 插件生态 | 2000+ 插件覆盖版本管理、构建工具、部署、通知等 |
| Pipeline as Code | 通过 Jenkinsfile 将 CI/CD 流程代码化,支持版本管理 |
| 分布式构建 | Master/Agent 架构,可跨多台机器并行执行构建 |
| 多语言支持 | 支持 Java、Node.js、Python、Go、C++ 等几乎所有语言 |
| 多平台 | Windows / Linux / macOS,支持 Docker、Kubernetes 等 |
| 丰富的触发方式 | Git 推送、定时、Webhook、手动触发 |
| 权限管理 | 基于角色的安全策略,支持 LDAP、OAuth 等认证集成 |
应用场景
| 场景 | 说明 |
|---|---|
| 自动化构建 | 代码提交后自动编译、打包(Maven / Gradle / npm 等) |
| 自动化测试 | 集成单元测试、集成测试、代码质量检查(SonarQube) |
| 自动化部署 | 构建产物自动部署到测试/预发/生产环境 |
| 多环境管理 | 不同分支触发不同流程(dev → test → staging → prod) |
| 定时任务 | 定时执行构建、数据同步、备份等任务 |
| 流水线编排 | 复杂的多阶段、多节点并行流水线 |
安装方式
方式一:Docker(推荐)
拉取镜像
bash
docker pull jenkins/jenkins:lts-jdk17创建数据卷
bash
docker volume create jenkins_home创建容器
bash
docker run -d \
-u root \
--privileged=true \
--name jenkins \
--restart=on-failure \
-v jenkins_home:/var/jenkins_home \
-p 9600:8080 `# Web 界面端口` \
-p 50000:50000 `# Agent 通信端口` \
jenkins/jenkins:lts-jdk17查看初始密码
bash
docker logs -f jenkins日志中会输出类似以下内容的初始密码:
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword首次配置
- 浏览器访问
http://<服务器IP>:9600 - 输入初始密码
- 选择 "安装推荐的插件" 或 "选择要安装的插件"
- 创建管理员用户
- 配置 Jenkins URL
TIP
首次安装插件时耗时较长,取决于网络状况。如果部分插件安装失败,可稍后手动安装。
重启 Jenkins
bash
docker restart jenkins方式二:WAR 包(通用)
bash
# 1. 下载 WAR 包
wget https://get.jenkins.io/war-stable/latest/jenkins.war
# 2. 启动(需安装 Java 11+)
java -jar jenkins.war --httpPort=9600方式三:Linux 系统安装
bash
# Debian / Ubuntu
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
# CentOS / RHEL
sudo wget -O /etc/yum.repos.d/jenkins.repo \
https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
sudo yum install jenkins配置 JDK 和 Maven
Jenkins 构建 Java 项目需要配置 JDK 和 Maven。
JDK 配置
详见 Jenkins 配置 JDK 文档,主要步骤:
- 下载 JDK 安装包
- 拷贝到 Jenkins 容器内并解压
- 在 Jenkins 系统管理 → 全局工具配置 → JDK 中指定路径
Maven 配置
详见 Jenkins 配置 Maven 文档,主要步骤:
- 下载 Maven 安装包
- 拷贝到 Jenkins 容器内并解压
- 通过全局属性配置 PATH
- (可选)使用 Config File Provider 插件管理全局 settings.xml
安装推荐插件
基础插件
| 插件名称 | 说明 |
|---|---|
| Maven Integration | Maven 项目的构建支持 |
| Git | Git 源码管理支持 |
| Pipeline | Pipeline as Code 核心支持 |
| Blue Ocean | 现代化的 Pipeline 可视化界面 |
| Credentials Binding | 凭据管理(用户名密码、SSH 密钥等) |
进阶插件
| 插件名称 | 说明 |
|---|---|
| Publish over SSH | 通过 SSH 传输构建产物到远程服务器 |
| SSH server | 在远程服务器执行 SSH 命令 |
| NodeJS | 构建 Node.js 项目时自动安装 Node 环境 |
| Config File Provider | 管理全局配置文件(如 Maven settings.xml) |
| SonarQube Scanner | 集成 SonarQube 代码质量扫描 |
| Docker Pipeline | Pipeline 中执行 Docker 操作 |
| Kubernetes CLI | 在 Pipeline 中执行 kubectl 命令 |
| Email Extension | 构建结果邮件通知 |
安装插件后重启
bash
docker restart jenkins创建 Pipeline
Freestyle 任务
Freestyle 是 Jenkins 的传统任务类型,适合简单的构建需求:
- 点击 "新建任务" → 输入任务名称 → 选择 "Freestyle project"
- 源码管理:选择 Git,填写仓库地址和凭据
- 构建触发器:选择触发方式(Webhook、定时轮询等)
- 构建步骤:添加构建步骤(如 Invoke Maven)
- 保存并构建
声明式 Pipeline(推荐)
Pipeline as Code 使用 Jenkinsfile 将 CI/CD 流程代码化,推荐存储在 Git 仓库中:
groovy
// Jenkinsfile
pipeline {
agent any
tools {
// 使用 Jenkins 全局工具配置中定义的 JDK 和 Maven
jdk 'JDK17'
maven 'Maven3'
}
stages {
stage('Checkout') {
steps {
git branch: 'main',
url: 'https://github.com/example/my-project.git'
}
}
stage('Build') {
steps {
sh 'mvn clean package -DskipTests'
}
post {
success {
archiveArtifacts artifacts: 'target/*.jar'
}
}
}
stage('Test') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
stage('Deploy to Test') {
when {
branch 'develop'
}
steps {
sh 'scp target/*.jar user@test-server:/app/'
}
}
}
post {
failure {
emailext(
subject: "构建失败: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
body: "请查看详情: ${env.BUILD_URL}",
to: 'team@example.com'
)
}
}
}Pipeline 常用选项
groovy
pipeline {
// 指定在哪个 Agent 上运行
agent { label 'linux' }
// agent { docker { image 'maven:3-eclipse-temurin-17' } }
// 环境变量
environment {
DOCKER_REGISTRY = 'registry.example.com'
}
// 参数化构建
parameters {
choice(name: 'ENV', choices: ['dev', 'test', 'prod'])
string(name: 'BRANCH', defaultValue: 'main')
}
stages {
stage('Example') {
steps {
echo "Deploying to ${params.ENV}"
}
}
}
}凭据管理
添加 SSH 私钥
- 系统管理 → 凭据 → 系统 → 全局凭据 → 添加凭据
- 类型:"SSH Username with private key"
- 填写用户名和私钥内容
添加 Git 仓库凭据
- 推荐使用 SSH 方式(需要先添加 SSH 凭据)
- 在 Pipeline 中引用凭据:
groovy
stage('Checkout') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: '*/main']],
userRemoteConfigs: [[
url: 'git@github.com:example/my-project.git',
credentialsId: 'my-ssh-key'
]]
])
}
}备份与恢复
备份
bash
# 备份 Jenkins 数据目录
docker run --rm -v jenkins_home:/data -v /backup:/backup alpine \
tar -czf /backup/jenkins-backup-$(date +%Y%m%d).tar.gz -C /data .恢复
bash
# 恢复备份
docker run --rm -v jenkins_home:/data -v /backup:/backup alpine \
tar -xzf /backup/jenkins-backup-20250101.tar.gz -C /data