一、前言:为什么要用 Jenkins?
在现代软件开发中,持续集成(CI) 和 持续部署(CD) 已经成为标配。Jenkins 作为最流行的开源自动化服务器,能够帮助开发团队:
-
自动拉取代码、编译、打包、测试、部署
-
提前发现问题,降低修复成本
-
减少重复性人工操作,提升效率
-
实现构建、测试、发布的全流程自动化
一句话总结:Jenkins 让"提交代码即发布"成为可能。
二、Jenkins 是什么?
-
前身:Hudson,2011 年更名为 Jenkins
-
开发语言:Java
-
核心功能:持续集成、持续交付、持续部署
-
特点:
-
易安装、易配置
-
支持 Git、SVN、GitHub、Gitee 等
-
支持 Maven、Gradle、Ant 等构建工具
-
丰富的插件生态
-
支持分布式构建
-
提供图形化界面和邮件/IM 通知
-
三、CI / CD 核心概念对比
| 概念 | 说明 |
|---|---|
| 持续集成(CI) | 代码频繁合并到主干,自动构建 + 测试 |
| 持续交付(CD) | 确保代码随时可发布到生产环境 |
| 持续部署(CD) | 每次代码变更自动部署到生产环境 |
持续集成的核心是自动化,持续部署是持续交付的"更进一步"。
四、环境准备(基于 openEuler 24.03)
1. 资源清单
| 主机名 | IP | 配置 | 角色 |
|---|---|---|---|
| jenkins | 192.168.207.137 | 2C4G | Jenkins 服务器 |
| gitlab | 192.168.207.138 | 2C4G | GitLab 代码仓库 |
2. 基础环境配置(所有节点)
bash
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭 SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# 时间同步
timedatectl set-timezone Asia/Shanghai
chronyc sources -v
# 修改主机名(分别执行)
hostnamectl set-hostname jenkins # 在 Jenkins 节点
hostnamectl set-hostname gitlab # 在 GitLab 节点
五、GitLab 部署与项目创建(简要)
bash
# 克隆项目代码
git clone http://192.168.207.138/root/demo.git
mv -f BlueLight/* demo/
cd demo
git add .
git commit -m "initial commit"
git branch -M main
git push -u origin main
补充:GitLab 部署可使用 Docker 或 RPM 方式,建议至少 4G 内存。
六、Jenkins 部署(基于 Tomcat)
1. 安装 JDK 11
bash
tar zxf jdk-11.0.16.1_linux-x64_bin.tar.gz
mv jdk-11.0.16.1 /usr/local/java11/
cat >> /etc/profile << 'EOF'
export JAVA_HOME=/usr/local/java11/
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
EOF
source /etc/profile
java -version
2. 安装 Tomcat 9
bash
tar zxvf apache-tomcat-8.5.56.tar.gz
mv apache-tomcat-8.5.56 /usr/local/tomcat
3. 部署 Jenkins WAR 包
bash
dnf -y install fontconfig
mv jenkins2.401.1.war jenkins.war
mv jenkins.war /usr/local/tomcat/webapps/
/usr/local/tomcat/bin/startup.sh
访问:http://192.168.207.137:8080/jenkins
七、Jenkins 初始化与插件管理
1. 修改插件源(国内加速)
bash
cd /root/.jenkins/updates
sed -i 's/https:\/\/www.jenkins.io/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json
sed -i 's/https:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
注意:
default.json在 Jenkins 首次启动后生成。
2. 推荐安装的插件清单(重点)
| 插件名称 | 用途 |
|---|---|
| Git Parameter | 动态选择 Git 分支 |
| Blue Ocean | 现代化 UI 流水线 |
| GitLab | 与 GitLab 集成 |
| Role-based Authorization Strategy | 角色权限控制 |
| Credentials Binding | 凭据管理 |
| Maven Integration | Maven 构建支持 |
| Publish Over SSH | 远程部署 |
| Localization: Chinese (Simplified) | 中文界面 |
补充:插件安装失败可重试或手动上传
.hpi文件。
八、角色与权限管理(RBAC)
1. 启用 Role-Based Strategy
路径:Manage Jenkins → Security → Authorization
2. 创建角色
| 角色名 | 类型 | 权限 |
|---|---|---|
| baseRole | 全局 | Overall/Read |
| role1 | 项目 | 匹配 my-item01.* |
| role2 | 项目 | 匹配 my-item02.* |
3. 创建用户并绑定角色
bash
用户:zhangsan → baseRole + role1
用户:lisi → baseRole + role2
补充:如果不绑定
Overall/Read,用户登录后会提示无权限。
九、凭据管理(Credentials)
1. 凭据类型
| 类型 | 说明 |
|---|---|
| Username with password | 用户名/密码 |
| SSH Username with private key | SSH 密钥对 |
| Secret text | API Token |
| Certificate | 证书文件 |
2. 添加 GitLab 用户名密码凭据
-
类型:
Username with password -
范围:
Global -
用户名:
root -
密码:
pwd12345
3. 添加 SSH 密钥对凭据
bash
# 生成密钥对
ssh-keygen
cat ~/.ssh/id_rsa.pub # 复制到 GitLab SSH Keys
Jenkins 中添加:
-
类型:
SSH Username with private key -
用户名:
root -
Private Key:粘贴
id_rsa内容
补充:首次连接 GitLab 需要手动
ssh git@gitlab-ip接受指纹。
十、项目构建与测试(权限验证)
1. 创建项目
-
my-item01-zhangsan -
my-item02-lisi
2. 验证权限
-
zhangsan 只能看到并操作
my-item01-* -
lisi 只能看到并操作
my-item02-*
十一、补充知识点(扩展阅读)
1. Jenkins Pipeline 语法概览
-
Declarative Pipeline:结构清晰,适合大多数场景
-
Scripted Pipeline:更灵活,适合复杂逻辑
groovy
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
}
}
2. 常见错误及解决方案
| 错误 | 解决方案 |
|---|---|
| 插件安装失败 | 更换镜像源或手动上传插件 |
| Git 拉取失败 | 检查凭据、SSH 指纹、网络连通性 |
| 权限不足 | 绑定 Overall/Read 角色 |
| 构建卡住 | 检查 Jenkins 内存、Tomcat 日志 |
3. 安全建议
-
使用 HTTPS + 反向代理(Nginx)
-
定期备份
/var/lib/jenkins -
限制用户注册权限
-
使用 LDAP / OAuth 统一认证
4. Jenkins + GitLab Webhook 自动触发构建
-
在 GitLab 项目中配置 Webhook URL:
http://jenkins-ip:8080/project/your-project -
Jenkins 中勾选
Build when a change is pushed to GitLab