前言
本文旨在解说软件包维护的概括流程,使中文地区一些英文能力稍遜的 Fedora 软件包维护人员能够更了解如何管理软件包。希望更多使用中文的 Fedora 爱好者能够加入,参与建设 Fedora 社区。
本文仍为初稿状态,内容仍在校正中;如有错误,请不吝指正。
准备工作
安装软件包维护工具
作为一位新的 Fedora 软件包维护人员,你需要拥有一套 Fedora 的软件包维护工具;本文建议你首先安装 fedora-packager 这个软件包。由于 fedora-packager 依赖了 Fedora 众多相关的软件包管理工具,因此安装此软件包也随即会安装上 rpmdevtools、mock、koji 和 bodhi 等工具。这些工具在后面的软件包维护中起到重要作用。
安装 fedora-packager 软件包,请在终端界面輸入以下指令:
su -c 'yum install fedora-packager'
申请 FAS 和 Bugzilla 帐户
要正式成为 Fedora 的软件包维护人员,你需要申請一个 FAS 帐号和 Red Hat Bugzilla 的帐号。申请这两个用户的方法都非常简单,详細步骤可查阅其他有关文档,本文只就此简述。
- 申请 FAS 帐户,地址如下: https://admin.fedoraproject.org/accounts/ 。
- 注冊完成后,还需要登录 FAS 签署 CLA、上传公共 SSH 密钥、PGP密钥,并申请加入 Fedora Packager CVS Commit Group。
- 申请Bugzilla帐户,地址如下: https://bugzilla.redhat.com/ 。
- 注意,在 FAS 注册所使用的电子邮件地址必须要与 Bugzilla 的电子邮件地址一致。
查询你要打包的软件是否已经存在于Fedora Package Database
为新软件打包之前,需要在 Fedora Package Database https://admin.fedoraproject.org/pkgdb 查询该软件包是否已经存在。如果存在,则无需要为该软件制作RPM包,因为软件仓库已经有该软件。另外,进入Fedora官方源的软件包必须是使用符合 OSL 的开源许可证,如果是非开源但是免费且可自由分发的软件,則建议向 RPM Fusion 申请。被 Fedora 任何的许可证可在以下链接查阅: http://fedoraproject.org/wiki/Licensing#SoftwareLicenses
在本地计算机构建一个rpm包
要成为软件包维护人员,首先要学会如何构建一个软件包。在此简略地介绍一下在本地计算机上构建一个软件包的步驟。
首先在本地 rpmbuild 的编译树。从 Fedora Core 5 开始,Fedora 不建议打包者使用 root 来构建 RPM 包,所以一般在普通用户的 home 目录上建立编译树。建立编译树的命令如下:
rpmdev-setuptree
此时,rpmdevtools 会在 $HOME 目录下建立一个 rpmbuild 的目录,并且里面会有六个目录:SOURCES, SRPMS, RPMS, BUILD, BUILDROOT, SPECS。然后以 foo(假设软件包名称为 foo) 在SPECS目录里新建一个 spec 文件。
rpmdev-newspec foo
编辑好 spec 文件后,把源代码包和补丁都放到 SOURCES 目录,那就可以正式构建 rpm 包了:
rpmbuild -ba foo.spec
维护者可以根据 rpmbuild 的各项参数进行调节,"-ba" 参数会构建出 src.rpm 包和 rpm包。然后是用 rpmlint 检测 rpm 包是否出现错误。rpmlint 可以检查 spec 文件、rpm 包和 src.rpm 包。
rpmlint pkgname.spec rpmlint pkgname.src.rpm rpmlint pkgname.i586.rpm // 若该软件包是i586架构的。
关于本地打包,可参考 RPM 打包教学 https://fedoraproject.org/wiki/Zh/Docs/RPM%E6%89%93%E5%8C%85%E6%95%99%E5%AD%B8
使用 Mock 和 Koji 去测试 RPM 包
Mock
Mock 是一個用本地系統模拟编译环境,测试 RPM 建立正确性的工具。使用 Mock 的好处是显然易见的:Mock 建立一个沙盘模式以确保 BuildRequire 内容的正确性。
安装好 Mock 以后,即可馬上使用:
mock -r <configfile> rebuild pkgname.src.rpm
(<configfile> 是位于 /etc/mock 里面,配置文档的名称;只需要輸入文件名,扩展名必须省略。)
因为要从源服务器上下载大量的 rpm 包以模拟编译环境;所以 Mock 的执行会耗费比较多时间。如果网络连接速度不是很快的朋友,建议不要使用这种办法,或者可以参考通过建立本地源的办法加快下载速度 http://fedoraproject.org/wiki/Docs/Drafts/MockSetupUsingLocalMirror 。若是在 Mock 通过测试,则大抵可以说这个软件包足够稳定了。
Koji
跟 Mock 相反, Koji 是帮助软件包维护人员用 Fedora 网上集成编译环境進行测试的工具。因為编译环境就是官方发行版使用的系統,所以测试结果将会非常可靠。
使用 Koji 的前提是,打包者必须是 Fedora 官方的软件包维护员;即 Fedora Packager CVS Commit Group 已验证的成员,并且把相关的管理员证书安装好。需要安装的是以下 3 份证书。
第一份,从 https://admin.fedoraproject.org/accounts/user/gencert 下载并保存到 ~/.fedora.cert
第二份,从 https://admin.fedoraproject.org/accounts/fedora-upload-ca.cert 下载并保存到 ~/.fedora-upload-ca.cert
第三份,从 https://admin.fedoraproject.org/accounts/fedora-server-ca.cert 下载并保存为 ~/.fedora-upload-ca.cert
保存好后,运行如下命令:
fedora-packager-setup
随后生成一份 fedora-browser-cert.p12 证书,你可以把这份证书添加到浏览器中,那么就可以通过浏览器登录koji的web界面。
使用koji来测试软件包的命令如下:
koji build --scratch targets pkgname.src.rpm
查看 targets 可以通过以下命令:
koji list-targets
关于 Mock 的其他使用,可以参考 Mock 教学 https://fedoraproject.org/wiki/Zh/Mock_%E6%95%99%E5%AD%A6
在 bugzilla 上发布软件包审核请求(Package Review)
软件包进入 Fedora 官方源前,需要通过严格的审核。软件包要先通过完整的审核流程,确保质量上完全没有问题後,才可以进入Fedora的官方源。
作为一名没有被 sponsored(担保)的打包者,你的软件包审核申请必须被 Sponsor(担保人)查阅,审核并通过。当这个软件包通过审核流程以后,Sponsor 往往要求你再提交一到两个软件包的审核申请;当这些软件包都有审核通过的时候,Sponsor 就会认可你的打包能力而為你担保,正式批准你成为Fedora的软件包维护者(Package Maintainer)。只有你成为正式的软件包维护者,你才有权限去维护和更新你申请的软件包。如果你已经是Fedora的维护者,你的新软件包申请只需要高级维护者通过(Proven Packager)即可。
软件包审核请求的例子可参阅:
https://bugzilla.redhat.com/show_bug.cgi?id=493246
Bugzilla 提交新 bug 報告的页面上:
- 在 Component 项选择 Package Review
- 在 URL 项上则填上软件包的项目主页地址
- 在 CC 上填入申请者的有效邮件地址
- 在Summary上,则填入 Review Rquest: foo (假設軟件包名字為 foo)
- 关键点在 Description 上:你需要提供一个 spec 文件和一个 src.rpm 文件的下载地址,方便审核者查看和审阅。另外,申请者还需也要提供一份关于软件包的较为详细的介绍。
* 然后,就在最后点击Commit的按钮。
审核需要等待数日才会有 Sponsor 去参与审核你的申请。而审核的标准,则是这一份 Package Guideline https://fedoraproject.org/wiki/Packaging:Guidelines (请求翻译者翻译)。如果你的申请出现问题,审批者会要求你重新提供修正后的 spec 文件和 src.rpm 文件.这里可能要花费一段时间。当 Sponsor 批准你的申请以后,你申请 CVS空间来存放软件包的代码和 spec 文件。回到 Bugzilla 的页面,把 fedora-cvs 的 flags 改为 "?" 并且在新的 comment 输入CVS申请的信息。內容如下:
New Package CVS Request ======================= Package Name: pkgname Short Description: summary of package Owners: foo bar Branches: F-10 F-11 EL-5 InitialCC: baz
- "Package Name": 软件包名称
- "Short Description": 软件包的简短描述
- "Owners": 候任软件包维护者之 FAS 帳號
- "Branches": devel(rawhide) 以外請求的版本 CVS 分支,以作往后移植 (backport) 之用。
- "InitialCC": 软件包版本更新時,会向其会送副本的 FAS 帐号;一般为 FAS 所使用的郵件列表,请查阅有关文档。
汇入软件包代码到 CVS 服务器
当 CVS 管理员吧 fedora-cvs 的 flags 改为”+”的时候,表示線上的 CVS 已完成建立,你就可以在本地计算机上检出 (checkout) CVS 分支。
fedora-cvs pkgname
完成后,请把获批准的 src.rpm 包汇入 CVS 服务器。先进入CVS目录,假设你的软件包是放在 $HOME 里,执行以下命令:
./common/cvs-import.sh -b F-11 -m "import Joe's update" ~/pkgname.src.rpm
维护者需要根据每个 Fedora 版本分支 (branch) 逐个上传,F-11 对应的是 Fedora 11 的分支,而 devel 则对应的是 Rawhide 的分支,以此类推。上传完成后,就可以在 koji 上编译打包你维护的软件包。
首先把CVS上传的内容同步到本地计算机:
cvs up
然后开始编译打包:
make build
和把软件包汇入到 CVS 服务器一样,你也需要逐个进入每个发行版的分支来编译打包。注意:编译打包并不是在本地计算机上进行,而是在远程服务器进行的,所以在编译打包过程中并不会占用你的系统资源。但是由于网络延迟的关系,有时候需要很长时间才能从远程服务器反馈信息到本地计算机;然而终端信息显示与否,绝不影响远程服务器编译进度。
推送软件包更新到bodhi
当编译完成后,终端会反馈出编译是否出错,同时你的邮箱就会得到一份邮件较为详细的报告。倘若非 devel 分支的编译打包成功,则需要把软件包推送到 bodhi 。bodhi 有命令行和网页界面两种方式,一般推荐使用网页界面的操作。登入 Bodhi https://admin.fedoraproject.org/updates/ 之后,点击 New Updates,新建一个更新请求。然后在Package 项输入要申请的软件包名称,版本号,隶属的分支,格式一般为:
shutter-0.80.1-2.fc11
- Type 为 newpackage
- Request 为 testing
- Bugs 为审核申请在 Bugzilla 的 ID
- Notes 为简要地介绍软件包内容
随后则可以点击 Save Update。这里需要审核的过程,大约几天的时间。审核过程中管理员还会在 Koji 重新编译软件包,并在打包的时候添加 GPG 密钥。当审核通过的时候,软件包就会出现 updates-testing 的软件库里。此时你需要把 Request 改成 stable,如果维护者早前在 Bugs 里输入了 ID,Bugzilla 则会自动关闭审核申请。当软件包通过最后的审核,则会出现在 updates 上,整个新软件包审核流程就会结束。
重申,另外 devel 分支的软件包无需推送到 bodhi,会直接被推送到 rawhide 的软件库。
更新已有的软件包
(此段文字存在较多未确定内容)
当软件包更新到新的版本以后,维护者有义务更新软件库内的版本。一般的维护者只能维护自己申请的软件包和获得维护权的软件包。作为维护者,你可以使用像新软件包的办法把 src.rpm 文件汇入到去 CVS 服务器后编译来更新软件包,而以下则是介绍另外一种办法。
首先把新软件包的源代码压缩包放置在 Fedora 分支的目录里,然后上传到CVS服务器:
make upload FILES=”pkgname.tar.gz”
然后把其余与编译有关的文件上传到CVS服务器,例如程序补丁,图标,徽标等:
cvs add packagename-fix-the-foobar.patch
确保所有被更改的部分完整正确:
cvs diff -u
提交维护者对软件包更改的内容:
cvs commit
标记软件包版本,注意:标记的版本号是根据 spec 文件里维护者所表示填写的版本号,这个版本号必须要比之前的要更高,否则在编译的时候会出现版本号问题:
make tag
设置编译器构建软件包:
make build
最后还是需要像新软件包那样把更新推送到 bodhi。