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

写得了代码,焊得了板!嵌入式开发工程师必修之代码管理方案(下)

目录

极狐GitLab嵌入式开发场景解决方案

3.1 高可用部署与灾备

3.2 组织管理

3.3 分支策略

3.4 分支保护

3.5 推送规则

3.6 代码评审

3.7 数据保护

3.8 其他相关


本文来自

武让 极狐GitLab 高级解决方案架构师

💡 前两篇文章,作者介绍了嵌入式开发场景之

  • 代码管理特点与诉求,代码管理工具与方式之 SVN 与 Git

  • 嵌入式开发场景的代码管理分仓、权限与依赖问题,以及基于 Git 的多仓管理

👆戳链接即可回顾前情。

本文进一步介绍极狐GitLab 针对嵌入式开发的解决方案。Enjoy~

极狐GitLab 嵌入式开发场景解决方案

围绕企业对于嵌入式开发场景的诉求,极狐GitLab 提供了一整套解决方案,可以较好解决嵌入式开发场景下的种种问题,重点包括以下几部分内容。

3.1 高可用部署与灾备

企业进行代码统一管理的前提是代码管理系统具备高可用、高性能以及容灾等特性,才能支撑企业安全可靠的管理代码数据资产。

极狐GitLab 专业版提供高可用部署方案,是松耦合分布式架构,各组件均为多副本部署,各组件均可实现横向扩展。

极狐GitLab 高可用架构通过横向扩展同时实现了高性能,针对从 1k 到 50k 用户数场景提供了不同的参考架构,满足不同用户规模的企业。

极狐GitLab 同时提供 GEO 主从架构部署方案,该方案为一主多从架构,主从节点配置不必完全一致,主节点提供读写服务,从节点提供只读服务,数据在主从节点之间实时同步,可实现:

  • 通过访问就近节点加速;

  • 负载分担;

  • 准实时备份;

  • 灾难恢复。

当主节点出现故障后可在几分钟内将从节点切换为主节点,恢复服务。

极狐GitLab GEO 在实现准高可用的同时,极大降低基础设施资源成本、部署和运维成本。

3.2 组织管理

极狐GitLab 通过群组、子群组嵌套关系实现对企业复杂组织关系的映射,嵌套最多支持 20 层,可以有效管理企业中的部门、组织、虚拟组织、项目。

代码库隶属于群组或子群组,可在任意群组、子群组对仓库和人员权限进行管理。

  • 对于需要总览整个群组的管理人员,可以将其在父群组上分配权限,该用户的权限将被继承到所有子群组和代码库中;

  • 对于需要查看部分内容的项目经理,可以将其在某个子群组上分配权限,该用户只可看到子群组下所有子子群组和代码库的数据;

  • 对于只专注于具体功能模块的开发人员,只需要将其在具体的代码库上分配权限即可,这样就实现了在分仓模式下的授权管理。

3.3 分支策略

前文提到,分支管理是 Git 的优势,分支策略也是体现 Git 高效协同的重要价值,此外分支策略直接决定了研发流程的标准化

从事嵌入式开发的企业进行 DevOps 转型,首先要考虑的就是分支策略怎么建立。以下是常见的几种分支模型,可供参考:

从极狐GitLab 自身实践的角度出发,我更倾向两种分支策略:

  • 上图是极狐GitLab 自己的分支策略,本身是属于版本分支 GitLab Flow,适合多人协同的大、中型项目。相较于Git Flow 裁剪了一些不必要的分支,降低复杂度;

  • 下图是对于小型项目推荐的极简分支策略,本身是属于 GitHub Flow,适合单人或者较少人员协同的小型项目。

需要注意的是,没有所谓的最佳分支策略,因为不同企业的研发流程不一样,即便是同一家企业的不同团队或者同一个团队在不同时期的研发流程也是不一样的,这时候就需要基于这些常见的分支策略总结和提炼一套属于自己的分支模型,并且对它持续进行检验和迭代。比如对于小型嵌入式项目,如果存在对不同的芯片或用户有定制版本,那么更建议基于 GitHub Flow,加入 Release 分支来管理不同的交付版本。

3.4 分支保护

当分支策略制定完成,如何保证开发人员遵循这套流程?那一定是需要工具层面有约束手段。

极狐GitLab 提供分支保护功能,可以限制开发人员直接向主分支提交代码,必须通过向 feature 分支或 dev 分支提交代码,再通过 Merge Requests 的方式合并到主分支,可以降低代码冲突,提高协同效率,同时也为开发团队践行代码评审提供了工具侧的落地支撑。

此外极狐GitLab 专业版实现了更加精细化的分支保护管理,可以对于指定的用户设置推送和合并权限,以此保证分支代码的可审核和可追溯性,免费版只能较粗粒度的指定某一类用户角色,如 Developer、Maintainer。

3.5 推送规则

代码规范也是 DevOps 转型非常关注的内容,以往粗放式的代码提交方式容易导致代码提交记录极度混乱、不可识别,比如大量 1111test1 之类的提交记录,不仅让协同人员无法接手、难以理解,甚至提交人自己也无法基于这些记录进行拉取或者回滚操作。

极狐GitLab 专业版提供的推送规则功能可以很好的解决这个问题,它可以实现:

  • 验证提交人是否是极狐GitLab 用户;

  • 自定义正则表达式,验证代码提交记录是否符合一定的规范;

  • 自定义正则表达式,验证分支名称是否符合一定的规范;

  • 自定义正则表达式,验证提交文件中是否有不符合规范的文件,比如 .zip、.tar 文件;

  • 验证提交的文件是否超过一定的大小。

推送规则验证不通过,则代码无法被推送到极狐GitLab 代码库中,从而确保研发人员严格按照规范进行代码提交。

规范代码提交信息可配合 Commitizen 工具,它可以按照一些行业内通用的提交规范引导开发人员填写提交信息;也可以配合 .gitignore 文件过滤一些不需要上传的文件或文件类型。它们都是在客户端发挥检查作用,本身不具备约束性质,开发人员可用可不用,而推送规则是在服务端进行验证,确保最终合规。

所以可以说 Commitizen、.gitignore 是源头检查,推送规则是尽头把关。两者可配合,但前者不可替代后者。

3.6 代码评审

由于嵌入式开发的周期相对较长,交付频率相对较慢,交付物多是固件,不具备互联网纯软件、高速迭代、灵活升级的特性,所以处理问题的成本也比较高,这也使得近些年从事嵌入式开发的企业对软件质量的要求逐渐提高,而提高软件质量最常用的方式就是进行代码评审

极狐GitLab 专业版提供了完善的代码评审机制,其中主要包括:

  • 支持强制代码评审,评审不通过不允许合并代码;

  • 支持自定义代码评审规则,针对不同分支设置不同评审人,以及最小核准人数;

  • 支持多重审批规则;

  • 支持当单元测试覆盖率降低时触发代码评审;

  • 支持阻止代码提交人、合并请求发起人进行评审;

  • 支持设置 Code Ower(代码负责人)为审批人。

其中 Code Owner 可以为代码库的不同目录、不同文件、不同文件后缀设置代码评审人,比如:

这就实现了对 Git 代码库的目录、文件进行写入控制,也解答了上文中遗留的问题。

3.7 数据保护

上文也提到了数据保护,代码防泄漏的相关问题,具体落实到系统层面,极狐GitLab 可以从事前、事中、事后三个方面提供支撑。其中最重要的是对极狐GitLab 的操作行为进行记录和分析,实现审计功能。

极狐GitLab专业版支持对创建仓库、修改密码、权限变更等系统事件进行审计,也支持对代码推拉事件进行审计,并可以事件流的方式传递给第三方日志系统,以便对数据进行分析和展示,也可以制定一些规则并触发告警或通知。

此外,在与第三方 DLP 工具对接的过程中,我们发现有些客户的 DLP 工具只能对 Git 客户端或 IDE 进行加密,而 GitLab 本身还可以通过在网页上直接打包下载的方式获取源码,这给客户的数据保护工作造成一些麻烦。所以极狐GitLab 为这个本土化需求增加了一项功能,可以在网页上禁用源代码下载,以便更好的解决数据保护问题。

3.8 其他相关

除了以上在源代码管理方面的优势外,极狐GitLab 还提供了一些其他的附加功能,比如:

  • 在工具方面,极狐GitLab 提供了 IDE 插件,可以更方便对极狐GitLab 中的项目、代码、流水线进行管理;提供了 WebIDE,可以在线对代码进行查看、对比、编辑操作。

  • 在项目管理方面,极狐GitLab 自身提供轻量的偏敏捷的项目管理功能,且可以和主流的项目管理工具如 Jira、禅道、PingCode 以及和传统制造行业常用的 PLM 系统 Windchill 进行集成和打通,实现在需求管理系统中查看该需求任务关联了哪些极狐GitLab 的代码提交和合并请求,实现项目到开发的流程关联与追溯。

  • 流水线是 DevOps 中的重要组成部分,也是研发效率提升的根本,极狐GitLab 提供了开箱即用的 CI/CD 功能,相较于Jenkins,极狐GitLab CI 依靠其一体化、轻量化、声明式、开箱即用的特性,在开发者群体中的使用率越来越高,在国内企业中仅次于 Jenkins 排在第二位。极狐GitLab 也为从事嵌入式开发的企业做完源代码统一管理后,进行更进一步的 DevOps 转型提供支撑和帮助。

最后,随着物联网、人工智能等技术的不断发展,嵌入式系统的应用场景将会更加广泛,这将会催生更多的 DevOps 应用场景,也会进一步推动 DevOps 在嵌入式开发场景中的落地,期待那一天早点来到。

参考:

  1. 关于版本控制 | git-scm.com

  2. 关于Git与SVN | techug.com

  3. Git与SVN对比 | 腾讯云开发者社区

  4. GitHub 将于明年停止支持 Subversion(SVN)| IT之家

  5. Introduction | Conan Tutorial

  6. Git submodule | Atlassian

  7. Git Subtree | Atlassian

  8. git-repo | Git at Google

  9. alibaba/git-repo-go | GitHub

  10. 极狐GitLab 文档中心

相关文章:

写得了代码,焊得了板!嵌入式开发工程师必修之代码管理方案(下)

目录 极狐GitLab嵌入式开发场景解决方案 3.1 高可用部署与灾备 3.2 组织管理 3.3 分支策略 3.4 分支保护 3.5 推送规则 3.6 代码评审 3.7 数据保护 3.8 其他相关 本文来自 武让 极狐GitLab 高级解决方案架构师 💡 前两篇文章,作者介绍了嵌入式开…...

Matlab论文插图绘制模板第110期—水平双向柱状图

在之前的文章中,分享了很多Matlab柱状图的绘制模板: 进一步,再来看一种特殊的柱状图:水平双向柱状图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行下…...

【广州华锐互动】VR全景工厂虚拟导览,虚拟现实技术提升企业数字化信息管理水平

随着工业4.0的到来,VR工厂全景制作成为了越来越多工业企业的选择。传统的工厂管理方式往往存在诸多问题,如信息不对称、安全隐患等。为了解决这些问题,VR工厂全景制作应运而生,它通过结合虚拟现实现实技术和数据采集技术&#xff…...

idea 创建mybatis xml文件时找不到

1、File >Settings 如图 &#xff1a; 2、添加模板&#xff1a;如下图 3、添加xml模板 如下图&#xff1a; 模板内容&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//E…...

Python钢筋混凝土结构计算.pdf-混凝土构件计算

计算原理&#xff1a; 代码实现&#xff1a; #钢筋混凝土参数 def c_hrb(): global fcuk,HRB,Ec,fc,ft,ftk,Es,fy,fyp,fyk global a1,epsilon_cu fcukEcfcftftk0.0 HRBEsfyfypfyk0.0 #矩形应力图系数a1&#xff0c;C50以下为1.0 a11.0 #正截面混凝土极限压应变epsilon_cu&#…...

mysql5.7-基于docker-compose搭建主从同步

一、环境信息 系统版本&#xff1a;CentOS Linux release 7.9.2009 (Core) cat /etc/centos-release Docker版本&#xff1a;Docker version 20.10.6, build 370c289 docker --version Docker-compose版本&#xff1a;Docker Compose version v2.10.2 docker-compose --versio…...

【USRP】调制解调系列5:16QAM、32QAM、64QAM、256QAM、1024QAM、基于labview的实现

QAM 正交振幅键控是一种将两种调幅信号&#xff08;2ASK和2PSK&#xff09;汇合到一个信道的方法&#xff0c;因此会双倍扩展有效带宽&#xff0c;正交调幅被用于脉冲调幅。正交调幅信号有两个相同频率的载波&#xff0c;但是相位相差90度&#xff08;四分之一周期&#xff0c…...

Odoo|5分钟创建自定义的业务系统唯一序列号

在业务操作中&#xff0c;经常会遇到需要生成全局唯一序列号数据的情况&#xff0c;比如订单号、报价单号等。为了确保数据的唯一性和准确性&#xff0c;通常我们会使用Redis或其他分布式锁机制来实现。然而&#xff0c;很多人可能不知道&#xff0c;odoo框架本身提供了一个原生…...

mysql索引为什么提高查询速度(底层原理)

一、索引原理图 二、索引数据存储到硬盘而不是内存&#xff1f; 硬盘内存 成本低成本高 容量大容量小 读写速度一般读取速度快 断电后数据永久存储断电后数据清空 三、硬盘数据为什么要读取到内存&#xff1f;为啥不直接…...

算法通关村——位运算在查找重复元素中的妙用

用4KB内存寻找重复元素 给定一个数组&#xff0c;包含从1到N的整数&#xff0c;N最大为32000&#xff0c;数组可能还有重复值&#xff0c;且N的取值不定&#xff0c;若只有4KB的内存可用&#xff0c;该如何打印数组中所有重复元素。 如果不要求使用4KB&#xff0c;最简单就是…...

使用环境中的视觉地标和扩展卡尔曼滤波器定位移动机器人研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【python基础知识】5.for循环和while循环

文章目录 前言for...in...循环语句for循环&#xff1a;空房间for循环&#xff1a;一群排队办业务的人range()函数for循环&#xff1a;办事流程 while循环while循环&#xff1a;放行条件while循环&#xff1a;办事流程 两种循环对比 前言 上一关&#xff0c;我们学习了两种新的…...

STM32CUBEMX_创建时间片轮询架构的软件框架

STM32CUBEMX_创建时间片轮询架构的软件框架 说明&#xff1a; 1、这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉 2、利用这种时间片的架构可以使得代码架构清晰易于维护 创建步骤&#xff1a; 1、使用STM32CUBEMX创建基础工程 2、新建用户代码目录 3、构建基础的代码框…...

vue 插槽Slots

vue插槽官网 <button class"fancy-btn"><slot></slot> <!-- 插槽出口 --> </button><slot> 元素是一个插槽出口 (slot outlet)&#xff0c;标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。 // 定义一个Child.vue…...

论文阅读《Nougat:Neural Optical Understanding for Academic Documents》

摘要 科学知识主要存储在书籍和科学期刊中&#xff0c;通常以PDF的形式。然而PDF格式会导致语义信息的损失&#xff0c;特别是对于数学表达式。我们提出了Nougat&#xff0c;这是一种视觉transformer模型&#xff0c;它执行OCR任务&#xff0c;用于将科学文档处理成标记语言&a…...

较难的换根dp:P6213 「SWTR-04」Collecting Coins

传送门 前题提要:感觉这道换根dp可以说是集中了换根dp的所有较高难度的操作和思想,以及较高的一些实现细节,可以说能够完全写出这道题才叫真正理解了换根dp,非常值得一做. 首先读完题意,不难发现这道题有很多限制.点的访问次数限制,必须访问某一个点,想要获得最大的贡献,没有…...

Springboot - 15.二级分布式缓存集成-Caffeine

&#x1f440;中文文档 Caffeine &#x1f440;使用Caffeine &#xff08;本地缓存&#xff09; 当与Spring Boot结合使用时&#xff0c;Caffeine提供了一个直观且功能强大的二级缓存解决方案。Spring Boot的缓存抽象使得整合Caffeine变得相当简单。以下是如何在Spring Boot…...

二叉树的介绍及二叉树的链式结构的实现(C语言版)

前言 二叉树是一种特殊的树&#xff0c;它最大的度为2&#xff0c;每个节点至多只有两个子树。它是一种基础的数据结构&#xff0c;后面很多重要的数据结构都是依靠它来进行实现的。了解并且掌握它是很重要的。 目录 1.二叉树的介绍 1.1概念 1.2现实中的二叉树 1.3特殊的二叉…...

不同写法的性能差异

“ 达到相同目的,可以有多种写法,每种写法有性能、可读性方面的区别,本文旨在探讨不同写法之间的性能差异 len(str) vs str "" 本部分参考自: [问个 Go 问题&#xff0c;字符串 len 0 和 字符串 "" &#xff0c;有啥区别&#xff1f;](https://segmentf…...

Bytebase 2.7.0 - ​新增分支(Branching)功能

&#x1f680; 新功能 新增支持与 Git 类似的分支&#xff08;Branching&#xff09;功能来管理 schema 变更。支持搜索所有历史工单。支持导出审计日志。 &#x1f384; 改进 变更数据库工单详情页面全新改版。优化工单搜索体验。SQL 审核规则支持针对不同数据库进行独立配…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...