第五阶段:Jenkins CI 持续集成平台部署
5.1 阶段目标
本阶段主要完成 Jenkins 持续集成平台部署,为后续:
Gitea代码仓库
↓
Jenkins Pipeline
↓
Docker构建镜像
↓
Harbor私有仓库
↓
Kubernetes部署
建立 CI 环境。
5.2 部署环境规划
本阶段主要操作:
| 主机 | IP | 是否操作 | 作用 |
|---|---|---|---|
| devops | 192.168.10.10 | ✅ | Jenkins CI平台 |
| harbor | 192.168.10.20 | 验证 | 镜像仓库 |
| ansible | 192.168.10.30 | ❌ | 后续自动化部署 |
| k8s-node1 | 192.168.10.40 | ❌ | Kubernetes节点 |
| k8s-node2 | 192.168.10.50 | ❌ | Kubernetes节点 |
| ecs-prod | 云服务器 | ❌ | 后续公网发布 |
5.3 Jenkins部署流程
本阶段实施步骤:
| 编号 | 内容 |
|---|---|
| 5.1 | 检查 Docker 环境 |
| 5.2 | 创建 Jenkins 数据目录 |
| 5.3 | Docker部署 Jenkins |
| 5.4 | 初始化 Jenkins |
| 5.5 | 安装 Jenkins 插件 |
| 5.6 | 配置 Jenkins 环境 |
| 5.7 | 创建 Pipeline 测试 |
| 5.8 | 阶段验收 |
5.4 devops环境检查
操作主机:
devops
192.168.10.10
5.4.1 检查 Docker
执行:
docker -v
检查 Docker 版本。
查看 Docker Compose:
docker compose version
查看 Docker 数据目录:
docker info | grep "Docker Root Dir"
确认:
Docker Root Dir: /data/docker
保持项目 Docker 目录统一规划。
5.4.2 检查 Java环境
执行:
java -version
示例:
OpenJDK 1.8.x
说明:
Jenkins 本身采用 Docker 部署,因此宿主机 Java 不是运行 Jenkins 的必要条件。
但是保留 JDK:
- 方便后续 Java 项目构建
- 方便问题排查
5.5 创建 Jenkins 数据目录
按照项目统一目录规范:
mkdir -p /data/apps/jenkins
mkdir -p /data/jenkins_home
mkdir -p /data/compose/jenkins
mkdir -p /data/logs/jenkins
目录结构:
/data
├── apps
│ └── jenkins
│
├── compose
│ └── jenkins
│
├── docker
│
├── jenkins_home
│
└── logs
└── jenkins
5.6 Docker部署 Jenkins
5.6.1 拉取 Jenkins 镜像
本项目采用:
jenkins/jenkins:lts-jdk17
执行:
docker pull jenkins/jenkins:lts-jdk17
查看:
docker images | grep jenkins
5.6.2 固定 Jenkins版本
为了避免版本变化导致插件兼容问题,最终固定:
jenkins/jenkins:2.541.3-lts-jdk17
5.6.3 创建 Docker Compose 文件
进入:
cd /data/compose/jenkins
创建:
vim docker-compose.yml
配置:
version: "3.8"
services:
jenkins:
image: jenkins/jenkins:2.541.3-lts-jdk17 //注意此处要把版本固定为2.541.3
container_name: jenkins
restart: always
privileged: true
user: root
ports:
- "8080:8080"
- "50000:50000"
volumes:
- /data/jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
environment:
- TZ=Asia/Shanghai
networks:
- jenkins-net
networks:
jenkins-net:
5.6.4 Docker挂载说明
Jenkins提前挂载:
Docker Socket
/var/run/docker.sock:/var/run/docker.sock
作用:
让 Jenkins 调用宿主机 Docker。
Docker CLI
/usr/bin/docker:/usr/bin/docker
作用:
让 Jenkins 容器内部拥有 docker 命令。
最终实现:
Jenkins容器
↓
Docker Socket
↓
宿主机Docker
↓
构建镜像
5.7 启动 Jenkins
执行:
docker compose up -d
查看:
docker ps
正常:
jenkins
访问:
http://192.168.10.10:8080
进入 Jenkins 初始化页面。
5.8 Jenkins初始化配置
5.8.1 获取初始化密码
执行:
docker exec jenkins \
cat /var/jenkins_home/secrets/initialAdminPassword
复制密码。
浏览器输入。
5.8.2 安装推荐插件
选择:
Install suggested plugins
自动安装官方推荐插件。
包括:
- Git
- Pipeline
- Credentials
- SSH相关插件
5.8.3 创建管理员账号
创建:
Username:
admin
Password:
自定义密码
Full Name:
Administrator
Email:
admin@example.com
5.8.4 Jenkins URL配置
设置:
http://192.168.10.10:8080/
保存。
5.9 Jenkins插件安装
进入:
Manage Jenkins
↓
Plugins
↓
Available Plugins
安装:
| 插件 | 用途 |
|---|---|
| Docker | Docker Build |
| Docker Pipeline | Pipeline 构建镜像 |
| Docker Commons | Docker 凭据 |
| SSH Agent | SSH 登录服务器 |
| SSH Pipeline Steps | Pipeline SSH |
| Publish Over SSH | 发布到远程服务器 |
| Ansible | 第八阶段 |
| Pipeline | Jenkins Pipeline |
| Git | 拉取代码 |
| Credentials | 保存 Harbor/Git 凭据 |
| SSH Credentials | SSH 登录服务器 |
| Generic Webhook Trigger | Webhook触发 |
安装完成后统一点击 “Restart Jenkins when installation is complete and no jobs are running”,让 Jenkins 自动重启。
5.10 Jenkins插件异常处理
问题现象
插件安装过程中出现:
- 插件依赖失败
- 缓存损坏
- bouncycastle-api异常
- snakeyaml-api异常
原因
Jenkins插件下载过程中:
- 网络中断
- 下载不完整
- 插件缓存损坏
解决方式
由于当前 Jenkins 尚未创建 Job:
直接清理插件缓存。
进入容器:
docker exec -it jenkins bash
删除:
rm -rf /var/jenkins_home/plugins/*
删除更新缓存:
rm -rf /var/jenkins_home/updates/*
退出:
exit
重启:
docker restart jenkins
重新安装插件。
默认更新站点有时较慢。
进入:
Manage Jenkins
↓
Plugins
↓
Advanced
将 Update Site 改为:
https://updates.jenkins.io/current/update-center.json
如果访问较慢,我们后续也可以切换到国内镜像源。
5.11 Jenkins环境配置
5.11.1 配置Docker调用
进入容器:
docker exec -it jenkins bash
执行:
docker version
正常显示:
Client:
Version:26.x
Server:
Version:26.x
说明:
Jenkins已经能够调用宿主机Docker。
5.11.2 配置Harbor认证
进入 Jenkins:
Manage Jenkins
↓
Credentials
↓
Global credentials
↓
Add Credentials
创建:
Kind:
Username with password
填写:
| 字段 | 内容 |
|---|---|
| Username | admin |
| Password | Harbor密码 |
| ID | harbor-admin |
| Description | Harbor Admin |
后续 Pipeline 使用:
harbor-admin
调用 Harbor。
5.11.3 配置SSH认证
如果你还没有 SSH 密钥,先在 devops 虚拟机生成:
ssh-keygen -t rsa -b 4096
一路回车即可。
查看公钥:
cat ~/.ssh/id_rsa.pub
然后把公钥追加到后续需要登录的机器(目前至少 Harbor,可以后续再扩展):
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "这里粘贴公钥" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
验证:
ssh harbor@192.168.10.20
或:
ssh root@192.168.10.20
能够免密登录即可。
Jenkins添加:
Kind:
SSH Username with private key
填写:
| 字段 | 内容 |
|---|---|
| Username | root |
| Private Key | id_rsa内容 |
| ID | ssh-root |
5.12 Git环境配置
进入:
Manage Jenkins
↓
Tools
配置 Git:
Name:
Git
路径:
/usr/bin/git
验证:
docker exec -it jenkins git --version
输出:
git version 2.x
5.13 Jenkins Harbor连接测试
进入 Jenkins 容器:
docker exec -it jenkins bash
执行:
docker login 192.168.10.20
输入:
用户名:admin
密码:Harbor密码
成功:
Login Succeeded
说明:
Jenkins
↓
Harbor
镜像推送链路正常。
5.14 第五阶段验收
完成以下内容:
Jenkins平台
✅ Jenkins Docker部署完成
✅ Jenkins Web访问正常
✅ 管理员创建完成
插件环境
✅ Git插件
✅ Pipeline插件
✅ Docker Pipeline插件
✅ Credentials插件
✅ SSH插件
Docker能力
✅ Jenkins容器调用宿主Docker
✅ Docker Build能力正常
Harbor连接
✅ Jenkins可以登录Harbor
✅ 可以推送镜像
最终形成:
Gitea
↓
Jenkins
↓
Docker Build
↓
Harbor
↓
Kubernetes
第五阶段完成。