第五阶段:Jenkins CI 持续集成平台部署

5.1 阶段目标

本阶段主要完成 Jenkins 持续集成平台部署,为后续:

Gitea代码仓库
Jenkins Pipeline
Docker构建镜像
Harbor私有仓库
Kubernetes部署

建立 CI 环境。


5.2 部署环境规划

本阶段主要操作:

主机IP是否操作作用
devops192.168.10.10Jenkins CI平台
harbor192.168.10.20验证镜像仓库
ansible192.168.10.30后续自动化部署
k8s-node1192.168.10.40Kubernetes节点
k8s-node2192.168.10.50Kubernetes节点
ecs-prod云服务器后续公网发布

5.3 Jenkins部署流程

本阶段实施步骤:

编号内容
5.1检查 Docker 环境
5.2创建 Jenkins 数据目录
5.3Docker部署 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

安装:

插件用途
DockerDocker Build
Docker PipelinePipeline 构建镜像
Docker CommonsDocker 凭据
SSH AgentSSH 登录服务器
SSH Pipeline StepsPipeline SSH
Publish Over SSH发布到远程服务器
Ansible第八阶段
PipelineJenkins Pipeline
Git拉取代码
Credentials保存 Harbor/Git 凭据
SSH CredentialsSSH 登录服务器
Generic Webhook TriggerWebhook触发

安装完成后统一点击 “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

填写:

字段内容
Usernameadmin
PasswordHarbor密码
IDharbor-admin
DescriptionHarbor 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

填写:

字段内容
Usernameroot
Private Keyid_rsa内容
IDssh-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

第五阶段完成。