From Fedora Project Wiki

Koji

Koji 是Fedora 社区的编译系统。它使用 Mock 创建编译软件包时需要的编译环境。如果您想下载 Koji 的源代码、反馈问题、加入邮件列表,参见 Koji 项目首页

说明文档

如果您想搭建或者使用 Koji 系统,这里有一些说明文档:

Koji 系统架构

术语

在 Koji 系统中,您有必要区分以下三个概念:一般意义上的软件包、软件包的一次构建、软件包一次构建过程中生成的各个 rpm 包。准确的说,这三个概念可以描述如下:

软件包(Package)
source rpm 的名称。表示一般意义上的软件包,没有指定软件包的具体版本和编译出的子包。比如:kernel、glibc等等。
构建(Build)
特定版本的软件包。表示软件包在一次构建过程中编译出的所有包,包括所有架构的包和编译出的所有包。比如:kernel-2.6.9-34.EL、glibc-2.3.4-2.19。
RPM包(RPM)
一个特定的 rpm 包。一次构建过程中编译出的特定架构和特定名称的包。比如:kernel-2.6.9-34.EL.x86_64、kernel-devel-2.6.9-34.EL.s390、glibc-2.3.4-2.19.i686、glibc-common-2.3.4-2.19.ia64。

Koji 的组件

Koji 由下列组件构成:

Koji-Hub

koji-hub 是所有 Koji 操作的核心。它是一个运行在 Apache 服务器的 mod_python 模块下的 XML-RPC 服务器。koji-hub 采用被动方式工作,它只接收 XML-RPC 请求,然后依靠编译守护进程以及其他组件来进行通信。Koji-hub 是唯一可以直接访问数据库的组件,也是两个对文件系统具有写权限的组件之一。

Kojid

kojid 是运行在每一台编译机上的编译守护进程。它的主要任务是查询发送过来的编译请求,根据实际情况进行处理。特别地, kojid 通过查询 koji-hub 上的信息进行工作。除了编译软件包 Koji 还支持其他的任务,例如制作系统安装文件,这些任务也由 kojid 进行处理。kojid 利用 mock 创建原始的编译环境,并且为每一次编译任务单独创建一个编译环境。kojid 是用 Python 编写的,并且通过 XML-RPC 与 koji-hub 进行通信。

Koji-Web

koji-web 是一系列运行在 mod_python 模块下,采用 Cheetah 模板引擎生成的可以对 Koji 提供一套 web 页面接口的脚本文件。它作为 koji-hub 的客户端运行,为一些系统管理命令提供了可视化的接口。通过 koji-web,您可以查看 Koji 系统中很多信息。并且 koji-web 提供了一种方式完成系统中的部分操作,如取消软件包编译任务。

Koji Client

koji-client 是用 Python 写成的命令行终端工具,它提供了对 Koji 系统进行操作的很多命令。它允许用户查询系统中的很多信息,还允许用户向 Koji 提交很多操作,比如:添加用户和初始化编译请求。

Kojira

kojira 是保持编译环境与系统同步更新的一个守护进程。它负责删除多余的编译环境,还负责软件包编译任务结束后的清理工作。

软件包组织形式

Tags 和 Targets

Koji 用 tag 组织软件包:

  • tag 保存在数据库中而不是磁盘文件系统中
  • tag 支持多重继承
  • 每个 tag 有它自己有效的软件包列表(软件包列表可以被其他的 tag 继承)
  • 我们可以根据 tag 为软件包设置不同的所有者(所有者关系也可以被其他 tag 继承)
  • tag 继承过程是可以配置的
  • 当您编译软件包时,您应该指定一个 target 而不是一个 tag

一个 target 表明了软件包的编译过程应该在哪里进行,编译生成的软件包应该放入哪个 tag 中。当 tag 的名称随着所发布系统的版本变化后, target 的名称仍然可以保持不变。您可以通过下面的命令查看系统中的 target 列表:

$ koji list-targets

您可以通过 --name 选项查看单个 target 的信息:

$ koji list-targets --name dist-fc7

Name                           Buildroot                      Destination
---------------------------------------------------------------------------------------------
dist-fc7                       dist-fc7-build                 dist-fc7

这告诉您利用 dist-fc7 这个 target 编译软件包时,编译环境由 dist-fc7-build 这个 tag 中的软件包构成,编译生成的软件包将放入 dist-fc7 这个 tag 中。

您可以通过下面的命令查看系统中的 tag 列表:

$ koji list-tags

软件包列表

前面提到过,每个 tag 都有自己的软件包列表。通过命令 list-pkgs 可以查看一个 tag 中的软件包列表:

$ koji list-pkgs --tag dist-fc7

Package                 Tag                     Extra Arches     Owner
----------------------- ----------------------- ---------------- ----------------
ElectricFence           dist-fc6                                 pmachata
GConf2                  dist-fc6                                 rstrode
lucene                  dist-fc6                                 dbhole
lvm2                    dist-fc6                                 lvm-team
ImageMagick             dist-fc6                                 nmurray
m17n-db                 dist-fc6                                 majain
m17n-lib                dist-fc6                                 majain
MAKEDEV                 dist-fc6                                 clumens
[...] 

第一列是软件包的名称,第二列告诉您这个软件包从哪个 tag 继承而来。第三列告诉您软件包的所有者是谁。

查看最近的构建任务

如果您想查看某个 tag 中软件包的最新版本,请使用 latest-pkg 命令:

$ koji latest-pkg --all dist-fc7

Build                                     Tag                   Built by
----------------------------------------  --------------------  ----------------
ConsoleKit-0.1.0-5.fc7                    dist-fc7              davidz
ElectricFence-2.2.2-20.2.2                dist-fc6              jkeating
GConf2-2.16.0-6.fc7                       dist-fc7              mclasen
ImageMagick-6.2.8.0-3.fc6.1               dist-fc6-updates      nmurray
MAKEDEV-3.23-1.2                          dist-fc6              nalin
MySQL-python-1.2.1_p2-2                   dist-fc7              katzj
NetworkManager-0.6.5-0.3.cvs20061025.fc7  dist-fc7              caillon
ORBit2-2.14.6-1.fc7                       dist-fc7              mclasen

输出结果中不仅显示了软件包的最新版本,而且显示了软件包是从哪个 tag 继承而来的,还显示了这个版本的软件包是由谁编译的(注意:对于那些通过 import 命令导入的软件包,"built by" 这个词可能会产生误解)。

文档

我们尽可能让 Koji 本身包含了使用说明。Koji 命令行终端可以打印出所有的命令列表,并且每一个命令都支持 --help 选项。例如:

$ koji help

Koji commands are:
build                Build a package from source
cancel-task          Cancel a task
help                 List available commands
latest-build         Print the latest rpms for a tag
latest-pkg           Print the latest builds for a tag
[...] 
$ koji build --help

usage: koji build [options]  tag URL
(Specify the --help global option for a list of other help options)

options:
-h, --help            show this help message and exit
--skip-tag            Do not attempt to tag package
--scratch             Perform a scratch build
--nowait              Don't wait on build
[...] 

使用 --admin 选项,您可以看到需要管理员权限才能执行的命令。大部分用户都用不到这些命令,但是如果您正搭建自己的 Koji 系统,您会发现这些命令非常有用。

$koji help --admin
Available commands:
        add-external-repo         Create an external repo and/or add one to a tag
        add-group                 Add a group to a tag
        add-group-pkg             Add a package to a group's package listing
[...]

Koji 使用者

据我们所知,很多机构部署了 Koji 系统协助完成自己的工作。如果您也用到了 Koji,欢迎您将信息添加到这个页面