compass ci构建及软件包编译学习总结

compass ci构建及软件包编译
1 Compass-CI
简介:Compass-CI 是持续集成构建的软件平台。
对我们而言,以将开源软件快速引入 openEuler 社区,并补充更多的测试用例,构建一个开源软件生态系统。
1.1 Compass-CI申请账号

1.2 Compass-CI安装
git clone lkp-tests: Linux Kernel Performance tests
cd lkp-tests
make install
source ~/.${SHELL##*/}rc
1.3 Compass-CI使用方法
注册账号后,可以编写job.yaml文件并通过工具上传任务进行自动化构建
job.yaml编写
job.yaml结构
job.yaml里主要是一堆参数,通过配置参数来拉起构建,主要有下面几个:
suite:为测试名称
category:测试的类型(主要有:benchmarch、functional)
repo_addr: 对应软件源码包链接
upstream_repo:二进制源码包路径链接
upstream_branch:二进制源码包版本分支
custom_repo_name:最终上传到的文件夹
testbox:拉起的构建机器类型及性能配置
os:系统名称
os_version:系统的版本
os_arch:系统类型(x86或arm)
1.3.1 submit命令
submit命令具体可以参考:doc/job/submit/submit-job.zh.md · Fengguang/compass-ci - 码云 - 开源中国 (gitee.com)链接
在使用的过程中我们一般会在z9环境上执行命令:submit xxx.yaml (上一步写好的yaml文件),执行后,会在屏幕回显出 id=z9.xxxxxxxx,然后执行escd z9.xxxxxxxx,进入了到一个目录中,该目录下会生成一个job.yaml文件,这个job.yaml文件是在xxxx.yaml的基础上加了一堆参数生成的,最后我们执行 submit -m –c job.yaml –i ssh.yaml,进入测试机,等待编译执行
2 软件包编译
2.1 rpmbuild脚本

2.2 rpm常用命令
RPM命令常用参数
-ivh 安装
-Uvh 升级
-Uvh --force 强制安装
-e 卸载
-qi 显示包信息
-qa 显示包
-qf 显示目录所属包
-q --qf ‘%{version}’ xxx 通过rpm宏的形式 查询软件包相关信息
rpm --eval “%{_datadir}” 查找变量对应的值
2.3 rpm打包
 环境准备工作:
yum install rpm-build
yum install rpmdevtools
rpmdev-setuptree命令查看工作目录:
 工作目录结构
SPECS:编译配置文件,主要告诉rpmbuild如何打包
SOURCES:源码包路径
BUILD:rpm包编译路径
BUILDROOT:存放最终安装用到的安装目录
RPMS:生成二进制rpm保存路径
SRPMS:生成源码rpm包保存路径
2.3.1 spec脚本内容详解
 spec脚本变量
Name 标签就是软件名
Version 标签为版本号
Release 是发布编号
Summary 标签是简要说明,英文的话第一个字母应大写
License 标签说明软件包的协议版本,审查软件的 License 状态是打包者的职责,这可以通过检查源码或 LICENSE 文件,或与作者沟通来完成
URL: 软件的URI
Group: 软件分组,
Patch: 补丁源码
Vendor: 打包组织或者人员
Patch: 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
%description: 软件的详细说明
%define: 预定义的变量,例如定义日志路径: _logpath /var/log/weblog
%prep: 预备参数,通常为 %setup -q
%build: 编译参数 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/……
%install: 安装步骤,此时需要指定安装路径,创建编译时自动生成目录,复制配置文件至所对应的目录中(这一步比较重要!)
%pre: 安装前需要做的任务,如:创建用户
%post: 安装后需要做的任务 如:自动启动的任务
%preun: 卸载前需要做的任务 如:停止任务
%postun: 卸载后需要做的任务 如:删除用户,删除/备份业务数据
%clean: 清除上次编译生成的临时文件,就是上文提到的虚拟目录
%files: 设置文件属性,包含编译文件需要生成的目录、文件以及分配所对应的权限
%changelog: 修改历史
 spec宏指令
1.%prep阶段
阶段进行实际的打包准备工作,其功能主要有:
① 将文件 ( SOURCES/) 解压到构建目录 (BUILD/)
② 应用 Patch(打补丁) (SOURCES/ => BUILD/)
③ 描述 rm -rf $RPM_BUILD_ROOT
④ 描述或编辑本部分用到的命令到 PreReq
⑤ 通过 -b .XXX 描述补丁备份
%autosetup:命令用于解压源码包(命令选项:① -n name : 如果源码包解压后的目录名称与 RPM 名称不同,此选项用于指定正确的目录名称;②-c name : 如果源码包解压后包含多个目录,而不是单个目录时,此选项可以创建名为 name 的目录,并在其中解压;)
%setup:用于将软件包打开
%patch:可将补丁文件加入解
%patch
这个宏将头部定义的补丁应用于源代码。如果定义了多个补丁,它可以用一个数字的参数来指示应用哪个补丁文件。它也接受 -b extension 参数,指示 RPM 在打补丁之前,将文件备份为扩展名是 extension 的文件。

通常补丁都会一起在源码 tar.gz 包中,或放到 SOURCES 目录下。一般参数为:
%patch -p1 使用前面定义的 Patch 补丁进行,-p1是忽略 patch 的第一层目录
%Patch2 -p1 -b xxx.patch打上指定的补丁,-b是指生成备份文件
2.%build阶段
%build阶段是对解压到%_builddir下的源码进行编译的阶段,整个过程在该目录下完成,一般是执行执行常见的 configure 和 make 操作。
%configure:执行源代码的configure配置。会自动将 prefix 设置成 /usr。
常见命令:
%configure
make %{?_smp_mflags} OPTIMIZE=“%{optflags}”
3.%install阶段
安装阶段,执行 make install 命令操作。打包到 rpm 软件包里的文件从 %builddir 里拷贝到 %_buildrootdir 里对应的目录开始把软件安装到虚拟的根目录中。这个阶段会在 %buildrootdir 目录里建好目录结构,然后将需要里

4.%check 阶段
如果需要执行测试,使用 %check 是个好主意。测试代码应写入 %check 部分(紧接在 %install 之后,因为需要测试 %{buildroot} 中的文件),而不是写入 %{build} 部分,这样才能在必要时忽略测试

5.%files 部分
本段是文件段,主要用来说明会将 %{buildroot} 目录下的哪些文件和目录最终打包到rpm包里。定义软件包所包含的文件,分为三类:
① 说明文档(doc)
② 配置文件(config)
③ 执行程序
这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径
%clean
清理段,可以通过 --clean 删除 BUILD

编译完成后一些清理工作,主要包括对 %{buildroot} 目录的清空(这不是必须的),通常执行诸如 make clean 之类的命令。

%changelog
本段是修改日志段,记录 spec 的修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。每一个修改日志都有这样一种格式:
第一行是:* 星期 月 日 年 修改人 电子信箱。其中:星期、月份均用英文形式的前 3 个字母,用中文会报错。
接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅。
%changelog

  • Initial version
    2.3.2 RPM包构建
     RPM打包
    进入SPECS路径执行 rpmbuild –ba xxx.spec
    如果成功,RPM 会保存至 ~/rpmbuild/RPMS,SRPM 会保存至 ~/rpmbuild/SRPMS
    如果失败,请查看 BUILD 目录的相应编译日志。为了帮助调试,可以用 --short-circuit 选项来忽略成功的阶段
    如果只想创建 RPM,请执行:
    rpmbuild -bb program.spec
    如果只想创建 SRPM(不需要执行 %prep 或 %build 或其他阶段),请执行:
    rpmbuild -bs program.spec
     rpmlint检查
    为避免常见错误,请先使用 rpmlint 查找 SPEC 文件的错误:
    rpmlint program.spec
    也可以使用 rpmlint 测试已构建的 RPM 包,检查 SPEC/RPM/SRPM 是否存在错误。你需要在发布软件包之前,解决这些警告。此页面 提供一些常见问题的解释。如果你位于 SPEC 目录中,请执行:
    rpmlint NAME.spec …/RPMS//NAME.rpm …/SRPMS/NAME*.rpm
     rpm安装
    如果看上去正常,以 root 身份安装它们:
    rpm -ivp package1.rpm package2.rpm package3.rpm
    3 软件包构建报错问题
    错误定位流程:查看报错error,大体看看啥情况,然后拿到job id
    然后执行escd {job id},进入任务工作空间,执行submit –m –c job.yaml –i ssh.yaml
    命令,等待之行结束,进入rpm编译空间rpmbuild/SPECS,执行rpmbuild –ba xxx.spec,
    结束后看失败回显,定位在spec脚本哪块失败的,最后需要看具体情况具体分析解决。
    3.1 常见的失败案例
    3.1.1 source软件包获取不到
    例如:Archlinux 给出的下载地址为 ftp://integral.physics.muni.cz/pub/fitspng/fitspng-2.0.tar.gz
    无法通过该链接获取到tar包,网页403
    这是一种很常见的情况,由于原网站结构变更或软件包升级等相关原因导致链接不可用。
    可以尝试 ftp://integral.physics.muni.cz/pub/fitspng/ 是否可访问,并选型其他版本。(或修改 ftp 为 http)
    Fitspng 刚好是个典型的例子,通过上述两种办法都无法找到,可以直接访问 integral.physics.muni.cz 网页主站,寻找相关下载包的信息 查找download或包名关键字
    3.1.2 git下载失败相关的问题
    3.1.3 获取 Patch时要注意
    和版本匹配,补丁是基于当前这个版本的源码包进行问题修复的,如果选取了高版本或低版本的源码包,使用patch时需要先判断是否需要引入补
    3.2 软件包编译安装阶段问题
    3.2.1 cmake失败

这里只能看到是 这里Cmake 是没有找到指定的目录
上机器复现问题,可以看到日志:

这个其实是源码没有下载下来的问题,cmake指定的目录不存在,定位问题的方向错了
3.2.2 编译缺少头文件
例:编译缺少头文件

通过日志可以看到缺少 ncurses.h 头文件,那就说明,当前的环境需要安装一个新的包,来提供这个文件,即需要增加构建依赖 BuildRequires:xxx
但是具体哪个包提供了这个文件,搜一下基本可以确定。或者通过yum list 命令来查看:

头文件一般由 xxx-lib,libxxx,xxx-devel类似这种结构的包提供,上图可见当前已经安装了ncurses-libs,依旧是缺少文件,很有可能是devel包提供的。

安装依赖包,并在spec中新增Buildrequires:ncurses-devel 即可解决当前问题
3.2.3 在configure阶段缺少文件
例:Flowgrind

Configure缺少文件 同理2.2 添加对应依赖包即可
Pacp.h → libpcap-devel gsl_rng.h → gsl-devel
3.2.4 缺少模块
例:Flexml

报错信息很明确,需要安装缺少的依赖模块
这个是工具转换spec时候把构建依赖写成了安装依赖导致的问题。
3.2.5 configure失败 缺少依赖
例:Fldiff

修改spec中 Requires 为 BuildRequires 修改fltk 为 fltk-devel

缺少对应库文件,需要增加编译依赖

修改PKGBUILD脚本中,转换到spec中的Requires为BuildRequires。问题基本都属于构建的时候缺少依赖包提供的文件,模块,库,符合导致的编译失败。新增对应的依赖包,即可解决问题

1 个赞