参考
从 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
软件包地址
前提条件
软件包
系统上要安装这些包:
- mysql
- lighttpd
- ruby
- rails
- ruby-mysql
按照完 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.1 和 http://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 最终删除的。
