写在前面
经过一段时间对Fedora koji的学习和部署,我做出了一些总结和疑难问题的解决方案,在koji系统部署的过程中会踩很多坑,需要我们一步步去解决。这篇文章会提供部署koji的每一个步骤,并且尽可能详细地把这么做的理由给讲出来,部署好koji系统并且使用koji构建出rpm包。Fedora koji在部署和使用过程中遇到的概念是比较多的,我会理论结合实践,这样会让你看得更加清楚。本文尽可能会写得通俗易懂,因为现有资料确实很难啃,大多都是提供一种思路,对于初学者而言最好是手把手教,给出可以复制的代码、可复刻的模板,用比较快的速度尽可能完成一个简单koji系统的部署。这篇文章主要是以构建RISC-V的rpm包为主。
我把一些关于koji系统的资料放在这里,本文的理论部分都来自于这些资料:
- Fedora koji中文文档
- Fedora koji英文文档
- leapmotion的文章
- Fedora官方的kojiweb
- koji官网
- koji的GitHub镜像
- mock GitHub
本文会从上述信息中总结出来,并且给出一条初学者容易理解并上手的koji学习路径,你跟着我一步一步做就好。本文中的脚本代码来自于上述文档以及来自iscas的大佬。当你已经学习一定的koji知识的时候最好把中文文档和英文文档给看掉,这样才能融会贯通。(中文文档里目前来说可能是有些地方是有误的,我会提交一个pr去尝试修复它)。在中文文档里的每一篇开头都会有一幅图,不过初学者看了可能会困惑,等到实际成熟我再来解释它们。
上面这幅图就是Fedora的koji页面,也就是后面会提到的kojiweb,这里面就展示了rpm包构建的一些信息
在我写这篇文章的时候,Fedora koji系统正在构建flatpak的kde runtime.
除了Fedora官方之外,iscas也部署了自己的koji构建系统(Build System Info | ISCAS openkoji system),就是上面的这幅图,这二者的界面略有差异。
不过大家也不用太羡慕,很快我们就可以在自己的机器上部署koji,就能够看到类似的界面了。
一、koji简介
大家可能对koji这个词很陌生,我简单讲讲它的含义,激发一下读者的阅读兴趣。
koji的中文意思是"麹",又称为“曲”,你理解成酒曲就好了,用来酿酒、酿醋的一种菌。koji似乎与日本文化比较有缘,后面还会提到它。
在这里koji指的是Fedora koji,是Fedora以及众多rpm系Linux发行版(比如CentOS、rhel、RockyLinux)的包构建和管理系统。koji提供一个集中式的rpm软件包管构建环境,允许开发者和维护者在受控的环境中构建和测试软件包,并将软件包发布到公共或者内部仓库中。是Fedora等操作系统的核心部件之一。除了koji之外,其实还有obs这些也是分布式的高级构建系统,不过这个我研究的就比较少了。
koji的发展历史与Fedora project紧密相连,Koji 的开发始于 2005 年左右,最初由 Red Hat 工程师 Mike McLean 开发。Koji 的名字源于日语中的“酿酒”,与它管理和“酿造”软件包的功能相契合。
在 2003 年,Fedora 项目由 Red Hat 创建,作为一个开源社区驱动的操作系统。随着 Fedora 项目的发展,社区需要一个强大且灵活的构建系统来管理其软件包的构建和发布流程。Koji 应运而生,作为继承于 Brew(Red Hat 内部使用的构建系统)的工具,用于更好地支持开源项目的需求。
Koji 旨在解决多个平台和架构的 RPM 包构建问题,并提供构建任务的全面管理功能。它支持分布式构建、多架构构建、任务调度、访问控制等功能,满足了 Fedora 项目日益增长的需求。
总之就是Fedora项目组高瞻远瞩,在比较早以前就开始着手构建系统的研究,这对于一个发行版而言非常重要。
Fedora koji中的几个重要部件
1、koji-hub
它是所有 Koji 操作的核心,是一个运行于 Apache 的 mod_wsgi 模块下XML-RPC 服务。koji-hub 仅 以被动方式 接受 XML-RPC 请求,依赖编译守护模块(kojid)和其他模块来发起交互。koji-hub是唯一能直接访问数据库的模块,而且是对文件系统有写权限的两个模块之一(另外一个是koji)。
2、kojid
编译守护模块,运行在每一个执行编译任务的机器上。其主要是负责对编译请求进行轮询并作相应处理。Koji除了编译外也支持其他任务,如创建安装镜像(Image)。kojid同样也可以完成这样的任务。
kojid使用mock来编译。它为每次编译任务创建一个干净的编译环境(buildroot)。kojid是python实现的,通过 XML-RPC 与 koji-hub 通信。
3、koji-web
它是一套运行在 mod_wsgi 下的脚本,使用 Cheetah 模板引擎为 Koji 提供一个 Web 接口。koji-web 不仅可显示许多信息,还可提供一些特定操作,如取消编译任务。
4、koji
它是一个用 python 实现的命令行程序,提供了许多操作Koji的方法(hooks)。它能让用户查询许多信息,也能执行许多操作,如发起编译任务。
5、kojira
它是一个守护程序,可保证编译环境(build root)使用的仓库数据的不断更新。
6、mock
它是一个虚拟环境管理器,构建系统使用mock来创建一个干净的构建环境,然后在这个干净的环境进行构建,具有类似chroot的功能。
上述信息是我从文档里摘录来的,大家看了可能会比较困惑,最好是亲眼见证,这样才会比较清晰,我会在后面一个一个讲述和演示它们的作用。除了这几个组件之外,koji作为一个rpm包的管理系统,它具有关于Linux发行版 包如何发行的重要概念,这几个概念更难理解了,你得跟着我做一遍,然后还得多实践一下。
二、koji初体验
Fedora koji最好在一台Fedora设备上部署,这样不会出现缺包的问题,你可以在一台Fedora物理机上面部署,不过由于我现在使用Gentoo了,在Gentoo部署koji不太合适,所以就开一台Fedora虚拟机来跑。无论是物理机还是虚拟机,我都推荐你使用带有图形界面的Fedora,因为你需要在本机上查看kojiweb.
如果你使用Linux,那么你至少需要qemu-system-x86_64和virt-manager(或者gnome-box).这样才能比较方便地管理虚拟机和得到比较好的桌面体验。如果你用的是Windows,那么vmware,virtualbox,Qemu等都能够使用,看你喜欢哪个了;如果你使用的是MacOS,那么就自己解决虚拟机问题吧,我没有用过Apple的设备。
1、安装Fedora虚拟机
我推荐你使用Fedora xfce桌面,因为xfce占用空间很小,可以跑在一些嵌入式设备上,我们拿来做实验不需要太花里胡哨的界面。GNOME和KDE占用资源太多,其他桌面又太简单了,就选xfce吧。选择并下载ISO文件,然后创建一个虚拟机(我在下面以virt-manager为例)。
注意:你最好给虚拟机多一些内存和硬盘,因为构建系统是比较吃性能的,而且我们要在Fedora虚拟机里面再开一个Fedora RISC-V虚拟机(虚拟机嵌套),这对于资源的占用是比较大的,所以我建议你内存最好大于等于8GB,硬盘80GB左右,多分配一些也没事。(因为qcow2格式是动态的虚拟磁盘格式,它不像raw那样直接占用空间,而是你越需要空间它才会增大实际存储空间)
创建好虚拟机后会进入启动盘界面,然后正常安装Fedora就好。我当前kde桌面使用的是wayland,所以观感可能有点差,会出现莫名其妙的横竖线。
安装期间不需要对koji进行什么操作,我们先进入系统再说。
系统安装好之后:
xfce桌面自带一个firefox浏览器,这一点非常重要,我们自己部署的kojiweb应当使用firefox浏览器打开而不是其他浏览器。因为我们在访问kojihub的时候是必须携带证书的,否则就没有访问权限,无法访问。目前来说只有firefox才允许通过证书登陆,而chrome是不行的。
安装好的系统可以先更新一下rpm包然后我们马上进行openssl签发证书工作。
sudo rpm --rebuilddb
sudo dnf update
安装界面创建的那个用户(april_zhao)默认在wheel组,所以你可以直接用sudo.
2、安装必要的软件包
sudo dnf install postgresql-server mod_ssl httpd koji-hub koji-web koji-utils
大家从安装的软件包里可以看出很多信息来:
- koji构建系统使用postgresql这个数据库进行后台管理,也就是构建的情况和用户信息使用postgresql数据库来记录.postgresql是现在一个比较火的数据库,它也是sql,语法和mysql等sql系列的数据库一样;
- kojihub的部署与SSL认证有关,但不是必须使用SSL;
- kojihub使用Apache服务器跑(httpd就是apache的主程序),不用nginx反向代理.
在安装上述包的同时会跟着多个依赖,这样一安装你就可以使用koji这个命令了。
3、初体验
我们先不要急着部署kojihub,而是先看看koji这个命令本身的一些用法。
你可以先执行一下koji help来查看koji的一些子命令,我们以后要和它们打交道并且必须理解它们的含义。
我在这里划几个关键词,它们表示一类操作。比如channel通道操作,有add,remove,edit增删改查一套,其他操作也是这样,允许增删改查。
然后最有趣的命令就是
koji hello
koji moshimoshi
这会让你当前的客户端(执行该命令的用户)去访问服务器端,相当于ping命令,去检查是否能联通,当然你现在肯定提示Error,因为它默认指向Fedora的kojihub,只有Fedora项目组的包管理maintainer才有权限访问,普通用户是连不上的,不过这并不影响你去读取Fedora官方提供的一些信息,就使用koji命令去获取,我会在后面讲到。moshimoshi在日语里相当于接电话的开场白“喂”,如果能够ping通的话,则会返回日语。有时候也会返回中文,是不是很有趣。
它使用post请求去访问kojihub后端。不用担心,等下一章做完了你就可以通过koji hello了