目录

304 龙蜥社区软件包引入和管理原则

1. 综述

1.1 文档范围

本文档涵盖:

本文档不涵盖:

本文档的维护主体为龙蜥社区技术委员会,文档定稿或重大修改均需报请技术委员会审议,通过后施行。

1.2 术语定义

在本文描述中,软件包代码在仓库中的组织形式分为两种,分别为「source tree」和「rpm tree」。

1.3 修订记录

时间 作者 版本 描述信息
2022/08/31 happy_orange, caspar v1.0 初始版本
2022/11/03 happy_orange v1.1 修正软件选型的原则
2023/06/13 happy_orange v1.2 在软件包引入的基本原则中增加依赖软件的要求
2023/08/13 happy_orange v1.3 增加软件维护责任说明、闭源软件引入规范和流程

2. 软件包管理基础设施介绍

龙蜥社区使用 Gitee 管理 Anolis OS 发行版及所有 SIG 组的软件包代码,统一放在 https://gitee.com/openanolis 组织下。

2.1 软件包在代码仓库的位置

此处展示使用较为频繁的几个软件包仓库的信息:

类别 仓库名称 仓库地址 仓库介绍
source tree anolis https://gitee.com/anolis 存放龙蜥社区所有项目的 source tree,本文不涉及。
rpm tree src-anolis-os https://gitee.com/src-anolis-os 存放 Anolis OS 发行版默认 RPM 打包代码
  src-anolis-sig https://gitee.com/src-anolis-sig 存放龙蜥社区各 SIG RPM 打包代码
  src-anolis-xxx   其他特殊 SIG 的 RPM 打包代码

2.2 代码分支管理

对于 rpm tree,每个软件仓库会通过特定分支进行进一步统一管理,确保不同的 OS 版本都有对应分支可映射;在初始化仓库时,应该建立对应版本的分支,后续将代码提交 PR 通过 review 后合入到对应分支上。

分支名称 介绍
master, main 默认都为空,用于初始化其他发行版对应的分支,禁止使用该分支管理代码。
aX (X 为不带任何后缀的大版本数字),如 a7, a8, a23, a25 等 Anolis OS X 版本的主线分支。
aX.Y (X 为大版本数字,Y 为对应小版本数字),如 a8.2, a8.6 等 Anolis OS X 以前发布过的 Y 小版本对应的分支,最新的主线分支开出后,之前的主线分支则重命名为形如 aX.Y 的形式。
aX-{module名}-stream-{版本名称}
aX.Y-{module名}-stream-{版本名称}
Anolis OS X 或者 X.Y 版本对应的 module 的模块化版本分支。

3. 软件包引入

软件包引入由申请人发起,申请人可以是产品发布 SIG 组成员,也可以是其他 SIG 组对应软件包的 owner(以下统一称为「软件包负责人」)。

3.1 软件包引入基本原则

软件包负责人需明确软件包引入原则,不符合软件包引入原则的组件,不允许引入。软件包引入的原则包含三大原则:

程度 要求项 补充说明
must 软件包的内容必须遵守国家法律法规、遵守社会公序良俗  
must 软件包不允许存在合规、安全问题 例如:无 license 或 license 尚存在争议的软件
must 软件包能给出明确的 License,并且属于开源软件的白名单范围内 license 白名单
must 软件包在龙蜥社区的 rpm tree 中从未引入过,且软件命名规范,遵循上游社区命名方式 同一款软件只能存在 rpm tree 的其中一个仓,如有,后加的仓库应当合并到先有的仓库。例如:src-anolis-os 和 src-anolis-sig 不可以包含同名软件包
must 软件包对应的上游开源社区仍在运营,并在持续发布 release 运营是指有代码提交、代码和入、issue解决等,代表上游社区的代码仓并没有被废弃
must 新引入软件需要遵循 follow upstream 模式,即 source.tag.gz 是来自上游开源社区的正式版本 md5 值和上游相同,且选取版本为正式 release 版本
must 原则不允许引入其他二进制,需要从源码构建,生成对应的 rpm,如果需要引入二进制软件请参考闭源软件引入规范 如果对构建依赖版本多要求的(比如:依赖多个 kernel-devel 版本),则需要构建多次
must 软件包所需要的全部构建依赖和运行依赖必须已经存在,如果不存在,则必须按照同等规则先引入;如果已经存在,但是需要更新版本,则需要有完整评估,不能影响其他组件。 核心包和成熟包必须将构建依赖和安装依赖全部引入;
对于孵化期软件引入时,要求可以酌情降低,允许通过其他方式引入构建依赖和安装依赖;
Anolis OS 8 中允许使用 epel 仓库作为孵化期软件的构建依赖和所有软件的安装依赖,Anolis OS 23 没有 epel 仓库,不允许使用
Anolis OS 8 中如果有 epel 包转自维护,需要和自维护软件同等策略维护
在引入软件如果需要引入较多软件,并且有责任人进行长期维护,可以支持新增 group 或者 repo 的方式统一处理
must Anolis OS 8 中允许使用 epel 仓库 发行版团队的同学会定期巡逻 epel ,将 epel 的包列表与 Anolis OS 8 里面自维护软件的基线列表进行对比,如果发现 epel 高于基线列表,会发起告警并需要对应软件包的负责人进行处理。
must 软件维护策略:谁引入谁负责,同时需要负责引入该软件过程中的构建依赖和安装依赖软件。 当前构建依赖和安装依赖的构建由发行版团队进行看护,待 abs 功能完善后,支持由 sig 的主要 maintainer 自行决定构建和发布策略,但需要同时对发行版负责
must 同一个背景下引入的软件应该全部放到一个仓库中,不允许跨仓库存放。  
must 新引入的软件不允许对原有软件产生影响。 比如:不能提供相同的能力,导致 repo 出现错误
must 软件包 owner 需要评估软件的运行平台,缺省默认全部支持,如果存在不支持的架构则需要额外声明 目前龙蜥社区支持列表为:x86_64、aarch64 和 loongarch64
must 软件引入时,优先引入 Anolis OS 23 版本,其次同步引入 Anolis OS 8 版本。 如果仅引入 Anolis 8,需要上 TC 会议说明背景和原因。

3.2 闭源软件引入规范

闭源组件主要针对不想公开源码、仅公开二进制的场景,龙蜥社区允许这部分特殊软件通过闭源方式引入,并提供 epao-nonfree 仓库作为闭源组件的 repo 源公开使用。 闭源组件除了需要满足上述 「3.1 软件包引入原则」的基本原则外,还需要满足如下规范:

程度 要求项 详细说明
must 确定来源方式,保证合法合规 来源分为两种:全自研闭源和二次开发闭源
1. 全部代码自研闭源。
全部代码自研闭源方式需要走二进制披露程序,公司内部组件请自行联系法务,如果由其他合作伙伴提供,则需要合作伙伴提供对应的许可证书和对应公司的闭源二进制发布许可证明,并向发行版同学提供许可证书;
2. 基于开源组件的二次开发闭源
基于开源组件的二次开发闭源方式,需要走公司内部二进制披露程序和开源代码扫描,查看原组件的 License 类型,并确定该 License 允许在二次开发后仅通过二进制的形式对外公开
must 不能和现有开源组件发生冲突 1. 软件命名不能和现有组件相同,如果相同则需要重新定义。
2. 软件版本尽量要和现有版本保持一致,如遇到特殊情况需要额外说明选择不同软件版本的原因,并保证软件维护者快速响应 CVE 和功能问题。
must 保证安全可靠,经过充分的测试保障 1. 闭源软件引入过程中需要走假构建流程,即需要经历 CI 的测试,包括:安装、卸载、abi 检测、repo 的依赖关系检测等。
2. 闭源组件的运行依赖需要参照开源组件的运行依赖要求,运行依赖建议参照开源组件方式进行引入,同为闭源组件则应该先引入依赖部分的闭源组件。
3. 闭源组件需要有明确的维护周期,并在更新的过程中持续保持兼容和安全,即在其发展路线中需要给出 bugfix 、CVE、版本更新的预期节奏和更新频率。
4. 如果是基于开源组件二次开发,在开源组件的 cve 修复之后,该闭源组件的维护者也需要快速响应,修复对应的 cve。

3.3 版本选型原则

龙蜥社区的软件选型主要围绕「分层分类」理论展开,根据软件包对操作系统发行版的重要程度,以及整体应用场景模块化程度,设立不同的选型原则。

layer 序号 layer 名称 详细描述 选型规则
layer-0 内核层 操作系统服务(内核)
1. 跟随上游内核社区,选取社区成熟期 LTS 版本;
2. 选型需兼顾龙蜥社区 IHV 生态支持最完整的内核版本,降低硬件补丁回合成本;
3.选型需兼顾龙蜥理事成员单位向上游贡献重大特性较多的内核版本,降低特性回合成本;
4. 在一个 OS 版本内不发生大版本变更,仅采取 release 更新形式,以补丁形式合入。
layer-1 核心层 核心工具、核心库、核心服务
1. 跟随上游社区,选取社区稳定版本或 LTS 版本;
2. 和硬件相关的组件选型时需兼顾龙蜥社区 IHV 生态支持最完整的版本,降低硬件补丁回合成本;
3. 在一个 OS 版本内主要版本不发生大版本变更,仅采取 release 更新形式,以补丁形式合入;
4. 原则上不允许同时引入多个版本(例如 libssh, libssh2 需要选择一个版本)。
layer-2 系统层 系统工具、系统库、系统服务
1. 跟随上游社区,选取社区稳定版本或 LTS 版本;
2. 和硬件相关的组件选型时需兼顾龙蜥社区 IHV 生态支持最完整的版本,降低硬件补丁回合成本;
3. 在一个 OS 版本内主要版本不发生大版本变更,仅采取 release 更新形式,以补丁形式合入;
4. 原则上不允许同时引入多个版本(例如 libssh, libssh2 需要选择一个版本)。
layer-3 应用层 应用工具、应用库、应用服务
1. 尽量选取正式发布的最新版本;
2. 允许在一个 OS 版本内发生 version 变更,但要对影响范围整体评估清楚,必须通过兼容性验证
3. 原则上不允许同时引入多个版本。
4. 自研 module 包可以采用 module 模式进行管理,保障单一大版本演进过程的应用软件兼容性
layer-4 应用场景 数据库、云原生、大数据、桌面等应用场景
1. 优先选择最新的,其次如果最新的版本带来不兼容(对其他软件产生影响)的问题,则可以选取次新版本;
2. 允许支持某款软件存在多个版本,但需要由需求驱动,比如:tomcat 7、tomcat 8、tomcat 9等。
3. 具体业务涉及的软件版本可以由对应负责人决策,不做过多要求。

3.4 SPEC 规范

详细规范请参阅 Anolis OS 23 spec 规范
下列情形需严格遵守该规范编写 SPEC 文件:

下列情形可参考本规范,并不强制执行:

3.5 开源软件引入流程

  1. 引入条件审查:软件包负责人需根据 「3.1 软件包引入原则」 和 「3.2 版本选型原则」所载明的规范要求,明确软件包的代码符合要求、版本选型符合规范,同时明确软件包的演进和维护路线。
  2. 提交软件包引入申请:软件包引入涉及发行版基线变更,基线数据是通过社区的软件包集成项目 (ospkg-list) 管理的。每一个软件包都需要通过 Pull Request 提交引入意向申请。该申请将由产品发布 SIG maintainer 负责审阅,必要时报请技术委员会成员审阅,如通过后则完成软件包基线数据的变更。
    1. 如果软件包在 ospkg-list 里不存在,则需要参照「附录1.1 软件包引入申请模板」填写一个新的 {package}.yaml文件。申请通过后由产品发布 SIG maintainer 创建新的仓库和对应分支;
    2. 如果软件包在 ospkg-list 里已经存在,则无需提交新的 {package}.yaml,在现有软件包数据中添加新的字段即可。申请通过后由产品发布 SIG maintainer在现有仓库创建新的分支。
  3. 本地验证:在本地进行软件包的构建和安装验证,保证基本功能正常。
  4. 提交软件包代码:根据 「305 SPEC 规范」制作符合要求的 rpm tree 代码,并提交 PR 到对应的软件包分支中。
  5. 完成引入: 产品发布 SIG maintainer,必要时社区技术委员会指派成员,根据 review 规范审核对应的 PR,如通过后则完成软件包整体引入。其他 review 结果包括:打回修改,拒绝等。如拒绝则需给出明确的理由。

3.6 闭源软件引入流程

  1. 引入条件审查:软件负责人根据「3.2 闭源软件引入规范」所声明的规范要求,明确软件包的代码形式、License 符合规范,同时明确软件包的演进和维护路线。
  2. 联系法务人员,保证二进制开源合规:软件维护者需要联系软件提供厂家的法务人员,一般要申请两个纰漏流程,包括二进制披露和开源代码合规扫描,完成流程审批。
  3. 提交软件包引入申请:同 「3.5 开源软件引入流程」中的提交申请步骤相同,在 (ospkg-list) 发起申请,按照模版填写清楚背景(包括闭源原因)、收益、维护者、维护方式、License 类型等基本信息。
  4. 建立代码仓库和分支:发行版同学在接收 ospkg-list 申请之后,进行评估,评估通过之后,会进行建立代码仓库、建立分支操作。
  5. 提交代码:软件维护 owner 按照 308 闭源软件集成样例 将二进制提交,并发起 pr,等待门禁 CI 的运行结果
  6. 合并代码和正式构建: 待 maintainer 审核通过后,由发行版同学负责正式构建和发布。
  7. 用户安装使用:待软件发布到 epao-nonfree 源之后,需要先安装 anolis-epao-nonfree-release 包,再通过 yum install 方式安装闭源组件。

4. 软件包构建

软件包构建从构建目的角度可以划分为两种:自验证构建和正式构建。

4.1 自验证构建

该过程为开发者自行在本地或模拟环境中对软件进行构建,以验证软件包本身的构建能力或产出测试包供后续测试。目前推荐的方式有两种:

4.2 正式构建

正式构建的产物将会发布到对应的 Anolis OS 发行版本中,因此需要慎重操作。正式构建操作需要通过命令行操作,并且需要提前获得相关 token,请联系龙蜥社区发 布小组 maintainer 获取相关 token。

5. 软件包发布与变更

5.1 软件包发布原则

软件包发布指的是将通过正式构建流程生成的二进制推送到镜像 YUM repo 中。发布时会根据 ospkg-list 工具中的软件包基线数据信息,推送到对应的 YUM repo 中。
软件包经过正式构建得到 RPM 产物后,并不能直接发布,需要经过 abs 系统集成的 CI 流程后,由产品发布 SIG maintainer 执行软件包签名,之后推送 YUM repo 并生成发布单(Errata)。

5.2 软件成熟度划分和变更流程

OpenAnolis 龙蜥社区中将所有的软件划分成三个阶段:系统包、成熟包、孵化包。

阶段名称 阶段介绍 维护主体 变更流程 补充
系统包 Anolis OS 中 Lay0 - Lay2 对应的核心软件范围,不允许随意更改。 发行版团队和内核团队 需要 TC 会议进行评审,评审通过后,即可引入。  
成熟包 Anolis OS 中 Lay3 - Lay4 对应的稳定应用软件范围,由维护主体决定更新策略,支持按需更新。 发行版团队和龙蜥社区 sig ospkg-list 发起转正请求,并提供转正材料,通过转正评审即可引入。 转正材料:软件的维护责任心和维护计划、软件的特性列表、引入软件的必要性、软件的真实使用场景和客户、软件依赖范围是否变更、 CI 检测的结果、稳定性或 CVE 相关信息等。
孵化包 龙蜥社区 SIG 和 社区开发爱好者新引入的软件,由维护主体决定更新策略,支持快速迭代。 龙蜥社区 sig 和开发爱好者 ospkg-list 发起软件引入申请并通过  

5.3 Anolis OS 软件包仓库结构

根据 「3.1 软件包引入原则」 和 「5.2 软件成熟度划分和变更流程」中的分层机制,OpenAnolis 龙蜥社区将所有软件按照如下 YUM 仓库 进行管理,分为三大类:系统包、成熟包、孵化包。

仓库名称 阶段 仓库介绍 仓库分层信息 仓库维护 owner ISO 包含 仓库默认状态 Anolis OS 8 仓库范围 Anolis OS 23 仓库范围
BaseOS 核心包 Anolis OS 8 中的核心软件 Lay 0 - Lay2 的全量软件部分 Lay 3 软件 发行版团队 ✅ 预装
✅ 使能
 
AppStream 成熟包 Anolis OS 8 中的稳定的开源应用库和应用软件 Lay 3 软件 发行版团队 ✅ 预装
✅ 使能
 
os 成熟包 Anolis OS 23 中的 iso 中的全部组件,包括核心组件和应用组件等 Lay 0 - Lay 3 软件 发行版团队 ✅ 预装
✅ 使能
 
PowerTools 成熟包 使用广泛的应用类软件 Lay 3 软件 发行版团队 ✅ 预装
✅ 使能
 
Extras 成熟包 Anolis OS release 组件 Lay 3 软件 发行版团队 ✅ 预装
✅ 使能
 
kernel-x 成熟包 存放 x 版本的 kernel 包和该内核相关的组件 Lay 3 软件 kernel sig + 发行版团队 ❌ 预装
❌ 使能
Plus 成熟包 通过社区 sig 运行较为成熟的软件 Lay 3 软件 社区 sig ❌ 预装
❌ 使能
 
DDE 成熟包 DDE sig 包含的桌面相关的软件 Lay 4 软件 社区 sig ❌ 预装
❌ 使能
 
HighAvailability 成熟包 高性能 sig 包含的软件 Lay 4 软件 社区 sig ❌ 预装
❌ 使能
 
Epao 孵化包 孵化阶段的所有开源软件   社区 sig 和 社区开发爱好者 ❌ 预装
❌ 使能
Epao-nonfree 孵化包 所有闭源组件   社区 sig 和 社区开发爱好者 ❌ 预装
❌ 使能

5.4 软件包发布流程

  1. 经过正式构建得到候选发布(release candidate)包,abs 自动执行集成的 CI 流程,如未自动执行,则可在 abs 系统手工触发;
  2. 通过所有 CI 测试项,或手工确认失败项无影响后,则达到发布条件。在 Bugzilla 平台 提交软件包发布需求,模板参考「附录 1.3 软件包发布需求模板」;同时需填写发布单(Errata),如有多个软件包,则只需填写一个发布单即可,模板参考「附录 1.4 发布单模板」。
  3. 产品发布 SIG maintainer 确认通过发布需求,分别执行软件包签名、推送 YUM repo、生成发布单操作,如软件包达到系统包级别,则还需额外更新镜像 comps 文件。

6. 软件包删除

当某些开源软件不再符合 OpenAnolis 的规范时,需要将其从社区中删除。目前已知条件如下,持续更新:

序号 分类 条件
1 版权 软件的版权信息发生变更,如:license 存在争议、转商用等
2 代码风险 源码中存在恶意代码或者安全隐患,且无法修复或上游社区反馈不修复
3   源码中存在争议风险,如:地区命名、民族习俗等
4 软件演进 开源社区不再进行维护,持续长时间无任何提交和 bug 讨论,考虑退出
5   软件落后,存在其他同类软件替代
6   功能不再被需要,可以无影响删除

附录1

附录 1.1 软件包引入申请模板

name: my_packages
repository: https://gitee.com/src-anolis-sig/my_package
summary: a short description
rpm_owner: anolis-bot
branches:
- name: a8
  repo: epao
  maturity: rawhide
- name: a23
  repo: epao
  maturity: rawhide

附录 1.2 社区重点生态应用场景

附录 1.3 软件包发布需求模板

申请发布

  1. 背景 必填: 简单描述需求背景, 有必要可以提供相关公共链接
  2. 用户故事 必填: 说明用户, 业务/应用场景, 获得结果/收益, 价值/竞争力/优势等
  3. 重要性/优先级 选填: 说明该需求的重要程度, 优先级, 紧迫性等
  4. 目标/计划 选填: 说明该需求目标版本或预期日期等
  5. 依赖/影响 选填: 说明该需求开发, 测试相关依赖信息及工作量估计
  6. 验收标准 选填: 说明交付物, 预期效果等

附录 1.4 发布单模板