提交 66a20bed 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!16 添加两篇关于如何使用OBS系统进行打包构建的文章

Merge pull request !16 from fuchangjie/use-OBS
+++
title = "如何使用 openEuler OBS - (二)与gitee的联动"
date = "2020-03-26"
tags = ["OBS"]
archives = "2020-03"
author = "Changjie Fu"
summary = "OBS系统如何借助Source Services自动获取git仓库中的代码."
+++
## 概要
本文分为两部分:
- 利用Source Services(下称源服务)直接获取git源码并编译成包
- 利用webhook 使源服务在git仓库push时触发,从而实现OBS始终跟进git仓库最新版本源码的效果
> 此文章的全部步骤使用[openEuler OBS](http://openeuler-build.huawei.com/)完成,使用其他服务器时可能出现工具不全的情况。
## 利用源服务直接获取git源码并编译成包
### Source Services 相关
> Source Services 是用于以可靠方式验证,生成或修改源的工具。它们被设计为最小的工具,并且可以按照经典UNIX设计的强大思想进行组合。
源服务就像是系统中的函数,我们可以通过运行脚本调用它;而脚本就是Package中的_service文件。
### 创建使用源服务的Package
1. 通过命令行工具或者网页新建一个空的Package
![空Package](../2020-03-26-OBS-with-Git-空Package.png "空Package.png")
2. 进入Package目录并创建_service:
* 网页端点击*Add file* ,点击*Choose a file*,并选择本地建好的_service文件。
* 命令行则在Package目录中新建_service文件并上传之服务器。
3. 准备编辑_service文件
### 编辑_service文件
最基础的_service文件将会如下所示:
```powershell
<services>
<service name="tar_scm">
<param name="scm">git</param>
<param name="url">git://github.com/cs2c-fu/hi.git</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>
```
最外层为`<services>`标记,在`<services>`内则为一个个`<service>`函数,而`<param>`则为`<service>`函数的参数。
为了实现“**利用源服务直接获取git源码并编译成包**”这个目标,
我们的_service应该类似于这样(以下格式请根据具体情况选择合适的顺序):
```xml
<services>
<service name="tar_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="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>
```
下面将对所需的服务逐一进行介绍:
**第一个服务:[tar_scm](https://github.com/openSUSE/obs-service-tar_scm)**
**tar_scm** 会将链接 url 中的仓库下载下来并打包为 tar 文件,文件包命名格式为:
> [Name]-[Version].[commit_timestamp].tar
其中,[commit_timestamp]为 commit 十六进制时间戳。
可选参数:
- **filename** 定义打包后文件的 Name,默认为git仓库名。
- **versionprefix** 定以打包后文件的 Version 格式,默认为当前十进制时间戳。
在OBS官方服务器中, **tar_scm** 服务由于在空间利用率上表现不佳, 已被 **obs_scm****tar** 服务取代,但openEuler的外网OBS暂时还不支持**obs_scm**,所以这里选择 **tar_scm**
> 详见:[链接](https://openbuildservice.org/2016/04/08/new_git_in_27/)
**第二个服务:[extract_file](https://github.com/openSUSE/obs-service-extract_file)**
**extract_file** 可以从tar包中提取文件, 具体需要提取什么文件取决于git仓库中的文件格式。
一般来说我们可以将打包需要的内容分为四大类:
- **源码** : 参与编译过程的文件
- **spec文件** : 指导如何打包的规范文件
- **patch文件** : 修改源码的差异文件
- **源文件** : 不参与编译但需要打包的文件
对于**git仓库**来说,一般会将所有文件放到仓库的根目录。
![git仓库](../2020-03-26-OBS-with-Git-git仓库.png "git仓库.png")
此时我们需要将**spec文件、patch文件、源文件**提取出来, **源码**则留在tar包中等待之后的服务将其压缩打包。
对于**OBS仓库**来说,为了方便OBS系统使用,人们已经对源码进行压缩打包。
![OBS仓库](../2020-03-26-OBS-with-Git-OBS仓库.png "OBS仓库.png")
此时我们需要将**所有文件**提取出来并省略之后的压缩打包环节。
参数:
- **archive** 定义提取来源文件格式
- **files** 定义提取文件类型 _注意:存在一个顶层目录,其名称未知,因此文件名应以 “*/” 开头_
**第三个服务:[recompress](https://github.com/openSUSE/obs-service-recompress)**
**recompress** 会对指定文件进行压缩
参数:
- **compression** 压缩格式,可选:none、gz、bz2、xz
- **file** 压缩内容
**第四个服务:[set_version](https://github.com/openSUSE/obs-service-set_version)**
会将spec文件中的Version替换为obs_scm时的
`[Version].[commit_timestamp]`
spec文件中可以以
`helloworld-%{version}.tar.xz`
格式定位源码包。
### 等待编译完成
由于使用源服务获取源码,所以编译时需要额外过程与时间。
![service运行中](../2020-03-26-OBS-with-Git-service运行中.png "service运行中.png")
当状态显示为 **blocked** 时, 表明源服务正在运行。当源服务运行完毕时会正常开始打包过程。
我的参考案例:[链接](http://openeuler-build.huawei.com/package/show/home:changjie_fu/hi)
### Source Services 在实际场景中的应用
[oVirt-SIG](http://openeuler-build.huawei.com/project/show/oVirt-SIG)组中,我们应用了源服务实现代码由git到OBS的同步。
首先,我们在git仓库中以:**spec文件、patch文件、 **源码tar包** 的格式上传并管理源码。
![gitee仓库](../2020-03-26-OBS-with-Git-gitee仓库.png "gitee仓库.png")
在OBS系统中建立对应包并以一下格式定义_service文件:
```xml
<services>
<service name="tar_scm">
<param name="scm">git</param>
<param name="filename">ioprocess</param>
<param name="url">https://gitee.com/openkylin/ioprocess.git</param>
</service>
<service name="extract_file">
<param name="archive">*.*</param>
<param name="files">*/*</param>
</service>
</services>
```
由于我们已经很好的在git仓库中设置了存储格式, 此时我们只需将所有文件下载并提取即可。
在这之后,OBS系统会帮助我们完成编译与打包的环节。
## 利用 webhook 使源服务在git仓库push时触发
在写此文时,OBS系统还不支持gitee格式的webhook,所以以下内容为使用github仓库实现。
> obs可以创建令牌(token),当令牌被触发时,OBS会运行源服务。
>
> 将网址与令牌添加到git仓库的webhook列表中,就可以在git仓库中实现触发源服务,进而更新OBS中的包版本。
>
>
> **具体步骤:**
>
> 创建专属包的OBS Token(OBS令牌):
> ```
> osc token --create <PROJECT> <PACKAGE>
> ```
>
> 命令将生成仅对Project/Package生效的token。
>
> - 使用命令 `osc token` 可以查看当前生效的令牌列表。
>
> - 使用命令`osc token --delete <TOKEN>` 可以删除令牌
>
>
> 打开git仓库网址(以github为例):
>
> ![git仓库页](../2020-03-26-OBS-with-Git-git仓库页.png "git仓库页.png")
>
> 打开仓库 -> Setting -> Webhooks
>
> ![Webhook页](../2020-03-26-OBS-with-Git-Webhook页.png "Webhook页.png")
>
> 点击左上方的 Add webhook 。
>
> ![新建Webhook](../2020-03-26-OBS-with-Git-新建Webhook.png "新建Webhook.png")
>
> 在 Payload URL中以:
>
> ` http://openeuler-build.huawei.com/trigger/webhook?id=<令牌ID>`
>
> 为格式填入。
>
> 在 Secret 中填入令牌秘匙,按需求选择trigger类型, 保证Webhook为Active状态。
>
> 之后点击 Add webhook 即成功实现。
>
> 可尝试触发trigger以验证成果。
+++
title = "如何使用 openEuler OBS - (一)介绍"
date = "2020-03-26"
tags = ["OBS"]
archives = "2020-03"
author = "Changjie Fu"
summary = "OBS系统的介绍及openEuler OBS 的简单应用."
+++
## OBS是什么
OBS是Open Build Service 的简写(官方网址:[https://openbuildservice.org/](https://openbuildservice.org/)),
原本是作为发行版openSUSE专用的rpm打包的平台,后续扩展为面向多发行版、多架构、多格式的打包发布平台。
![OBS 系统结构。图自论文《集群模式操作系统软件包生成系统的研究与实现》](../2020-03-26-how-to-OBS-系统结构.png "系统结构.png")
## 与koji的不同
- 管理范围
与koji只管理包(包括源码包与二进制包)仓库不同,OBS同时管理着源码与包两个仓库。koji是从一个包编译完成后开始接手,根据包的NVR(Name-Version-Release)确定包的位置,在编译验证后入库保存。而OBS是从源码阶段开始管理,它拥有自己的包版本标记与changelog日志。OBS可以像git一样保存源码的历史版本,对源码进行分支管理。并生成各版本的二进制包与源码包。
换句话说,OBS可以同时实现koji和git的功能。
> OBS接受源码的格式与git普遍的保存格式并不相同,所以OBS无法完全取代git。
- 适用格式
OBS可以生成rpm、deb等格式的包,而koji只适用于rpm格式。
## OBS使用
### 安装osc
osc是OBS的命令行程序,您可以在[这里](https://download.opensuse.org/repositories/openSUSE:/Tools/) ,选择自己的系统版本,添加软件源到自身包管理器中。
这里以Fedora30为例:
1. 添加软件源
将文件`http://download.opensuse.org/repositories/openSUSE:/Tools/Fedora_30/openSUSE:Tools.repo`另存到/etc/yum.repo.d/中。
> 需要root权限。
2. 安装osc
执行 `dnf install osc` 命令安装osc。
### 配置openEuler的OBS
有很多方法可以将osc链接至openEuler外网的OBS:
1. 最基础的方法为在每次执行 `osc` 命令时添加参数: `-A http://openeuler-build.huawei.com/`
2. 使用alias:`alias iosc="osc -A http://openeuler-build.huawei.com/"`
3. 修改位于`home`目录下的osc配置文件:`vi ~/.oscrc`,并写入以下内容:
```
[general]
apiurl = http://openeuler-build.huawei.com/
[http://openeuler-build.huawei.com/]
```
### 注册OBS账号
打开 [http://openeuler-build.huawei.com/](http://openeuler-build.huawei.com/),点击右上角“Sign Up”,注册自己喜欢的帐号。
注册完成后,重新回到上面网址。点击右上角的“Login”,用新账户登录。系统会在注册时自动创建一个以“home:用户名”为格式命名的Home Project。
### 创建本地目录
创建obs工作目录:
`mkdir ~/obs`
进入obs工作目录:
`cd ~/obs`
将远程obs库同步到本地:
`osc checkout home:用户名`
输入网页用户名与密码
![登陆OBS](../2020-03-26-how-to-OBS-登陆OBS.png "登陆OBS.png")
第一次登陆时会询问本地密码保存方式,三种方式分别是:
1. 明文保存
2. 加密保存
3. 不保存(需要每次输入)
![三种密码保存方式](../2020-03-26-how-to-OBS-三种密码保存方式.png "三种密码保存方式.png")
这里推荐选择2。同步结束后可以看到当前目录下有以Project名命名的文件夹。
### 配置Project
两种方法:网页操作、命令行操作
- 网页操作:
在obs主页点击右上角
![主页右上角](../2020-03-26-how-to-OBS-主页右上角.png "主页右上角.png")
依次进入 Home Project -> Repositories -> Add from a Distribution 。
![Add from a Distribution页](../2020-03-26-how-to-OBS-AFD页.png "AFD页.png")
按上图所示填写基础配置,并在Name栏填写喜欢的名字。
在选择后后退至Repositories界面,可以看到如下图所示的环境:
![环境标签](../2020-03-26-how-to-OBS-环境标签.png "环境标签.png")
1. 第一个为编辑按钮,可以选择当前发行版编译架构
2. 第二个为添加按钮,可在发行版标准环境上额外添加单独的包(例如其他私人编译的依赖包)
3. 第三个为下载,点击后转到当前环境的仓库
4. 第四个为删除
- 命令行操作:
执行命令: `osc meta prj -e [project名]` ,会看到类似如下文本:
![meta配置](../2020-03-26-how-to-OBS-meta配置.png "meta配置.png")
其中,
1. repository标签为仓库标签, 可添加此项添加编译时的基础环境
2. Path标签为可用包路径标签, 需手动添加发行版包路径。如需要额外依赖, 也可以单独添加。
3. Arch标签为编译架构, 可同时添加多个。
例如:
```xml
<repository name="openEuler_selfbuild_BaseOS_beiyong_aarch64">
<path project="openEuler:selfbuild:BaseOS" repository="mainline_standard_aarch64"/>
<path project="openEuler:selfbuild:BaseOS" repository="standard_aarch64"/> //此为额外添加依赖
<arch>aarch64</arch>
<arch>armv7l</arch> //此为多架构选项
</repository>
```
### 新建包
进入Project目录:
`cd [project名]`
新建Package:
`osc mkpac [package名]`
进入Package目录并将下载源码以【tar包、所有patch、spec文件、其他source文件】格式放置:
![目录格式](../2020-03-26-how-to-OBS-目录格式.png "目录格式.png")
向新创建的package中添加以上文件:
`osc add * `
![osc add](../2020-03-26-how-to-OBS-图片1.png "图片1.png")
将更改上传至服务器:
`osc commit`
![commit介绍](../2020-03-26-how-to-OBS-commit介绍.png "commit介绍.png")
在这里可以注明本次上传的简短介绍,用`:wq`保存并退出
之后就可以在网页上等待编译并查看结果了。
### 查看包状态与下载包
您可以在Project与Package主页右侧看到当前编译状态
![编译状态](../2020-03-26-how-to-OBS-编译状态.png "编译状态.png")
- `finished ` 表示在某个系统平台执行编译链接、安装检查的过程结束
- `succeeded ` 状态为编译成功
- `failed ` 为编译失败,您可以点击查看日志
您可以点击*编译平台 -> Go to download repository* 到达编译仓库,获得此Project的repo源与所有编译成功的package。
### 更新包
进入project文件夹:
`cd [project名]`
更新本地代码为最新代码:
`osc up `
进入package目录,使用 `osc add` 命令将新文件添加到package,修改spec文件后使用`osc commit`命令上传新版本。
## 参考资料
- [openSUSE Wiki](https://en.opensuse.org/openSUSE:Build_Service_Concept_SourceService)
- [OBS官网文档](https://openbuildservice.org/help/manuals/obs-user-guide/cha.obs.source_service.html)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册