From Fedora Project Wiki

在 Fedora 中使用 Koji 构建系统

Koji 构建系统 是 Fedora 的 RPM 构建系统。打包人员需要使用 koji 客户端来请求构建包,并获得构建系统返回的相关信息。Koji 运行在 Mock 之上来构建不同架构的 RPM 包,并确保它们正确构建。服务自身包含多个架构的几十台在线构建宿主机。

这里还有一个 简体中文版本

安装 Koji

安装 Koji CLI

要使用 Koji(需要您是 Fedora 的贡献者),请安装 fedora-packager 包:

dnf install fedora-packager

fedora-packager 提供了一系列脚本帮助你安装和管理 koji 环境。额外地,它也包括了 Koji CLI 的依赖,当安装 fedora-packager 时 CLI 工具会被自动安装。该命令名为 koji,包含在 koji 主包里。koji 工具默认使用 Kerberos 协议认证客户端和中心服务器。您需要具备一个有效的认证令牌,才能使用 Koji 服务。否则,在未认证的情况下,只能运行只读命令。

如果您需要身份验证方面的帮助,或想成为 Fedora packager,请查看本指南:Join_the_package_collection_maintainers
您需要安装 fedora-packager 软件包,执行 fedora-packager-setup 并获得有效的 kerberos 票据以执行构建。

初始化 Fedora Setup

为了使用 Koji 服务器,软件包维护者需要运行:

/usr/bin/fedora-packager-setup

如果用户需要使用 Koji 去构建 Fedora 的软件包,则必须要运行一次该命令。每个用户都必须拥有他们的证书用于认证身份。

Fedora 证书

Koji 使用以下三份证书:

~/.fedora.cert(给与 Fedora 软件包维护者)
此份证书是在 FAS此页面 生成的。当你成为软件包维护者,它会自动生成。当证书过期时,你需要重新生成。
~/.fedora-upload-ca.cert(此证书在验证时,用于导入使用者的密钥)
可以在 此处 下载,或使用 fedora-packager-setup 获取。
~/.fedora-server-ca.cert(此证书在验证时,用于导入编译服务器的密钥)
可以在 此处 下载,或使用 fedora-packager-setup 获取。

配置 Koji

Koji 本地客户端的全局配置文件在 /etc/koji.conf。你不需要为编译 Fedora 软件包去更改配置文件。这些配置文件,允许你使用首要架构编译系统和次级架构编译系统。

使用 fedpkg targets 构建

每次推送都通过 git 自动标记。你要做的是执行以下命令构建软件包,

fedpkg build

这将触发当前分支的构建请求。很简单吧!

还可以如下,指定特定的 koji 标签:

fedpkg build --target TARGET

例如,在 rawhide 上构建针对由 rel-eng 创建的用于更新许多包的 API 的特殊标签,例如 dist-f14-python,您可以使用以下命令:

fedpkg build --target 'dist-f14-python'

Chained builds

chain-builds 仅在 devel/ 分支 (又称为rawhide) 上工作。为了更新一个已发行的版本而 chain-build,请使用 bodhi 设置覆盖,请求将软件包包含在正确的 buildroot 中。

有时,你想在启动下一个任务之前确保前一个编译成功。例如,当你想为重建依赖关系而重新构建一个包时。这种情况下,您可以使用链式构建:

fedpkg chain-build libwidget libgizmo

当前的软件包将会被加入到 CHAIN 列表的最后。冒号“:”可以作为 CHAIN 参数使用,来定义软件包所属的组。在下一组编译开始前,任何一个组中的软件包都会被并行编译,且一个组中的所有软件包都必须编译成功,并移送到软件包仓库。例如:

fedpkg chain-build libwidget libaselib : libgizmo :

此举将会同时编译 libwidget 和 libaselib,随后是 libgizmo,然后到现有目录内的软件包。如果没有定义组,那么软件包将会按照顺序编译。如果其中一个编译失败,跟随的编译就会被取消,但已经编译好的软件包将会被推送到软件仓库。

Scratch Builds

有时,能够针对 buildroot 构建一个未实际包含在发行版中的包是有用的。这称为 scratch 构建。以下部分介绍,直接使用 koji 以及使用 fedpkg 工具执行 scratch 构建。要从尚未提交的更改创建临时构建,请执行以下操作:

rpmbuild -bs foo.spec
koji build --scratch rawhide foo.srpm

构建最新的 git commit:

koji build --scratch rawhide 'git url'

警告:如果您的 .spec 文件根据 %fedora 的值(%fc9等)来执行不同的操作,则临时构建将 不会 正常工作。像这样的宏值是由 builder 设置,而不是由 koji 设置,因此 %fedora 的值将由 SRPM 的值决定,而不是由正在构建的内容决定。非临时构建通过首先重新构建 SRPM 来解决这个问题。

如果您已将更改提交到 git 并且位于当前分支中,则可以使用 fedpkg 工具进行暂存(scratch)构建,该工具以适当的选项包装了 koji 工具:

fedpkg scratch-build

如果您想要针对指定架构执行一个 scratch 构建,您可以执行:

fedpkg scratch-build-<archs>

<archs> 是一个逗号分隔的架构列表。

最后可以将 scratch-build 命令与特定 koji tag 结合使用:

fedpkg scratch-build --target TARGET

请查看 fedpkg scratch-build --help 或 koji build --help 了解更多信息。

构建失败

如果您上传的软件包无法通过构建,您将会看到类似的信息:

420066 buildArch kernel-2.6.18-1.2739.10.9.el5.jjf.215394.2.src.rpm,
ia64): open (build-1.example.com) -> FAILED: BuildrootError:
error building package (arch ia64), mock exited with status 10

您可以通过查看日志来了解编译失败的具体原因。build.log 是最好的分析来源。除此之外还可以查看 init.log。

失败任务的日志可以在 koji web 界面的 Task 页面里找到。或者可以使用 koji 客户端的 watch-logs 命令查看日志。查看帮助命令了解更详细信息。

Koji 高级应用

我们已经完善了 Koji 的帮助命令,确保其可以正常运行。命令行工具将会显示一个有效命令的列表,每个命令都支持 --help 参数。例如:

$ koji help

Koji commands are:
build                Build a package from source //从 SRPM 构建一个软件包
cancel-task          Cancel a task //取消一个任务
help                 List available commands //列出可用的命令
latest-build         Print the latest rpms for a tag //输出一个标记的最新rpms
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 //运行一个 scratch 构建任务
--nowait              Don't wait on build //不等待构建
[...] 

使用 koji 生成一份 mock 配置来复制一个编译链

koji 可以为本地调试复制一个编译链。

koji mock-config --help
Usage: koji mock-config [options] name
(Specify the --help global option for a list of other help options)

Options:
  -h, --help            show this help message and exit //显示帮助信息并退出
  --arch=ARCH           Specify the arch //指定架构
  --tag=TAG             Create a mock config for a tag //为一个标记创建一份 mock 配置
  --task=TASK           Duplicate the mock config of a previous task //复制前一个任务的 mock 配置
  --buildroot=BUILDROOT Duplicate the mock config for the specified buildroot id //复制指定 buildroot id 的 mock 配置
  --mockdir=DIR         Specify mockdir //指定 mock 的目录
  --topdir=DIR          Specify topdir //指定 top 目录
  --topurl=URL          url under which Koji files are accessible //设置 Koji 文件的url地址
  --distribution=DIST   Change the distribution macro //修改发行版的宏
  -o FILE               Output to a file //输出到一个文件

例如,获得最新的 dist-f14-build 编译链可以运行:

koji mock-config --tag dist-f14-build --arch=x86_64 --topurl=http://kojipkgs.fedoraproject.org/ dist-f14

您需要传入 --topurl=http://koji.fedoraproject.org/ 参数到对应的 mock-config 命令,从 Fedora Koji 获得一份可以运行的 mock-config。

使用 Koji 控制任务

列出任务:

koji list-tasks

仅列出您请求的任务:

koji list-tasks --mine

重新排列一个已经进行的任务:通用语法:koji resubmit [options] taskID

koji resubmit 3

使用命令行构建一个软件包

您可以使用 fedpkg target,也可以直接使用 koji 命令行工具。

构建软件包的命令的语法是:

$ koji build <build target> <git URL>

例如:

使用您需要编译的标记替换 dist-f14,例如 dist-rawhide
$ koji build dist-f14 'git url'

koji build 命令在 Koji 中创建一个构建任务。默认情况下,工具将等待并打印状态更新,直到构建完成。您可以使用 --nowait 选项覆盖此行为。

注意:对于 fedora koji,git url 必须基于 pkgs.fedoraproject.org。其他任何 git repos 不能用于构建。

Koji 标记和软件包的组织

术语

在 Koji 中,有时需要区分一个普通的软件包,一个包的特定构建,以及由构建创建的各种 rpm 文件。当需要精确描述时,这些术语应解释如下:

  • Package:源码包的名称,通常指普通软件包,而不是任何特定的构建或子包。例如:kernel, glibc 等。
  • Build:一个软件包的特定构建。这里指的是完整编译:所有架构和主包。例如:kernel-2.6.9-34.EL, glibc-2.3.4-2.19。
  • 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

标记和目标 (tags and targets)

Koji 使用标记来管理软件包。在 Koji 中,一个标记是一个软件包的集合:

  • 标记支持继承
  • 每个标记都有它们拥有的有效的软件包列表(可继承)
  • 每个标记可以设置软件包的拥有权(可继承)
  • 当您构建时,指定的是目标,而不是标记

一个编译目标指定了一个软件包应该在哪里编译和如何在编译后被标记。这允许目标名称,在标签发布修改时,保持固定。

用于标记的 Koji 命令

目标 (Targets)

使用以下命令列出编译目标的完整列表:

$ koji list-targets

你可以添加 --name 参数查看单独的目标:

$ koji list-targets --name dist-f14

Name                           Buildroot                      Destination
---------------------------------------------------------------------------------------------
dist-f14                       dist-f14-build                 dist-f14

以上内容告诉你,一个属于 dist-fc14 目标的编译任务将使用一个带有标记为 dist-fc14-build 的软件包组成的编译链,并且在编译完成后生成的软件包会被标记为 dist-fc14。

留意:你可能不希望在 dist-rawhide 上编译。如果 Fedora N 是一个已发布的最新版本,那么你可以选择编译到下一个版本,标记为 dist-f{N+1}。

标记 (Tags)

您可以通过下列命令获得可用的发行版本分支标记:

$ koji list-tags
软件包 (Packages)

如上所述,每个标记都拥有属于它的软件包列表。查看一个标记的软件包列表,使用 list-pkgs 命令:

$ koji list-pkgs --tag dist-f14

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

第一列为软件包的名称,第二列表明软件包继承自哪一个标记,第三列显示软件包的所有者。

最新的构建任务

为了查看某个标记的最新构建,使用 latest-pkg 命令:

$ koji latest-pkg --all dist-f14

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

输出不仅仅会告诉你最新的编译,而且会告诉你继承自哪一个标记和谁在编译它们。