Table of Contents

OBS 笔记

:!: openEuler 官方已经全面切换到 EBShttps://build.openeuler.openatom.cn/https://build.openeuler.org/ 均已无法访问。本教程不是 EBS 的教程。

openEuler RISC-V 的 OBS 主页是: https://build.tarsier-infra.isrc.ac.cn/

本文章是【玩转openEuler系列直播 5】openEuler构建之OBS使用指导这个影片的总结。

重要概念

比如这个链接里的 home:misaka00251 是工程名,Packages 则是工程里所有的包,旁边 Build Results 里的 AmogOS 是仓库名,riscv64 是我要编译出来的架构。

上方有个 Meta,此处就是我的工程 Metadata 文件。里面有 description 以及我要编译哪些架构的说明。

<project name="home:misaka00251">
  <title/>
  <description>Packages need to upgrade version</description>
  <person userid="misaka00251" role="maintainer"/>
  <useforbuild>
    <disable/>
  </useforbuild>
  <repository name="AmogOS">
    <path project="openEuler:22.03" repository="22.03"/>
    <arch>riscv64</arch>
  </repository>
</project>

其中 path project 那一行的意思为:我编译 riscv64 包对哪些工程有依赖。

Repositories 就是仓库,Build Flag 可以查看我打开了哪些架构的编译,Publish Flag 可以查看哪些会发布到我的 Repo 源上。

OBS 命令

OCS 的安装配置

首先安装 osc 软件包: dnf install osc

osc 的凭据位置为 ~/.config/osc/oscrc,进行以下配置:

.oscrc
[general]
apiurl = https://build.tarsier-infra.isrc.ac.cn/
no_verify = 1
 
[https://build.tarsier-infra.isrc.ac.cn/]
user=<你的用户名>
pass=<你的密码>

注意的是,密码在这里为明文密码。

基于 OBS 构建 RPM 包

社区已有软件包

  1. 进入 Project 页面
  2. 找到要构建的包所在的工程,并在详情页面搜索需要构建的软件包
  3. 点击 “branch package” 创建子工程
  4. 点击 “_service” 文件进入编辑页面并修改

如果不选择 Stay on this revision 的话,则会在创建子工程之后开始自动构建。

根据流程,要想修复一个包首先要对其进行 Fork,去 RISC-V 的 Repo 提交 PR Request(更改 configuration 目录下的 riscv_fork_list.yaml 即可),等待数分钟后便会在 openEuler-RISC-V 下出现被 Fork 的 Repo。

如果此处遇到了问题,请在微信群内汇报,会有专人处理。去这里查看失败的原因会帮忙更快的解决问题。

在自己的 Repo 做出更改之后,我们随后编辑 _service 文件来在 OBS 上自动编译:

<services>
    <service name="tar_scm">
      <param name="scm">git</param>
      <param name="url">git@gitee.com:misaka00251/nano.git</param>
      <param name="exclude">.git</param>
      <param name="revision">3fe8a8d4985a4600816f699e491bba1666b32067</param>
    </service>
    <service name="extract_file">
        <param name="archive">*.tar</param>
        <param name="files">*/*</param>
    </service>
</services>

这里还有另一种更好的写法:

<services>
    <service name="tar_scm">
      <param name="scm">git</param>
      <param name="url">git@gitee.com:misaka00251/nano.git</param>
      <param name="revision">master</param>
      <param name="exclude">*</param>
      <param name="extract">*</param>
    </service>
</services>

在我这个例子内,我把 url 改成了我自己的 Repo,并指明了最新的 Revision(可以指定为 branch 或者 commit),剩下的都没有动。保存之后就会开始自动编译。

新增软件包

前提条件:你已经根据依赖关系确认了你要把新增的包加入到社区的哪个工程里面

如果之前已经 branch 过该工程下面的软件包,就不要这么做了,直接点击右上角的 Home project,进入之后点击 Subprojects,然后进入对应的 branch 工程页面详情即可。

至于删除操作是为了获得工程 metadata 文件的依赖关系。

文件上传成功之后,OBS 会自动开始构建。

使用 OSC 构建 RPM 包

先打个预防针:本地的磁盘空间要够哦!

构建社区已有软件包

假设我们要将 Mainline 的 nano 包 branch 到个人分支:

$ osc branch openEuler:Mainline nano

随后将软件包配置信息下载到本地(上一步会有提示哦):

$ osc co home:misaka00251:branches:openEuler:Mainline/nano

接下来,修改 _service 文件为个人 Git Repo 地址(同在线构建方法一样修改即可)。随后上传你的更改:

$ osc ci -m "Update _service"

修改提交成功后,OBS 会自动开始构建软件包。通过以下命令可以查看编译日志情况:

$ osc buildlog standard_riscv64 riscv64

如果需要将远程软件包代码同步到本地,可以使用如下命令:

$ osc up -S

可以发现这样拉下来的文件开头都有 _service 一样的开头,在本地编译时会出问题,此时要删除掉:

$ rm -f _service;for file in `ls`;do new_file=${file##*:};mv $file $new_file;done

修改源代码和 spec 文件之后,提交到 OBS 服务器进行构建:

$ osc up
$ osc addremove *
$ osc ci -m "Update source and spec"

修改提交成功后,OBS 会自动开始构建软件包。

如果提示 Entity Too Large 的话,大于 1 MB 的都无法被上传成功,为平台的已知问题。我们也不推荐这么做,最好用 _service 文件!

新增软件包

前提条件:你已经根据依赖关系确认了你要把新增的包加入到社区的哪个工程里面

首先,基于工程 openEuler:Mainline,选择该工程下面的任意软件包并 branch 到个人分支:

$ osc branch openEuler:Mainline nano

随后将软件包配置信息下载到本地(上一步会有提示哦):

$ osc co home:misaka00251:branches:openEuler:Mainline/nano

接下来,删除创建工程时的 branch 到个人分支的无用软件包:

$ cd home:misaka00251:branches:openEuler:Mainline
$ osc rm nano
$ osc commit -m "Delete nano"

然后就可以在个人工程下创建新增的软件包:

$ mkdir my-first-package

接下来,添加你准备好的源代码和 spec 文件到目录下,并上传至 OBS 服务器:

$ cd ..
$ osc add my-first-package
$ osc ci -m "Add my-first-package"

修改提交成功后,OBS 会自动开始构建软件包。通过以下命令可以查看编译日志情况:

$ osc buildlog standard_riscv64 riscv64

创建 subproject

假设我要在 home:misaka00251 下创建一个 Subproject 叫 NewMeta,可以新建一个文件:

<project name="home:misaka00251:NewMeta">
  <title/>
  <description/>
  <person userid="misaka00251" role="maintainer"/>
  <publish>
    <enable/>
  </publish>
  <useforbuild>
    <disable/>
  </useforbuild>
  <repository name="AmogOS">
    <path project="openEuler:Mainline:RISC-V" repository="standard_riscv64"/>
    <arch>riscv64</arch>
  </repository>
</project>

然后使用 osc meta prj home:misaka00251:NewMeta –file=test 就可以啦~