N-V-R
即Name-Version-Release 对于unzip-6.0-2.fc13.i686.rpm来说,Name="unzip",Version="6.0",Release="2.fc13" NVR其实来自SPEC文件中的对应字段而非rpm文件名,该例只是正好相同而已,比如gcc- 4.4.4-2.fc13.i686.rpm和gcc-c++-4.4.4-2.fc13.i686.rpm其实是由一个srpm即gcc- 4.4.4-2.fc13.src.rpm编译出来的,所以package name都是gcc,即同属一个package
package
package name(比如unzip)
build
即NVR(比如:unzip-6.0-2.fc13) koji系统内的build是唯一的;但是没有编译通过的可以继续提交该build直到编译成功为止
rpm
指*.rpm文件 一个package(N)可能有多个build(NVR);一个build可能有多个rpm,比如unzip-6.0-2.fc13可 能包括unzip-6.0-2.fc13.i686.rpm,unzip-6.0-2.fc13.x86_64.rpm和unzip- 6.0-2.fc13.src.rpm等。
tag
koji使用tag来引用package或build的集合。也就是说可以给多个package或build打上同一个tag。 必须先给package打上tag以后才能给属于该包的build打tag
build tag
其实就是tag,只是有不同的用途,tag只是一个package的集合,build-tag一般从某个tag继承而来且还包含arch和build- group信息,可用来创建不同体系的build任务,比如可以为i386和x86_64各创建一个build tag,每次只引用其中一个来为其parent tag创建不同体系的build版本。
build target
标明一次build从哪个build tag确定包及编译体系,build完了以后放到哪个tag(默认是源tag)。
build group
用于指定mock chroot中需要安装的所有rpm包,然后mock还会安装要编译包的所有依赖,一起构成基础编译系统
术语
Koji 中有时需要分清通常的 package ,一个包的特定 build ,和一个 build 产生的各种 rpm 文件。下面详细解释:
Package: source rpm 的名字(仅仅name字段!)。如: kernel , glibc 等等
Build: source 包的一个特定 build,特指 source rpm 的name+version+release。例如: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
Koji 包含几个部分 : koji-hub
它是所有 Koji 操作的核心,通过 XML-RPC 运行于 Apache 的 mod_python 模块下。koji-hub 采用被动方式,仅仅接受 XML-RPC 请求,依 赖编译守护模块和其他模块来进行交互。koji-hub是唯一直接访问数据库的 模块,而且是有读写文件系统的权限的两个模块之一(另外一个是koji)。
它是编译守护模块,运行在每一个执行编译任务的机器上。主要任务 是对编译请求分析处理。Koji除了编译外也支持其他任务,如创建安装 images。kojid同样也可以完成这样的任务。kojid使用mock来编译。它为每 一个build创建一个干净的编译环境。kojid使用python编写,通过 XML-RPC 和 koji-hub 通信。
它包含一套脚本,运行在 mod_python 下,使用 Cheetah 模板引 擎为 Koji 提供一个 Web 接口。
它是一个用 python 写的 CLI 程序,提供对于 Koji 最多的操作。它 能让用户查询信息,也能执行编译操作。
它是一个后台守护程序,可以实时更新 build root repodata 一个示例架构图
httpd koji koji-hub koji-web mod_ssl mod_python postgresql-server
koji-builder mock koji-utils rpm-build createrepo setarch (for some archs you'll require a patched version)(暂时没用到)
mkdir /etc/pki/koji/ && touch /etc/pki/koji/ssl.cnf
写入配置文件 /etc/pki/koji/ssl.cnf 如下内容(可根据自己的情况修改)
HOME = . RANDFILE = .rand [ca] default_ca = ca_default [ca_default] dir = . certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/%s_ca_cert.pem private_key = $dir/private/%s_ca_key.pem serial = $dir/serial crl = $dir/crl.pem x509_extensions = usr_cert name_opt = ca_default cert_opt = ca_default default_days = 3650 default_crl_days = 30 default_md = md5 preserve = no policy = policy_match [policy_match] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [req] default_bits = 1024 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert string_mask = MASK:0x2002 [req_distinguished_name] countryName = Country Name (2 letter code) countryName_default = CN # you can modify countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Beijing # you can modify localityName = Locality Name (eg, city) localityName_default = Beijing # you can modify 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Linux # you can modify organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (eg, your name or your server\'s hostname) commonName_max = 64 emailAddress = Email Address emailAddress_default = [email protected] # you can modify emailAddress_max = 64 [req_attributes] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [usr_cert] basicConstraints = CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always [v3_ca] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always basicConstraints = CA:true
cd /etc/pki/koji/ && mkdir {certs,private} touch index.txt echo 01 > serial caname=koji openssl genrsa -out private/${caname}_ca_cert.key 2048 openssl req -config ssl.cnf -new -x509 -days 3650 -key private/${caname}_ca_cert.key -out ${caname}_ca_cert.crt -extensions v3_ca
注意:直接回车就行(Common Name 填 koji)
for user in kojira kojiweb kojihub kojiadmin kojibuilder1 kojibuilder2 kojibuilder3; do openssl genrsa -out certs/${user}.key 2048 openssl req -config ssl.cnf -new -nodes -out certs/${user}.csr -key certs/${user}.key openssl ca -config ssl.cnf -keyfile private/${caname}_ca_cert.key -cert ${caname}_ca_cert.crt -out certs/${user}.crt -outdir certs -infiles certs/${user}.csr cat certs/${user}.crt certs/${user}.key > ${user}.pem done
注意: Common Name字段依次输入kojira、kojiweb、kojihub、kojiadmin、kojibuilder1、kojibuilder2、kojibuilder3 [y/n]选y 其它直接回车
caname=koji for user in kojiadmin; do openssl pkcs12 -export -inkey certs/${user}.key -in certs/${user}.crt -CAfile ${caname}_ca_cert.crt -out certs/${user}_browser_cert.p12 done
注意:直接回车 使用方式:浏览器访问时,点击右上角的login会提示需要证书,导入方法为“编辑” -> “首选项” -> “高级” -> “加密” -> “查看证书” -> “您的证书” -> 导入kojiadmin_browser_cert.p12
koji 自动编译平台需要对应一个操作系统用户,用来执行管理koji,理论上root用户也可以用来管理koji,但是建立一个专有的用户更妥当
useradd kojiadmin
koji的通讯是通过SSL证书验证来实现的,因此要为kojiadmin 用户准备证书
mkdir ~/.koji cp -pv /etc/pki/koji/kojiadmin.pem ~/.koji/client.crt cp -pv /etc/pki/koji/koji_ca_cert.crt ~/.koji/clientca.crt cp -pv /etc/pki/koji/koji_ca_cert.crt ~/.koji/serverca.crt 注意:~表示当前用户(即kojiadmin),建议不要使用root用户。
koji 命令行程序默认使用 /etc/koji.conf 配置文件,但是每个用户的 ~/.koji/config 文件会覆盖全局文件的设置
修改文件/etc/koji.conf
server = http://localhost/kojihub weburl = http://localhost/koji pkgurl = http://localhost/packages topdir = /mnt/koji cert = ~/.koji/client.crt ca = ~/.koji/clientca.crt serverca = ~/.koji/serverca.crt
如果数据库安装后尚未初始化则执行:
service postgresql initdb service postgresql start
添加一个koji数据库专用系统用户,并清空该用户的密码
useradd koji passwd -d koji
su - postgres createuser koji createdb -O koji koji exit 当询问到y/n 全部 “n”
# su - koji psql koji koji < /usr/share/doc/koji-1.6.0/docs/schema.sql
(修改文件/var/lib/pgsql/data/pg_hba.conf,注意该文件必须要用root用户去修改,否则无法进入/var/lib/pgsql目录。)
设置koji用户访问postgresql数据库权限,本例中,kojiweb和kojihub都是在本地localhost上运行。在 /var/lib/pgsql/data/pg_hba.conf文件中增加下面一行:
host koji koji 127.0.0.1/32 trust
应用改变:
su - postgres pg_ctl reload exit
原有配置如下,
# "local" is for Unix domain socket connections only local all all ident # IPv4 local connections: host all all 127.0.0.1/32 ident # IPv6 local connections: host all all ::1/128 ident
可考虑更改为如下:
local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 trust
PostgreSQL Server 配置文件列表
/var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/postgresql.conf
这里最重要,管理员账号要手动创建,其他用户可以用管理员权限创建,如果使用username/password验证方式访问数据库,那么管理员创建的其他用户的密码需要手动设置。
su - koji psql insert into users (name, password, status, usertype) values ('kojiadmin', '3460572', 0, 1); select * from users; # 这里要注意!例子中 id=1 insert into user_perms (user_id, perm_id,creator_id) values (1, 1,1); exit
/etc/httpd/conf/httpd.conf /etc/httpd/conf.d/kojihub.conf /etc/httpd/conf.d/ssl.conf (when using ssl auth)
修改apache的性能(留作疑问?)
<IfModule prefork.c> ... MaxRequestsPerChild 100 </IfModule> <IfModule worker.c> ... MaxRequestsPerChild 100 </IfModule>
通常这个文件中包含这样一行:
PythonOption ConfigFile /etc/koji-hub/hub.conf
如果使用 ssl 认证,kojihub.conf文件中设置:
<Location /kojihub> SSLOptions +StdEnvVars </Location>
我们可以配置 /etc/koji-hub/hub.conf 文件,下面值设置要注意(本例都使用ssl认证方式):
DBName = koji DBUser = koji #DBHost = localhost #DBPass = 密码字符串 KojiDir = /mnt/koji ... DNUsernameComponent = CN ProxyDNs = /C=CN/ST=BeiJing/L=Beijing/O=TurboLinux/CN=koji/[email protected] KojiWebURL = http://172.16.70.48/koji 其中 ProxyDNs 和 kojiweb 认证文件的 DirName 字段一样。
其中密码是这样设置的:
[root@dev koji]# su - postgres psql postgres=# ALTER USER koji with password '密码字符串'
SSLCertificateFile /etc/pki/koji/certs/kojihub.crt SSLCertificateKeyFile /etc/pki/koji/certs/kojihub.key SSLCertificateChainFile /etc/pki/koji/koji_ca_cert.crt SSLCACertificateFile /etc/pki/koji/koji_ca_cert.crt SSLVerifyClient require SSLVerifyDepth 10
如果运行了 SELinux,那么要容许 apache 访问 sql:
[root@dev koji]# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 21 Policy from config file: targeted [root@dev koji]# setsebool -P httpd_can_network_connect_db 1
停用 selinux
#cd /selinux #echo 0 > enforce
# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: permissive Mode from config file: enforcing Policy version: 24 Policy from config file: targeted
例子设置了 KojiDir 为 /mnt/koji cd /mnt mkdir koji cd koji mkdir {packages,repos,work,scratch} chown apache.apache *
service httpd restart
koji add-user kojira // 正确返回:Added user kojira (n),否则前面配置有问题,解决后再继续! koji grant-permission repo kojira
注意:要用前面被配置了证书的用户(kojiadmin)执行该命令,否则会显示“Unable to log in, no authentication methods available
PythonOption KojiHubURL http://10.1.81.87/kojihub PythonOption KojiPackagesURL http://10.1.81.87/packages PythonOption WebCert /etc/pki/koji/kojiweb.pem PythonOption ClientCA /etc/pki/koji/koji_ca_cert.crt PythonOption KojiHubCA /etc/pki/koji/koji_ca_cert.crt <Location /koji/login> SSLOptions +StdEnvVars </Location>
添加如下选项
Alias /packages /mnt/koji/packages <Directory "/mnt/koji/packages"> Options all </Directory>
重启Apache(httpd)使以上设置生效
service httpd restart
假设主机A 10.1.81.87 为koji-server 假设主机B 10.1.83.63 为kojibuilder1
在koji-server端执行
添加 kojibuilder1 到 createrepo channel
koji add-host kojibuilder1 mips64el koji add-host-to-channel kojibuilder1 createrepo
koji koji-builder mock koji-utils rpm-build createrepo setarch (for some archs you'll require a patched version)(暂时没用到)
如果服务端已经预留足够的kojibuilder证书 此步骤可以跳过 caname=koji for user in kojibuilder1 ; do openssl genrsa -out certs/${user}.key 2048 openssl req -config ssl.cnf -new -nodes -out certs/${user}.csr -key certs/${user}.key openssl ca -config ssl.cnf -keyfile private/${caname}_ca_cert.key -cert ${caname}_ca_cert.crt -out certs/${user}.crt -outdir certs -infiles certs/${user}.csr cat certs/${user}.crt certs/${user}.key > ${user}.pem done
server = http://10.1.81.87/kojihub weburl = http://10.1.81.87/koji pkgurl = http://10.1.81.87/packages cert = ~/.koji/client.crt ca = ~/.koji/clientca.crt serverca = ~/.koji/serverca.crt
修改kojibuilder 配置文件/etc/kojid/kojid.conf,参考配置信息如下:
[kojid] maxjobs=10 vendor=regulus packager=regulus distribution=regulus mockhost=regulus-linux server=http://10.1.81.87/kojihub pkgurl=http://10.1.81.87/packages allowed_scms=10.1.81.87:/cvs/pkgs from_addr= REGULUS <[email protected]> cert = /etc/pki/koji/kojibuilder1.pem ca = /etc/pki/koji/koji_ca_cert.crt serverca = /etc/pki/koji/koji_ca_cert.crt
修改kojibuilder配置文件 /etc/kojira/kojira.conf
server=http://10.1.81.87/kojihub cert = /etc/pki/koji/kojira.pem ca = /etc/pki/koji/koji_ca_cert.crt serverca = /etc/pki/koji/koji_ca_cert.crt
查看配置信息
sed -e '/^;/d;/^$/d' /etc/kojid/kojid.conf
mkdir ~/.koji scp -pv [email protected]:/etc/pki/koji/kojibuilder1.pem ~/.koji/client.crt scp -pv [email protected]:/etc/pki/koji/koji_ca_cert.crt ~/.koji/clientca.crt scp -pv [email protected]:/etc/pki/koji/koji_ca_cert.crt ~/.koji/serverca.crt su - root mkdir /etc/pki/koji/ scp -pv [email protected]:/etc/pki/koji/kojira.pem /etc/pki/koji/kojira.pem scp -pv [email protected]:/etc/pki/koji/kojibuilder1.pem /etc/pki/koji/kojibuilder1.pem scp -pv [email protected]:/etc/pki/koji/koji_ca_cert.crt /etc/pki/koji/koji_ca_cert.crt
在编译机端执行
service kojid start
在server端执行koji list-hosts 如果显示如下,说明通讯成功
[kojiadmin@koji-server]$ koji list-hosts Hostname Enb Rdy Load/Cap Arches Last Update kojibuilder1 Y Y 0.0/2.0 mips64el 2012-07-12 13:44:49
service kojira start
service rpcbind start service nfs start
修改配置文件/etc/exports
/mnt/koji *(rw,sync,no_root_squash)
注:其中/mnt/koji为服务器的koji文件,是所有ip主机都可以挂载服务器A的文件。可以改为特别ip地址段如:10.1. 则10.1..的主机B都可以挂载服务器的/mnt/koji文件系统。之后,输入
exportfs -rv service nfs start
使配置文件生效。
service nfs start
mount -t nfs -o nolock 10.1.81.87:/mnt/koji /mnt/koji
这是表明挂载服务器A的/mnt/koji到编译机B上的/mnt/koji
对文件/etc/httpd/conf/httpd.conf增加如下内容。
Alias /kojirepo "/mnt/koji" <Directory "/mnt/koji"> Options all </Directory>
重启服务使其生生效
service httpd restart
添加编译用户
cd /etc/pki/koji/ caname=koji for user in koji.panhaitao; do openssl genrsa -out certs/${user}.key 2048 openssl req -config ssl.cnf -new -nodes -out certs/${user}.csr -key certs/${user}.key openssl ca -config ssl.cnf -keyfile private/${caname}_ca_cert.key -cert ${caname}_ca_cert.crt -out certs/${user}.crt -outdir certs -infiles certs/${user}.csr cat certs/${user}.crt certs/${user}.key > ${user}.pem done
创建 web 认证 (PKCS12 user certificate)
user="koji.panhaitao" openssl pkcs12 -export -inkey certs/${user}.key -in certs/${user}.crt -CAfile ${caname}_ca_cert.crt -out certs/${user}_browser_cert.p12
useradd koji.panhaitao
为用户导入证书
#su - koji.panhaitao mkdir ~/.koji cp -pv /etc/pki/koji/koji.panhaitao.pem ~/.koji/client.crt cp -pv /etc/pki/koji/koji_ca_cert.crt ~/.koji/clientca.crt cp -pv /etc/pki/koji/koji_ca_cert.crt ~/.koji/serverca.crt
# su - kojiadmin koji add-user koji.panhaitao koji grant-permission build koji.panhaitao koji grant-permission admin koji.panhaitao
koji import [--link] <SRPM1> <SRPM2> ... koji import [--link] <RPM1> <RPM2> ...
koji import --create-build <RPM1> <RPM2>
koji add-tag nk6.0-mips64el koji add-tag --parent nk6.0-mips64el --arches=mips64el nk6.0-mips64el-build
koji remove-tag nk6.0-mips64el
koji list-pkgs --quiet | xargs koji add-pkg --owner kojiadmin nk6.0-mips64el koji list-untagged | xargs -n 1 koji call tagBuildBypass nk6.0-mips64el
koji add-target nk6.0-mips64el nk6.0-mips64el-build
该选项的完成格式如下:
koji add-target target-name from-build-tag to-dist-tag target-name target的名称 from-build-tag 使用源自build-tag的软件仓库集合 to-dist-tag 编译完成的build归档至目标tag的软件仓库集合 若 to-dist-tag 与 target-name 同名时 to-dist-tag 可省略
koji add-group nk6.0-mips64el-build build koji add-group nk6.0-mips64el-build srpm-build
koji add-group-pkg nk6.0-mips64el-build build bash bzip2 coreutils cpio diffutils regulus-release findutils gawk gcc gcc-c++ grep gzip info make patch \ regulus-rpm-config rpm-build sed shadow-utils tar unzip util-linux-ng which koji add-group-pkg nk6.0-mips64el-build srpm-build bash curl git gnupg make rpm-build shadow-utils regulus-rpm-config regulus-release
koji regen-repo nk6.0-mips64el-build
koji build nk6.0-mips64el zlib-1.2.3-25.RG6.0.01.src.rpm
koji build --scratch nk6.0-mips64el zlib-1.2.3-25.RG6.0.01.src.rpm --scratch 该选项会让该build不汇入数据库,仅仅是一个build,RPMS会放置在 <topdir>/scratch
批量建立任务
ls *.src.rpm | xargs -n 1 koji build --scratch nk6.0-mips64el
开始编译一个新的版本,可能需要如下步骤:
koji add-tag nk6.3-mips64el koji add-tag --parent nk6.3-mips64el --arches=mips64el nk6.3-mips64el-build koji add-target nk6.3-mips64el nk6.3-mips64el-build koji add-group nk6.3-mips64el-build build koji add-group nk6.3-mips64el-build srpm-build koji add-group-pkg nk6.3-mips64el-build build bash bzip2 coreutils cpio diffutils regulus-release findutils gawk gcc gcc-c++ grep gzip info make patch regulus-rpm-config rpm-build sed shadow-utils tar unzip util-linux-ng which koji add-group-pkg nk6.3-mips64el-build srpm-build bash curl git gnupg make rpm-build shadow-utils regulus-rpm-config regulus-release koji list-untagged | xargs -n 1 koji call tagBuildBypass nk6-mips64el
其中koji build 需要的最小环境的包需要自己现编译出来,以RHEL6.3为例,koji build 需要的最小编译环境包含在如下源码包中:
bash-4.1.2-9.el6_2.src.rpm gawk-3.1.7-9.el6.src.rpm rpm-4.8.0-27.el6.src.rpm bzip2-1.0.5-7.el6_0.src.rpm gcc-4.4.6-4.el6.src.rpm sed-4.2.1-10.el6.src.rpm coreutils-8.4-19.el6.src.rpm git-1.7.1-2.el6_0.1.src.rpm regulus-release-6Server-RG6.0.15.Adv.src.rpm tar-1.23-7.el6.src.rpm cpio-2.10-10.el6.src.rpm gnupg2-2.0.14-4.el6.src.rpm texinfo-4.13a-8.el6.src.rpm curl-7.19.7-26.el6_2.4.src.rpm grep-2.6.3-3.el6.src.rpm unzip-6.0-1.el6.src.rpm diffutils-2.8.1-28.el6.src.rpm gzip-1.3.12-18.el6.src.rpm regulus-rpm-config-9.0.3-25.RG6.02.src.rpm util-linux-ng-2.17.2-12.7.el6.src.rpm findutils-4.4.2-6.el6.src.rpm make-3.81-20.el6.src.rpm patch-2.6-6.el6.src.rpm which-2.19-6.el6.src.rpm
注意:确保postgresql,httpd,kojid,kojira正在运行
dropdb -U koji koji
如果报错“正在被使用”,先停掉apache,重启postgresql后再试
su su - postgres createdb -O koji koji exit postgres exit root psql koji koji < /usr/share/doc/koji-1.6.0/docs/schema.sql 注意版本号,例如: koji-1.3.2 /usr/share/doc/koji-1.3.2/docs/schema.sql koji-2.6.0 /usr/share/doc/koji-1.6.0/docs/schema.sql
登录数据库
psql -U koji koji insert into users (name, password, status, usertype) values ('kojiadmin', 'qwe123', 0, 1); select * from users; insert into user_perms (user_id, perm_id) values (1,1); exit koji
user_id等于上面看到的id
如果出现 koji=> insert into user_perms (user_id, perm_id) values (1, 1); ERROR: null value in column "creator_id" violates not-null constraint insert into user_perms (user_id, perm_id,creator_id) values (1, 1,1); 可以尝试
cd /mnt/koji rm -rf {packages,repos,work,scratch}/* rm -rf /var/lib/mock/* service httpd restart
登录kojiadmin 用户
su - kojiadmin koji add-user kojira koji grant-permission repo kojira koji add-host kojibuilder1 mips64el koji add-host-to-channel kojibuilder1 createrepo capacity psql -U koji koji select (id, name, capacity) from host; update host set capacity = 16 where id = 1; select (id, name, capacity) from host; // 检查是否被修改 exit koji
服务端 service postgresql restart service nfs restart service httpd restart builder端 service kojid restart service kojira restart mount -t nfs -o nolock 10.1.81.87:/mnt/koji /mnt/koji
dropdb -U koji koji su - postgres createdb -O koji koji exit postgres psql koji koji < /usr/share/doc/koji-1.6.0/docs/schema.sql psql -U koji koji insert into users (name, password, status, usertype) values ('kojiadmin', 'qwe123', 0, 1); insert into user_perms (user_id, perm_id,creator_id) values (1,1,1); exit koji su - kojiadmin koji add-user kojira koji grant-permission repo kojira koji add-host kojibuilder1 mips64el koji add-host-to-channel kojibuilder1 createrepo koji add-host kojibuilder2 mips64el koji add-host-to-channel kojibuilder2 createrepo koji add-host kojibuilder3 mips64el koji add-host-to-channel kojibuilder3 createrepo koji add-host kojibuilder4 mips64el koji add-host-to-channel kojibuilder4 createrepo koji add-host kojibuilder5 mips64el koji add-host-to-channel kojibuilder5 createrepo koji add-host kojibuilder6 mips64el koji add-host-to-channel kojibuilder6 createrepo koji add-host kojibuilder7 mips64el koji add-host-to-channel kojibuilder7 createrepo koji add-host kojibuilder8 mips64el koji add-host-to-channel kojibuilder8 createrepo koji add-host kojibuilder9 mips64el koji add-host-to-channel kojibuilder9 createrepo koji add-host kojibuilder10 mips64el koji add-host-to-channel kojibuilder10 createrepo koji add-user koji.1 koji add-user koji.2 koji add-user koji.3 koji grant-permission admin koji.1 koji grant-permission admin koji.2 koji grant-permission admin koji.3 koji add-tag nk6.0-mips64el koji add-tag --parent nk6.0-mips64el --arches=mips64el nk6.0-mips64el-build koji add-target nk6.0-mips64el nk6.0-mips64el-build koji add-group nk6.0-mips64el-build build koji add-group nk6.0-mips64el-build srpm-build koji add-group-pkg nk6.0-mips64el-build build bash bzip2 coreutils cpio diffutils regulus-release findutils gawk gcc gcc-c++ grep gzip info make patch regulus-rpm-config rpm-build sed shadow-utils tar unzip util-linux-ng which koji add-group-pkg nk6.0-mips64el-build srpm-build bash curl git gnupg make rpm-build shadow-utils regulus-rpm-config regulus-release koji list-pkgs --quiet | xargs koji add-pkg --owner kojiadmin nk6.0-mips64el koji list-untagged | xargs -n 1 koji call tagBuildBypass nk6.0-mips64el koji regen-repo nk6.0-mips64el-build koji list-pkgs --quiet | xargs koji add-pkg --owner kojiadmin nk6.0 koji list-untagged | xargs -n 1 koji call tagBuildBypass nk6.0 koji regen-repo nk6.0-build koji add-tag RG6.0 koji add-tag --parent RG6.0 --arches=mips64el RG6.0-build koji add-group RG6.0-build build koji add-group RG6.0-build srpm-build koji add-target RG6.0 RG6.0-build koji add-group-pkg nk6.0-build build bash bzip2 coreutils cpio diffutils regulus-release findutils gawk gcc gcc-c++ grep gzip info make patch regulus-rpm-config rpm-build sed shadow-utils tar unzip util-linux-ng which koji add-group-pkg nk6.0-build srpm-build bash curl git gnupg make rpm-build shadow-utils regulus-rpm-config regulus-release koji add-tag RG6.3 koji add-tag RG6.3-build --parent RG6.3 --arches=mips64el koji add-tag-inheritance --priority 1 RG6.3-build RG6.0-build koji add-target RG6.3 RG6.3-build
http://fedoraproject.org/wiki/Zh/%E6%9E%84%E5%BB%BAKoji%E7%BC%96%E8%AF%91%E6%9C%8D%E5%8A%A1%E5%99%A8#koji_.E7.AE.80.E4.BB.8B
http://jianlee.ylinux.org/Computer/Server/koji.html
http://fedoraproject.org/wiki/Zh/%E4%BD%BF%E7%94%A8Koji%E7%BC%96%E8%AF%91%E6%89%93%E5%8C%85%E7%B3%BB%E7%BB%9F
debian repo manager