18. 软件打包服务 - Open Build Service
觉得看文字教程无聊的同学可以直接去看玛噶学姐的优酷视频教程:
openSUSE 下构建 RPM 软件包
18.1 软件打包简介
前面17章介绍了代码编译工具、集成开发环境(IDE)、源码的发布管理(版本控制系统),软件源码从开发到管理、发布走了一遍,下面到怎样把软件源码打包成适合各个版本的Linux,比如Debian/Ubuntu/Deepin会使用deb包,Fedora/openSUSE使用rpm包。不同的Linux发行版和同一发行版的不同版本号的Linux,通常都需要将软件从源码编译组建成二进制格式的deb或rpm包。通过安装deb或rpm包,省去了普通用户编译源码、寻找软件依赖库的繁琐过程,就可以实现傻瓜式安装,省时省力。
当然还有将一些头文件、库文件打包成devel(或dev)系列的deb或rpm包,用于开发。
通常以devel(或dev)结尾的deb或rpm包,就是开发和编译代码用的。
以debuginfo和debugsource结尾的就是专用于该软件的调试信息和调试源码包。
以source结尾的包(如kernel-source)就是该软件完整的源代码的打包。
以lang结尾的包(如anjuta-lang)就是该软件的多国语言包。
各种各样的Linux都是这些打好的软件包的集合,如果没有deb或rpm之类现成的软件包,那么从源代码编译软件,生成可执行程序或库,对新手来说是一件麻烦的事。软件基本都不是独立的个体,通常会依赖这样或那样的库,很可能在网上找了软件源码来编译,发现怎么搞都不行,很多时候就是依赖的库太多,剪不断理还乱,所以新手就很难弄。
当然,这些东西搞多了就轻车熟路了。作为新世纪的好青年,不能总是指望老外搞。作为世界人口第一的大国,我们也应该为开源社区出一份力。写17和18章的内容也是期望大家多作贡献。
18.2 Open Build Service
下面介绍Open Build Service(OBS),Open Build Service原本叫openSUSE Build Service,最初是openSUSE社区人员为openSUSE生成rpm软件安装包而打造的平台,现在已经发展成支持各种Linux发行版软件打包的服务平台,由于支持的Linux系统的广泛性,2011年openSUSE Build Service正式改名为Open Build Service。其主页:
http://openbuildservice.org/
目前支持的操作系统包括:openSUSE, Debian, Fedora, Ubuntu, Red Hat Enterprise Linux, SUSE Linux Enterprise等。
在openSUSE 12.1的时候,还需要添加OBS安装源:
http://download.opensuse.org/repositories/openSUSE:/Tools/openSUSE_12.1/
现在新版本中发现其发行DVD盘里面就有OBS的各种软件。所以省事了,直接在root命令行执行:
zypper in osc
查看内置帮助文档命令:
osc help
osc就是OBS命令行的意思,软件包管理器会自动安装相关的软件包,所以安装是非常容易的。
OBS软件直接放到发行DVD里面,也可以看出openSUSE社区和其他开源社区对大家的召唤啊。
18.3 简单的OBS之旅
OBS打包服务的大致工作流程是在本地准备好源代码包,编辑好SPEC文件,然后将各种相关文件提交给OBS服务器,服务器自动根据SPEC文件进行编译链接源代码,为各个版本Linux打包,并检查软件包信息。所以通常都是需要连网操作的。既然是贡献软件包,自然是公开在OBS网站的。
下面先介绍命令行下的osc打包。下节介绍Web页面的提交方式。
下面就用hellolq.cpp作为例子,打包成rpm发到OBS网站上去。
//hellolq.cpp
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
cout << "Hello LQ!" << endl;
return 5201314;
}
本章用到的代码、SPEC等文件压缩包下载:
18.hellolq.tar.gz
(1)注册OBS帐号
去这个网站:
https://build.opensuse.org/
点击右上角“Sign Up”,注册自己喜欢的帐号;
注册完成后,重新回到上面网址;
点击右上角的“Login”,用新账户登录进去。
登录后会看到页面变了,中间有个“New Project”,点击一下,
填写新建的项目:
最下面两个复选框不要选,直接点“Create Project”。如果刚注册的用户名为iloveliuqing,那么就会出现新建的项目 home:iloveliuqing 。第一步成功。
(2)在本地创建OBS打包项目文件夹
在用户主文件夹下建立一个文件夹,专门用于OBS打包:
mkdir ~/OBSProjects
比如用户主文件夹是/home/suse123,那么OBS项目文件夹就是/home/suse123/OBSProjects 。
(3)把服务器上的OBS项目同步到本地OBSProjects。
OBS命令类似SVN的命令,这里先和服务器上的同步一下。
cd ~/OBSProjects
osc checkout home:username
checkout可以简写成co,
username就是前面注册的账户名,比如
osc co home:iloveliuqing
连网同步的时候,命令行会提示需要自己前面注册的用户名和密码。然后等待下载同步过程。由于新账户没东西,所以本地OBSProjects/home:
username文件夹是空的。
(4)设定想为哪些发行版打包
命令行下可以用如下命令打开配置文件:
osc meta prj -e home:username
这时会看到vim里的配置条目:
<project name="home:iloveliuqing">
<title>iloveliuqing's Home Project</title>
<description>Test hellolq.</description>
<person userid="iloveliuqing" role="maintainer"/>
<person userid="iloveliuqing" role="bugowner"/>
</project>
在vim界面按i键开启编辑模式,在</project>上面添加几行:
<repository name="openSUSE_12.3">
<path project="openSUSE:12.3" repository="standard"/>
<arch>i586</arch>
<arch>x86_64</arch>
</repository>
输入好之后就是这个样子:
然后按ESC键退出编辑模式,再打字 :wq 就可以保存退出vim了。
添加的一段就是表示为openSUSE 12.3版本的32位和64位系统打包。这里做测试,只加了一个,还可以类似地添加多个目标版本。这配置文件是OBS服务器上的,通过远程编辑方式改变配置条目。
(5)准备好源码包和spec 文件
实际上的源码包当然不会只有一个hellolq.cpp,所以这里按照GNU标准,用自动配置工具如autoconf、automake等打了一个带有一些配置文件的源码包:hellolq-1.0.tar.gz 。
一般自动配置工作都是集成开发环境自动做的,所以不用在意生成的一堆配置文件和脚本。其实源代码就只有一个hellolq.cpp。当然感兴趣的可以去搜一下“Linux自动生成Makefile”。
(需要注意的是automake处理时会添加install-sh、depcomp、missing三个快捷方式到源码文件夹里,这三个快捷方式在本地能用,但远程OBS服务器上是没有的。必须把它们三个的文件本体,从/usr/share/auotomake-
version/ 里面,复制到源码文件夹里,再做成压缩包。)
在解决好依赖关系之后,Linux下的软件源代码编译安装通常都是非常简单的三板斧:
./configure
make
sudo make install
第一步是检查配置环境,看看有没有依赖的工具、头文件、库等。第二步是正式编译链接,生成目标文件和可执行的程序。第三步是安装到系统中。
得到要打包的源代码后,怎么让OBS打包系统知道编译、打包、安装、卸载这个软件时具体执行什么命令呢?
这就要靠 spec 文件了。除了软件源码,就数 spec 文件重要了。在OBS上打包,至少需要这两个东西。
spec 文件的编写知识很多,但通常情况下,找个差不多的模板,
把软件包的名字、版本、依赖关系之类的改改就差不多了。
对于这里简单的软件包,找了个模板套一下,然后把名字改为 hellolq.spec 。
详细的编写方法参考:
http://fedoraproject.org/wiki/How_to_create_an_RPM_package
改好的hellolq.spec如下:
Name: hellolq
Version: 1.0
Release: 1
License: GPL-2.0+
Source: hellolq-1.0.tar.gz
Group: Productivity/Other
Summary: Test hellolq
# List of additional build dependencies
BuildRequires: gcc-c++ , libstdc++-devel
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
hellolq-1.0
%prep
%setup -q
%build
# Assume that the package is built by plain 'make' if there's no ./configure.
# This test is there only because the wizard doesn't know much about the
# package, feel free to clean it up
if test -x ./configure; then
%configure
fi
make
%install
make DESTDIR=%buildroot install
# Write a proper %%files section and remove these two commands and
# the '-f filelist' option to %%files
echo '%%defattr(-,root,root)' >filelist
find %buildroot -type f -printf '/%%P*\n' >>filelist
%clean
rm -rf %buildroot
%files -f filelist
%defattr(-,root,root)
# This is a place for a proper filelist:
# /usr/bin/Qt4
# You can also use shell wildcards:
# /usr/share/Qt4/*
# This installs documentation files from the top build directory
# into /usr/share/doc/...
# %doc README COPYING
# The advantage of using a real filelist instead of the '-f filelist' trick is
# that rpmbuild will detect if the install section forgets to install
# something that is listed here
%changelog
* Tue Mar 26 2013 Winland <winland0704@126.com> 1.0
- Build for 1.0.
这倒数第二段的注释深深地出卖了我,这是从一个打包qt的项目里弄来的spec模板。这个是最简单的模板,可以自己试着玩玩,但是正式的写法最好参考opensuse_zh项目上的软件包的spec文件写法。比如Dr.COM 包页面,打开页面里的drcom.spec文件就可以看到里面的内容了。
https://build.opensuse.org/package/show/home:opensuse_zh/Dr.COM
准备好源码包hellolq-1.0.tar.gz和spec文件hellolq.spec之后,就可以进入下一步了。
(6)创建一个具体的打包项目
继续在~/OBSProjects里面执行命令,来新建一个打包项目:
osc meta pkg -e home:username packagename
username是之前的用户名,
packagename就是软件包的名字。
比如执行
osc meta pkg -e home:iloveliuqing hellolq
命令行下会打开vim,编辑配置文件,按 i 键编辑,
在 <title> </title> 中间填写软件名字,如 hellolq 。
在 <description> </description> 中间填写软件描述,如 Test hellolq 。
然后按ESC,再输入 :wq 。就可以保存退出了。
这个是在OBS服务器上创建了打包项目,本地需要更新一下:
osc up home:username
显示结果如下:
suse123@linux-9ppl:~/OBSProjects> osc up home:iloveliuqing
checking out new package hellolq
A home:iloveliuqing/hellolq
At revision None.
这时就会和OBS服务器同步了。
(7)写打包记录,添加文件到打包项目
把之前准备的hellolq-1.0.tar.gz
和 hellolq.spec 复制到这个目录里:
~/OBSProjects/home:
username/packagename/
比如OBSProjects/home:iloveliuqing/hellolq/目录。然后进入这个目录:
cd ~/OBSProjects/home:username/packagename/
先在打包目录里面执行:
osc vc
这会打开一个hellolq.changes文件,用于记录打包者做的事情,比如记录打包开始日期、什么时候修复了什么问题之类的。这里输入的是:
-------------------------------------------------------------------
Tue Mar 26 2013 Winland <winland0704@126.com>
- begin OBS test
- build hellolq-1.0
编辑好后,按ESC键,在输入 :wq 保存退出。
执行添加文件到打包项目的命令:
osc add *
这会把该目录里的文件都添加到打包项目里。
然后执行提交:
osc commit
提交时会提示要在“--This line, and those below, will be ignored--”上面输入一些关于本次提交打包的描述信息,比如 Fix bugs. Test hellolq 。
按i键编辑,编辑好后按ESC键,再输入 :wq 保存退出。
再等待文件都被上传到服务器。就差不多搞定了。
(8)查看打包结果
上传到的文件,OBS服务器会自动根据spec文件打成rpm包。
查看提交日志,执行:
osc log
查看打包结果,执行:
osc results
如果打包的过程结束,会看到finished字样。finished表示在某个系统平台执行编译链接、安装检查的过程结束,finished不是说成功也不是说失败。如果OBS服务器打包过程出错,以后查看results会出现failed字样。如果打包过程没问题,以后查看results会出现succeeded字样。
查看在某个版本系统架构上打包的日志,执行:
osc buildlog openSUSE_12.3 i586
osc buildlog openSUSE_12.3 x86_64
在finished之后就可以查看这些打包日志。
如果出错,会看到有些ERROR打头记录可以查看哪里出错的。
如果没问题,会看到类似这些记录:
RPMLINT report:
… …
... saving built packages
… …
build34 finished "build hellolq.spec" at Wed Mar 27 04:47:49 UTC 2013.
打包成功后,就可以在自己的OBS个人页面看到打好的包:
也可以从属于自己的打包软件源下载软件,比如:
https://build.opensuse.org/package/show/home:iloveliuqing/hellolq
OBS个人空间
https://build.opensuse.org/package/show/home:
username/
就是自己专属的打包发布的地方。
18.4 Web界面提交打包
登录
https://build.opensuse.org/
网站之后,点击右上角的Home Project,就会进入自己的打包项目管理页面。
注册帐号和新建个人项目同上一节的(1)步骤。下面示例Web界面操作。
(1)设置想为哪些发行版打包
到 Home Project 主界面,点击上面的 Repositories ,找到 Build Flag 字样上面的 Add repositories,点击它就可以选择添加要打包的平台。
(2)准备好源代码包和SPEC文件
这个同上一节的osc命令行方式步骤(5)介绍的。有changes文件更好,做好打包记录是好习惯。
changes文件可以自己用编辑器建一个,然后编辑,一样好使的。
(3)创建打包项目
回到HomeProject主界面,点击下面的“Create package”,就可以新建一个打包项目。
编辑好后保存。
(4)提交文件到打包项目
到Home Project主界面,可以看到建好的Packages,打开这个打包项目,
找到Revision字样上面的Add file就可以添加文件。Web界面很直观,就不细说了。
添加完文件后,就可以静候佳音。
右边的Build Results就是打包结果。
点击结果里面的链接“finished”或“failed”、“succeeded”就能看到打包日志。
有问题的就可以查看问题。
18.5 推荐的资料
OBS是很强大的平台,熟悉了SPEC文件打包之后,不管去其他哪个Linux平台打包都是可以举一反三的。学习打包可以锻炼自己,也能为开源社区出力。当然,可以学到很多知识。打包出了问题实在不好解决,就去
openSUSE中文社区
或openSUSE官方论坛求助。推荐几个网址,可以多去学学。
玛噶学姐的“带你学”系列:
(一) openSUSE Build Service 注册与安装
(二) OBS 常用命令:以创建一个包为例
不过玛噶学姐最厉害的是把打包过程做成优酷视频教程了,不喜欢看文字的同学有福了!视频见本节开头。
山木的 Open Build Service 软件建包简要教程:
(一)创建OBS项目
(二)从web页面构建发行版安装包
(三)利用osc工具构建发行版安装包
(四)编写跨平台spec文件
Redhat的RPM打包教程
https://www.redhat.com/sysadmin/create-rpm-package
openSUSE的OBS打包指南
https://en.opensuse.org/openSUSE:Build_Service_Tutorial
openSUSE的OSC使用教程
https://en.opensuse.org/openSUSE:OSC
本文档翻译自
http://opensuse-guide.org/ 不当之处,还望指正
使用e-mail发送您的英文评论给 admin [at] opensuse-guide.org
或发送意见和建议给中文译者:Libitum (hello[at]libitum.org);
Winland (winland0704[at]126.com)