写得了代码,焊得了板!嵌入式开发工程师必修之代码管理方案(下)
目录
极狐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 转型非常关注的内容,以往粗放式的代码提交方式容易导致代码提交记录极度混乱、不可识别,比如大量 1111
、test1
之类的提交记录,不仅让协同人员无法接手、难以理解,甚至提交人自己也无法基于这些记录进行拉取或者回滚操作。
极狐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 在嵌入式开发场景中的落地,期待那一天早点来到。
参考:
-
关于版本控制 | git-scm.com
-
关于Git与SVN | techug.com
-
Git与SVN对比 | 腾讯云开发者社区
-
GitHub 将于明年停止支持 Subversion(SVN)| IT之家
-
Introduction | Conan Tutorial
-
Git submodule | Atlassian
-
Git Subtree | Atlassian
-
git-repo | Git at Google
-
alibaba/git-repo-go | GitHub
-
极狐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工厂全景制作应运而生,它通过结合虚拟现实现实技术和数据采集技术ÿ…...

idea 创建mybatis xml文件时找不到
1、File >Settings 如图 : 2、添加模板:如下图 3、添加xml模板 如下图: 模板内容: <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//E…...

Python钢筋混凝土结构计算.pdf-混凝土构件计算
计算原理: 代码实现: #钢筋混凝土参数 def c_hrb(): global fcuk,HRB,Ec,fc,ft,ftk,Es,fy,fyp,fyk global a1,epsilon_cu fcukEcfcftftk0.0 HRBEsfyfypfyk0.0 #矩形应力图系数a1,C50以下为1.0 a11.0 #正截面混凝土极限压应变epsilon_cu&#…...
mysql5.7-基于docker-compose搭建主从同步
一、环境信息 系统版本:CentOS Linux release 7.9.2009 (Core) cat /etc/centos-release Docker版本:Docker version 20.10.6, build 370c289 docker --version Docker-compose版本:Docker Compose version v2.10.2 docker-compose --versio…...

【USRP】调制解调系列5:16QAM、32QAM、64QAM、256QAM、1024QAM、基于labview的实现
QAM 正交振幅键控是一种将两种调幅信号(2ASK和2PSK)汇合到一个信道的方法,因此会双倍扩展有效带宽,正交调幅被用于脉冲调幅。正交调幅信号有两个相同频率的载波,但是相位相差90度(四分之一周期,…...

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

mysql索引为什么提高查询速度(底层原理)
一、索引原理图 二、索引数据存储到硬盘而不是内存? 硬盘内存 成本低成本高 容量大容量小 读写速度一般读取速度快 断电后数据永久存储断电后数据清空 三、硬盘数据为什么要读取到内存?为啥不直接…...
算法通关村——位运算在查找重复元素中的妙用
用4KB内存寻找重复元素 给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中所有重复元素。 如果不要求使用4KB,最简单就是…...

使用环境中的视觉地标和扩展卡尔曼滤波器定位移动机器人研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

【python基础知识】5.for循环和while循环
文章目录 前言for...in...循环语句for循环:空房间for循环:一群排队办业务的人range()函数for循环:办事流程 while循环while循环:放行条件while循环:办事流程 两种循环对比 前言 上一关,我们学习了两种新的…...

STM32CUBEMX_创建时间片轮询架构的软件框架
STM32CUBEMX_创建时间片轮询架构的软件框架 说明: 1、这种架构避免在更新STM32CUBEMX配置后把用户代码清除掉 2、利用这种时间片的架构可以使得代码架构清晰易于维护 创建步骤: 1、使用STM32CUBEMX创建基础工程 2、新建用户代码目录 3、构建基础的代码框…...
vue 插槽Slots
vue插槽官网 <button class"fancy-btn"><slot></slot> <!-- 插槽出口 --> </button><slot> 元素是一个插槽出口 (slot outlet),标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。 // 定义一个Child.vue…...

论文阅读《Nougat:Neural Optical Understanding for Academic Documents》
摘要 科学知识主要存储在书籍和科学期刊中,通常以PDF的形式。然而PDF格式会导致语义信息的损失,特别是对于数学表达式。我们提出了Nougat,这是一种视觉transformer模型,它执行OCR任务,用于将科学文档处理成标记语言&a…...
较难的换根dp:P6213 「SWTR-04」Collecting Coins
传送门 前题提要:感觉这道换根dp可以说是集中了换根dp的所有较高难度的操作和思想,以及较高的一些实现细节,可以说能够完全写出这道题才叫真正理解了换根dp,非常值得一做. 首先读完题意,不难发现这道题有很多限制.点的访问次数限制,必须访问某一个点,想要获得最大的贡献,没有…...
Springboot - 15.二级分布式缓存集成-Caffeine
👀中文文档 Caffeine 👀使用Caffeine (本地缓存) 当与Spring Boot结合使用时,Caffeine提供了一个直观且功能强大的二级缓存解决方案。Spring Boot的缓存抽象使得整合Caffeine变得相当简单。以下是如何在Spring Boot…...

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

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

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

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...