全方位质量保障!龙蜥在内核、软件包、容器镜像、三方模块的 CI 工程实践

编者按:在海量的代码测试和构建中, CI(Continuous Integration)在代码提交阶段,对提高软件质量和开发效率起到了至关重要的作用。2023 龙蜥操作系统大会全面繁荣开发者生态分论坛上,龙蜥社区 QA SIG Maintainer、联通数科 CUlinux 测试负责人宋彦岭从龙蜥社区质量体系、CI 架构、CI 服务流程及 CI 接入等方面进行介绍,充分展示出社区 CI 在龙蜥开源操作系统质量保障上的重要程度。

图片

 (图/龙蜥社区 QA SIG Maintainer、联通数科 CUlinux 测试负责人宋彦岭)

社区质量体系

图片

一般来说,操作系统版本发布周期可以分为三部分:第一是日常开发。日常开发过程中由代码提交触发的 CI 测试,包含 Kernel CI、Package CI、Docker CI、OOT CI,这也是目前 CI 服务体系的四项主要内容。第二是日常集成。该过程中由日常的定时任务来触发 Nightly 测试。第三是产品发布,包含功能、性能、兼容性、稳定性等测试。 我们可以看到,作为操作系统服务的第一道防线,CI 测试的意义非常重大:

  • 统一标准规范:所有开发者按照社区标准规范提交代码,既改善了研发流程,又满足开源合规需求。

  • 提前预知缺陷:在代码提交阶段就进行代码测试,提前暴露代码质量问题,减少后续测试压力,提升产品质量。

  • 全自动无感知:在社区提交的 PR 只要符合规范均自动触发 CI 测试,降低开发者使用门槛,提升研发效率。

图片

目前,龙蜥社区 CI 架构如上图,首先社区代码仓库主要来自于 Gitee 或 Github 的公开仓库,这些仓库通过 webhook 接入到社区 CI 服务体系中,接入的仓库若有新事件,如新代码合入、PR 评论等会触发 webhook 消息传递,将消息传递给 git 解析器,解析成标准的数据后进行逻辑处理。其次 CI 通过提前接入体系中的 SDK 去调度具体的任务,例如基于 T-One 平台的测试任务,或基于 ABS 平台的构建任务。最终 T-One、ABS 等平台会将任务结果返回,CI 服务通过标准回调处理,以评论的形式将结果呈现在对应的 PR 上。

在开发者的角度上,该体系由托管在 Gitee 或者 Github 上的代码,基于 CI 机器人、配置中心或 T-One、ABS 平台等基础设施,实现一系列 CI 服务。它处于自动化无感知的状态,更像是一个黑盒子。

CI 基础设施中,有关测试方面的核心在 T-One 测试平台完成,该平台集成了行业内通用的测试用例,如模糊测试、性能测试用例等,也可以由社区开发者自定义一些测试用例加入到 T-One 中,实现自动化运行。目前,T-One 已覆盖业界主流通用 OS 以及混合的硬件架构测试,支持动态扩展,利用动态扩展创建云资源,并且作为测试资源使用。

ABS 作为构建核心平台,覆盖 Anolis OS 及主流的硬件架构,可以实现对社区开源软件包的构建,同时将构建成功的软件包对象发布到公网环境中。

社区 CI 体系特色分为四大部分:第一是分层分级,针对不同仓库可以进行分层分级处理,普通仓库提供基本 CI 测试,核心仓库提供定制化的 CI 测试能力。第二是可拓展框架,CI 工具提供了插件化能力,多种工具可以组合产生联动效果,其中新增功能可以通过插件进行快速扩展。第三是接入能力,提供高度开放的接入能力,可以让开发者自定义开发测试来接入 CI 服务体系。第四是 CI/CD服务一体化,提供 PR 合入后的后续操作,根据仓库类型不同提供不同的处理能力。

CI 服务流程

CI 服务阶段从代码提交到触发 CI 测试,再由 reviewer 评审,测试失败后需要进行重新测试,也可以通过评论方式重新触发测试,评审通过则会合入 PR。

在上文中提到,CI 测试流程共有 Kernel CI、Package CI、Docker CI、OOT CI 4 种。Kernel CI 针对内核做 CI 测试,目前主要监测存放在 Gitee 上的 Cloud Kernel 仓库,若4.19、5.10、6.6 三个内核一旦有新的代码合入,由 CI 机器人进行检查 CLA 签署协议以及 PR 信息是否符合规范。再通过 CBC 工具以及 T-One 测试平台对新提交的 PR 进行测试,检测没有问题后,CI 机器人合入 PR 到指定仓库并进行自动签名操作。

CBC 与 T-One 测试部分主要测试项详见下图:

针对软件包的 Package CI,对存放在 Gitee 上的 src-anolis-os、src-anolis-sig、src-anolis-module、src-anolis-ai 等多个仓库组下的所有仓库进行检测。一旦发现新提交的 PR,先对基本信息进行检测,由 T-One 进行合规检查和代码检查,检查测试无误后由 ABS 构建出初步使用的软件包,再交给 T-One 做冒烟测试。后续如果没有问题,最后再由 ABS 构建出正式的软件包,并推送到 mirrors 仓库中。

Package CI 整个测试项详见下图:

针对容器镜像的 Docker CI,检测 baseos、app、dragonwell、language 存放在 Gitee 和 Github 公开仓库的容器仓库,一旦有新的 PR,会检查 CLA 和容器的配置文件,检测没有问题后,会先通过 ABS 构建出测试使用的容器,由 T-One 做进一步测试,测试没有问题会合入,通过 ABS 构建出正式的镜像,推送到公网的镜像仓库中。

对于容器的测试详见下图:

针对内核的第三方模块做的 CI 测试 - OOT CI ,检测仓库主要在 anolis 下以 kmod 开头的第三方模块的仓库,这些仓库中有新的 PR 产生,(该测试更轻量,与内核测试类似)先检查 CLA,通过 T-One 进行 checkpatch 检查和生成临时分支 rpm tree,然后通过 ABS 构建出新的 OOT 模块进行测试。

社区CI接入

下面介绍社区的开发者来自定义去接入 CI 流程的方法。首先在 Gitee 上建立了一个仓库 ci-meta,是针对 CI 服务体系建立的 CI 配置中心。仓库目录结构如下图,主要包括公共配置和开发者自定义的配置两大部分。其中公共配置中包含三部分:产品相关的配置、 T-One 平台测试配置、全局仓库配置,其中仓库配置中包含了代码检查、ABS 构建的选项、依赖测试等。

图片

若开发者想自己定义新的 CI 测试,则需要定义 CI 的 yaml 文件,将其存放在 CI 配置中心,其中的自定义目录 repos 则会根据首字母建立不同的目录,将相对应的软件包  CI  yaml 文件存放,就可以接入到社区的 CI 服务中进行测试。该文件中的组成分为三部分,包括仓库配置、测试配置和通知配置。若在 ci.yaml 缺失的情况下,默认引用全局配置,包括与 T-One 的交互或自定义的参数。通知配置目前支持两种方式:邮件和钉钉,集成接入后在指定状态时进行通知。

图片

目前,在上述四种 CI 服务中,Kernel CI 和 Package CI 属于常用服务,拦截了大量有问题的 PR,检测了 6.5 万 + patch,拦截了 1 万+ patch,通过 T-One 平台发起了 7万+ 测试任务,通过 ABS 平台发起了 2.1 万+ 构建任务。

未来,社区关于 CI 服务体系发展有以下展望:第一方面扩大支撑,未来会支持更多仓库来进行定制化的 CI 测试,提供更强大的测试能力。第二部分是可视化,希望打造一个全新的可视化 web 界面,帮助开发者理解和纵览社区服务,也降低接入 CI 体系的难度,通过可视化界面来完成点击接入方式。第三部分完善接入,提供体验更好的接入方式,提供更多的 CI 模式,完善开源社区的 CI 服务体系。第四部分是能力开放,提供工具封装级别的插件支持,允许开发者自定义 CI 测试流程和工具模组,自行组装和定制化 CI 流程步骤。

落地实践

由于操作系统版本发布周期相似,联通数科针对社区没有开源部分的设施进行了替换。联通数科整体以 T-One 作为测试核心,基于内部搭建的 git 仓库,建木实现任务调度和触发,koji 实现包构建,最后由 T-One 实现测试。

图片

—— 完 ——

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8 Closing dataloader mosaic

在使用YOLOV8训练时,epoch训练到最后10次出现”Closing dataloader mosaic",又不是报错,但又不往下进行训练,有点懵了,后面经过了解,Yolov8是默认设置close_mosaic10,需要把它修改为0; clo…

什么是HTTP代理?适用于哪些场景?

HTTP代理是一种网络代理服务器,它主要用于处理HTTP协议的请求和响应。HTTP代理充当客户端(如浏览器)和目标服务器之间的中介,允许客户端通过代理服务器来发送HTTP请求,并接收来自服务器的响应。HTTP代理可以分为正向代…

C++ 虚函数和纯虚函数

虚函数 #include <iostream> using namespace std; class Vehicle //交通工具 { public:void run() const{cout << "run a vehicle. " << endl;} }; class Car : public Vehicle //汽车 { public:void run() const{cout << "run a c…

报名倒计时!「飞天技术沙龙-CentOS 迁移替换专场」参会指南

为帮助广大用户诊断 CentOS 迁移替换过程中的疑难杂症&#xff0c;「飞天技术沙龙-CentOS 迁移替换专场」将于 5 月 29 日&#xff08;周三&#xff09;在北京举办&#xff0c;将围绕如何在确保服务的连续性和稳定性的前提下实现平滑迁移及如何最大限度地利用现有资源前提下确保…

R可视化:另类的箱线图

介绍 方格状态的箱线图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

营销短信XML接口对接发送示例

在现代社会中&#xff0c;通信技术日新月异&#xff0c;其中&#xff0c;短信作为一种快速、简便的通信方式&#xff0c;仍然在日常生活中占据着重要的地位。为了满足各种应用场景的需求&#xff0c;短信接口应运而生&#xff0c;成为了实现高能有效通信的关键。 短信接口是一种…

使用RAG和文本转语音功能,我构建了一个 QA 问答机器人

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

Spring 事务源码分析

前言&#xff1a; 我们知道 Spring 声明式事务是通过 AOP 来实现的&#xff0c;日常项目开发中我们只需要使用 Transactional 注解就可以实现声明式事务&#xff0c;那你知道通过 Transactional 注解怎样实现事务的吗&#xff1f;本篇我们将从源码来分析 Spring 声明式事务的执…

【测评】OrangePi AIPro环境配置与基础应用

1.介绍 官网&#xff1a;http://www.orangepi.cn/ 社区&#xff1a;http://forum.orangepi.cn/ 昇腾社区&#xff1a;https://www.hiascend.com/ OrangePi AIPro 是一款基于昇腾AI技术的开发板&#xff0c;它采用华为昇腾910E AI芯片&#xff0c;集成4核64位CPU和AI处理器&am…

【Unity之FGUI】黑神章Fairy GUI控件详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

宝塔下新增站点 No Input File Specified.错误修复

今天明月收到了一个购买【站长必备在线工具源码含上百款工具-博客优化修复版】用户的求助&#xff0c;在宝塔里新增网站部署好工具源码后&#xff0c;访问出现“No input file specified.”的提示。其实出现这个提示一般都是 PHP 文件无法被解析造成的。 简单排查了一下宝塔相关…

python技巧梳理

背景 在开发中&#xff0c;经常会遇到&#xff0c;同时存在多个值&#xff0c;依次判断上述值&#xff0c;选择第一个非空、True的值作为整个表达式的值进行返回&#xff0c;这个时候会用到or这个关键词&#xff0c;下面讲一下用法。 方法 value1 None value2 0 value3 H…

教师专属的成绩发布小程序

还在为成绩发布而烦恼&#xff1f;还在担心家长无法及时获得孩子的学习反馈&#xff1f;是否想要一个既安全又高效的工具来简化你的教学工作&#xff1f;那么&#xff0c;易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担&#xff0c;提高…

快速搭建 WordPress 外贸电商网站指南

本指南全面解析了在 Hostinger 平台上部署 WordPress 外贸电商网站的详细步骤&#xff0c;涵盖托管方案选择、WordPress 一键安装、主题挑选与演示数据导入、主题个性化定制、SEO插件插件 AIOSEO 安装、通过 GTranslate 实现多语言自动翻译、地区访问控制插件&#xff0c;助力用…

【C++练级之路】【Lv.21】C++11——列表初始化和声明

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、列表初始化1.1 内置类型1.2 结构体或类1.3 容器 二、声明2.1 auto2.2 decltype2.3 nullptr 三、STL的…

最新dofm飞行棋高阶版,分享情侣版飞行棋高级版和终极版

阿星今天要给大家带来一款甜蜜蜜的小游戏——情侣飞行棋。这不是普通的飞行棋&#xff0c;而是专为情侣设计的&#xff0c;让你们的感情在游戏中升温&#xff0c;擦出更多爱的火花。 准备好了吗&#xff1f;跟着阿星一起&#xff0c;咱们来看看这款软件的魅力所在&#xff01;…

2024最新机器人相关基础技术总结(1)

机器人分类 功能分类&#xff1a;工业机器人&#xff0c;服务机器人&#xff0c;移动机器人&#xff08;AGV&#xff09; 机器人系统组成 组成部分&#xff1a;机器人本体、伺服电机、减速机、伺服驱动器、IO板、控制系统、其他电子元器件。 逐一分析&#xff1a; 本体 机…

抖音小店出单之后怎么发货?抖店详细发货流程来了

大家好&#xff0c;我是喷火龙。 抖音小店发货是有规则的&#xff0c;如果出现超时发货或者虚假发货都会被平台处罚的&#xff0c;会影响我们店铺的评分和正常运营&#xff0c;还有些小伙伴们在发货的时候会遇到平台的违规提醒等问题。 今天我就给大家讲一下抖音小店的发货流…

深度神经网络——什么是决策树?

决策树 决策树是一种强大的机器学习算法&#xff0c;它通过模拟人类决策过程来解决分类和回归问题。这种算法的核心在于它如何将数据集细分&#xff0c;直至每个子集足够“纯净”&#xff0c;即包含的实例都属于同一类别或具有相似的数值范围。 开始于根节点&#xff1a;决策…