11、架构:CI/CD 设计

news2024/11/24 3:18:45

本章内容是基于 DevOps 体系的精简版本,如果有阅读过之前 DevOps 小册的同学,可以快速掠过。

开局先放一张镇楼图,上图我在行云集团做的通用型 CI/CD 解决方案 ALL IN DOCKER,所有的操作构建与发布过程都在 Docker 中操作。

但很多公司和团队都有自己的基础设施和规范,包括使用不同的构建集成工具和仓库管理工具,比如使用 JenkinsDroneGitLab CIGithub Action 等等三方工具,不同的仓库管理工具如 GitLabGitHubGitee 等。

我们产品的需求开发中会涉及到私有化部署以及个性化定制,所以需要设计一个通用性的 CICD 方案,不能让用户有新的学习成本与额外的使用维护负担,同时我们的发布不仅仅只有前端资源还可以包含服务端。

所以基于 Docker 的通用型方案,依然是我推荐的首选之一。

在这个方案中,我们会尽可能的减少三方构建工具的使用。尽量降低学习与使用的成本,但是 Docker 相关的一些内容还是需要补充的。

一个通用型的 Devops 方案中,需要包含流程管理、持续构建、持续部署等

基于 GitFlow 的流程设计


GitFlow 的核心是通过在项目的不同阶段对 branch 的不同操作包括但不限于 createmargerebase 等来实现一个完整的高效率的工作流程。

  • Production: 这个分支包含最近发布到生产环境的代码,最近发布的 Release,并且只能从其他分支合并,不能在这个分支直接修改,一般将 Matser 作为 Production 分支;
  • Develop: 包含所有要发布到下一个 Release 的代码,这个主要合并于其他分支,比如 Feature 分支;
  • Feature:用来开发一个新的功能,一旦开发完成,合并回 Develop 分支,并进入下一个 Release
  • Release:当需要发布一个新 Release 的时候,基于 Develop 分支创建一个 Release 分支,完成 Release 后,合并到 Master 和 Develop 分支;
  • Hotfix: 当在线上环节发现新的 Bug 时候,需要创建一个 Hotfix 分支, 完成修复后,合并回 Master 和 Develop 分支,所以 Hotfix 的改动会进入下一个 Release

整体的分支管理流程如下图所示

通过服务端来控制整个 GitFlow 流程图如下所示:

服务端需要做的分支管理功能主要如下:

  1. 控制每个分支的版本号;
  2. 处理多分支集成发布的情况;
  3. 防止生产环节发布缺失功能;
  4. 锁定发布分支与发布环境,防止功能冲突。

基于 Docker 的 CICD


Docker 的优势

第一优势跨平台,由于 Docker 的镜像能够提供除了系统内核之外完成的运行环境,所以能在任何系统中都能提供一致的运行环境,这样就不需要考虑不同系统中间兼容性的问题,也就不存在虚拟机在各系统中间的配置不同的情况。

第二优势:就是借助于跨平台的特性,Docker 可以将很多配置复杂的服务端中间件打包成基础镜像提供给开发使用。这样无疑能够大大降低配置成本,开发只需要知道常规的 Docker 相关的命令或者直接运行提供的容器编排脚本就可以搭建出需要使用的服务端环境。同时公共的镜像仓库上已经有很多这种基础镜像,例如 MysqlRedisNode 等等,按需提取即可。

第三优势:这点对于运维同学比较好操作,Docker 能提供快速迁移以及配合 k8s,能够快速的伸缩副本,减少运维的工作成本与负担。

这里简单介绍一下 Docker 相关的内容,学起来其实比想象中简单很多,不用过于抵触,更多的 Docker 相关的细节请移步《工程化专栏》,里面会有比较多关于 Docker 方面的介绍,小册里面就不过多介绍了。

持续构建与部署

为了完成持续构建与部署的功能,我们需要设计一个通用性的构建镜像:

  1. 基础镜像:选择一个适合前端项目的基础镜像,例如 Alpine LinuxLinux 等;
  2. 安装必要的软件:在基础镜像上安装必要的软件,例如构建工具、依赖管理工具、图片服务、上传工具等;
  3. 添加缓存和代理:为了加速构建过程,可以添加缓存和代理。例如使用 npm 的缓存,以避免重复下载相同的软件包,以及借助 Docker 的文件联合系统架构,避免重复构建相同的层,提高构建效率;
  4. 清理冗余文件:构建完成后需要清理不必要的文件,以确保镜像的大小尽可能小。例如安装软件包时下载的缓存文件、日志文件、临时文件等等。

在通用性的构建镜像之上,我们还需要针对各个不同的体系定制不同的业务构建镜像提供给不同的业务使用,所以在设计构建触发的时候需要有使用不同镜像构建的功能。

具体的 Dockerfile 脚本以及其他设计的内容都会放在对应的实战篇进行详细解说。

基于 NestJS 的任务队列与调度

文章最开始的时候提过到了,在这套方案里面我们会尽可能的减少对于三方工具的依赖,在之前的 ALL IN DOCKER 的方案中,是借助了 Jenkins 的任务队列来下发各个构建任务。

当我们不再依赖于 Jenkins 的时候就需要自己来开发任务队列的模块了。

  • 任务队列

bull 是一个基于 Redis 的高性能队列库,用于实现队列功能。@nestjs/bull 是 NestJS 对 bull 的封装,提供了更加便捷的使用方式。

可以使用 @nestjs/bull 中的 @InjectQueue 装饰器来注入队列服务。如下所示:

import { Injectable } from '@nestjs/common';
import { InjectQueue } from '@nestjs/bull';
import { Queue } from 'bull';

@Injectable()
export class EventQueue {
  constructor(@InjectQueue('event') private readonly queue: Queue) {}

  async addJob(jobData: any) {
    await this.queue.add(jobData);
  }

  async processJob(jobHandler: (jobData: any) => void) {
    this.queue.process(async (job) => {
      jobHandler(job.data);
    });
  }

  async getJobCounts() {
    const counts = await this.queue.getJobCounts();
    return {
      waiting: counts.waiting || 0,
      active: counts.active || 0,
      completed: counts.completed || 0,
      failed: counts.failed || 0,
    };
  }
}
  • 任务调度

在低代码产品中我们需要提供定时发布、上下架的功能,而 NestJS 也提供了这样的能力 NestJS Schedule

  1. 创建任务调度器:可以使用 NestJS Schedule 中的 @Cron 装饰器来定义一个任务调度器。如下代码所示,创建了一个每分钟调用一次的任务调度器:
import { Injectable } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';

@Injectable()
export class TaskScheduler {
  @Cron(CronExpression.EVERY_MINUTE)
  handleCron() {
    console.log('Called every minute');
  }
}
  1. 注册任务调度器:使用任务调度器,需要使用 ScheduleModule.forRoot() 方法注册 NestJS Schedule 模块:
import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';
import { TaskScheduler } from './schedulers/task.scheduler';

@Module({
  imports: [ScheduleModule.forRoot()],
  providers: [TaskScheduler],
})
export class AppModule {}

在上述的代码中,我们在 providers 数组中添加了 TaskScheduler,并在 imports 数组中注册了 NestJS Schedule 模块。

这里的具体设计细节后续会在对应的服务端开发中展开讲解,因为是设计篇,所以不想放一些示例的内容,这样没有上下文联系,学起来会比较分散。

写在最后


本章主要是介绍了 CI/CD 相关的设计,无论是工程化的专栏还是 Devops 的小册,都对相关的设计做了很多的介绍,所以本章的内容就不做过多介绍,感兴趣的同学可以多看一下,拓展一下相关的知识体系。

但与之前不同的是,这次我们并不打算借助三方工具来减少成本,而是全部自己开发来减少用户的学习与使用成本。

如果你有什么疑问或者更好的建议,欢迎在评论区提出。 👏

11 架构:CI/CD 设计

后续有空的话,会在工程化的专栏里面继续添加一些 Docker 相关的内容,可以随手关注于一下。

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

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

相关文章

java进阶3:GC 的背景与一般原理

目录 为什么会有GC 背景: 理解: 可达性分析算法 基本思路: 标记清除算法 ​讲解 一 点睛 二 执行过程 三 什么是清除 四 缺点 STW 对象与分代 GC时对象在内存池中的迁移 GC Roots 总结 默认算法 标记-清除算法(…

OpenCV创建一张类型为CV_8UC4的4通道图像

#include <iostream> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp>int m

Openlayers实战:自定义版权属性信息

Openlayers地图中,通常会展示地图的一个版权信息,这里面涉及到地图层的版权信息内容,还涉及到control中的Attribution的设置,本实战示例中,通过灵活的属性配置,显示了还是大剑师兰特的博客版权信息,点击是可以跳转的。 效果图 源代码 /* * @Author: 大剑师兰特(xiaoz…

【新版系统架构】第十二章-信息系统架构设计理论和实践

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 第一章-绪论第二章-计算机系统基础知识&#xff08;一&#xff09;第二章-计算机系统基础知识&#xff08;二&#xff09;第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

2023年SCI影响因子(JCR2022)正式公布

2023年6月28日&#xff0c;Clarivate Analytics&#xff08;科睿唯安&#xff09;发布最新的《期刊引证报告》&#xff08;Journal Citation Reports&#xff0c;简称JCR&#xff09;&#xff0c;刷新SCI期刊2022年影响因子(IF)。该指数也备受访问学者、联培博士及博士后研究者…

Centos7安装编译ffmpeg到指定目录

1、官网下载tar包 https://ffmpeg.org/download.html 2、解压usr/local目录 3、编译准备 cd ffmpeg-6.0 # 切换到ffmpeg-6.0目录 yum install gcc # 安装gcc编译器 yum install yasm # 安装yasm编译器 4、安装设置 ./configure --enable-shared --prefix/usr/local/ffmp…

AI 对抗超级细菌:麦克马斯特大学利用深度学习发现新型抗生素 abaucin

内容一览&#xff1a;鲍曼不动杆菌是一种常见的医院获得性革兰氏阴性病原体&#xff0c;通常表现出多重耐药性。利用传统方法&#xff0c;发现抑制此菌的新型抗生素很困难。但利用机器学习可以快速探索化学空间&#xff0c;从而增加发现新型抗菌分子的可能性。近期&#xff0c;…

基于STM32智能窗帘控制系统仿真设计(含源程序+proteus仿真+讲解视频)

# 基于STM32智能窗帘设计&#xff08;含源程序proteus仿真&#xff09; 仿真&#xff1a;proteus8.11 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 编号C0007 资料下载链接 讲解视频 基于STM32的简易智能窗帘控制系统仿真设计 功能说明&#xff1a; 实现功能&a…

浅谈金融场景的风控策略

随着互联网垂直电商、消费金融等领域的快速崛起&#xff0c;用户及互联网、金融平台受到欺诈的风险也急剧增加。网络黑灰产已形成完整的、成熟的产业链&#xff0c;每年千亿级别的投入规模&#xff0c;超过1000万的“从业者”&#xff0c;其专业度也高于大多数技术人员&#xf…

innovus:earlyGlobalRoute与trial route

在innovus很早的版本里&#xff0c;比如早期encounter&#xff0c;earlyGlobalRoute还叫trial route&#xff0c;所以这二者没有本质区别&#xff0c;使用setRouteMode可以针对early global route的绕线层次等属性进行设置&#xff0c;除了对earlyGlobal Route命令有显性约束外…

小端机器上读取数值、字符串到寄存器的实现

目录 0. 问题 1. 对于从内存读取/写入的数据 2. 对于从常量直接写入寄存器 0. 问题 小端机器上&#xff0c;对于以下两条指令&#xff0c;实现如下&#xff1a; mov eax, 0x78FF5ABC //eax里存的是0x78FF5ABC mov ebx,WXYZ //ebx里存的是0x5a595857&#xff0c;对应于…

Ribbon源码分析(负载均衡源码)

Bean LoadBalanced //ribbon 的负载均衡注解public RestTemplate restTemplate() {return new RestTemplate(); }加了LoadBalanced //ribbon 的负载均衡注解的RestTemplate&#xff0c;是必须要走Ribbon 的流程&#xff08;见4.1&#xff09;的。接上文&#xff0c;如果想用原生…

通过ioctl函数选择不同硬件的控制,LED 蜂鸣器 马达 风扇

通过ioctl函数选择不同硬件的控制&#xff0c;LED 蜂鸣器 马达 风扇 实验现象 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{volatile unsigned int MODER; // 0x00volatile unsigned int OTYPER; // 0x04volatile unsigned int OSPEEDR; // 0x08volati…

【数学建模】 MATLAB 蚁群算法

蚁群算法 MATLAB–基于蚁群算法的机器人最短路径规划* https://blog.csdn.net/woai210shiyanshi/article/details/104712540?ops_request_misc%257B%2522request%255Fid%2522%253A%2522168853912916800215023827%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fa…

浅谈电动自行车充电桩智能监测系统的设计与应用

安科瑞 华楠 摘要&#xff1a;围绕基于物联网的电动自行车充电桩智能监测系统&#xff0c;介绍了该系统的软硬件组成、各部分之间的联系&#xff0c;以及该系统的工作原理、相应的设计技术&#xff0c;主要包括电动车充电桩的智能控制方法、充电桩与手机的通信方法&#xff0c…

免费远程控制/局网远控软件

亲测可用&#xff0c;永久免费。适用于局网远控。 一、Quasar 免费开源 二、Solarwinds Dameware Mini Remote Control 收费

小白开酒吧前要知道的几个知识(四)

第七、岗位分工 酒吧一定要分工明确&#xff0c;各司其职。每一个岗位都有着自己的职责&#xff0c;每一个环节都有所关联&#xff0c;每天上班前需要提前安排好各岗位的工作。团队需要一个规章制度&#xff0c;毕竟没有规矩不成方圆&#xff0c;建立岗位相关的工作制度以及责…

linux应用docker基本使用(一)

相关文章&#xff1a; linux docker安装及报错处理_做测试的喵酱的博客-CSDN博客 一、mac 安装及使用docker_docker mac_做测试的喵酱的博客-CSDN博客 Docker 容器使用 | 菜鸟教程 一、docker介绍 1.1 介绍 Docker 属于 Linux 容器的一种封装&#xff0c;提供简单易用的容…

LeetCode——两数相加

目录 一、两数相加 1、题目 2、题目解读 3、代码 二、反转链表 1、题目 2、题目解读 3、代码 三、两数相加 II 1、题目 2、题目解读 3、代码 反转链表再进行计算 借助栈 一、两数相加 1、题目 2. 两数相加 - 力扣&#xff08;Leetcode&#xff09; 给你两个 非…

linux入门之进程控制(上)进程创建,进程等待

目录 一、进程创建 1.fork函数 2.fork函数返回值 3.写时拷贝 4.fork常规用法 5.fork调用失败原因 二、进程终止 1.进程退出场景 2.进程常见退出方法 2.1_exit函数&#xff08;直接调用内核&#xff09; 2.2 exit函数 2.3return退出 三、进程等待 1.进程等待必要性…