Koji/zh-cn

= Koji =

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

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


 * 使用 Koji 系统
 * 搭建您自己的 Koji 系统
 * 在 Koji 中制作系统镜像文件
 * 定义 hub 中的策略
 * 关于 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，欢迎您将信息添加到这个页面.