Build Service/Tutorial

Jump to: navigation, search


Geeko 本篇文章概述了编译服务和如何使用这个伟大的工具为不同的发行编译包。 我们将会以一个程序为例来讲述所有的功能,这样您就可以按照这些步骤来编译您自己的包。

准备

您应该对如何创建RPMs有个大概的了解,或者对类似于dpkg的其它打包系统有所了解。这篇文章并不能取代打包文档,有许多的教程、向导和书籍讲述了如何打包。

您也应该熟悉您的准备打包的工程的源代码。编译服务能产生一些常见的错误,会借助于日志文件和简单的编译失败来通知您的包存在问题。我们的编译服务邮件列表可以提供给您帮助和建议。当然,应用什么补丁、使用什么编译选项等这些事情完全取决于您。

要求

为了使用编译服务您必须有一个登录的帐号,:)

您的编译服务帐号与您的wiki/bugzilla的帐号是同一个帐号。如果您仍没有帐号,在本页面的顶部有一个创建帐号的链接,您可以创建一个。

在您已经创建了wiki/bugzilla的帐号后,你可以进入http://build.opensuse.org/ 页面并登录。在您首次登录时您需要填写申请表单,解释一下您想申请帐号的原因及您想打包什么软件。然后您需要等您的帐号被批准。在等待的过程中您也可以订阅opensuse编译服务邮件列表,并简单的介绍一下您自己,告诉我们您的名称和您想要创建和维护的工程(如能介绍一些您的打包技巧和经验就更好了)。

如果您想要在本地测试和编译您的包(一个很好的想法!),您应该看看SUSE 包编译教程,这篇文章向您讲述了本地编译环境的需求。

工作流

下面的步骤列出一个通用的工作流程来告诉您如何创建工程并添加包到工程中。当然,实际的操作中您也许会在一些步骤中失败,您必须重复的操作直到没有失败为止。 这些步骤让您感觉到我们尽力会让您如愿以偿。

如果可能的话,我们将讲述两种不同的方法:

  • Web客户端 方式
  • 命令行 客户端方式(我们将以osc为例)

第一步 - 登录

如果您已经有一个编译服务的帐号,那么这是最容易的一步。

  • Web客户端: 打开http://build.opensuse.org/ 页面,输入您的用户名和密码。登录后,您将会看见工程列表,在右上角您也可以发现"Home Project"的链接。进入这个链接。
  • 命令行: 首先您先必须在本机上安装命令行客户端。您可以在openSUSE-工具下载仓库中找到不同的发行版本的osc包(这些也是编译服务的工程)。使用您喜欢的包管理器来安装osc包。注意:在SUSE Linux 9.3 或更老的版本中您需要从安装python-elementtree和python-urlgrabber。

然后,"cd"进入您想要使用的工程文件目录。每一个熟悉SVN的人感觉到使用osc得心应手,现在可以使用下面的命令检出您的工程

 osc checkout home:<username>

(请您的登录名代替 <username>)。您将会看到输入用户名和口令的提示。之后,osc将会尝试检出您的工程并创建一个新目录home:<username>。您可以在~/.oscrc更改设置。

第二步 - 创建和上传包

因为您可以上传包到一个现有的工程,所以您也不一定非得上传您自己的工程中,但是这是一个好的起点,任何人都不应该会使用另一个用户的工程作为编译时的依赖。因此您参自己的工程中测试包,当一切正常后再传送到其它的工程中。

  • Web客户端: 单击 [Add Package] 链接。您应该填写接下来的三个文本框中添写信息:"Name"、"Title"和"Description"。"Name"为包的名称、"Title"为包的摘要、"Description"为包的描述。
之后单击[Add File]链接来添加您的包。您需要上传您的源代码和至少一个spec文件。
CLARIFICATION debian 包需要什么?
  • 命令行:
osc meta pkg -e home:<username> <packagename>

osc将在您喜爱的编辑器(在EDITOR中设置的)中打开一个模板xml文件,您需要添加与上述同样的信息(名称、摘要和描述)。

现在使用

osc up

将会更新以您的包的名字为名称的目录。借助命令行来添加文件,使用'cd'进入新的文件夹,拷贝相关的文件后并使用

osc add *

这个将标记这些文件,以准备下一次的提交。提交文件时使用

osc commit

第三步 - 添加仓库

现在您应该决定使用哪一个发行版本的仓库来编译您的包。

  • Web客户端: 单击[Add Repository]并选择一个可用 的发行版本和体系架构(Advanced链接)。
  • 命令行: 首先获取一个可用仓库的列表
osc ls

然后编辑您的工程元数据;

osc meta prj -e home:<username>

并添加仓库:

 <repository name="SUSE_Linux_Factory">
   <path project="SUSE:Factory" repository="standard" />
   <arch>x86_64</arch>
   <arch>i586</arch>
 </repository>

注意:repository="standard"用于将来的扩展(仓库的分支)。

第四步: 编译您的包

通常在提交之后或改变一些文件后,您的包便会被加入到编译的预定任务中。如果您依赖的包重新编译了,您的包也会自动重新编译。如果您需要,您也能够手动开始重新编译(但是请不要过于频繁的做此操作,为其它包的编译节省些资源)。

在本机编译您的包

有些时候在本机编译您的包比等待来自编译服务的结果更快些。如果您本机的硬件支持您的包,osc支持本地编译您的包(在x86_64的机器上您能够编译用于i586和x86_64的包,但在i586的机器上只能编译用于i586的包。

 osc build <platform> <arch> <specfile> [--clean|--noinit]

如果您使用普通用户来编译(好主意!),您将被要求输入本机root用户的口令。如您不想这么做,添加您的用户到/etc/sudoers并编辑您的~/.oscrc :

su-wrapper: sudo

osc将连接到仓库服务器并下载所需的RPM包到/var/tmp/osbuild-packagecache/<plattform>/<repository>/<arch>缓存目录中。(因此如果您已经有一个完整的仓库,您可以把RPM包链接到这个目录,这样可以减少大量的下载流量。

以openSUSE_10.2仓库为例,您可以使用零售的盒装DVD的iso:

 mount openSUSE-10.2.iso /mnt -o loop
 mkdir -p /var/tmp/osbuild-packagecache/openSUSE\:10.2
 ln -s /mnt/suse /var/tmp/osbuild-packagecache/openSUSE:10.2/standard

上面将给您一个用于x86和x86_64的仓库

现在可以在本地编译包了:

 osc build openSUSE_10.2 i586 beryl-core-snapshot.spec

osc将在/var/tmp/osc-build-root/下创建chroot环境并开始编译您的包。如果您只做了很小的改动,您可使用--noinit选项来不进行重新创建编译环境。如果您的chroot环境坏掉了,您可以使用--clean来开始完整的重新编译。

由于您的包在chroot环境中编译,您可以在'/var/tmp/osc-build-root/usr/src/packages/RPMS/下找到生成的包。

本机编译的完整的日志文件在/var/tmp/osc-build-root/.build.log

在编译服务中编译您的包

在编译服务中编译比编译工具用起来更容易 - 但也许会花更长的时间。

  • Web客户端:如果您想要手工开始重新编译,只要点击[Trigger Rebuild]即可。
  • 命令行: 以<repo> 和 <arch>参数,重新编译将限于特定的仓库和体系架构。
osc rebuildpac <project> <package> [<repo> [<arch>]]
警告
注意通常不要使用这种方式来重新编译,因为这些都会以完全自动的方式运作,被源代码的提交所触发。另外,包编译的顺序会由编译服务来自动处理。

第五步: 检查日志文件

编译服务会为每编译一个包产生一个比较大的日志文件。

  • Web客户端:在页面中单击[Build Log]链接。
  • 命令行: 您可以使用不同的方法,这取决于您的需求。如果您在包的目录下,packagedir参数就不需要了。
osc prjresults [packagedir]

显示编译整个工程的编译结果

osc results [packagedir]

显示单个包的编译结果

osc buildlog <platform> <arch>

显示一个包的编译日志文件(您需要进入包的目录)。

创建模式

模式是一些包含多个包在一起的列表的文件,并包含它们用途的描述(将来编译服务将导出模式到仓库中,这样它们就能在YaST中看得见了)。另外,编译服务为每一个产生的仓库创建.ymp文件。用户可用这些.ymp文件进行一键安装

简而言之,模式不需要关心多个包之间的依赖关系来安装一套软件。

可直接使用api来使用模式,或使用osc:

# 用 $EDITOR(如果仍不存在就创建一个) 打开模式
osc meta pattern -e <project> <pattern>
# 列出现有的模式
osc meta pattern <project>
# 获取一个现有的模式
osc meta pattern <project> <pattern>
# 您也可以提交一个现有的文件:
osc meta pattern --file <local_file> <project> <pattern>
#为了测试,在konquerer中点击.ymp应该会启动安装程序,如果您没有安装konquerer,您可以尝试用普通用户启动shell:
/sbin/yast2 MetaPackageHandler http://download.opensuse.org/repositories/<project>/<SUSE_Factory or openSUSE_10.2>/<pattern>.ymp

下面的文件是模式的一个例子,是KDE:KDE4工程的。您可以从看到从它产生的.ymp文件。

<pattern>
  xmlns="http://novell.com/package/metadata/suse/pattern"
  xmlns:rpm="http://linux.duke.edu/metadata/rpm" >
   <name>KDE 4 Games</name>
   <summary lang="en">KDE 4 Games</summary>
   <description lang="en">A number of games for KDE 4.</description>
   <uservisible/>
   <category lang="en">Games</category>
   <rpm:requires>
     <rpm:entry name="kde4-kpat"/>
     <rpm:entry name="kde4-kmahjongg"/>
   </rpm:requires>
</pattern>