OpenCloudOS CI门禁问题排查手册
门禁管理员:nilusyi、cunshunxia、wynnfeng、zoedong
1. 门禁流程简介
相关指导文档:
- OpenCloudOS 社区版本贡献指南: https://docs.opencloudos.org/contribution/how-to-contribute-oc/
- 软件包管理原则:https://docs.opencloudos.org/contribution/software-package-management-principles/
- 软件包打包指导:https://docs.opencloudos.org/contribution/software-packaging-guide/
2. 门禁常用操作
2.1 门禁支持命令列表
门禁支持在pull request页面输入对应命令,触发门禁不同功能,具体命令如下:
类型 | 命令 | |
---|---|---|
pull request | /retest | 触发门禁测试 |
/check-pass | 强制通过门禁检查,需权限检查 | |
/approve | 同意 pull request 并合并,需权限检查 | |
/help | 显示帮助信息 |
2.2 重试
门禁测试正常由PR触发,后续如果由新commit推送,会自动触发重试
如果需要手动重新执行门禁测试,请评论/retest
。
3. 门禁检查项以及问题排查
3.1 检查项介绍
测试项名称 | 子测试项 | 主要检查内容 | SUCCESS | WARNING | FAILED |
---|---|---|---|---|---|
spec | 检查spec文件里changelog和version,release是否规范 | 成功 | / | changelog格式不对或者version, release没有递增 | |
source | 获取source文件中的源码包 | 成功 | / | 从文件服务器获取源码包失败 | |
srpmbuild | 生成source rpm包 | 成功 | / | 制作srpm包失败 | |
rpmbuild | rpm编译 | 成功 | / | 编译失败 | |
install | 安装测试 | 成功 | / | 安装失败 | |
compatibility | subrpmlist | 子包数量变化 | 无变化 | 子包增加 | 子包减少 |
filelist | 包含文件列表变化 | 无变化 | 包文件发生增加 | 包文件发生减少 | |
ability | 包提供的requires/provides等能力变化 | 无变化 | REQUIRES/CONFLICTS/OBSOLETES/RECOMMENDS变化、PROVIDES增加 | PROVIDES减少 | |
abi | ABI差异 | 无变化 | / | 软件包ABI发生变化并且影响ABI兼容性 | |
api | API差异 | 无变化 | / | 软件包API发生变化并且影响API兼容性 | |
executable | 可执行文件执行输出差异 | 无变化 | / | 包中可执行文件运行输出发生变化 | |
conf | 配置文件配置项差异 | 无变化 | 其余配置文件发生变化 | 宏、系统关键路径配置文件变化 |
3.2 问题排查方式
3.2.1 spec失败
请打开build_info,确认其错误信息,也可以参考spec检查项相应备注栏信息
一、changelog相关失败(build_info中)
- 错误:
changelog must start with *
: 说明changelog 没有以*
开头 - 错误:
bad mailbox in changelog:
: 说明邮箱格式不对 - 错误:
cannot extract date from changelog
: 说明changelog缺少日期,或者提取失败 - 错误:
bad date in changelog:
: 日期格式不正确 - 错误:
bogus date in changelog
: 存在虚假日期 - 错误:
spec's version or release not consistant with changelog
: spec的版本号和changelog不一致 - 警告:
changelog format error
: changelog的内容格式不对,应该具有[Type]
和[DESC]
两个字段
其中对于changelog format error
,请参考如下changelog 格式:
注意:Type字段只能是bugfix, security, other
* Thu Oct 12 2023 wynnfeng <wynnfeng@tencent.com> - 0.16-6
- [Type] bugfix
- [DESC] fix xxx problem
- 错误:
version xxx is not greater than xxx
: 说明spec的Version比旧包的小 - 错误:
release xxx is not greater than xxx
: 说明Version一致, spec的Release比旧包小 - 错误:
release xxx is not 1
: 说明Version增加, Release应为1
3.2.2 source失败
rpm仓库的源码包存放在文件服务器中,通过在仓库中的sources
文件中配置文件名和HASH值确定。
SHA512 (systemd-253.tar.gz) = 3bbc431a292ab590b70d3b490a528f71d30ccf478ddfa66d1c210f40c260ef49ac30651c19f2d073acf38d68398a4a6fbf95391f0e3ea0333d94b9d4e81d514f
如果该步骤失败,需要确认以下情况
- 是否已将源码文件上传到文件服务器中
- sources文件中是否配置了正确的文件名和SHA512值
如果排除上述问题后,该项仍然失败,请联系门禁管理员。
3.2.3 srpmbuild检查失败
source rpm制作是编译的前序步骤,可以通过本地执行进行问题排查。 srpm包制作流程参考以下命令:
rpmdev-setuptools
cd your-project
cp *spec ~/rpmbuild/SPECS/
cp * ~/rpmbuild/SOURCES/
rpmbuild -bs ~/rpmbuild/SPECS/your-project.spec
3.2.4 rpmbuild失败
该步骤为使用上一步骤生成的srpm包提交给koji执行编译任务。 如果该步骤失败,可以点击下图中的链接进入koji任务查看
3.2.5 install失败
该步骤会将编译出来的rpm包进行dnf安装测试,如果该步骤失败,通过以下步骤查找日志:
- 点击install检查的详情链接
3.2.6 compatibility失败
该项检查目前主要分为七个子检查,主要检查当前提交的版本与上一个版本之间的兼容性差异。 每一个子检查都对应具体的详细日志的链接,如下图红框:
3.2.6.1 subrpmlist失败
如果subrpmlist失败,说明相比于上一个版本,该次提交的版本造成了子包的增加或者删除,在rpmlist
日志中会找到如下日志
[2023-11-02T09:32:27.781Z] 旧包的包列表:4, 详情:['mockito-3.12.4-4.ocs23.noarch.rpm', 'mockito-inline-3.12.4-4.ocs23.noarch.rpm', 'mockito-3.12.4-4.ocs23.src.rpm', 'mockito-javadoc-3.12.4-4.ocs23.noarch.rpm']
[2023-11-02T09:32:27.781Z] 新包的包列表:5, 详情:['mockito-javadoc-3.12.4-5.ocs23.noarch.rpm', 'mockito-inline-3.12.4-5.ocs23.noarch.rpm', 'mockito-3.12.4-5.ocs23.noarch.rpm', 'mockito-3.12.4-5.ocs23.src.rpm', 'mockito-junit-jupiter-3.12.4-5.ocs23.noarch.rpm']
[2023-11-02T09:32:27.781Z] 2023-11-02 17:32:27,757 - [31mERROR[0m - mockito - check_subrpmlist failed
packages
字段来排查,例如
%package libs
3.2.6.2 filelist失败
该项检查如果失败,说明相同rpm包中打包的文件发生了变化,在filelist_rpmdiff
日志中会找到如下日志
可以搜索list files are in
字段匹配到具体日志。
打包的文件通常是由spec文件中的files
字段指定,例如
%files devel
例如: https://gitee.com/opencloudos-stream/mockito/pulls/1
3.2.6.3 ability失败
该项检查如果告警或者失败,说明相比于上一个版本,该rpm包所提供的能力发生了变化,在ability_rpmdiff
日志中会找到如下日志
可以搜索list requires/provides are in
字段匹配到具体日志
也可以本地通过rpm -qR
或者rpm -qP
命令检查确认
3.2.6.4 abi失败
该项检查如果失败,说明rpm包中的动态库发生了兼容性变化,在summary
日志中会找到如下日志,打印了ABI变化的的动态库以及变化比例,Binary compatibility
不为100%即认为ABI不兼容。
[2023-11-06T03:55:18.047Z] Preparing, please wait ...
[2023-11-06T03:55:18.047Z] Comparing ABIs ...
[2023-11-06T03:55:18.047Z] Comparing APIs ...
[2023-11-06T03:55:18.047Z] Creating compatibility report ...
[2023-11-06T03:55:18.047Z] Binary compatibility: 75%
[2023-11-06T03:55:18.047Z] Source compatibility: 100%
[2023-11-06T03:55:18.047Z] Total binary compatibility problems: 1, warnings: 0
[2023-11-06T03:55:18.047Z] Total source compatibility problems: 0, warnings: 0
[2023-11-06T03:55:18.047Z] Report: compat_reports/filter-aaaa.so/9.18.18-2.ocs23_to_9.18.18-3.ocs23/compat_report.xml
[2023-11-06T03:55:18.047Z] ======================================== bind-9.18.18-2.ocs23.x86_64.rpm ========================================
动态库名filter-aaaa.so
在路径中可以看到,最后分割线中的为所属的rpm包名。
下面解释summary.log
中出现下面几种情况的日志以及对应的含义
有变化且有影响
1 外部符号变化,有影响包
如果有如下日志,说明当前包中的ABI发生了变化,并且此变化对外部其他依赖他的软件包产生了影响
Following packages are affected by ABI difference:
+------------------+---------------------------------------+-------------------------------------------+
| Package Name | Related file | Symbol |
+------------------+---------------------------------------+-------------------------------------------+
| mod_proxy_html | mod_proxy_html.so | htmlCreatePushParserCtxt@@LIBXML2_2.4.30 |
+------------------+---------------------------------------+-------------------------------------------+
| nghttp2 | nghttp | htmlCreatePushParserCtxt@@LIBXML2_2.4.30 |
+------------------+---------------------------------------+-------------------------------------------+
| php-xml | dom.so | htmlCtxtUseOptions@@LIBXML2_2.6.0 |
+------------------+---------------------------------------+-------------------------------------------+
2 动态库soname变化
如果有如下日志,说明当前包中的动态库soname发生变化,只要有软件包依赖当前库,就一定会有兼容性问题
[WARNING] Library soname version changed from [libbfd-2.38.so] to [libbfd-2.40.so]
有变化但无影响
1 外部符号变化,但无影响包
如果有如下日志,说明当前包对外暴露的符号发生了变化,但是未找到受影响的软件包,需要结合CI重编来确认影响
No packages found affected by changed symbols.
2 内部符号变化
ABI affected Symbols are in private header files. They can only be used internally
特殊情况
1 debuginfo包缺失
如果有如下日志,说明当前包无debuginfo包,无法进行兼容性检查,需要人工确认兼容性
No debug info of {file} in given .debug, please use devel pkg.
2 旧包中的库未在新包中找到
如果有如下日志,说明当前包中有库删除或者重命名,需要通过CI重编确认影响
is not found in new rpm. If the name of library is not changed, please contact the administrator.
3 动态库软连接被破坏
如果有如下日志,说明当前包中有库的软连接被破坏,需要人工确认兼容性
Library {file_b_lib} changes to a broken symlink in {file_b}
4 无法区分对外对内符号
如果有如下日志,说明当前包无devel包,无法区分受影响的符号是内部使用还是外部使用,需要通过CI测试重编确认影响
devel pkg XXX not found, please check affected symbols which may be in private headers.
5 当前不支持检查的软件包
如果有如下日志,说明当前包的语言类型不支持兼容性检查,需要人工确认兼容性
{rpm_name} is not supported by ABI check, please review it manully.
如何解读abidiff详细日志
在abidiff
日志中会打印出具体的变化内容:
Processing source report...
Test library: libxml2.so.2.10.4
Test Version: 2.10.4-4.ocs23 VS 2.11.5-1.ocs23
Test Results:
Headers:
- c14n.h
- catalog.h
- chvalid.h
- debugXML.h
- dict.h
- encoding.h
- entities.h
- globals.h
...
...
Libs:
- libxml2.so.2.10.4
Symbols: 1670
Types: 431
Verdict: incompatible
Affected: 3.2
Removed Symbols:
Header: parserInternals.h
Library:
Symbol: xmlErrMemory
Library: libxml2.so.2.10.4
Symbol: __xmlErrEncoding
Header: xmlerror.h Library: libxml2.so.2.10.4
Symbol: __xmlSimpleError
Symbol: __xmlRaiseError
Problems with severity 'High':
Header: entities.h
Type: struct _xmlEntity, Problem: Renamed_Field, Change: Field checked has been renamed to flags.
Affected Symbol: getEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
Affected Symbol: getParameterEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
Affected Symbol: xmlAddDocEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
Affected Symbol: xmlAddDtdEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
Affected Symbol: xmlDumpEntityDecl, Comment: 2nd parameter ent (pointer) has base type struct _xmlEntity.
Affected Symbol: xmlGetDocEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
Affected Symbol: xmlGetDtdEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
Affected Symbol: xmlGetParameterEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
Affected Symbol: xmlGetPredefinedEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
Affected Symbol: xmlHandleEntity, Comment: 2nd parameter entity (pointer) has base type struct _xmlEntity.
该文件主要分为几个部分
- Headers 涉及的头文件
- Libs 检查的动态库
- Verdict 是否兼容
- Affected 影响分数
- Removed/Added Symbols 删除/新增的符号
- Problems with severity XXX 变化的符号以及具体变化内容
其中Problems with severity XXX
单独介绍,以上面的日志为例:
第一行,兼容性变化等级:ABI/API问题分为4个等级,其中除了Safe
等级外,其他的问题都被认为存在兼容性问题,这里等级为High,表示大概率会造成兼容性影响的变化
Problems with severity 'Safe':
Problems with severity 'Low':
Problems with severity 'Medium':
Problems with severity 'High':
第二行,问题位置:问题存在于头文件entities.h
中
Header: entities.h
第三行,涉及的结构体为struct _xmlEntity
,具体的问题是该结构体中有一个成员checked
被重命名成了flags
Type: struct _xmlEntity, Problem: Renamed_Field, Change: Field checked has been renamed to flags.
第三行及以后,变化所造成的影响:影响了哪些函数符号,比如getEntity
,原因为他的返回值含有struct _xmlEntity
Affected Symbol: getEntity, Comment: Return value (pointer) has base type struct _xmlEntity.
然后结合源码,定位思路一般是:影响的函数符号-->涉及的参数-->变化的结构体成员
注意,这里的变化不一定为当前提交产生,也可能是编译依赖变化导致,可参考https://gitee.com/opencloudos-stream/mod_security/pulls/4
如果对该项检查仍有疑问,请联系门禁管理员。
3.2.5.5 api失败
C/C++/JAVA 兼容性检查结果
该项检查如果失败,说明该版本相比于上一个版本,API接口发生了变化,在summary
日志中有与ABI检查一样的打印,不同的是,在对动态库的检查中Source compatibility
不为100%,而不是Binary compatibility
。
Source compatibility: 97.8%
关于API详细变化的日志与ABI一样可以在abidiff
中查看。
Python 兼容性检查结果
如果在summary
中发现如下日志,说明该包中的python文件发生了API变化,并且对外部包产生了影响,需要结合CI测试重编确认影响
[WARNING] Function django.utils.timezone.*utc found in RPM package: python3-openstack_auth, file: /tmp/tmphzblwo38/python3-openstack_auth/usr/lib/python3.11/site-packages/openstack_auth/utils.py
如果需要详细确认python文件变化,需要进入具体的流水线日志查看,进入链接后进入下图位置:
详细的变化会以表格形式打印出
- [Class]前缀表示类
- @前缀表示有装饰器装饰的函数
- *前缀表示变量
+------------------------------------------------------------------------+-------------------------------------+-------------------+------------------------------------------+
| File | Added Symbols | Removed Symbols | Changed Symbols |
+------------------------------------------------------------------------+-------------------------------------+-------------------+------------------------------------------+
| usr/lib/python_[pyversion]/site-packages/oslo_concurrency/lockutils.py | AcquireLockFailedException.__str__ | *ReaderWriterLock | internal_lock(2 -> 3) severity:Low |
| | ReaderWriterLock.__init__ | | contextmanager@lock(8 -> 9) severity:Low |
| | AcquireLockFailedException.__init__ | | synchronized(7 -> 8) severity:Low |
| | [Class] ReaderWriterLock | | |
| | [Class] AcquireLockFailedException | | |
+------------------------------------------------------------------------+-------------------------------------+-------------------+------------------------------------------+
3.2.5.6 executable失败
该项检查如果失败,说明该版本中的可执行文件,相比于上一个版本,执行--help/-h/-v命令输出发生了变化
3.2.5.7 conf失败
该项检查如果失败,说明该版本中的配置文件相比于上一个版本发生了变化,配置文件类型主要包括以下:
- .conf后缀文件
- .yaml后缀文件
- .xml后缀文件
- .json后缀文件
- macros.开头文件
- /etc/、/usr/lib/systemd/目录下文件
在[arch]_conf
日志中会出现以下日志
Configuration file differences for XXX.conf
-
以下日志说明配置项 {key} 被删除
{key} is missing in the second file
-
以下日志说明配置项 {key} 的值变更,由XXX变为YYY
{key} has different values: XXX != YYY
-
以下日志说明 {key} 为新增配置项
{key} is missing in the first file
例如: https://gitee.com/opencloudos-stream/xbean/pulls/1
4. 重编测试
部分包、库如果发生兼容性变化,会通过重编依赖他们的包的方式检查。 出现下列情况时会触发重编测试:
- 包提供能力(provides)删除
- 包ABI发生变化
- 包API发生变化
- 可执行文件输出发生变化(--help/-h/-v)
- 宏文件发生变化
如果包因为ABI变化需要正式重编,CI流水线会创建对应的issue来通知以及跟踪。
5. 其余常见问题
待补充