diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f8a0cec66d6262f2c6cabbcb2b3f9a9b8c92ab47..18461894673eddf65385efce19722014d015a0a1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -102,11 +102,14 @@
龙蜥社区是个更规范、更统一的社区,每款开源项目都需要有个 spec 文件用于构建和生成 rpm。参考 《[305 - spec 模版和自检项](/articles/305-module-and-checklist-of-spec.md)》一文。
-### 3.6 龙蜥社区软件的 spec 指导手册
+### 3.6 龙蜥社区软件的 rpmbuild 构建指导手册
-龙蜥社区也会帮助你更加了解一款软件的构建和安装过程,特增加指导手册,可以参考《[306 - spec 指导手册](/articles/306-instruction-manual-of-spec.md)》一文。
+龙蜥社区也会帮助你更加了解一款软件的构建和安装过程,特增加指导手册,可以参考《[306 - rpmbuild 构建指导手册](/articles/306-instruction-manual-of-rpmbuild.md)》一文。
### 3.7 构建原生的龙蜥社区项目
从0 开始构建一个原生的操作系统项目,无疑是让人非常兴奋的。整个过程中的注意事项,可以参考《[307 - 从零构建一个龙蜥开源项目](/articles/307-build-a-new-project.md)》一文。
+
+### 3.8 闭源软件集成样例
+龙蜥社区对符合要求的闭源软件提供了集成样例,可以参考《[308 - 闭源软件集成样例](/articles/308-example-of-epao-nonfree-package.md)》一文。
\ No newline at end of file
diff --git a/README.md b/README.md
index 23262a42fdaac670b2cf254cbd93b540d815806e..adc624fab5bfa8b74769c7b83a84995b3ec19436 100644
--- a/README.md
+++ b/README.md
@@ -42,8 +42,9 @@
+ 《[303 - 内核研发指南](/articles/303-join-kernel-developing.md)》
+ 《[304 - 龙蜥社区软件包引入和管理原则](/articles/304-package-introduction-and-management-principles.md)》
+ 《[305 - spec 模版和自检项](/articles/305-module-and-checklist-of-spec.md)》
- + 《[306 - spec 指导手册](/articles/306-instruction-manual-of-spec.md)》
+ + 《[306 - rpmbuild 构建指导手册](/articles/306-instruction-manual-of-rpmbuild.md)》
+ 《[307 - 从零构建一个龙蜥开源项目](/articles/307-build-a-new-project.md)》
+ + 《[308 - 闭源软件集成样例](/articles/308-example-of-epao-nonfree-package.md)》
## 4. 参与文档贡献
diff --git a/articles/301-join-code-review.md b/articles/301-join-code-review.md
index 962bd507ad2153f5653979f6d39e0d1bee724718..8b132018918c6f51579baf5304aaadb0de98d1d7 100644
--- a/articles/301-join-code-review.md
+++ b/articles/301-join-code-review.md
@@ -1 +1,64 @@
# 参与 Review 其他社区贡献者的代码
+
+本文章介绍了代码 Review 过程中的细节和注意点,希望更好的帮助到代码提交者和 reviewer,让代码提交和代码和入都变得简单。
+
+## 1. 综述
+
+### 1.1 前提介绍
+
+本文章已经假设 source 仓库([anolis](https://gitee.com/anolis))或 rpm 仓库([src-anolis-os](https://gitee.com/src-anolis-os) 和 [src-anolis-sig](https://gitee.com/src-anolis-sig))已经存在,不涉及软件引入流程([304 龙蜥社区软件包引入和管理原则](https://gitee.com/anolis/docs/blob/main/articles/304-package-introduction-and-management-principles.md))。
+
+### 1.2 文档范围
+
+本文章涵盖:
+
+* 龙蜥社区中 source tree的代码 Review 模版
+
+* 龙蜥社区中 rpm tree的代码 Review 模版
+
+
+### 1.3 修定记录
+
+| **时间** | **作者** | **描述** | **审核人** |
+| --- | --- | --- | --- |
+| 2022/12/01 | happy\_orange | v1.0 - 初始版本 | |
+| 2022/08/09 | happy\_orange | v1.1 - 调整 review 项 | |
+
+## 2. source 仓库 Review 规范
+
+### 2.1 规则介绍
+
+maintainer 可以按照自己的意见填写审核结果,[+] 代表通过,[-] 代表不通过,不通过的点建议给出不通过原因或者建议修改方式。
+
+### 2.2 Review 模版
+
+| 类别 | 审核要求 | 审核级别 | 审核结果 | 意见项 |
+| --- | --- | --- | --- | --- |
+| 提交规范 | PR 标题清晰 | must | | |
+| | 应该尽可能描述清楚 PR 的修改内容和影响性 | must | | |
+| | 代码实际修改内容与 PR 一致 | should | | |
+| 代码规范 | 代码简洁、易懂,可读性高 | must | | |
+| | 符合 gitee 的规范检查,包括源码仓的缺陷扫描和规范扫描 | must | | |
+| 引入三方规范 | 不引入 license 不明的文件或者依赖 | must | | |
+| | 有存在三方引入时,声明来源 | must | | |
+
+## 3. rpm 仓库 Review 规范
+
+### 3.1 规则介绍:
+
+maintainer 可以按照自己的意见填写审核结果,[+] 代表通过,[-] 代表不通过,不通过的点建议给出不通过原因或者建议修改方式。
+
+### 3.2 Review 模版
+
+| 类别 | 审核要求 | 审核级别 | 审核结果 | 意见项 |
+| --- | --- | --- | --- | --- |
+| 门禁规范 | 门禁全部通过,如果因为门禁环境原因,需要给出合理解释 | must | | |
+| 提交规范 | PR 标题清晰 | must | | |
+| | PR 内容描述详细具体,尽可能描述清楚 PR 的修改内容和影响性 | must | | |
+| | 代码实际修改内容与 PR 一致 | must | | |
+| spec-基本信息 | 符合 《[https://anolis.gitee.io/docs/articles/305-module-and-checklist-of-spec.html](https://anolis.gitee.io/docs/articles/305-module-and-checklist-of-spec.html)》中的字段要求 | must | | |
+| | 不升级时 anolis\_release 采取递增,升级时,anolis\_release 从 1 开始。 | must | | |
+| | patch 和 souce 采用序号区分自研和开源三方 | must | | |
+| | 涉及具体架构的专项更改时,使用架构作为判断条件 | must | | |
+| | changlog 格式正确,并且提交信息简单易懂 | must | | |
+| source 文件 | 目录结构清晰,仅包括:spec、source.tag.gz、patch、source,不存在其他文件 | must | | |
\ No newline at end of file
diff --git a/articles/304-package-introduction-and-management-principles.md b/articles/304-package-introduction-and-management-principles.md
index 6881fdc3abd882ca103460e3dc8a93a782f9b7ee..5c6d46a4071a5fcb2918a75cc9d6379e6cbba014 100644
--- a/articles/304-package-introduction-and-management-principles.md
+++ b/articles/304-package-introduction-and-management-principles.md
@@ -27,9 +27,12 @@
### 1.3 修订记录
-| **时间** | **作者** | **描述** | **审核人** |
+| **时间** | **作者** | **版本** | **描述信息** |
| --- | --- | --- | --- |
-| 2022/08/31 | happy_orange, caspar | v1.0 - 初始版本 | |
+| 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. 软件包管理基础设施介绍
@@ -59,27 +62,28 @@
| **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 软件包引入基本原则
-软件包引入申请人主体可以是产品发布 SIG 组成员,也可以是其他 SIG 组对应软件包的 owner(以下统一称为「软件包负责人」)。当软件包引入前,软件包负责人需明确软件包引入原则,不符合软件包引入原则的组件,不允许引入。
+软件包负责人需明确软件包引入原则,不符合软件包引入原则的组件,不允许引入。软件包引入的原则包含三大原则:
+
+- 背景和用途:能给出引入背景和软件用途,并阐述带来的业务场景和价值
+- 软件维护责任:软件引入时,需要同时声明软件包的负责人,并承担起维护的责任,包括:修复 bugfix、修复 CVE、更新等动作
+- 引入责任规范:必须满足下面所有的引入要求,达到合规状态的软件才允许引入
**程度** | **要求项** | **补充说明**
--|--|--
must | 软件包的内容必须遵守国家法律法规、遵守社会公序良俗 |
must | 软件包不允许存在合规、安全问题 | 例如:无 license 或 license 尚存在争议的软件
must | 软件包能给出明确的 License,并且属于开源软件的白名单范围内 | [license 白名单](https://gitee.com/anolis/anolis-ci-test/blob/master/utils/license_check/white_black.xlsx)
-must | 软件包在引入时,应该说明背景和用途 |
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 | 原则不允许引入其他二进制,需要从源码构建,生成对应的 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 自行决定构建和发布策略,但需要同时对发行版负责
@@ -90,7 +94,20 @@ must | 软件引入时,优先引入 Anolis OS 23 版本,其次同步引入 A
-### 3.2 版本选型原则
+### 3.2 闭源软件引入规范
+闭源组件主要针对不想公开源码、仅公开二进制的场景,龙蜥社区允许这部分特殊软件通过闭源方式引入,并提供 epao-nonfree 仓库作为闭源组件的 repo 源公开使用。
+闭源组件除了需要满足上述 「[3.1 软件包引入原则](#31-软件包引入基本原则)」的基本原则外,还需要满足如下规范:
+
+**程度** | **要求项** | **详细说明**
+--|--|--
+must | 确定来源方式,保证合法合规 | 来源分为两种:全自研闭源和二次开发闭源
1. 全部代码自研闭源。
全部代码自研闭源方式需要走二进制披露程序,公司内部组件请自行联系法务,如果由其他合作伙伴提供,则需要合作伙伴提供对应的许可证书和对应公司的闭源二进制发布许可证明,并向发行版同学提供许可证书;
2. 基于开源组件的二次开发闭源
基于开源组件的二次开发闭源方式,需要走公司内部二进制披露程序和开源代码扫描,查看原组件的 License 类型,并确定该 License 允许在二次开发后仅通过二进制的形式对外公开 |
+must | 不能和现有开源组件发生冲突 | 1. 软件命名不能和现有组件相同,如果相同则需要重新定义。
2. 软件版本尽量要和现有版本保持一致,如遇到特殊情况需要额外说明选择不同软件版本的原因,并保证软件维护者快速响应 CVE 和功能问题。
+must | 保证安全可靠,经过充分的测试保障 | 1. 闭源软件引入过程中需要走假构建流程,即需要经历 CI 的测试,包括:安装、卸载、abi 检测、repo 的依赖关系检测等。
2. 闭源组件的运行依赖需要参照开源组件的运行依赖要求,运行依赖建议参照开源组件方式进行引入,同为闭源组件则应该先引入依赖部分的闭源组件。
3. 闭源组件需要有明确的维护周期,并在更新的过程中持续保持兼容和安全,即在其发展路线中需要给出 bugfix 、CVE、版本更新的预期节奏和更新频率。
4. 如果是基于开源组件二次开发,在开源组件的 cve 修复之后,该闭源组件的维护者也需要快速响应,修复对应的 cve。
+
+
+
+
+### 3.3 版本选型原则
龙蜥社区的软件选型主要围绕「分层分类」理论展开,根据软件包对操作系统发行版的重要程度,以及整体应用场景模块化程度,设立不同的选型原则。
@@ -99,14 +116,14 @@ must | 软件引入时,优先引入 Anolis OS 23 版本,其次同步引入 A
| **layer 序号** | **layer 名称** | **详细描述** | **选型规则** |
| --- | --- | --- | --- |
-| layer-0 | 内核层 | 操作系统服务(内核) |
1. 跟随上游内核社区,选取社区成熟期 LTS 版本;
2. 选型需兼顾龙蜥社区 IHV 生态支持最完整的内核版本,降低硬件补丁回合成本;
3. 选型需兼顾龙蜥理事成员单位向上游贡献重大特性较多的内核版本,降低特性回合成本;
4. 在一个 OS 版本内不发生大版本变更,仅采取 release 更新形式,以补丁形式合入。
|
+| 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.3 SPEC 规范
+### 3.4 SPEC 规范
详细规范请参阅 [Anolis OS 23 spec 规范](/articles/305-module-and-checklist-of-spec.md)。
下列情形需严格遵守该规范编写 SPEC 文件:
- Anolis OS 23 及以后的发行版引入的所有软件包;
@@ -117,10 +134,10 @@ must | 软件引入时,优先引入 Anolis OS 23 版本,其次同步引入 A
-### 3.4 软件包引入流程
-1. **引入条件审查**:软件包负责人需根据 「[3.1 软件包引入原则](#wpzHw)」 和 「[3.2 版本选型原则](#S6HMX)」所载明的规范要求,明确软件包的代码符合要求、版本选型符合规范,同时明确软件包的演进和维护路线。
+### 3.5 开源软件引入流程
+1. **引入条件审查**:软件包负责人需根据 「[3.1 软件包引入原则](#31-软件包引入基本原则)」 和 「[3.2 版本选型原则](#32-闭源软件引入规范)」所载明的规范要求,明确软件包的代码符合要求、版本选型符合规范,同时明确软件包的演进和维护路线。
1. **提交软件包引入申请**:软件包引入涉及发行版基线变更,基线数据是通过社区的软件包集成项目 ([ospkg-list](https://gitee.com/anolis/ospkg-list)) 管理的。每一个软件包都需要通过 Pull Request 提交引入意向申请。该申请将由产品发布 SIG maintainer 负责审阅,必要时报请技术委员会成员审阅,如通过后则完成软件包基线数据的变更。
- 1. 如果软件包在 ospkg-list 里不存在,则需要参照「[附录1.1 软件包引入申请模板](#XvmFu)」填写一个新的 `{package}.yaml`文件。申请通过后由产品发布 SIG maintainer 创建新的仓库和对应分支;
+ 1. 如果软件包在 ospkg-list 里不存在,则需要参照「[附录1.1 软件包引入申请模板](#附录-11-软件包引入申请模板)」填写一个新的 `{package}.yaml`文件。申请通过后由产品发布 SIG maintainer 创建新的仓库和对应分支;
1. 如果软件包在 ospkg-list 里已经存在,则无需提交新的 `{package}.yaml`,在现有软件包数据中添加新的字段即可。申请通过后由产品发布 SIG maintainer在现有仓库创建新的分支。
1. **本地验证**:在本地进行软件包的构建和安装验证,保证基本功能正常。
1. **提交软件包代码**:根据 「[305 SPEC 规范](../articles/305-module-and-checklist-of-spec.md)」制作符合要求的 rpm tree 代码,并提交 PR 到对应的软件包分支中。
@@ -128,6 +145,15 @@ must | 软件引入时,优先引入 Anolis OS 23 版本,其次同步引入 A
+### 3.6 闭源软件引入流程
+1. **引入条件审查**:软件负责人根据「[3.2 闭源软件引入规范](#31-软件包引入基本原则)」所声明的规范要求,明确软件包的代码形式、License 符合规范,同时明确软件包的演进和维护路线。
+2. **联系法务人员,保证二进制开源合规**:软件维护者需要联系软件提供厂家的法务人员,一般要申请两个纰漏流程,包括二进制披露和开源代码合规扫描,完成流程审批。
+3. **提交软件包引入申请**:同 「[3.5 开源软件引入流程](#35-开源软件引入流程)」中的提交申请步骤相同,在 ([ospkg-list](https://gitee.com/anolis/ospkg-list)) 发起申请,按照模版填写清楚背景(包括闭源原因)、收益、维护者、维护方式、License 类型等基本信息。
+4. **建立代码仓库和分支**:发行版同学在接收 ospkg-list 申请之后,进行评估,评估通过之后,会进行建立代码仓库、建立分支操作。
+5. **提交代码**:软件维护 owner 按照 [308 闭源软件集成样例](../articles/308-example-of-epao-nonfree-package.md) 将二进制提交,并发起 pr,等待门禁 CI 的运行结果
+6. **合并代码和正式构建**: 待 maintainer 审核通过后,由发行版同学负责正式构建和发布。
+7. **用户安装使用**:待软件发布到 epao-nonfree 源之后,需要先安装 anolis-epao-nonfree-release 包,再通过 yum install 方式安装闭源组件。
+
## 4. 软件包构建
软件包构建从构建目的角度可以划分为两种:自验证构建和正式构建。
@@ -138,6 +164,7 @@ must | 软件引入时,优先引入 Anolis OS 23 版本,其次同步引入 A
- 本地通过 mock 机制构建,参考《[Anolis OS 8 软件包本地构建 · 语雀](https://www.yuque.com/anolis-docs/kbase/cvy9g3?view=doc_embed)》一文;
- 通过 Anolis Build System (ABS) 提供的个人工作空间机制进行自定义构建,可以参考[《使用ABS平台轻松胜任Anolis OS开发工作》](../articles/208-how-to-build-package-via-ABS.md) 一文的内容,进行构建。
+- 构建过程中遇到的问题参考 「[306 rpmbuild 构建指导手册](../articles/306-instruction-manual-of-rpmbuild.md)」
### 4.2 正式构建
@@ -156,34 +183,36 @@ must | 软件引入时,优先引入 Anolis OS 23 版本,其次同步引入 A
OpenAnolis 龙蜥社区中将所有的软件划分成三个阶段:系统包、成熟包、孵化包。
-| 阶段名称 | 阶段介绍 | 维护主体 | 变更流程 | 补充 |
+| 阶段名称 | 阶段介绍 | 维护主体 | 变更流程 | 补充 |
| -------- | ------------------------------------------------------------ | ------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
-| 核心包 | Anolis OS 中 Lay0 - Lay2 对应的核心软件范围,不允许随意更改。 | 发行版团队和内核团队 | 需要 TC 会议进行评审,评审通过后,即可引入。 | |
+| 系统包 | Anolis OS 中 Lay0 - Lay2 对应的核心软件范围,不允许随意更改。 | 发行版团队和内核团队 | 需要 TC 会议进行评审,评审通过后,即可引入。 | |
| 成熟包 | Anolis OS 中 Lay3 - Lay4 对应的稳定应用软件范围,由维护主体决定更新策略,支持按需更新。 | 发行版团队和龙蜥社区 sig | ospkg-list 发起转正请求,并提供转正材料,通过转正评审即可引入。 | 转正材料:软件的维护责任心和维护计划、软件的特性列表、引入软件的必要性、软件的真实使用场景和客户、软件依赖范围是否变更、 CI 检测的结果、稳定性或 CVE 相关信息等。 |
| 孵化包 | 龙蜥社区 SIG 和 社区开发爱好者新引入的软件,由维护主体决定更新策略,支持快速迭代。 | 龙蜥社区 sig 和开发爱好者 | ospkg-list 发起软件引入申请并通过 | |
### 5.3 Anolis OS 软件包仓库结构
-根据 「[3.1 软件包引入原则](#wpzHw)」 和 「[5.2 软件包引入原则](#wpzHw)」中的分层机制,OpenAnolis 龙蜥社区将所有软件按照如下 [YUM 仓库](https://mirrors.openanolis.cn/anolis/) 进行管理,分为三大类:系统包、成熟包、孵化包。其中,;成熟包是由;孵化包是。
+根据 「[3.1 软件包引入原则](#31-软件包引入基本原则)」 和 「[5.2 软件成熟度划分和变更流程](#52-软件成熟度划分和变更流程)」中的分层机制,OpenAnolis 龙蜥社区将所有软件按照如下 [YUM 仓库](https://mirrors.openanolis.cn/anolis/) 进行管理,分为三大类:系统包、成熟包、孵化包。
| 仓库名称 | 阶段 | 仓库介绍 | 仓库分层信息 | 仓库维护 owner | ISO 包含 | 仓库默认状态 | Anolis OS 8 仓库范围 | Anolis OS 23 仓库范围 |
| ---------------- | ------ | ----------------------------------------- | -------------------------------------------- | -------------------------- | --------- | ----------------- | -------------------- | --------------------- |
-| BaseOS | 核心包 | Anolis OS 的核心软件 | Lay 0 - Lay2 的全量软件部分 Lay 3 软件 | 发行版团队 | 是 | ✅ 预装
✅ 使能 | 有 | 有 |
-| AppStream | 成熟包 | 稳定的开源应用库和应用软件 | Lay 3 软件 | 发行版团队 | 是 | ✅ 预装
✅ 使能 | 有 | 有 |
+| 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 和 社区开发爱好者 | 否 | ✅ 预装
❌ 使能 | 有 | 有 |
+| 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 系统手工触发;
-1. 通过所有 CI 测试项,或手工确认失败项无影响后,则达到发布条件。在 [Bugzilla 平台](https://bugzilla.openanolis.cn/enter_bug.cgi?classification=Anolis%20OS) 提交软件包发布需求,模板参考「[附录 1.3 软件包发布需求模板](#A5FyM)」;同时需填写发布单(Errata),如有多个软件包,则只需填写一个发布单即可,模板参考「附录 1.4 发布单模板」。
+1. 通过所有 CI 测试项,或手工确认失败项无影响后,则达到发布条件。在 [Bugzilla 平台](https://bugzilla.openanolis.cn/enter_bug.cgi?classification=Anolis%20OS) 提交软件包发布需求,模板参考「[附录 1.3 软件包发布需求模板](#附录-13-软件包发布需求模板)」;同时需填写发布单(Errata),如有多个软件包,则只需填写一个发布单即可,模板参考「附录 1.4 发布单模板」。
1. 产品发布 SIG maintainer 确认通过发布需求,分别执行软件包签名、推送 YUM repo、生成发布单操作,如软件包达到系统包级别,则还需额外更新镜像 comps 文件。
@@ -211,10 +240,10 @@ rpm_owner: anolis-bot
branches:
- name: a8
repo: epao
- maturity:rawhide
+ maturity: rawhide
- name: a23
repo: epao
- maturity:rawhide
+ maturity: rawhide
```
### 附录 1.2 社区重点生态应用场景
@@ -227,6 +256,18 @@ branches:
### 附录 1.3 软件包发布需求模板
> 申请发布
+> 1. 背景
+> 必填: 简单描述需求背景, 有必要可以提供相关公共链接
+> 2. 用户故事
+>必填: 说明用户, 业务/应用场景, 获得结果/收益, 价值/竞争力/优势等
+> 3. 重要性/优先级
+>选填: 说明该需求的重要程度, 优先级, 紧迫性等
+> 4. 目标/计划
+>选填: 说明该需求目标版本或预期日期等
+> 5. 依赖/影响
+>选填: 说明该需求开发, 测试相关依赖信息及工作量估计
+> 6. 验收标准
+>选填: 说明交付物, 预期效果等
### 附录 1.4 发布单模板
diff --git a/articles/305-module-and-checklist-of-spec.md b/articles/305-module-and-checklist-of-spec.md
index 9d46f354d55fa98378698ab0bbf36bab60866f1c..46919a275b1f7ad88cd5f7eb24cd5a22d141dd12 100644
--- a/articles/305-module-and-checklist-of-spec.md
+++ b/articles/305-module-and-checklist-of-spec.md
@@ -20,6 +20,8 @@
| 2022.3.31 | v1.1 | [@伊和](https://gitee.com/yueeranna) | 添加规范 |
| 2022.4.20 | v1.2 | [@伊和](https://gitee.com/yueeranna) | 添加 epoch 版本号说明 |
| 2022.8.3 | v1.3 | [@橘悦](https://gitee.com/happy_orange)| 新增模版和 checklist |
+| 2022.11.03 | v1.4 | [@橘悦](https://gitee.com/happy_orange)| 增加 abi 和 api 的能力 |
+| 2022.11.30 | v1.5 | [@橘悦](https://gitee.com/happy_orange)| 修改 python 类软件的规范 |
| 2023.2.7 | v1.4 | [@橘悦](https://gitee.com/happy_orange) | 增加 Requires 的介绍并修改 doc 包的依赖关系 |
## 2 SPEC File 写作规范
@@ -32,7 +34,7 @@ spec 基础模版,可以使用 rpmdev-newspec 命令生成。
Name: package
Version: 1.0.0
-Release: %{anolis_release}{?dist}
+Release: %{anolis_release}%{?dist}
Summary: Library providing xxx
License: LBPLv2+ and MIT
URL: https://github.com/package
diff --git a/articles/306-instruction-manual-of-spec.md b/articles/306-instruction-manual-of-rpmbuild.md
similarity index 99%
rename from articles/306-instruction-manual-of-spec.md
rename to articles/306-instruction-manual-of-rpmbuild.md
index 94ecda8baf8344bad29baea3b82c42d6f49e84a3..6675adea24f06001d6187ec95802ad93535e5d40 100644
--- a/articles/306-instruction-manual-of-spec.md
+++ b/articles/306-instruction-manual-of-rpmbuild.md
@@ -1,6 +1,6 @@
-# 306 SPEC 指导手册
+# 306 rpmbuild 构建指导手册
该文章介绍了 spec 编写和构建过程中的细节和技术原理,相当于指导手册。
-## 1 spec 宏
+## 1 宏介绍
在软件包构建的过程中,为了防止过多使用硬编码路径和常用路径引用问题,增加了增加了“宏”的概念。将一些常用路径或者变量值通过宏变量定义出来,并可以在整个 Anolis OS 发行版中使用。
spec 宏目前来源于三种:系统宏、各种编程语言的宏和自定义宏
### 1.1 系统宏
diff --git a/articles/308-example-of-epao-nonfree-package.md b/articles/308-example-of-epao-nonfree-package.md
new file mode 100644
index 0000000000000000000000000000000000000000..72c9ce82d021b1f210f197d358609fa727d579e7
--- /dev/null
+++ b/articles/308-example-of-epao-nonfree-package.md
@@ -0,0 +1,327 @@
+# 闭源软件集成样例
+
+### 1. 联系法务,走开源流程
+
+acc 的软件维护者 程斌 同学,在准备好公开策略(公开的频率和方式)之后,联系法务同学,申请了二进制披露序和开源软件合规扫描。这里要注意一点,如果涉及版本更新,则该流程需要重新走一遍。
+
+### 2. 获取法律允许
+
+流程申请之后,获取法务许可,增加一个 Alibaba-Cloud-Compiler-End-User-Agreement.docx 文件,该文件表示用户安装此软件的同意许可。该文件和软件本身的 License 文件必须包含在 rpm 的 filelist 内。
+
+### 3. 本地准备编译环境,制作可用 rpm,并进行本地测试。
+
+1. 需要定义软件的基本信息。
+
+
+2. 包括:name、version、summary、url、descriotion。
+
+3. 注意:version 代表软件版本,release 仅代表构建次数。如果同一个版本,不做源码变更(此处叫二进制变更),仅仅是 spec 的修改,需要保证 version 不变、递增 release;如果在正式发布之后版本发生变更,比如二进制更新了,此处应该变更 version,release 重新从 1 开始。
+
+
+4. 软件维护者准备编译环境。
+
+
+5. 发布的版本尽量和本地的构建环境保持一致,因为构建依赖的版本不同可能会导致 so 运行不起来。即:发布到 Anolis OS 23 的 rpm 尽量使用 Anolis OS 23 的环境编译,发布到 Anolis OS 8 的 rpm 尽量使用 Anolis OS 8 的环境进行编译。
+
+6. acc 这个包比较特殊,特殊在仅对 glibc 的 so 有依赖,且 an8 提供的 glibc.so 在 Anolis OS 23 上也能通用,所以仅构建一次,采用 Anolis OS 8 上构建出来的结果同步发布到 Anolis OS 23 版本。
+
+
+7. 新建 spec([参考 spec 模版](https://gitee.com/anolis/docs/blob/main/articles/305-module-and-checklist-of-spec.md)),并在本地编译出闭源软件的 rpm。
+
+8. rpmbuild 过程出现问题,可以查看 [构建指导手册](../articles/306-instruction-manual-of-rpmbuild.md)
+
+9. 此处直接给出 rpm 样例:
+
+```
+ [root@localhost acc]# ls
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.aarch64.rpm
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.src.rpm
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm
+```
+
+### 4. 制作 rpm tree 需要的 source 文件。
+
+* 需要先创建一个目录(rpmname-version),并且在该目录下创建两个架构目录(x86\_64,aarch64),如果是 noarch 的包,可以建立 noarch 目录或者选择不建立架构目录。
+
+```
+ [root@localhost acc]# mkdir alibaba-cloud-compiler-13.0.1
+ [root@localhost acc]# cd alibaba-cloud-compiler-13.0.1
+ [root@localhost alibaba-cloud-compiler-13.0.1]# mkdir x86_64
+ [root@localhost alibaba-cloud-compiler-13.0.1]# mkdir aarch64
+ [root@localhost alibaba-cloud-compiler-13.0.1]# ls
+ aarch64 x86_64
+ [root@localhost acc]# tree alibaba-cloud-compiler-13.0.1
+ alibaba-cloud-compiler-13.0.1
+ ├── aarch64
+ └── x86_64
+
+ 3 directories, 0 files
+```
+
+* 使用 rpm2cpio 命令将 rpm 解压到刚才创建的带架构的目录下。(注意:路径全部保留)-D 选项可以指定解压的目标目录。
+
+```
+ [root@localhost acc]# rpm2cpio alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm | cpio -divm -D alibaba-cloud-compiler-13.0.1/x86_64
+ [root@localhost acc]# ls alibaba-cloud-compiler-13.0.1
+ aarch64 x86_64
+ [root@localhost acc]# ls alibaba-cloud-compiler-13.0.1/x86_64/
+ opt
+ [root@localhost acc]# ls alibaba-cloud-compiler-13.0.1/x86_64/opt/
+ alibaba-cloud-compiler
+ [root@localhost acc]# ls alibaba-cloud-compiler-13.0.1/x86_64/opt/alibaba-cloud-compiler/
+ bin FLANG-LICENSE.TXT include JEMALLOC.COPYING lib64 libexec LICENSE.TXT README share
+```
+
+* 将另一个架构的 rpm 按照同样方式解压拷贝进去。
+
+```
+ [root@localhost acc]# tar -xvf 20221117-161007-543-#75-anolis8.6.aarch64.release.rpm-13-rpm.tar.gz
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.aarch64.rpm
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.src.rpm
+ summary_message.txt
+ [root@localhost acc]# rpm2cpio alibaba-cloud-compiler-13.0.1-2.fix.an8.aarch64.rpm | cpio -divm -D alibaba-cloud-compiler-13.0.1/aarch64/
+ [root@localhost acc]# ls alibaba-cloud-compiler-13.0.1/aarch64/opt/alibaba-cloud-compiler/
+ bin FLANG-LICENSE.TXT include JEMALLOC.COPYING lib64 libexec LICENSE.TXT README share
+```
+
+* 对整个目录进行压缩,压缩成一个 tar.gz
+
+```
+ [root@localhost acc]# tar -cvf alibaba-cloud-compiler-13.0.1.tar.gz alibaba-cloud-compiler-13.0.1
+ [root@localhost acc]# ls | grep tar.gz
+ 20221117-161007-047-#75-anolis8.6.x86_64.release.rpm-13-rpm.tar.gz
+ 20221117-161007-543-#75-anolis8.6.aarch64.release.rpm-13-rpm.tar.gz
+ alibaba-cloud-compiler-13.0.1.tar.gz
+```
+
+### 5. 走软件引入流程,ospkg-list 进行申请
+
+* 软件维护者创建 issue,按照模版填写需求背景、收益、维护者和目标。写清楚闭源软件的引入背景和原因、闭源的 License 信息等。
+
+* 由橘悦审核 issue 并通过之后,进行建立仓库。仓库地址:https://gitee.com/src-anolis-nonfree/ , a8 分支对应 Anolis OS 8,a23 分支对应 Anolis OS 23。
+
+* 软件维护者在 ospkg-list 仓库中提交代码,参照指导,提交软件信息
+
+
+### 6. 将制作好的 source.tar.gz 和 spec 提交到已经建立的仓库
+
+* 打开 gitee 的仓库地址:https://gitee.com/src-anolis-nonfree/
+
+* 将软件仓库 fork 到个人仓库
+
+* 将准备好的 source.tar.gz 和 spec 文件提交到个人仓库的版本分支(a8或a23)
+
+* 发起 pr,等待门禁通过,如果门禁失败,则需要查看错误原因,并进行解决,重新提交代码后,门禁会重新触发
+
+* 提交者下载门禁构建的 rpm 包,并自行进行功能测试
+
+* 等待 maintainer 或者发行版同学审核通过,合入代码,由发行版同学触发正式构建
+
+* 发行版同学将 rpm 发布到 epao-nonfree 仓库,维护者安装 anolis-epao-nonfree-release 包之后,即可通过 yum install 的方式进行安装对应闭源组件。
+
+
+### 7. 软件和代码样例
+
+#### 软件样例:
+
+alibaba-cloud-compiler
+
+#### 代码样例:
+
+* spec 样例:[https://gitee.com/src-anolis-sig/alibaba-cloud-compiler/blob/a23/alibaba-cloud-compiler.spec](https://gitee.com/src-anolis-sig/alibaba-cloud-compiler/blob/a23/alibaba-cloud-compiler.spec)
+
+* source 样例:[http://build.openanolis.cn/kojifiles/upstream-source/alibaba-cloud-compiler-13.0.1.3.tar.gz.c2df8c535fc55ac9604cc2f3b16cbc60](http://8.131.87.1//kojifiles/upstream-source/alibaba-cloud-compiler-13.0.1.3.tar.gz.c2df8c535fc55ac9604cc2f3b16cbc60)
+
+
+#### 门禁 CI 的检测内容样例:
+
+##### 1. 将 rpm 解压到本地
+
+ [root@localhost acc]# ls
+ 20221117-161007-047-#75-anolis8.6.x86_64.release.rpm-13-rpm.tar.gz summary_message.txt
+ 20221117-161007-543-#75-anolis8.6.aarch64.release.rpm-13-rpm.tar.gz
+ [root@localhost acc]# tar -xvf 20221117-161007-047-#75-anolis8.6.x86_64.release.rpm-13-rpm.tar.gz
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.src.rpm
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm
+
+##### 2. 测试基本安装和卸载
+
+* 安装测试:如果采用 rpm 安装显示缺少运行依赖时,可以采用 yum localinstall 方式进行验证。
+
+```
+ [root@localhost acc]# ls
+ 20221117-161007-047-#75-anolis8.6.x86_64.release.rpm-13-rpm.tar.gz alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm
+ 20221117-161007-543-#75-anolis8.6.aarch64.release.rpm-13-rpm.tar.gz summary_message.txt
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.src.rpm
+ [root@localhost acc]# rpm -ivh alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm
+ error: Failed dependencies:
+ perl(File::Copy) is needed by alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64
+ perl(FindBin) is needed by alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64
+ perl(Hash::Util) is needed by alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64
+ perl(Sys::Hostname) is needed by alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64
+ [root@localhost acc]# yum localinstall alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm
+ Last metadata expiration check: 0:42:27 ago on Thu 03 Aug 2023 01:18:16 PM CST.
+ Dependencies resolved.
+ =====================================================================================================================================
+ Package Architecture Version Repository Size
+ =====================================================================================================================================
+ Upgrading:
+ perl-Errno x86_64 1.36-11.an23 os 14 k
+ perl-interpreter x86_64 4:5.36.1-11.an23 os 70 k
+ perl-libs x86_64 4:5.36.1-11.an23 os 2.1 M
+ Installing dependencies:
+ perl-File-Copy noarch 2.39-11.an23 os 19 k
+ perl-FindBin noarch 1.53-11.an23 os 13 k
+ perl-Hash-Util x86_64 0.28-11.an23 os 33 k
+ perl-Hash-Util-FieldHash x86_64 1.26-11.an23 os 37 k
+ perl-Sys-Hostname x86_64 1.24-11.an23 os 16 k
+ Downgrading:
+ alibaba-cloud-compiler x86_64 13.0.1-2.fix.an8 @commandline 651 M
+
+ Transaction Summary
+ =====================================================================================================================================
+ Install 5 Packages
+ Upgrade 3 Packages
+ Downgrade 1 Package
+
+ Total size: 653 M
+ Total download size: 2.3 M
+ Is this ok [y/N]: y
+ Downloading Packages:
+ (1/8): perl-FindBin-1.53-11.an23.noarch.rpm 60 kB/s | 13 kB 00:00
+ (2/8): perl-Hash-Util-0.28-11.an23.x86_64.rpm 127 kB/s | 33 kB 00:00
+ (3/8): perl-File-Copy-2.39-11.an23.noarch.rpm 69 kB/s | 19 kB 00:00
+ (4/8): perl-Hash-Util-FieldHash-1.26-11.an23.x86_64.rpm 260 kB/s | 37 kB 00:00
+ (5/8): perl-Sys-Hostname-1.24-11.an23.x86_64.rpm 105 kB/s | 16 kB 00:00
+ (6/8): perl-Errno-1.36-11.an23.x86_64.rpm 82 kB/s | 14 kB 00:00
+ (7/8): perl-interpreter-5.36.1-11.an23.x86_64.rpm 551 kB/s | 70 kB 00:00
+ (8/8): perl-libs-5.36.1-11.an23.x86_64.rpm 4.3 MB/s | 2.1 MB 00:00
+ -------------------------------------------------------------------------------------------------------------------------------------
+ Total 2.6 MB/s | 2.3 MB 00:00
+ Running transaction check
+ Transaction check succeeded.
+ Running transaction test
+ Transaction test succeeded.
+ Running
+ Preparing : 1/1
+ Upgrading : perl-libs-4:5.36.1-11.an23.x86_64 1/13
+ Installing : perl-File-Copy-2.39-11.an23.noarch 2/13
+ Installing : perl-FindBin-1.53-11.an23.noarch 3/13
+ Installing : perl-Hash-Util-FieldHash-1.26-11.an23.x86_64 4/13
+ Installing : perl-Hash-Util-0.28-11.an23.x86_64 5/13
+ Installing : perl-Sys-Hostname-1.24-11.an23.x86_64 6/13
+ Upgrading : perl-interpreter-4:5.36.1-11.an23.x86_64 7/13
+ Downgrading : alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64 8/13
+ Upgrading : perl-Errno-1.36-11.an23.x86_64 9/13
+ Cleanup : perl-Errno-1.36-10.an23.x86_64 10/13
+ Cleanup : perl-interpreter-4:5.36.0-10.an23.x86_64 11/13
+ Cleanup : perl-libs-4:5.36.0-10.an23.x86_64 12/13
+ Cleanup : alibaba-cloud-compiler-13.0.1.3-1.an23.x86_64 13/13
+ Running scriptlet: alibaba-cloud-compiler-13.0.1.3-1.an23.x86_64 13/13
+ Verifying : alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64 1/13
+ Verifying : alibaba-cloud-compiler-13.0.1.3-1.an23.x86_64 2/13
+ Verifying : perl-File-Copy-2.39-11.an23.noarch 3/13
+ Verifying : perl-FindBin-1.53-11.an23.noarch 4/13
+ Verifying : perl-Hash-Util-0.28-11.an23.x86_64 5/13
+ Verifying : perl-Hash-Util-FieldHash-1.26-11.an23.x86_64 6/13
+ Verifying : perl-Sys-Hostname-1.24-11.an23.x86_64 7/13
+ Verifying : perl-Errno-1.36-11.an23.x86_64 8/13
+ Verifying : perl-Errno-1.36-10.an23.x86_64 9/13
+ Verifying : perl-interpreter-4:5.36.1-11.an23.x86_64 10/13
+ Verifying : perl-interpreter-4:5.36.0-10.an23.x86_64 11/13
+ Verifying : perl-libs-4:5.36.1-11.an23.x86_64 12/13
+ Verifying : perl-libs-4:5.36.0-10.an23.x86_64 13/13
+
+ Upgraded:
+ perl-Errno-1.36-11.an23.x86_64 perl-interpreter-4:5.36.1-11.an23.x86_64 perl-libs-4:5.36.1-11.an23.x86_64
+ Downgraded:
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64
+ Installed:
+ perl-File-Copy-2.39-11.an23.noarch perl-FindBin-1.53-11.an23.noarch perl-Hash-Util-0.28-11.an23.x86_64
+ perl-Hash-Util-FieldHash-1.26-11.an23.x86_64 perl-Sys-Hostname-1.24-11.an23.x86_64
+
+ Complete!
+```
+
+* 卸载测试:
+
+ * 卸载时不仅要测试包有没有卸载掉,更需要确认安装的文件或者路径是否被清除。
+
+ * 这个版本的 acc 在卸载时文件虽然被清除干净,但是路径没清除,该问题需要解决。解决方案:在 %files 中增加对路径的定义:
+
+```
+%files
+
+%dir /opt
+
+%dir /opt/alibaba-cloud-compiler
+```
+```
+ #
+ [root@localhost acc]# rpm -ql alibaba-cloud-compiler | grep txt
+ /opt/alibaba-cloud-compiler/lib64/clang/13.0.1/share/asan_ignorelist.txt
+ /opt/alibaba-cloud-compiler/lib64/clang/13.0.1/share/cfi_ignorelist.txt
+ /opt/alibaba-cloud-compiler/lib64/clang/13.0.1/share/dfsan_abilist.txt
+ /opt/alibaba-cloud-compiler/lib64/clang/13.0.1/share/hwasan_ignorelist.txt
+ /opt/alibaba-cloud-compiler/lib64/clang/13.0.1/share/msan_ignorelist.txt
+ [root@localhost acc]# rpm -qa alibaba-cloud-compiler
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64
+ [root@localhost acc]# rpm -e alibaba-cloud-compiler
+ [root@localhost acc]# rpm -qa alibaba-cloud-compiler
+ [root@localhost acc]# ls ///opt/alibaba-cloud-compiler/lib64/
+ #### 注意 !!!!这里有问题!!!!
+ [root@localhost acc]# ls /opt/alibaba-cloud-compiler
+ bin include lib64 libexec share
+```
+
+##### 3. 测试该软件对外提供的能力是否产生冲突
+
+* 通过 rpm -qP 查看对外提供的能力,需要对每一个 Provides 的能力进行检测现有源上会不会存在同等功能,尤其是 so,一旦查出来存在相同能力即为有问题的 rpm,需要去除对应能力提供。这里可以用 libflang.so()(64bit) 举例。
+
+```
+ [root@localhost acc]# ls alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm
+ alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm
+ [root@localhost acc]# rpm -qP alibaba-cloud-compiler-13.0.1-2.fix.an8.x86_64.rpm
+ alibaba-cloud-compiler = 13.0.1-2.fix.an8
+ alibaba-cloud-compiler(x86-64) = 13.0.1-2.fix.an8
+ lib64/LLVMgold.so(LLVM_13)(64bit)
+ libRemarks.so.13()(64bit)
+ libRemarks.so.13(LLVM_13)(64bit)
+ libclang_rt.asan-x86_64.so()(64bit)
+ libclang_rt.dyndd-x86_64.so()(64bit)
+ libclang_rt.hwasan-x86_64.so()(64bit)
+ libclang_rt.hwasan_aliases-x86_64.so()(64bit)
+ libclang_rt.memprof-x86_64.so()(64bit)
+ libclang_rt.scudo-x86_64.so()(64bit)
+ libclang_rt.scudo_minimal-x86_64.so()(64bit)
+ libclang_rt.scudo_standalone-x86_64.so()(64bit)
+ libclang_rt.ubsan_minimal-x86_64.so()(64bit)
+ libclang_rt.ubsan_standalone-x86_64.so()(64bit)
+ libflang.so()(64bit)
+ libflangrti.so()(64bit)
+ libpgmath.so()(64bit)
+ pkgconfig(jemalloc) = 5.3.0_0
+
+ # 应该对每个能力进行检测,这里使用 libflang.so()(64bit) 给个样例.这里没有查到,结果正确。
+ [root@localhost acc]# yum repoquery --whatprovides 'libflang.so()(64bit)'
+ Last metadata expiration check: 1:46:37 ago on Thu 03 Aug 2023 01:18:16 PM CST.
+ [root@localhost acc]#
+```
+* 发现上述存在问题,去除相同能力提供方式。
+
+
+* 如果存在包名相同,该问题需要重新定义软件名称
+
+* 如果存在提供相同的 bin ,则需要在构建时,重新创建绝对路径,将二进制存放对应目录,或者在源码中更改生成的 bin 名称,避免产生相同的 bin
+
+* 如果存在相同的 so,不仅需要生成到不同目录,也需要去除 so 的对外提供。
+
+
+spec 中添加如下代码,将其去除:
+```
+ %global _privatelibs (libclang.*|libflang.*|libLTO|libomp.*|libc++.*|libRemarks.*|libpgmath)[.]so.*|(.*jemalloc.*)
+ %global __provides_exclude ^(%{_privatelibs})$
+```
+##### 4. 准备测试文档,将上述测试都输出到测试文档中。
+
+该测试文档可以添加到 pr 的评论中同步提交。
\ No newline at end of file