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
相关推荐
sunoo-2297 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
听风若依8 小时前
数据在内存中的存储-纸面笔记整理
c语言·笔记
xiaominngtongxue8 小时前
从中职技能节看实训教学的组织逻辑
笔记
杨逢昌工厂6S管理8 小时前
109-杨逢昌车间管理负熵循环:三环体系持续输出负熵的机制解析
经验分享·笔记·职场和发展·学习方法
inferno9 小时前
SVN学习笔记(二)
笔记·学习·svn
海绵宝宝转agent9 小时前
leetCode100算法开源笔记分享
笔记·算法
91刘仁德10 小时前
Linux网络编程从入门到实战:UDP/TCP协议与socket编程全解析
linux·网络·笔记·tcp/ip·udp
@Mike@11 小时前
13-数据库学习笔记(查询执行处理模型)
数据库·笔记·学习
Go Work11 小时前
实体类字段用 @Value 赋了默认值,取出来还是 null?
经验分享·笔记
白杨尚青11 小时前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl