[ 已解决 ] 本地如何做和 obs 一样严格的 check

自己在本地测试 spec 文件,总是很好的就通过了,但是放在 obs 上,就总是不满足这不满足那,有什么方法能够在本地构建一个和 obs 完全一样的打包环境吗?最起码所有的 check 都做一做,不用等半天 obs 然后说不满足条件。

OBS 有三个 check:brp-check-suse,post-build-checks 和 rpmlint。

第一个和第二个是 SuSE 独有的:

github.com/openSUSE/brp-check-suse

github.com/openSUSE/post-build-checks

第三个是 rpm 系统独有的。

有两种方法可以本地实现:

第一个是不用 rpmbuild -ba 用 osc build --local-package 命令。

优点是环境和 obs 完全一样,这个命令就是把服务器的虚拟编译环境整个搬到本地。缺点是:

  1. 要下载一个相当于 minimal installation 的依赖到本地,就是所谓的 108 将(minimal installation 所需的 108 个软件包)。大概 1.5 GB,两种官方架构都要就是 3 GB。
  2. 这些软件包是被放在 /var 的,很少人这个盘会很大,一般是和 / 分在一起。
  3. 所有编译需要的软件包都是在线下载的。所以你在 108 将基础上编译一个比如 kdoubanfm 这样的 KDE 小程序,下载时间会很长很长。

当然也有 tweak,比如把 ISO 解压开,链接到 /var 的某个位置来冒充已经下载好了的软件包。因为 osc build 的 init 过程其实就是在本地做一个软件源。

总之网速不够快就会很折腾,这就是为什么我们现在不提供显卡驱动的 rpm 了(最早我和 hillwood 有做过),太麻烦了,i586 又要重新下载一遍。优点也很明显,因为本地 x86_64 编译 i586 更折腾。

第二个是本地安装 brp-check-suse 和 rpmlint。

brp-check-suse 很简单,装上不用配置直接就能用:

calling /usr/lib/rpm/brp-suse.d/brp-30-desktop
WARNING: '/usr/lib/rpm/brp-desktop.data/suse-screensavers.menu' does not exist
WARNING: '/usr/lib/rpm/brp-desktop.data/preferences-gnome.menu' does not exist
WARNING: '/usr/lib/rpm/brp-desktop.data/applications-kmenuedit.menu' does not exist
calling /usr/lib/rpm/brp-suse.d/brp-35-rpath
calling /usr/lib/rpm/brp-suse.d/brp-40-rootfs
calling /usr/lib/rpm/brp-suse.d/brp-45-tcl
calling /usr/lib/rpm/brp-suse.d/brp-50-check-python
calling /usr/lib/rpm/brp-suse.d/brp-55-boot-scripts
calling /usr/lib/rpm/brp-suse.d/brp-60-hook
calling /usr/lib/rpm/brp-suse.d/brp-65-lib64-linux
sf@suse.de: if you find problems with this script, drop me a note

现在本地编译日志里会多一个这个。

至于 rpmlint 是用来检查 srpm 文件的。

$ rpmlint -i zenity-3.10.2-0.src.rpm 
zenity.src: W: spelling-error %description -l en_US gdialog -> dialog, catalog, dialogue
The value of this tag appears to be misspelled. Please double-check.

zenity.src: W: spelling-error %description -l en_US commandline -> command line, command-line, commanding
The value of this tag appears to be misspelled. Please double-check.

zenity.src: E: no-changelogname-tag
There is no changelog. Please insert a '%changelog' section heading in your
spec file and prepare your changes file using e.g. the 'osc vc' command.

1 packages and 0 specfiles checked; 1 errors, 2 warnings.

明白怎么用了吧。

至于 post-build-checks 这个软件包,一是我没找到怎么调用它(它的作用就是测试安装 rpm,看看那些 %pre %post %preun %postun 什么的有没有错误),二是它的软件包描述里有这样一句话:

感觉大意是除了编译虚拟机其它不要装。我实际安装了一下也没有感觉到本地编译过程有所变化。

论坛提醒被 gmail 扔垃圾邮件了, 乃至今天才看到回复.

我去学着测试下.

另外, 你提到的 108 个安装包, 是下载了以后就一直用本地的了吗, 还是每次编译都要把这 3 个 G 全下载一遍?

每次下载之后就会 cache 住,不需要全下载一遍。

但是你上次编译失败后下次再跑还要全部重新编译,这个在编译编译器或者 kernel 的时候其实很烦。希望 OBS 能够智能保存已经编译好的文件(类似 makefile)这样……