Devops项目笔记阶段 7:Jenkins CI/CD 自动化部署

阶段 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
相关推荐
Z59981784142 分钟前
c#软件开发学习笔记--WPF(控件、样式)
笔记·学习·c#
KhalilRuan43 分钟前
秋招笔记——汇总
笔记
疯狂打码的少年1 小时前
【数据结构】复习日:树 + 图 + 排序(整理对比表)
数据结构·笔记·算法
苏子寒2 小时前
Nano-VLLM全代码解析笔记(2)-block_manager
人工智能·笔记·python·机器学习·nlp·vllm
心仪久了会沦陷2 小时前
数据结构入门系列——顺序表详解:概念、分类与动态实现
c语言·数据结构·经验分享·笔记·开源
存在morning2 小时前
【PySpark 学习笔记 六】性能优化:分区、Shuffle、缓存与数据倾斜
笔记·学习·性能优化
hongmai6668883 小时前
竖插专用:ESP8684-WROOM-07-H2X模组上手记录
笔记·单片机·嵌入式硬件·物联网·risc-v
是枚小菜鸡儿吖6 小时前
把视频教程变成可复习的笔记:Docker 部署 BiliNote,自动转写与总结
笔记·docker·容器
运维全栈笔记6 小时前
Vue + Spring Boot 前后端分离项目部署笔记(若依 RuoYi-Vue 3.9.2)
运维·服务器·vue.js·spring boot·笔记·开源·开源软件