CI/CD 流水线

news2025/1/12 0:48:34

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: 2
  selector:
    matchLabels:
      app: spring-boot-app
  template:
    metadata:
      labels:
        app: spring-boot-app
    spec:
      containers:
      - name: spring-boot-app
        image: your-docker-hub-repo/spring-boot-app:latest
        ports:
        - containerPort: 8080
  • service.yaml(用于暴露服务端口):
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-service
spec:
  type: NodePort
  ports:
 - port: 8080
    targetPort: 8080
    nodePort: 30001
  selector:
    app: spring-boot-app
  • ingress.yaml(用于 Ingress 暴露服务):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spring-boot-ingress
spec:
  rules:
  - host: springboot.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: spring-boot-service
            port:
              number: 8080

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

pipeline {
    agent any
    environment {
        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 工具自动化,并根据不同需求选择适合的发版策略(如灰度发布、蓝绿部署等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2275207.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS核心概念解析:从Node到Master,再到roslaunch的全面指南

Node 在ROS中,最小的进程单元就是节点(node)。一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点。 从程序角度来说,node就是一个可执行文件&…

深入Android架构(从线程到AIDL)_22 IPC的Proxy-Stub设计模式04

目录 5、 谁来写Proxy及Stub类呢? 如何考虑人的分工 IA接口知识取得的难题 在编程上,有什么技术可以实现这个方法? 范例 5、 谁来写Proxy及Stub类呢? -- 强龙提供AIDL工具,给地头蛇产出Proxy和Stub类 如何考虑人的分工 由框架开发者…

风水算命系统架构与功能分析

系统架构 服务端:Java(最低JDK1.8,支持JDK11以及JDK17)数据库:MySQL数据库(标配5.7版本,支持MySQL8)ORM框架:Mybatis(集成通用tk-mapper,支持myb…

551 灌溉

常规解法&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,k,t; const int N105; bool a[N][N],b[N][N]; int cnt; //设置滚动数组来存贮当前和下一状态的条件 //处理传播扩散问题非常有效int main() {cin>>n>>m>>t;for(int i1;i&l…

HDFS编程 - 使用HDFS Java API进行文件操作

文章目录 前言一、创建hdfs-demo项目1. 在idea上创建maven项目2. 导入hadoop相关依赖 二、常用 HDFS Java API1. 简介2. 获取文件系统实例3. 创建目录4. 创建文件4.1 创建文件并写入数据4.2 创建新空白文件 5. 查看文件内容6. 查看目录下的文件或目录信息6.1 查看指定目录下的文…

Java面试题~~

深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 关于深拷贝和浅拷贝区别&#xff0c;我这里先给结论&#xff1a; 浅拷贝&#xff1a;浅拷贝会在堆上创建一个新的对象&#xff08;区别于引用拷贝的一点&#xff09;&#xff0c;不过&#xff0c;如果原对象内部的属性是引用类型的…

el-table 自定义表头颜色

第一种方法&#xff1a;计算属性 <template><div><el-table:data"formData.detail"border stripehighlight-current-row:cell-style"{ text-align: center }":header-cell-style"headerCellStyle"><el-table-column fixed…

MySQL笔记大总结20250108

Day2 1.where (1)关系运算符 select * from info where id>1; select * from info where id1; select * from info where id>1; select * from info where id!1;(2)逻辑运算符 select * from info where name"吴佩奇" and age19; select * from info wh…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台&#xff0c;今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统&#xff0c;后端基于最新的.Net6和Asp.Net Core框架&#xff0c;遵循RESTFul接口规范&…

SEO内容优化:如何通过用户需求赢得搜索引擎青睐?

在谷歌SEO优化中&#xff0c;内容一直是最重要的因素之一。但要想让内容真正发挥作用&#xff0c;关键在于满足用户需求&#xff0c;而不是简单地堆砌关键词。谷歌的算法越来越智能化&#xff0c;更注重用户体验和内容的实用性。 了解目标用户的需求。通过工具如Google Trends…

Spring——自动装配

假设一个场景&#xff1a; 一个人&#xff08;Person&#xff09;有一条狗&#xff08;Dog&#xff09;和一只猫(Cat)&#xff0c;狗和猫都会叫&#xff0c;狗叫是“汪汪”&#xff0c;猫叫是“喵喵”&#xff0c;同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…

计算机网络(三)——局域网和广域网

一、局域网 特点&#xff1a;覆盖较小的地理范围&#xff1b;具有较低的时延和误码率&#xff1b;使用双绞线、同轴电缆、光纤传输&#xff0c;传输效率高&#xff1b;局域网内各节点之间采用以帧为单位的数据传输&#xff1b;支持单播、广播和多播&#xff08;单播指点对点通信…

错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中

一、问题 用maven对一个开源项目打包时&#xff0c;遇到了“错误的类文件: *** 类文件具有错误的版本 61.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。”&#xff1a; 二、原因 原因是当前java环境是Java 8&#xff08;版本52.0&#xff09;&#xff0c;但…

【大模型入门指南 07】量化技术浅析

【大模型入门指南】系列文章&#xff1a; 【大模型入门指南 01】深度学习入门【大模型入门指南 02】LLM大模型基础知识【大模型入门指南 03】提示词工程【大模型入门指南 04】Transformer结构【大模型入门指南 05】LLM技术选型【大模型入门指南 06】LLM数据预处理【大模型入门…

在线工具箱源码优化版

在线工具箱 前言效果图部分源码源码下载部署教程下期更新 前言 来自缤纷彩虹天地优化后的我爱工具网源码&#xff0c;百度基本全站收录&#xff0c;更能基本都比较全&#xff0c;个人使用或是建站都不错&#xff0c;挑过很多工具箱&#xff0c;这个比较简洁&#xff0c;非常实…

@LocalBuilder装饰器: 维持组件父子关系

一、前言 当开发者使用Builder做引用数据传递时&#xff0c;会考虑组件的父子关系&#xff0c;使用了bind(this)之后&#xff0c;组件的父子关系和状态管理的父子关系并不一致。为了解决组件的父子关系和状态管理的父子关系保持一致的问题&#xff0c;引入LocalBuilder装饰器。…

C 语言内存探秘:数据存储的字节密码

文章目录 一、数据在内存中的存储1、基本数据类型存储2、数组存储3、结构体存储1、基本存储规则2、举例说明3、查看结构体大小和成员偏移量的方法 二、大小端字节序三、字节序的判断 一、数据在内存中的存储 1、基本数据类型存储 整型&#xff1a;如int类型&#xff0c;通常在…

双因素身份验证技术在NPI区域邮件安全管控上的解决思路

在制造业中&#xff0c;NPI&#xff08;New Product Introduction&#xff0c;新产品导入&#xff09;区域是指专门负责新产品从概念到市场推出全过程的部门或团队。NPI 的目标是确保新产品能够高效、高质量地投入生产&#xff0c;并顺利满足市场需求。在支撑企业持续创新和竞争…

浙江安吉成新的分布式光伏发电项目应用

摘 要&#xff1a;分布式光伏发电站是指将光伏发电组件安装在用户的建筑物屋顶、空地或其他适合的场地上&#xff0c;利用太阳能进行发电的一种可再生能源利用方式&#xff0c;与传统的大型集中式光伏电站相比&#xff0c;分布式光伏发电具有更灵活的布局、更低的建设成本和更高…

更新Office后,LabVIEW 可执行程序生成失败

问题描述&#xff1a; 在计算机中&#xff0c;LabVIEW 开发的源程序运行正常&#xff0c;但在生成可执行程序时提示以下错误&#xff1a; ​ A VI broke during the build process from being saved without a block diagram. Either open the build specification to include…