参考
从 git 仓库安装 obs-server 记录
clone 项目
打包
制作 rpm 包
osc
问题解决
build
软件包地址
前提条件
软件包
安装后端 (backend)
错误处理
安装 workers
安装到本机
安装到其他主机
安装配置 MySQL database
配置和启动 frontend 和 webclient
安装其他依赖软件包
Socket:MsgHdr
Setup Initial Distributions
访问 webclient
创建 project
为 project 添加 "standard" Repository
/srv/obs/projects/XXX.xml
准备 Repository
使用 bs_admin 扫描 Repository
使用 openSUSE 发行版配置
配置 backend
问题解决
Build.pm
IP 接口
关键概念
Backend (后端)
Process (处理)
FAQ
请看 log
rake db:migrate 错误
启动 webclient 错误
登录问题
创建 standard

参考

从 git 仓库安装 obs-server 记录

当前,obs-server 已经移进 git 仓库了。下面就从 git 仓库编译 obs-server,本实验在 GTES,RHEL,CentOS对应版本上都有效:

clone 项目

git://gitorious.org/opensuse/build-service.git

$ git clone git://gitorious.org/opensuse/build-service.git

打包

进入 build-service 目录,dist/obs-server.spec 中是 rpm 包编译需要的 spec 文件,此时的 Version 是 1.6.90 ,使用 "git archive" 打包:

$ git archive --format=tar --prefix=obs-server-1.6.90/ HEAD |bzip2 > ../obs-server-1.6.90.tar.bz2

制作 rpm 包

准备编译

在自己的实验环境下,创建目录 obs-server :

$ mkdir -pv obs-server/{BUILD,RPMS,SRPMS,SPECS,SOURCES,TMP}

拷贝刚才生成的 obs-server-1.6.90.tar.bz2 到 obs-server/SOURCES , 并拷 贝 build-service/dist/obs-server.spec 到 obs-server/SPECS/

编译

在非 SUSE 的 rpm 系统上编译 obs-server 会有很多依赖关系问题,而且我们用 的 spec 是基于 SUSE 系统的,所有很多写法也不规范,需要修改。不过,现在 就运行 rpmbuild 命令,遇到问题我们一个一个去解决,进入 obs-server 目录:

$ rpmbuild -ba SPECS/obs-server.spec '--define=_topdir /data/lab/obs/obs-server' '--define=_tmppath /data/lab/obs/obs-server/TMP'

问题解决

Unknown tag: Recommends

错误如下:

error: line 106: Unknown tag: Recommends:     memcached

这是因为实验环境不支持 Recommends 这种 spec 语法,修改为 Requires ,再 编译安装 mecached 软件包:

# rpm -ivh memcached-1.2.8-1.el5.src.rpm.b3f5367853eb2059fc85fcc844dbda3b/RPMS/x86_64/memcached-1.2.8-1.x86_64.rpm memcached-1.2.8-1.el5.src.rpm.b3f5367853eb2059fc85fcc844dbda3b/RPMS/x86_64/memcached-selinux-1.2.8-1.x86_64.rpm

osc

从 openSUSE 下载 osc srpm 包编译

$ wget http://download.opensuse.org/repositories/openSUSE:/Tools/openSUSE_11.2/src/osc-0.125.1-4.1.src.rpm

问题解决

安装依赖高版本的 m2crypto

安装编译好的 osc ,错误如下:

error: Failed dependencies:
        m2crypto > 0.19 is needed by osc-0.125.1-4.1.x86_64

下载高版本 m2crypto 编译安装。

# rpm -Uvh m2crypto-0.19.1-10.src.rpm.e1ff73dcc27ab094da7481c46d5aaee2/RPMS/x86_64/m2crypto-0.19.1-10.x86_64.rpm
# rpm -ivh osc-0.125.1-4.1.src.rpm.e24307e78c10ab0908ff36619aa3bec6/RPMS/x86_64/osc-0.125.1-4.1.x86_64.rpm

build

$ wget http://download.opensuse.org/repositories/openSUSE:/Tools/openSUSE_11.2/src/build-2010.01.13-5.1.src.rpm

软件包地址

前提条件

软件包

系统上要安装这些包:

按照完 obs ,系统会有这些包:

# rpm -qa|grep obs
obs-server-1.6.0-14.1
obs-signd-1.6.0-14.1
obs-utils-1.6.0-14.1
obs-api-1.6.0-14.1
obs-productconverter-1.6.0-14.1
obs-worker-1.6.0-14.1

安装后端 (backend)

backend 存放所有的 sources 和 built packages,同时也执行任务。backend 在 obs 里由 obs-server 包提供。

rpm -ivh obs-server-1.6.0-14.1.noarch.rpm

安装好 obs-server 后,按顺序启动服务:

rcobsrepserver start
rcobssrcserver start
rcobsscheduler start
rcobsdispatcher start
rcobspublisher  start

这些脚本路径在:

# ls -l /usr/sbin/rcobs*
lrwxrwxrwx 1 root root 25 08-20 15:56 /usr/sbin/rcobsdispatcher -> /etc/init.d/obsdispatcher
lrwxrwxrwx 1 root root 24 08-20 15:56 /usr/sbin/rcobspublisher -> /etc/init.d/obspublisher
lrwxrwxrwx 1 root root 24 08-20 15:56 /usr/sbin/rcobsrepserver -> /etc/init.d/obsrepserver
lrwxrwxrwx 1 root root 24 08-20 15:56 /usr/sbin/rcobsscheduler -> /etc/init.d/obsscheduler
lrwxrwxrwx 1 root root 24 08-20 15:56 /usr/sbin/rcobssrcserver -> /etc/init.d/obssrcserver
lrwxrwxrwx 1 root root 21 08-20 15:56 /usr/sbin/rcobsworker -> /etc/init.d/obsworker

默认配置下,数据都存储在 /srv/obs 目录下。

错误处理

如果我们直接拿 openSUSE 的包来编译或者直接安装,很可能有下面这些错误出现:

没有 /etc/rc.status

# rcobsrepserver start
/usr/sbin/rcobsrepserver: line 19: /etc/rc.status: 没有那个文件或目录

注意: openSUSE 系统中有 /etc/rc.status 文件,如果我们安装在其他系统上 (比如 CentOS ,需要修改脚本文件,否则上面服务启动不了。

也可以用这个 rc.status 文件

没有 /etc/sysconfig/obs-server

# rcobsrepserver start
/usr/sbin/rcobsrepserver: line 21: /etc/sysconfig/obs-server: No such file or directory

在这里有些示例配置文件:

# ls -l /var/adm/fillup-templates/
总计 8
-rw-r--r-- 1 root root 306 2008-04-25 sysconfig.obs-server
-rw-r--r-- 1 root root 876 2008-03-31 sysconfig.obs-worker
# cp /var/adm/fillup-templates/sysconfig.obs-server \
     /etc/sysconfig/obs-server

如果提示找不到文件 /etc/sysconfig/osb-server ,可以拷贝一份 sysconfig.obs-server 。查看示例: obs-server

同理,如果缺少 /etc/sysconfig/osb-worker,可以拷贝一份。查看示例: obs-worker

没有 startproc 命令

# rcobsrepserver start
Initializing obsrepserverchown: `obsrun:obsrun': invalid user
/usr/sbin/rcobsrepserver: line 47: startproc: command not found

自带脚本需要 killproc/checkproc/startproc 等命令支持,编译安装 ftp://ftp.suse.com/pub/projects/init/killproc-2.13.tar.gz 即可。

或者从本站下载 killproc-2.13

安装 workers

workers 向 backend 发送 open build jobs 请求,然后执行 build。

rpm -ivh obs-worker-1.6.0-14.1.noarch.rpm

安装到本机

worker 可以安装在本地(本机)

# rcobsworker start
/usr/sbin/rcobsworker: line 71: [: : integer expression expected
Run 4 obsworker using /tmp
/var/run/obsworker/boot /dist/osc
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 99144    0 99144    0     0  4223k      0 --:--:-- --:--:-- --:--:-- 11.8M
194 blocks
/dist/osc
/usr/sbin/rcobsworker: line 92: [: : integer expression expected
/usr/sbin/rcobsworker: line 92: [: : integer expression expected
/usr/sbin/rcobsworker: line 92: [: : integer expression expected
/usr/sbin/rcobsworker: line 92: [: : integer expression expected
/var/run/obsworker/boot /dist/osc
/dist/osc

安装到其他主机

worker 可以安装到其他机器,这些机器可以在您的局域网内,也可以在 Internet 上,不过需要快速的网速。在其他主机上安装好 worker 后,需要修改 一些配置文件使用这些 worker :

修改 "main" 机器配置文件

请修改 /usr/lib/obs/server/BSConfig.pm 文件的具体配置

修改 "worker" 机器配置文件

默认安装有 /var/adm/fillup-templates/sysconfig.obs-worker 文件,拷贝到 /etc/sysconfig/obs-worker , 修改相应的配置项即可。

# cp /var/adm/fillup-templates/sysconfig.obs-worker  /etc/sysconfig/obs-worker
# rpm -qf /var/adm/fillup-templates/sysconfig.obs-worker
obs-worker-0.9.1-4.1

obs-worker-0.9.1-4.1.noarch.rpm* 运行 frontend

还需要安装 "obs-api" 及 MySQL server 才能运行 frontend 。

安装配置 MySQL database

启动 MySQL server

# /etc/init.d/mysqld start
启动 MySQL:                                               [确定]

设置 root 密码

mysqladmin -u root password 'turbolinux'

有些系统这样设置不成功,可以查看这里, 重置MySQL管理员密码

创建空的 production database

# mysql -u root -p
mysql> create database frontend_production;
mysql> create database webclient_production;
mysql> quit

如果这个 MySQL 还提供其他服务,建议创建一个分开的 MySQL 用户,比如 “obs”:

# mysql -u root -p'your-password'
GRANT all privileges
ON frontend_production.*
TO 'obs'@'%', 'obs'@'localhost' IDENTIFIED BY 'obs-password';

GRANT all privileges
ON webclient_production.*
TO 'obs'@'%', 'obs'@'localhost' IDENTIFIED BY 'obs-password';

FLUSH PRIVILEGES;

在下列配置文件的 "production_slave:" 字段配置刚才设置好的 MySQL 用户名/密码。

/srv/www/obs/frontend/config/database.yml
/srv/www/obs/webclient/config/database.yml

例如(文件 /srv/www/obs/frontend/config/database.yml ):

...
  9 production_slave:
 10   adapter: mysql
 11   database: frontend_production
 12   username: root
 13   password: turbolinux
 14   socket: /var/lib/mysql/mysql.sock
...

创建 database

# cd /srv/www/obs/frontend/
# chown -R lighttpd.lighttpd db/
# sudo -u lighttpd RAILS_ENV="production_slave" rake db:migrate

配置和启动 frontend 和 webclient

默认的配置文件在 /etc/lighttpd/vhosts.d/obs.conf ,默认配置提供

http://127.0.42.1http://127.0.42.2 接口。可以自行配置访问接口:

$HTTP["host"] =~ "buildserver.my.domain.example.org" {
 ...
}

注意 :如果你改变默认的Web接口,需要相应的修改 /srv/www/obs/webclient/config/environments/production_slave.rb 文件中 的配置。

注意 : 如果你的 backend 和 frontend 不在同一台机器上,你需要修改 /srv/www/obs/frontend/config/environments/production_slave.rb 文件中的 SOURCE_HOST 值!

在 /etc/lighttpd/lighttpd.conf 中激活 obs.conf 配置可以这样:

include "vhosts.d/obs.conf"

或者

include_shell "cat vhosts.d/*.conf"

同时, "mod_magnet" , "mod_rewrite" 和 fastcgi 模块也要激活。

...
14 server.modules              = (
15                                "mod_rewrite",
...
24                                "mod_fastcgi",
...
36                                 "mod_magnet",
...
## mod_magnet
include "conf.d/magnet.conf"

## FastCGI (mod_fastcgi)
include "conf.d/fastcgi.conf"

修改 /srv/www/obs/webclient/config/environments/production_slave.rb

如果修改过 /etc/lighttpd/vhosts.d/obs.conf ,那么也要相应修改 /srv/www/obs/webclient/config/environments/production_slave.rb 的配置内容。

重启 lighttpd

# /etc/init.d/lighttpd start
启动 lighttpd:                                            [确定]

安装其他依赖软件包

有写 Perl 模块和 ruby 模块需要安装

Socket:MsgHdr

cpan> install Socket::MsgHdr

Setup Initial Distributions

访问 webclient

使用默认用户名密码 — "Admin"/"opensuse" 访问 http://127.0.42.1 (如果你 修改过,那么你应该知道这个IP改成什么了 :-) ) 。

创建 project

创建 “GTES:11.3” project

为 project 添加 "standard" Repository

在这个 project 里,添加一个 "standard" Repository

/srv/obs/projects/XXX.xml

如果我们创建的 GTES:11.3 project 成功,会有这样一个文件 /srv/obs/projects/GTES:11.3.xml

<project name="GTES:11.3">
  <repository status='disabled' name='standard'>
    <arch>i586</arch>
  </repository>
  <title>GTES 11.3 test environment</title>
  <description>GTES 11.3 test enviroment, at 172.16.70.30 host!

-- Jian Lee</description>
  <person role="maintainer" userid="Admin" />
  <person role="bugowner" userid="Admin" />
  <person role="maintainer" userid="Admin" />
</project>

"disabled" 的状态会阻止在这个 project 之中的编译,这样它就可以作为一基 本的项目了。

准备 Repository

现在从基础发行版拷贝 rpms 到 /srv/obs/build/GTES\:11.3/standard/i586/\:full/ 目录,如果目录不存在, 就手动创建它:

# mkdir -pv "/srv/obs/build/GTES:11.3/standard/i586/:full/"

拷贝完所有的 i568 和 noarch 包之后:

# chown -R obsrun.obsrun /srv/obs

现在重启 obs 的服务。

使用 bs_admin 扫描 Repository

在我们添加一个 Repository 后,需要重新扫描:

# /usr/lib/obs/server/bs_admin --rescan-repository "GTES:11.3" "standard" "i586"

使用 openSUSE 发行版配置

本地拷贝发行版配置文件:

# cp /usr/lib/obs/server/build/configs/sl11.0.conf "/srv/obs/projects/GTES:11.3.conf"

osc 获取

# osc meta prjconf Fedora:11 > "Fedora:11.conf"
# osc meta prjconf "CentOS:CentOS-5" > "CentOS:CentOS-5.conf"
# osc meta prjconf "RedHat:RHEL-5" > "RedHat:RHEL-5.conf"

配置 backend

配置 backend 很重要,默认在 /usr/lib/obs/server/ 下有一个配置文件 BSConfig.pm

意义也很明了,这个和 /srv/www/obs/frontend/config/environments/production_slave.rb 的关系密 切。

问题解决

Build.pm

安装 openSUSE 的包 http://download.opensuse.org/repositories/openSUSE:/Tools/openSUSE_10.3/src/build-2009.07.27-49.2.src.rpm 即可。

# ls /usr/lib/obs/server/Build
Deb.pm  Kiwi.pm  Rpm.pm  Susetags.pm

IP 接口

默认的配置文件 /etc/lighttpd/vhosts.d/obs.conf 使用 localhost IP 地址, 修改为局域网 IP。

# grep HTTP /etc/lighttpd/vhosts.d/obs.conf
$HTTP["host"] =~ "127.0.42.2\.?" {
$HTTP["host"] =~ "127.0.42.2\.?" {
$HTTP["host"] =~ "127.0.42.3\.?" {

修改为基于端口的虚拟主机

# grep SERVER /etc/lighttpd/vhosts.d/obs.conf
$SERVER["socket"] == "172.16.70.30:81\.?" {
$SERVER["socket"] == "172.16.70.30:82\.?" {

注意 : 要用 "==" ,而不是 "=~" !

关键概念

参考 : http://en.opensuse.org/Build_Service/Key_Components

Backend (后端)

OBS server 主要存放在 /usr/lib/obs 目录下

bs_srcserver

OBS server 有一个 source server (srcserver),负责 manages the sources, revisions, project/package metadata, the "link"-handling, (submit)requests, binary package search, 等等。

srcserver 是 frontend 的接口,传递事件信息给一个或多个 repserver。

srcserver 有一个 http 接口。

bs_repserver

worker 在 repserver 注册后执行编译

repserver 有一个 http 接口

bs_scheduler

bs_dispatcher

bs_publisher

bs_worker

bs_warden

bs_signer

Process (处理)

FAQ

请看 log

提示任何错误请首先查看 log , 从 lighttpd 的日志 (/var/log/lighttpd 下 的 error.log)开始,到/srv/obs/log/ 下的日志,再查看 /srv/www/obs/frontend/log/production_slave.log 和 /srv/www/obs/webclient/log/production_slave.log 日志。

rake db:migrate 错误

frontend

在 frontend 目录里面:

# pwd
/srv/www/obs/frontend
# rake db:migrate
(in /dist/srv/www/obs/frontend)
Using global environment /dist/srv/www/obs/frontend/config/environments/development_base.rb
rake aborted!
Access denied for user 'root'@'localhost' (using password: NO)

(See full trace by running task with --trace)

这可能是 config/database.yml 配置的数据库访问用户名和密码不对,请配置好。 比如我的配置如下:

production_slave:
  adapter: mysql
  database: frontend_production
  username: root
  password: turbolinux
  socket: /var/lib/mysql/mysql.sock

下载就用 production_slave 数据库:

RAILS_ENV="production_slave" rake db:migrate

webclient

这里面就不用执行 "rake db:migrate" 了 :-)

启动 webclient 错误

2010-01-07 15:24:10: (mod_fastcgi.c.924) bind failed for: unix:/srv/www/obs/webclient/tmp/sockets/fcgi.socket-0 No such file or directory
2010-01-07 15:24:10: (mod_fastcgi.c.1365) [ERROR]: spawning fcgi failed.
2010-01-07 15:24:10: (server.c.902) Configuration of plugins failed. Going down.
2010-01-07 15:26:07: (log.c.97) server started
2010-01-07 15:26:07: (mod_fastcgi.c.924) bind failed for: unix:/srv/www/obs/webclient/tmp/sockets/fcgi.socket-0 Permission denied
2010-01-07 15:26:07: (mod_fastcgi.c.1365) [ERROR]: spawning fcgi failed.
2010-01-07 15:26:07: (server.c.902) Configuration of plugins failed. Going down.

"No such file or directory" 可能是 "/srv/www/obs/webclient/tmp/sockets/" 目录不存在,如果不存在,手动创建 下面几个目录:

[root@obs4-x86 tbs]# ll /srv/www/obs/webclient/tmp/
总计 16
drwxr-xr-x 2 lighttpd lighttpd 4096 01-07 15:25 cache
drwxr-xr-x 2 lighttpd lighttpd 4096 01-07 15:25 pids
drwxr-xr-x 2 lighttpd lighttpd 4096 01-07 15:25 sessions
drwxr-xr-x 2 lighttpd lighttpd 4096 01-07 15:59 sockets

"Permission denied" 就是 lighttpd 无权限了,修改权限

# chown -R lighttpd.lighttpd /srv/www/obs/{webclient,frontend}/{tmp,log}

登录问题

表现为输入错误用户名和密码得到错误提示,表明数据库访问没有问题。但时输 入正确用户名和密码返回一个错误页面,大致说没有匹配的动作/index。这很可 能是 frontend 没有设置正确。

首先查看 /srv/www/obs/webclient/config/environments/production_slave.rb 是否和 /etc/lighttpd/vhosts.d/obs.conf 一致(特指 frontend 地址) :

$SERVER["socket"] == "172.16.70.54:82\.?" {
  rails_app   = "frontend"
  rails_root  = "/srv/www/obs/frontend"
  rails_procs = 5
  # production/development are typical values here
  rails_mode  = "production_slave"

  log_root = "/srv/www/obs/frontend/log"

  include "vhosts.d/rails.inc"
}
FRONTEND_HOST = "172.16.70.54"
FRONTEND_PORT = 82
FRONTEND_PROTOCOL = 'http'

创建 standard

需要先在 webclient 里用 Admin (默认密码 opensuse,我改为 turbolinux) 用户创建一个 project 项目,比如 "GTES:11.3" (名字最好用 OBS 习惯 ':'),创建完项目后会在 "/srv/obs/projects" 下看到 "GTES:11.3.xml" 文件。

再手动(用 Advance)添加一个仓库(Repository),名称填写 "standard",架 构勾选需要的即可。现在可以看到 "/srv/obs/build/GTES:11.3/standard/" 目 录存在,下面是架构目录。

以 i386 arch 为例,创建 "/srv/obs/build/GTES:11.3/standard/i386/:full" 目录,拷贝所有需要的二进制包(rpm 系统就用 rpm包)到 :full 目录下。

重启 OBS, 或者用 bs_admin 脚本,就可以让 OBS 更新信息。

注意:一定要先创建项目,并添加仓库,再拷贝。如果自己创建的目录,会被 OBS 最终删除的。