阶段 7:Jenkins CI/CD 自动化部署
1. 阶段目标
将原来的手动发布流程:
Windows IDEA
│
▼
mvn package
│
▼
docker build
│
▼
docker push Harbor
│
▼
kubectl apply
升级为自动化流水线:
Gitee
│
│ git push
▼
Jenkins
│
│ Maven Build
▼
Docker Build
│
│ Push
▼
Harbor
│
│ SSH
▼
Kubernetes
│
│ rollout
▼
Spring Boot 应用更新
2. Jenkins 部署节点规划
| 服务器 | 主机名 | 用途 |
|---|---|---|
| 192.168.205.144 | devops | Ansible + Jenkins + CI/CD 执行节点 |
3. Java 环境配置
3.1 安装 JDK 21
和Spring Boot、Maven用的版本统一
bash
sudo apt install openjdk-21-jre-headless
验证:
bash
java -version
结果:
openjdk version "21.0.7"
4. Jenkins 安装
4.1 添加 Jenkins 源
创建 key:
bash
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
添加仓库:
bash
sudo vim /etc/apt/sources.list.d/jenkins.list
内容:
deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/
遇到问题 1:apt 权限错误
错误:
-bash: /etc/apt/sources.list.d/jenkins.list: Permission denied
原因: 普通用户无法写入 /etc 目录。
错误方式:
bash
echo xxx > /etc/apt/xxx
正确方式:
bash
sudo bash -c "echo xxx > /etc/apt/xxx"
遇到问题 2:Jenkins GPG Key 错误
错误:
NO_PUBKEY 7198F4B714ABFC68
原因: 旧 key 过期。
检查:
bash
gpg --show-keys /usr/share/keyrings/jenkins-keyring.asc
确认 key ID:7198F4B714ABFC68
解决:重新导入新 key。
4.2 安装 Jenkins
bash
sudo apt update
sudo apt install jenkins
启动:
bash
sudo systemctl enable jenkins
sudo systemctl start jenkins
查看状态:
bash
systemctl status jenkins
5. Jenkins 初始化
访问地址:
http://192.168.205.144:8080
创建管理员账号:
| 字段 | 值 |
|---|---|
| 用户名 | admin |
| 密码 | 123456 |
6. Jenkins 插件安装
需要安装的插件
| 插件 | 作用 |
|---|---|
| Git Plugin | 从 Gitee 拉取代码 |
| Pipeline | 流水线任务 |
| Pipeline Stage View | 流水线可视化 |
| Credentials Binding | 凭据管理 |
| Docker Pipeline | Docker 构建 |
| SSH Agent Plugin | SSH 远程执行 |
遇到问题 3:sshagent 不存在
Pipeline 报错:
No such DSL method 'sshagent'
原因: 缺少 SSH Agent Plugin。
注意: 不要安装 SSH Build Agents Plugin,两者区别:
| 插件 | 作用 |
|---|---|
| SSH Agent Plugin | Pipeline 中调用 sshagent |
| SSH Build Agents Plugin | 创建 Jenkins 远程构建节点 |
本项目需要:SSH Agent Plugin
7. Maven 环境配置
7.1 安装 Maven 3.9.9
安装目录:/opt/maven
验证:
bash
/opt/maven/bin/mvn -version
结果:
Apache Maven 3.9.9
Java version: 21.0.7
7.2 Jenkins 用户测试
Jenkins 执行用户:jenkins
测试:
bash
sudo -u jenkins /opt/maven/bin/mvn -version
遇到问题 4:jenkins 找不到 mvn
错误:
bash
sudo -u jenkins mvn -version
结果:
sudo: mvn: command not found
原因: jenkins 用户的 PATH 环境变量没有包含 /opt/maven/bin。
解决: 创建软链接:
bash
sudo ln -s /opt/maven/bin/mvn /usr/local/bin/mvn
验证:
bash
sudo -u jenkins mvn -version
8. Docker 权限配置
8.1 Jenkins 访问 Docker
测试:
bash
sudo -u jenkins docker version
错误:
permission denied
/var/run/docker.sock
解决: 将 jenkins 用户加入 docker 组:
bash
sudo usermod -aG docker jenkins
重启 Jenkins:
bash
sudo systemctl restart jenkins
验证:
bash
sudo -u jenkins docker ps
9. Harbor 认证配置
| 字段 | 值 |
|---|---|
| Harbor 地址 | 192.168.205.146 |
| 协议 | HTTP |
| 账号 | admin |
| 密码 | 123456 |
遇到问题 5:Docker 默认 HTTPS 访问 Harbor
错误:
Get https://192.168.205.146/v2/
443 connection refused
原因: Docker 默认使用 HTTPS 连接仓库,但 Harbor 使用 HTTP。
解决: 在 devops 节点编辑 Docker 配置:
bash
sudo vim /etc/docker/daemon.json
增加:
json
{
"insecure-registries": ["192.168.205.146"]
}
重启 Docker:
bash
sudo systemctl restart docker
验证 Jenkins 用户登录:
bash
sudo -u jenkins docker login 192.168.205.146
成功输出:
Login Succeeded
10. Kubernetes SSH 配置
Jenkins 需要通过 SSH 在 k8s-master 上执行 kubectl rollout。
| 字段 | 值 |
|---|---|
| 目标主机 | 192.168.205.141 |
| 主机名 | k8s-master |
| 操作用户 | master |
测试 SSH 连接:
bash
sudo -u jenkins ssh master@192.168.205.141
成功输出:
Welcome to Ubuntu
master@k8s-master
11. Jenkins Credential 配置
Gitee 凭据
| 字段 | 值 |
|---|---|
| 类型 | Username with password |
| Username | Gitee 用户名 |
| Password | Gitee Token |
| ID | gitee-auth |
Harbor 凭据
| 字段 | 值 |
|---|---|
| 类型 | Username with password |
| ID | harbor-auth |
| 用户名 | admin |
| 密码 | 123456 |
Kubernetes SSH 凭据
| 字段 | 值 |
|---|---|
| 类型 | SSH Username with private key |
| ID | k8s-master-ssh |
12. Jenkins Pipeline 创建
| 字段 | 值 |
|---|---|
| 任务名称 | devops-demo-pipeline |
| 类型 | 流水线 |
| Pipeline 来源 | Pipeline script from SCM |
| SCM | Git |
| 仓库地址 | Gitee devops-demo 仓库 |
| Script Path | Jenkinsfile |
13. Jenkinsfile
项目根目录下创建 Jenkinsfile,内容如下:
groovy
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Maven Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Docker Build & Push') {
steps {
withCredentials([usernamePassword(
credentialsId: 'harbor-auth',
usernameVariable: 'HARBOR_USER',
passwordVariable: 'HARBOR_PASS'
)]) {
sh """
docker login 192.168.205.146 \\
-u ${HARBOR_USER} \\
-p ${HARBOR_PASS}
docker build -t 192.168.205.146/devops/devops-demo:latest .
docker push 192.168.205.146/devops/devops-demo:latest
"""
}
}
}
stage('Deploy to Kubernetes') {
steps {
sshagent(['k8s-master-ssh']) {
sh '''
ssh -o StrictHostKeyChecking=no master@192.168.205.141 << 'EOF'
kubectl set image deployment/devops-demo \
devops-demo=192.168.205.146/devops/devops-demo:latest
kubectl rollout status deployment/devops-demo
EOF
'''
}
}
}
}
}
14. Pipeline 第一次运行问题
问题:No such DSL method sshagent
错误:
No such DSL method sshagent
原因: 未安装 SSH Agent Plugin。
解决: 安装 SSH Agent Plugin 后重新构建。
15. CI/CD 成功验证
Harbor 镜像仓库
登录 Harbor Web 界面,可以看到:
devops/devops-demo
Tag: 1
Tag: 2
Kubernetes 部署
查看 Pod:
bash
kubectl get pods -o wide
结果:
devops-demo-xxxxx Running k8s-node1
devops-demo-yyyyy Running k8s-node2
查看镜像版本:
bash
kubectl describe deployment devops-demo | grep Image
结果:
Image: 192.168.205.146/devops/devops-demo:2
说明: Jenkins 成功发布新版本到 Kubernetes 集群。
16. 自动触发配置
Webhook 方案(失败)
原因: Gitee 无法访问 192.168.205.144。
错误:
URL invalid
原因分析: 192.168.x.x 属于内网地址,Gitee 公网服务无法访问。
17. 使用 Poll SCM 自动触发
配置路径:
任务 → 配置 → 构建触发器 → 轮询 SCM
配置内容:
*/1 * * * *
含义:每分钟检查一次代码是否有变化。
测试自动触发
bash
git add .
git commit -m "test poll scm"
git push
结果:Jenkins 自动产生 Build #3。
阶段 7 最终成果
完成状态
| 项目 | 状态 |
|---|---|
| Jenkins CI/CD | ✓ |
| Gitee 代码管理 | ✓ |
| Maven 自动构建 | ✓ |
| Docker 自动构建 | ✓ |
| Harbor 镜像管理 | ✓ |
| Kubernetes 自动发布 | ✓ |
| 自动触发 Pipeline | ✓ |
自动化流程
git push
↓
Jenkins 自动检测(Poll SCM)
↓
Maven Build
↓
Docker Build & Push to Harbor
↓
SSH to k8s-master
↓
kubectl rollout
↓
Spring Boot 应用更新
下一阶段
阶段 8:ELK 日志平台
目标架构:
Spring Boot
│
▼
Filebeat
│
▼
Logstash
│
▼
Elasticsearch
│
▼
Kibana
附录:本阶段遇到的问题汇总
| 序号 | 问题 | 原因 | 解决 |
|---|---|---|---|
| 1 | apt 权限错误 | 普通用户无法写入 /etc |
使用 sudo bash -c |
| 2 | GPG Key 错误 | 旧 key 过期 | 重新导入新 key |
| 3 | sshagent 不存在 | 缺少 SSH Agent Plugin | 安装正确插件 |
| 4 | jenkins 找不到 mvn | PATH 环境变量未配置 | 创建软链接到 /usr/local/bin |
| 5 | Docker HTTPS 访问 Harbor | Docker 默认 HTTPS | 配置 insecure-registries |