当前位置: 首页 > news >正文

CI/CD 流水线

CI/CD 流水线

  • CI 与 CD 的边界
    • CI 持续集成
    • CD(持续交付/持续部署)
    • 自动化流程示例:
  • Jenkins 引入到 CI/CD 流程
    • 在本地或服务器上安装 Jenkins。
    • 配置 Jenkins 环境
    • 流程设计
      • CI 阶段:Jenkins 流水线实现
      • CD 阶段:Jenkins 流水线实现
      • 完整流程概述
  • 发版
    • 发版的内容
    • 发版的过程
    • 发版的类型
    • 发版与版本号
    • 发版的目的

CI(Continuous Integration,持续集成)
CD(Continuous Delivery 或 Continuous Deployment,持续交付或持续部署)

在这里插入图片描述

CI 与 CD 的边界

CI:从代码提交到 Docker 镜像推送至 Docker Hub。
CD:从 Kubernetes 拉取镜像到应用运行及服务暴露

示例:

  • CI: 通过mvn 创建spring boot 项目,创建java类,通过dockerfile构建镜像至docker hub
  • CD: 在k8s拉取dockerhub镜像,运行应用程序,创建server进行端口映射,创建ingress暴露服务

CI 持续集成

CI 主要关注代码的开发、构建和质量保证,最终目标是生成一个稳定的可交付产物(如 Docker 镜像)

通过 Maven 创建 Spring Boot 项目

  • 初始化项目结构,编写代码逻辑。
  • 提交代码到版本控制系统(如 Git)

创建 Java 类

  • 开发新功能或修复问题,更新代码库。

通过 Dockerfile 构建镜像

  • 使用 Maven 构建项目 (mvn clean package) 并生成 JAR 文件。
  • 使用 Dockerfile 将 JAR 文件打包成 Docker 镜像。

推送镜像至 Docker Hub

使用 CI 工具(如 Jenkins、GitLab CI/CD)实现自动化:

  • 代码提交后触发流水线。
  • 运行测试(单元测试、集成测试)。
  • 构建并生成 Docker 镜像。
  • 将镜像推送至 Docker Hub 或其他镜像仓库。

CD(持续交付/持续部署)

CD 主要关注如何将 CI 生成的镜像部署到实际运行环境(如 Kubernetes 集群),并确保服务的正常暴露。

在 Kubernetes 上拉取 Docker Hub 镜像

  • 使用 Kubernetes Deployment 清单(YAML 文件)描述应用程序的镜像和资源需求。
  • 从 Docker Hub 拉取生成的镜像,创建容器实例。
  • 运行应用程序

通过 Kubernetes Deployment 控制器管理应用程序的副本(Pod)。

  • 创建 Service 并进行端口映射

定义 Kubernetes Service(如 ClusterIP、NodePort 或 LoadBalancer),将应用的内部端口映射到集群外部。

  • 创建 Ingress 暴露服务

定义 Ingress 资源,提供 HTTP(S) 路由规则,将外部流量路由到 Service。

  • 配置域名和证书(可选,支持 HTTPS)。

自动化流程示例:

CI 流程

  1. 开发者提交代码至 Git 仓库(触发 CI 流水线)。
  2. CI 工具执行以下步骤:
    拉取代码。
    使用 mvn clean package 构建项目。
    构建 Docker 镜像(基于 Dockerfile)。
    运行测试以验证代码和镜像质量。
    将镜像推送至 Docker Hub。

CD 流程

  1. 部署工具(如 ArgoCD、FluxCD 或 Jenkins)监听到新镜像的更新。
  2. 执行以下步骤:
    拉取新的 Docker 镜像到 Kubernetes 集群。
    创建/更新 Deployment,将镜像部署到 Pod 中。
    配置 Service 以进行端口映射。
    创建 Ingress 暴露服务,为用户提供访问入口。

Jenkins 引入到 CI/CD 流程

通过 Jenkins 的 CI/CD 流水线,整个开发到部署的流程自动化,减少人工干预,提高交付效率和可靠性。

基于Jenkins+K8S+harbor+git等技术链助力DevOps在企业落地实践

在这里插入图片描述

在本地或服务器上安装 Jenkins。

确保安装了必要的插件:

Pipeline(支持声明式流水线)。
Docker(支持 Docker 构建)。
Kubernetes CLI(支持 kubectl 命令)。
Git(拉取代码)。
Maven Integration(构建 Spring Boot 项目)

配置 Jenkins 环境

  • 配置全局工具:
    安装 JDK 和 Maven。
    配置 Docker 和 kubectl 的路径。
  • 添加 Jenkins 凭据:
    Docker Hub 凭据(用于推送镜像)。
    Kubernetes 集群凭据(用于 CD 部署)。

流程设计

CI 阶段:Jenkins 流水线实现
CI 的目标是构建、测试和将 Docker 镜像推送到 Docker Hub

CI 阶段:Jenkins 流水线实现

Jenkinsfile for CI
在项目根目录创建一个 Jenkinsfile,内容如下

pipeline {agent {docker { image 'maven:3.8.7-openjdk-17' } // 使用 Maven 镜像}environment {DOCKER_HUB_CREDENTIALS = credentials('docker-hub-id') // Docker Hub 凭据DOCKER_IMAGE = 'your-docker-hub-repo/spring-boot-app'}stages {stage('Checkout Code') {steps {checkout scm}}stage('Build and Test') {steps {sh 'mvn clean package'}}stage('Build Docker Image') {steps {sh 'docker build -t ${DOCKER_IMAGE}:latest .'}}stage('Push Docker Image') {steps {withDockerRegistry([credentialsId: 'docker-hub-id', url: '']) {sh 'docker push ${DOCKER_IMAGE}:latest'}}}}
}

Jenkins 配置

  • 在 Jenkins 上创建一个 Pipeline Job,链接到代码仓库(如 GitHub)。
  • Jenkins 会自动执行流水线,完成代码构建、测试、镜像打包与推送。

CD 阶段:Jenkins 流水线实现

CD 的目标是将 Docker 镜像拉取到 Kubernetes 中,并完成部署。
创建 Kubernetes 配置文件

  • deployment.yaml(用于部署镜像到 Kubernetes 集群):
apiVersion: apps/v1
kind: Deployment
metadata:name: spring-boot-app
spec:replicas: 2selector:matchLabels:app: spring-boot-apptemplate:metadata:labels:app: spring-boot-appspec:containers:- name: spring-boot-appimage: your-docker-hub-repo/spring-boot-app:latestports:- containerPort: 8080
  • service.yaml(用于暴露服务端口):
apiVersion: v1
kind: Service
metadata:name: spring-boot-service
spec:type: NodePortports:- port: 8080targetPort: 8080nodePort: 30001selector:app: spring-boot-app
  • ingress.yaml(用于 Ingress 暴露服务):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: spring-boot-ingress
spec:rules:- host: springboot.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: spring-boot-serviceport:number: 8080

Jenkinsfile for CD 在项目根目录扩展 Jenkinsfile 或创建新的 Pipeline Job:

pipeline {agent anyenvironment {KUBECONFIG_CREDENTIALS = credentials('k8s-config-id') // Kubernetes 配置凭据}stages {stage('Deploy to Kubernetes') {steps {withKubeConfig([credentialsId: 'k8s-config-id']) {sh 'kubectl apply -f deployment.yaml'sh 'kubectl apply -f service.yaml'sh 'kubectl apply -f ingress.yaml'}}}}
}

Jenkins 配置

  • 创建新的 Pipeline Job,配置为自动触发(如监控 Docker Hub 镜像更新)。
  • Jenkins 执行流水线,完成镜像拉取和 Kubernetes 部署。

完整流程概述

CI 阶段
提交代码到 Git 仓库后,触发 CI。
Jenkins 构建 Spring Boot 项目,生成 Docker 镜像,并推送至 Docker Hub。

CD 阶段
Jenkins 检测到新镜像(或手动触发),执行 Kubernetes 部署。
创建 Deployment、Service 和 Ingress 资源,将应用运行在 Kubernetes 集群中。

发版

发版是软件开发和运维过程中常见的术语,指的是将开发完成的功能、修复或改动版本发布给用户或部署到生产环境的过程。它是软件开发生命周期中的一个重要阶段。

发版的内容

发版通常包含以下内容:

  • 新功能: 提供给用户的新特性或增强功能。
  • Bug 修复: 修复已知问题或漏洞。
  • 性能优化: 提高软件运行效率或资源利用率。
  • 版本升级: 依赖库、框架或工具的版本更新。
  • 配置更新: 改动配置项以适应新的需求或部署环境。

发版的过程

发版通常包括以下几个步骤:

  1. 开发和测试
    开发团队完成代码开发。
    测试团队进行功能测试、回归测试、性能测试等,确保版本质量。
  2. 打包和构建
    使用构建工具(如 Maven、Gradle)将代码打包。
    可能会生成可执行文件、Docker 镜像或其他可交付产物。
  3. 版本管理
    确定发版版本号(如 v1.0.0)。
    提交对应的版本标签到版本控制系统(如 Git 标签)。
  4. 部署
    将构建好的版本部署到生产或预生产环境。
    可以通过 CI/CD 流水线实现自动化部署。
  5. 通知和发布
    发布版本公告,包括新增功能说明、修复内容和已知问题。
    通知用户或相关方新版本已上线。
  6. 监控和验证
    部署后监控系统运行状况,确保应用正常运行。
    根据用户反馈修复问题(如果有)。

发版的类型

根据影响范围和目标环境,发版可以分为以下几种类型:

  • 测试环境发版: 部署到测试环境,用于测试功能是否符合预期。
  • 预生产环境发版: 部署到与生产环境一致的预生产环境,用于模拟真实场景验证。
  • 生产环境发版: 正式发布到用户可访问的生产环境。
  • 灰度发布: 部分用户或节点先体验新版本,验证稳定性后逐步扩大范围。
  • 紧急发版: 修复重大问题或安全漏洞的快速发版,通常跳过部分流程。

发版与版本号

发版通常伴随版本号的更新,遵循 语义化版本号 的规则:

  • 主版本号(Major):重大更新或不兼容改动(如 1.0.0 -> 2.0.0)。
  • 次版本号(Minor):新增功能,向下兼容(如 1.0.0 -> 1.1.0)。
  • 修订版本号(Patch):Bug 修复或小的改进(如 1.0.0 -> 1.0.1)。

发版的目的

  • 将新功能或改进快速、安全地交付给用户。
  • 修复系统问题,保证用户体验和系统稳定性。
  • 保持软件版本的可管理性和一致性。

发版是一种规范化的软件发布过程,从开发完成到生产环境上线都需要经过严格的管理。它可以通过 CI/CD 工具自动化,并根据不同需求选择适合的发版策略(如灰度发布、蓝绿部署等)。

相关文章:

CI/CD 流水线

CI/CD 流水线 CI 与 CD 的边界CI 持续集成CD(持续交付/持续部署)自动化流程示例: Jenkins 引入到 CI/CD 流程在本地或服务器上安装 Jenkins。配置 Jenkins 环境流程设计CI 阶段:Jenkins 流水线实现CD 阶段:Jenkins 流水…...

【python3】 sqlite格式的db文件获得所有表和数据

【python3】 sqlite格式的db文件获得所有表和数据 1.背景2.代码3.解析1.背景 SQLite 格式的 .db 文件就是一个包含 SQLite 数据库的文件。 SQLite 格式的 .db 文件通常存储的是一个关系型数据库。 SQLite广泛用于应用程序、移动设备、浏览器等场景。它将整个数据库存储在一个文…...

【灵码助力安全3】——利用通义灵码辅助智能合约漏洞检测的尝试

前言 随着区块链技术的快速发展,智能合约作为去中心化应用(DApps)的核心组件,其重要性日益凸显。然而,智能合约的安全问题一直是制约区块链技术广泛应用的关键因素之一。由于智能合约代码一旦部署就难以更改&#xf…...

openEuler 22.04使用yum源最快速度部署k8s 1.20集群

本文目的 openEuler的官方源里有kubernetes 1.20,使用yum源安装是最快部署一个k8s集群的办法 硬件环境 主机名系统架构ipmasteropenEuler release 22.03 (LTS-SP2)arm192.168.3.11edgeopenEuler release 22.03 (LTS-SP2)arm192.168.3.12deviceopenEuler release 22.…...

Docker Compose 教程

Docker Compose 是一个 Docker 容器的依赖管理工具。 例如我们一个服务需要依赖到多个 Docker 容器,那么使用 Docker Compose 这个工具就能很方便的帮助我们管理。 Docker Compose 通过配置文件 .yml。 定义了所有容器的依赖关系。 然后我们只需把我们想要的 Docke…...

opencv的NLM去噪算法

NLM(Non-Local Means)去噪算法是一种基于图像块(patch)相似性的去噪方法。其基本原理是: 图像块相似性:算法首先定义了一个搜索窗口(search window),然后在该窗口内寻找…...

scala基础学习_方法函数

文章目录 方法与函数函数(又称函数值/匿名函数)定义方法注意 单参数函数多参数函数函数作为参数传递 方法将方法转换为函数方法的返回值总结 方法与函数 函数(又称函数值/匿名函数) 定义在任何地方:函数可以定义在类…...

Android车机DIY开发之软件篇(八)单独编译

Android车机DIY开发之软件篇(八)单独编译 1.CarLauncher单独编译 CarLauncher源码位于 packages/apps/Car/Launcher 用Eclipse ADT 谷歌定制版编译而成,.mk .bp编译 Android13目录如下: alientekalientek:~/packages/apps/Car$ ls Calendar …...

【Bug】报错信息:Required request body is missing(包含五种详细解决方案)

大家好,我是摇光~ 遇到“Required request body is missing”错误通常意味着服务器期望在HTTP请求中包含一个请求体(body),但是实际上并没有收到。 例如: 当你在使用网页或应用程序的后台(比如一个网站或手…...

Docker 专栏 —— Dockerfile 指令详解

文章目录 ADD 复制文件COPY 复制文件ARG 设置构建参数CMD 容器启动命令ENTRYPOINT ⼊⼝点ENV 设置环境变量EXPOSE 声明暴露的端⼝FROM 指定基础镜像LABEL 为镜像添加元数据MAINTAINER 指定维护者的信息RUN 执⾏命令USER 设置⽤户VOLUME 指定挂载点WORKDIR 指定⼯作⽬录 ADD 复制…...

Spring Boot 项目自定义加解密实现配置文件的加密

在Spring Boot项目中, 可以结合Jasypt 快速实现对配置文件中的部分属性进行加密。 完整的介绍参照: Spring Boot Jasypt 实现application.yml 属性加密的快速示例 但是作为一个技术强迫症,总是想着从底层开始实现属性的加解密,…...

在ubuntu下对NFS做性能测试

安装NFS 首先,安装服务 sudo apt update sudo apt install nfs-kernel-server然后创建共享文件夹 # 请自定义你自己的共享目录 sudo mkdir -p /exports/nfs4/homes sudo chmod -R 777 /exports/nfs4/homes# 这个可以根据no_root_squash标致选择设置。 # 如果不设…...

Spring-Cloud-Gateway-Samples,nacos为注册中心,负载均衡

背景:本想找个简单例子看下,无奈版本依赖太过复杂,花了点时间。记录下吧 使用Spring Cloud Gateway作为网关服务,Nacos作为注册中心,实现对子服务的负载均衡访问。简单例子。 一、gateway-main-nacos服务端&#xff…...

StarRocks Awards 2024 年度贡献人物

在过去一年,StarRocks 在 Lakehouse 与 AI 等关键领域取得了显著进步,其卓越的产品功能极大地简化和提升了数据分析的效率,使得"One Data,All Analytics" 的愿景变得更加触手可及。 虽然实现这一目标的道路充满挑战且漫…...

Autoencoder(李宏毅)机器学习 2023 Spring HW8 (Boss Baseline)

1. Autoencoder 简介 Autoencoder是一种用于学习数据高效压缩表示的人工神经网络。它由两个主要部分组成: Encoder 编码器将输入数据映射到一个更小的、低维空间中的压缩表示,这个空间通常称为latent space或bottleneck。 这一过程可以看作是数据压缩,去除冗余信息,仅保留…...

深入探索 ScottPlot.WPF:在 Windows 桌面应用中绘制精美图表的利器

一、ScottPlot.WPF 简介 ScottPlot.WPF 是基于 ScottPlot 绘图库专门为 Windows Presentation Foundation (WPF) 框架量身定制的强大绘图组件。它无缝集成到 WPF 应用程序中,为开发者提供了一种简洁、高效的方式来可视化数据,无论是科学研究中的实验数据展示、金融领域的行情…...

React中的useMemo 和 useEffect 哪个先执行?

在 React 组件的渲染过程中,useMemo 和 useEffect 的执行顺序是不同的。具体来说: useMemo 先执行:useMemo 是在 渲染阶段 执行的,它的作用是缓存计算结果,确保在渲染过程中可以直接使用缓存的值。 useEffect 后执行&…...

错误修改系列---基于RNN模型的心脏病预测(pytorch实现)

前言 前几天发布了pytorch实现,TensorFlow实现为:基于RNN模型的心脏病预测(tensorflow实现),但是一处繁琐地方 一处错误,这篇文章进行修改,修改效果还是好了不少;源文章为:基于RNN模型的心脏病…...

Table-Augmented Generation(TAG):Text2SQL与RAG的升级与超越

当下AI与数据库的融合已成为推动数据管理和分析领域发展的重要力量。传统的数据库查询方式,如结构化查询语言(SQL),要求用户具备专业的数据库知识,这无疑限制了非专业人士对数据的访问和利用。为了打破这一壁垒&#x…...

Stable Diffusion本地部署教程(附安装包)

想使用Stable Diffusion需要的环境有哪些呢? python3.10.11(至少也得3.10.6以上):依赖python环境NVIDIA:GPUgit:从github上下载包(可选,由于我已提供安装包,你可以不用git)Stable Diffusion安装包工具包: NVIDIA:https://developer.nvidia.com/cuda-toolkit-archiv…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...