OBS与git的联动应用

05 Mar 2020 - changjie.fu

总览

本文章主要将分为两部分:

# 此文章的全部步骤使用OBS参考服务器完成,使用其他服务器时可能出现工具不全的情况

利用源服务直接获取git源码并编译成包

Source Services 相关

Source Services 是用于以可靠方式验证,生成或修改源的工具。它们被设计为最小的工具,并且可以按照经典UNIX设计的强大思想进行组合。

源服务就像是系统中的函数, 我们可以通过运行脚本调用它。而脚本就是Package中的_service文件。

参考链接: openSUSE Wiki OBS官网文档

创建使用源服务的Package

  1. 将源服务工具添加到环境中:

    osc meta prj -e [project名]

    在对应<repository>下添加对应环境的工具库:

     <repository name="Fedora_30">
         <path project="openSUSE:Tools" repository="Fedora_30"/>
         <path project="Fedora:30" repository="standard"/>
         <arch>x86_64</arch>
     </repository>
    

    或者使用网页版的方式:

    点击Home Project -> Repositories。

    点击对应环境下方的绿色加号。

    环境标签

    在Project栏填入“openSUSE:Tools”,并在Repositories栏中选择对应环境。

    添加

    点击Accept按钮保存。

  2. 通过命令行工具或者网页新建一个空的Package

    空Package

  3. 进入Package目录并创建_service:

    • 网页端点击“Add file” ,在“File URL:”中填入git链接并保存。
    • 命令行则在Package目录中新建_service文件并上传之服务器。
  4. 准备编辑_service文件

编辑_service文件

最基础的_service文件将会如下所示:

	<services>
	  <service name="obs_scm">
	    <param name="scm">git</param>
	    <param name="url">git://github.com/cs2c-fu/hi.git</param>
	  </service>
	  <service name="tar" mode="buildtime"/>
	  <service name="recompress" mode="buildtime">
	    <param name="compression">xz</param>
	    <param name="file">*.tar</param>
	  </service>
	  <service name="set_version" mode="buildtime"/>
	</services>

最外层为<services>标记,在<services>内则为一个个<service>函数,而<param>则为<service>函数的参数。

为了实现“利用源服务直接获取git源码并编译成包”这个目标,

我们的_service应该类似于这样:

<services>

  <service name="obs_scm">
    <param name="scm">git</param>
    <param name="filename">helloworld</param>
    <param name="url">git://github.com/cs2c-fu/hi.git</param>
    <param name="versionprefix">VERSION.git</param>
  </service>

  <service name="tar" mode="buildtime"/>

  <service name="extract_file">
    <param name="archive">*.*</param>
    <param name="files">*/*.spec */*.patch</param>
  </service>

  <service name="recompress" mode="buildtime">
    <param name="compression">xz</param>
    <param name="file">*.tar</param>
  </service>

  <service name="set_version" mode="buildtime"/>

</services>

下面将对所需的服务逐一进行介绍:

第一个服务:obs_scm

obs_scm 会将链接 url 中的仓库下载下来并打包为 obscpio、obsinfo 文件,文件包命名格式为:

[Name]-[Version].[commit_timestamp].obscpio

其中,[commit_timestamp]为 commit 十六进制时间戳。

可选参数:

第二个服务:tar

tar 会将 obs_scm 保存的 obscpio 文件转化为 tar 包文件。

原本OBS统一使用 tar_scm 来完成 obs_scmtar 的任务,但 tar_scm 在空间利用率上表现不佳,故现在推荐使用 obs_scmtar 来完成下载tar包的任务。

# 详见:链接

第三个服务:extract_file

extract_file 可以从tar包中提取文件, 具体需要提取什么文件取决于git仓库中的文件格式。

一般来说我们可以将打包需要的内容分为四大类:

对于git仓库来说,一般会将所有文件放到仓库的根目录。

git仓库

此时我们需要将spec文件、patch文件、源文件提取出来, 源码则留在tar包中等待之后的服务将其压缩打包。

对于OBS仓库来说,为了方便OBS系统使用,人们已经对源码进行压缩打包。

OBS仓库

此时我们需要将所有文件提取出来并省略之后的压缩打包环节。

参数:

第四个服务:recompress

recompress 会对指定文件进行压缩

参数:

第五个服务:set_version

会将spec文件中的Version替换为obs_scm时的

[Version].[commit_timestamp]

spec文件中可以以

helloworld-%{version}.tar.xz

格式定位源码包。

等待编译完成

由于使用源服务获取源码,所以编译时需要额外过程与时间。

service运行中

当状态显示为 blocked 时, 表明源服务正在运行。当源服务运行完毕时会正常开始打包过程。

我的参考案例:链接

利用 webhook 使源服务在git仓库push时触发

obs可以创建令牌(token),当令牌被触发时,OBS会运行源服务。

将网址与令牌添加到git仓库的webhook列表中,就可以在git仓库中实现触发源服务,进而更新OBS中的包版本。

具体步骤:

创建专属包的OBS Token(OBS令牌):

osc token --create <PROJECT> <PACKAGE>

命令将生成仅对Project/Package生效的token。

打开git仓库网址(以github为例):

git仓库页

打开仓库 -> Setting -> Webhooks

Webhook页

点击左上方的 Add webhook。

新建Webhook

在 Payload URL中以:

https://<服务器域名>/trigger/webhook?id=<令牌ID>

为格式填入。

在 Secret 中填入令牌秘匙,按需求选择trigger类型, 保证Webhook为Active状态。

之后点击 Add webhook 即成功实现。

可尝试触发trigger以验证成果。