openSUSE:Packaging Service for Source Processing
构建服务教学 - 技巧和花样 - 跨发行版打包 - Debian 打包指南 - 打包检查
桌面菜单分类 - 打包常用的 RPM 宏 - 小脚本片段 - SysVinit 脚本 - 源代码服务
OBS 打包互助问答 - 打包黑名单
在线下载(Download a file)
参数有主机(host)、路径(path)、文件名(filename)、端口(port)和协议(protocol)
其中后三者没什么好说的,协议支持 HTTP/HTTPS/FTP 协议,默认为 HTTP。
需要注意的是输入主机时不能带 http:// 前缀,因为那是归协议管的; 而 path 最前面一定要有一个 “/” 表示站点根目录。
例如:http://www.longene.org/download/WineQQ2012-20120719-Longene.deb
要下载这个文件,在 OBS 的文件窗口,添加源代码处理服务(Add service for source processing)- 下载文件(Download a file),然后编辑参数(Edit Parameters),主机(host)填 www.longene.org,路径(path)填 /download/WineQQ2012-20120719-Longene.deb
注意:下载的文件名称为:_service.download_url.mysql-5.5.27.tar.gz 这样,你在「文件名」参数中改不掉 _service.download_url. 这个前缀,而在 spec 文件中要正常使用%{name}-%{version}.tar.gz,简单说就是当前缀不存在,你加前缀反而会找不到文件。
从 SCM 源(GIT/SVN/Mercurial/Bazaar)拉取源代码进行打包(Packaging from SCM repository)
使用 obs-service-tar-scm 完成从 SCM 源的打包构建。接下来假设您已经有了基础的打包知识,在本地进行试打包。
首先在本地 obs 目录通过:
osc mkpac xx
或者osc copypac xx xx
创建一个包(其他创建操作详见 man osc
)
通过给 osc 传递 SCM 源地址,直接创建一个 _service 文件模板:
osc add https://the.git.url.here
(从前项目链接里可以知道目前您应该使用 obs_scm 而不是 tar_scm 这里默认也是使用的 obs_scm)
然后你会得到类似如下的模板 _service 文件:
<services> <service name="obs_scm"> <param name="url">https://the.git.url.here</param> <param name="scm">git</param> </service> <service mode="buildtime" name="tar" /> <service mode="buildtime" name="recompress"> <param name="file">*.tar</param> <param name="compression">xz</param> </service> <service mode="buildtime" name="set_version" /> </services>
可以看到模板创建了 4 个服务:从 SVM 获取源代码(生成 .obscpio 文件);编译时的将前述文件压缩为 tar 文件;将 tar 文件重打包为以 xz 方式压缩的文件(这一步你可以进行文件筛选,见上的匹配操作,具体详见后文提供的参数链接);处理 spec 文件版本的服务(因为你可能想让其自动以某种方式为你将版本号修改,如直接改为最新的提交日期等)。
针对上述 _service 文件的 obs_scm 部分的具体参数参见 tar_scm.service.in ,您可以对照进行自由修改。
比如你可以仅仅通过添加修改如下内容:(摘自此 OBS unclutter-xfixes 项目 _service 文件)
<service name="obs_scm"> ... <param name="revision">master</param> <param name="match-tag">v1.5</param> <param name="versionformat">@PARENT_TAG@.@TAG_OFFSET@~git.%cd</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ... </service>
- 将从 master 分支抓取的源代码生成如:service:obs_scm:the_project_name-1.5.11~git.20190707.obscpio 的 obscpio 文件。
- 上述内容的
1.5.11~git.20190707
为 versionformat 的内容匹配,和 versionrewrite-pattern 对版本号 v1.5 的 v 的正则匹配去除得到 - OBS 会在编译时(上文模板 set_version 的 mode 决定)将你的 spec 文件 Version 部分替换为
1.5.11~git.20190707
写入临时编译 spec 文件(对,你的 spec 文件并不会变)。 - 同时由于 changesgenerate 参数的启用,服务会自动将最近的一些提交日志写入临时的 changes 变更,打包进 RPM 文件(同样的,你的 changs 变更文件也不会变,你会注意到有自动生成的保留的变更文件生成)。
- 具体的参数内容详见前链接。
其他服务的具体参数可参见 英文维基 下具体对应服务的项目地址。
编写好 _service 后大致从源码拉取部分就结束了,总的来讲通过这个服务文件,obs 会自动帮你在线得到源代码文件,产生其他有用的文件等,通过合适的服务文件,之后更新包也许只需要 trigger 一下就能完成。
之后编写 .spec 文件注意 Source 部分对源代码包的指定请使用 %{name}
和%{version}
指定源代码文件,以匹配服务自动生成的源代码文件,如:
Source: %{name}-%{version}.tar.xz
本地编译测试:
osc build
安装测试通过后添加项目文件,写变更,提交:
osc add _service xx.spec xx.changes osc vc osc ci
OBS 官方给出的一个 参考项目