====== OBS 笔记 ====== OBS 主页是: https://build.openeuler.org/ 查看 Mainline 的包: https://build.openeuler.org/project/show/openEuler:Mainline:RISC-V ===== 重要概念 ===== * 工程(Project): 以工程为划分单位,以工程组织软件包。工程分为公共工程和个人工程。 * 工程配置(Project Config): 每个工程都有的,通常用于定义编译过程所需要用到的宏、打开或关闭某些功能、循环依赖处理策略、包冲突处理策略等。 * 工程 Metadata(Project Meta): 以 xml 格式进行记录,通常用来定义工程描述信息、工程的仓库配置信息、要编译的目标架构、编译依赖的路径信息、是否打开编译开关对外提供编译依赖等。 * 包 Metadata(Package Meta): 通常包含包的描述信息,是否要禁用或打开某些架构的编译等。 * 包(Package): 以包为管理单元,包为要编译的对象,所有的包都隶属于某一个工程。 * 仓库(Repository): 仓库是用来发布包编译生成的二进制的集合,例如从仓库下载 nano 这个包可以用 ''dnf install nano''。 * 架构(Arch): OBS 采用本地架构进行编译,没有提供交叉编译。 [[https://build.openeuler.org/project/show/home:misaka00251:VersionUpgrade|比如这个链接]]里的 **home:misaka00251:VersionUpgrade** 是工程名,Packages 则是工程里所有的包,旁边 Build Results 里的 **AmogOS** 是仓库名,**riscv64** 是我要编译出来的架构。 上方有个 Meta,此处就是我的工程 Metadata 文件。里面有 description 以及我要编译哪些架构的说明。 <description>Packages need to upgrade version</description> <person userid="misaka00251" role="maintainer"/> <useforbuild> <disable/> </useforbuild> <repository name="AmogOS"> <path project="openEuler:Mainline:RISC-V" repository="standard_riscv64"/> <arch>riscv64</arch> </repository> </project> </code> 其中 path project 那一行的意思为:我编译 riscv64 包对哪些工程有依赖。 Repositories 就是仓库,Build Flag 可以查看我打开了哪些架构的编译,Publish Flag 可以查看哪些会发布到我的 Repo 源上。 ===== OBS 命令 ===== ==== OCS 的安装配置 ==== 首先安装 osc 软件包: ''dnf install osc'' osc 的凭据位置为 ''~/.config/osc/oscrc'',进行以下配置: <file oscrc .oscrc> [general] apiurl = https://build.openeuler.org/ no_verify = 1 [https://build.openeuler.org] user=<你的用户名> pass=<你的密码> </file> 注意的是,密码在这里为明文密码。 ==== 基于 OBS 构建 RPM 包 ==== === 社区已有软件包 === - 进入 Project 页面 - 找到要构建的包所在的工程,并在详情页面搜索需要构建的软件包 - 点击 "branch package" 创建子工程 - 点击 "_service" 文件进入编辑页面并修改 如果不选择 **Stay on this revision** 的话,则会在创建子工程之后开始自动构建。 根据流程,要想修复一个包首先要对其进行 Fork,去 [[https://gitee.com/openeuler/RISC-V|RISC-V]] 的 Repo 提交 PR Request(更改 configuration 目录下的 ''riscv_fork_list.yaml'' 即可),等待数分钟后便会在 [[https://gitee.com/organizations/openeuler-risc-v/projects|openEuler-RISC-V]] 下出现被 Fork 的 Repo。 如果此处遇到了问题,请在微信群内汇报,会有专人处理。去[[https://jenkins.openeuler.org/job/Infra/job/RISC-V_fork_repos/|这里]]查看失败的原因会帮忙更快的解决问题。 在自己的 Repo 做出更改之后,我们随后编辑 ''_service'' 文件来在 OBS 上自动编译: <code> <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> </code> 这里还有另一种更好的写法: <code> <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> </code> 在我这个例子内,我把 ''url'' 改成了我自己的 Repo,并指明了最新的 Revision(可以指定为 branch 或者 commit),剩下的都没有动。保存之后就会开始自动编译。 === 新增软件包 === 前提条件:你已经根据依赖关系确认了你要把新增的包加入到社区的哪个工程里面 * 进入 Project 页面 * 找到要新增的包所属的工程,并在详情页面点击任意软件包 * 点击 "branch package" 创建子工程 * 然后点击 "delete package" 删除该软件包,随后会自动进入 Branch 工程页面详情 如果之前已经 branch 过该工程下面的软件包,就不要这么做了,直接点击右上角的 Home project,进入之后点击 Subprojects,然后进入对应的 branch 工程页面详情即可。 至于删除操作是为了获得工程 metadata 文件的依赖关系。 * 点击 "create package" 并填写相关信息 * 点击 "Add file" 上传要新增软件包的 spec 文件及对应的源码包文件 文件上传成功之后,OBS 会自动开始构建。 ==== 使用 OSC 构建 RPM 包 ==== 先打个预防针:本地的磁盘空间要够哦! === 构建社区已有软件包 === 假设我们要将 Mainline 的 nano 包 branch 到个人分支: <code> $ osc branch openEuler:Mainline nano </code> 随后将软件包配置信息下载到本地(上一步会有提示哦): <code> $ osc co home:misaka00251:branches:openEuler:Mainline/nano </code> 接下来,修改 _service 文件为个人 Git Repo 地址(同在线构建方法一样修改即可)。随后上传你的更改: <code> $ osc ci -m "Update _service" </code> 修改提交成功后,OBS 会自动开始构建软件包。通过以下命令可以查看编译日志情况: <code> $ osc buildlog standard_riscv64 riscv64 </code> 如果需要将远程软件包代码同步到本地,可以使用如下命令: <code> $ osc up -S </code> 可以发现这样拉下来的文件开头都有 _service 一样的开头,在本地编译时会出问题,此时要删除掉: <code> $ rm -f _service;for file in `ls`;do new_file=${file##*:};mv $file $new_file;done </code> 修改源代码和 spec 文件之后,提交到 OBS 服务器进行构建: <code> $ osc up $ osc addremove * $ osc ci -m "Update source and spec" </code> 修改提交成功后,OBS 会自动开始构建软件包。 如果提示 Entity Too Large 的话,大于 1 MB 的都无法被上传成功,为平台的已知问题。我们也不推荐这么做,最好用 _service 文件! === 新增软件包 === 前提条件:你已经根据依赖关系确认了你要把新增的包加入到社区的哪个工程里面 首先,基于工程 openEuler:Mainline,选择该工程下面的任意软件包并 branch 到个人分支: <code> $ osc branch openEuler:Mainline nano </code> 随后将软件包配置信息下载到本地(上一步会有提示哦): <code> $ osc co home:misaka00251:branches:openEuler:Mainline/nano </code> 接下来,删除创建工程时的 branch 到个人分支的无用软件包: <code> $ cd home:misaka00251:branches:openEuler:Mainline $ osc rm nano $ osc commit -m "Delete nano" </code> 然后就可以在个人工程下创建新增的软件包: <code> $ mkdir my-first-package </code> 接下来,添加你准备好的源代码和 spec 文件到目录下,并上传至 OBS 服务器: <code> $ cd .. $ osc add my-first-package $ osc ci -m "Add my-first-package" </code> 修改提交成功后,OBS 会自动开始构建软件包。通过以下命令可以查看编译日志情况: <code> $ osc buildlog standard_riscv64 riscv64 </code> ==== 创建 subproject ==== 假设我要在 home:misaka00251 下创建一个 Subproject 叫 NewMeta,可以新建一个文件: <file test> <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> </file> 然后使用 ''osc meta prj home:misaka00251:NewMeta --file=test'' 就可以啦~