diff --git a/DEVELOPER_DOCS/menu.yaml b/DEVELOPER_DOCS/menu.yaml index c4ca03038c7cb2476e97c4286d408db0ca28324c..5e8bb38757a0a9f7f4ac3764eb4a75b89341a652 100644 --- a/DEVELOPER_DOCS/menu.yaml +++ b/DEVELOPER_DOCS/menu.yaml @@ -31,3 +31,4 @@ DEVELOPER_DOCS: rpmbuild 构建指导手册: ../进阶开发/rpmbuild 构建指导手册.md 从零构建一个龙蜥开源项目: ../进阶开发/从零构建一个龙蜥开源项目.md 闭源软件集成样例: ../进阶开发/闭源软件集成样例.md + Anolis OS 8 软件包本地构建.md: ../进阶开发/Anolis OS 8 软件包本地构建.md diff --git "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/Anolis OS 8 \350\275\257\344\273\266\345\214\205\346\234\254\345\234\260\346\236\204\345\273\272.md" "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/Anolis OS 8 \350\275\257\344\273\266\345\214\205\346\234\254\345\234\260\346\236\204\345\273\272.md" new file mode 100644 index 0000000000000000000000000000000000000000..e81710db1a67c05cbb203cec60b10623b4a23713 --- /dev/null +++ "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/Anolis OS 8 \350\275\257\344\273\266\345\214\205\346\234\254\345\234\260\346\236\204\345\273\272.md" @@ -0,0 +1,123 @@ +# Anolis OS 8 软件包本地构建 + +Mock 是软件包构建工具,可快速构造和内部 KOJI 平台一致性的沙箱(chroot 或者 systemd-spawn)隔离构建的软件包环境,并通过 rpmbuild 完成 RPM 软件包的构建。 本文档会介绍在环境中快速配置 Mock 环境,并举例说明使用方法,满足快速构建的目的。Mock 的更多参数使用方法可直接参考官网文档。 + +## 1. mock 环境搭建 ++ 启动安装 Anolis OS 8 设备或者实例 ++ 安装 EPAO(Extras Package For Anolis) YUM 仓库的 mock-core-configs 包(非 ECS 实例需要安装 epel-release) + +```bash +yum install -y anolis-epao-release +#阿里云 ECS Anolis OS 实例不需要运行 epel-release 安装步骤, +#因为阿里云 ECS 实例已通过(epel-aliyuncs-release)预装 epel 对应 YUM REPO +yum install -y epel-release +yum install -y mock-core-configs mock rpm-build +``` + ++ 配置 build 用户 + +mock 不支持 root 用户,所以新建用户 build,用于执行构建。 + +```bash +useradd build +usermod -a -G mock build +``` + +## 2 mock 环境编译 +### 2.1 简单构建环境 +该构建环境仅仅提供了 `BaseOS`、`AppStream`、`PowerTools` 官方发布仓库。可以满足最小化的构建环境需求。mock 可以通过 `-r`参数直接指定如下 Anolis OS 的构建环境文件。请注意,若用户需要 aarch64 的本地构建环境需要在 aarch64 的设备或实例进行相应配置。 + +```bash +anolis-8-aarch64 +anolis-8-x86_64 +anolis-7-aarch64 +anolis-7-x86_64 +``` + +使用方法如下: + + +```bash +su build +# target_srpm 为目标 srpm +mock -r anolis-8-x86_64 rebuild --no-bootstrap-image --enable-network ${target_srpm} +``` + +### 2.2 社区本地构建环境 +该构建环境基本还原真实的社区构建环境,编译支撑的 Repo 远远大于 `BaseOS`、`AppStream`、`PowerTools` 。需要先准备一份 config 文件, 然后基于该文件执行命令编译相应包即可。 + + + +#### 2.2.1 x86_64/aarch64 config 文件 +```plain +config_opts['basedir'] = '/var/lib/mock' +config_opts['chroot_setup_cmd'] = 'install bash bzip2 coreutils cpio diffutils elfutils git gzip make meson patch perl redhat-rpm-config rpm-build rpmdevtools scl-utils-build sed shadow-utils tar texinfo unzip util-linux util-linux-ng which dnf' +config_opts['chroothome'] = '/builddir' +config_opts['dnf_warning'] = False +config_opts['package_manager'] = 'dnf' +config_opts['root'] = 'dist-an8-build' +config_opts['rpmbuild_networking'] = False +config_opts['rpmbuild_timeout'] = 86400 +config_opts['use_host_resolv'] = False +config_opts['dnf.conf'] = """ +[main] +cachedir=/var/cache/yum +debuglevel=1 +logfile=/var/log/yum.log +reposdir=/dev/null +retries=20 +obsoletes=1 +gpgcheck=0 +assumeyes=1 +keepcache=1 +install_weak_deps=0 +strict=1 + +# repos +[build] +name=build +baseurl=http://build.openanolis.cn/kojifiles/repos/dist-an8-build/latest/$basearch +module_hotfixes=1 +""" + +config_opts['plugin_conf']['ccache_enable'] = False +config_opts['plugin_conf']['root_cache_enable'] = False +config_opts['plugin_conf']['yum_cache_enable'] = False + +config_opts['macros']['%_rpmfilename'] = '%%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm' +config_opts['macros']['%_topdir'] = '/builddir/build' +config_opts['macros']['%distribution'] = 'OpenAnolis Community Testing' +config_opts['macros']['%packager'] = 'OpenAnolis Community' +config_opts['macros']['%vendor'] = 'OpenAnolis Community' +``` + + + +#### 2.2.2 x86_64/aarch64 构建命令 +```bash +su build +# target_srpm 为目标 srpm +mock -r anolis-8-local.cfg --no-bootstrap-image --enable-network --arch=`arch` rebuild ${target_srpm} +``` + + + +## 3 Anolis OS 8 mock 构建常见问题集锦 ++ mock 编译包的结果位置在哪里? + +mock 执行完成后会给出构建包所在路径,类似如下提示,默认所在路径是 `/var/lib/mock/dist-an8-build/result`。 + +结果路径受文件首行中`basedir`以及`--uniqueext=my_uniqueext`选项共同影响。例如:修改 cfg 文件首行`config_opts['basedir'] = '/my_basedir'`并在构建命令添加`--uniqueext=my_uniqueext`选项后,构建结果所在路径会变更为`/my_basedir/dist-an8-build-my_uniqueext/result`。 + ++ 如何自定义构建包 dist 的值? + +可通过在 command 中增加选项`--define "%dist .mydist"`用于进行自定义修改,其中`mydist`为自定义 dist 的值。 + ++ 如何安装环境依赖包所使用的 yum 仓库? + +可修改 baseurl 的值来自定义 yum 仓库,如需要添加格式可参考 repo 文件。 + ++ 不同架构的命令是否相同? + +是的,`arch`命令会自动获取执行机架构。 + diff --git "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/rpmbuild \346\236\204\345\273\272\346\214\207\345\257\274\346\211\213\345\206\214.md" "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/rpmbuild \346\236\204\345\273\272\346\214\207\345\257\274\346\211\213\345\206\214.md" index 4fd365691f4f0ddecd22d4f0de774c2aaa084781..92d0169a92b753f9e57eea8a19799cde46f2e667 100644 --- "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/rpmbuild \346\236\204\345\273\272\346\214\207\345\257\274\346\211\213\345\206\214.md" +++ "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/rpmbuild \346\236\204\345\273\272\346\214\207\345\257\274\346\211\213\345\206\214.md" @@ -1,4 +1,4 @@ -# 306 rpmbuild 构建指导手册 +# rpmbuild 构建指导手册 该文章介绍了 spec 编写和构建过程中的细节和技术原理,相当于指导手册。 ## 1 宏介绍 在软件包构建的过程中,为了防止过多使用硬编码路径和常用路径引用问题,增加了“宏”的概念。将一些常用路径或者变量值通过宏变量定义出来,并可以在整个 Anolis OS 发行版中使用。 diff --git "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/spec \346\250\241\347\211\210\345\222\214\350\207\252\346\243\200\351\241\271.md" "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/spec \346\250\241\347\211\210\345\222\214\350\207\252\346\243\200\351\241\271.md" index d2a9f3106d5fdd7c1634a918b611a49d3f4c9d45..a691178cc0b97d586ab54543c4d87c0ab47c9dce 100644 --- "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/spec \346\250\241\347\211\210\345\222\214\350\207\252\346\243\200\351\241\271.md" +++ "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/spec \346\250\241\347\211\210\345\222\214\350\207\252\346\243\200\351\241\271.md" @@ -1,4 +1,4 @@ -# 305 SPEC 模版和 checklist +# SPEC 模版和 checklist ## 1 背景 本文档规定龙蜥社区 RPM Tree 组织规范和 SPEC File 写作规范。 @@ -269,7 +269,7 @@ rm -rf %{pypi_name}.egg-info | %build | 将软件包的源码进行编译阶段。
1. 路径信息:在 ~/rpmbuild/BUILD/%{name}-%{version}/ 下
2. 执行构建可以根据源码语言去选择构建方式
3. 在构建过程中是个 chroot 环境,不允许联网 download 等动作
4. 不允许随意修改 flags 等 | 必选 | | %install | 将软件包编译生成的文件复制到安装目录,进行预安装动作,即模拟所有 package 安装后的环境。
1. 路径信息: ~/rpmbuild/BUILDROOT/%{name}-%{version}/
2. 复制时,文件从 ~/rpmbuild/BUILD/%{name}-%{version}/ 拷贝到 ~/rpmbuild/BUILDROOT/%{name}-%{version}/
3. 复制文件时,需要保留文件的时间戳,采用 cp -p 或 install -p
4. 操作允许直接将 SourceX 文件拷贝到安装目录允许再该阶段直接生成新文件 | 必选 | | %check | 用于测试软件的命令或一系列命令。
这通常包括诸如单元测试之类的东西,阶段能开则开,如果不能开启,声明不能开启的原因。 | 可选 | -| %files | 定义每个 package 的文件列表,并生成对应的 .rpm。
1. 文件布局必须布局遵循 [**FHS**](https://yuque.antfin-inc.com/bobac/pm1qpi/xz4m02) ,个别情况额外声明
2. 正确设置文件权限:目录 0755,文件 0644 root root,除非出于安全考虑需要使用特定的用户或组
3. 所有安装在 ~/rpmbuild/BUILDROOT/%{name}-%{version}/ 下的文件必须全部有唯一归属
4. 不允许包含具有攻击性、歧义性、宗教性、色情性、受限制使用的文件等
5. %doc 后面可以直接跟 ~/rpmbuild/BUILD/%{name}-%{version}/ 下的说明类文档:README、ChangeLog等
6. %license 后面可以跟~/rpmbuild/BUILD/%{name}-%{version}/ 下的版权文件:copying、license 等 | 必选 | +| %files | 定义每个 package 的文件列表,并生成对应的 .rpm。
1. 文件布局必须布局遵循 [**FHS**](https://developer.aliyun.com/article/526645) ,个别情况额外声明
2. 正确设置文件权限:目录 0755,文件 0644 root root,除非出于安全考虑需要使用特定的用户或组
3. 所有安装在 ~/rpmbuild/BUILDROOT/%{name}-%{version}/ 下的文件必须全部有唯一归属
4. 不允许包含具有攻击性、歧义性、宗教性、色情性、受限制使用的文件等
5. %doc 后面可以直接跟 ~/rpmbuild/BUILD/%{name}-%{version}/ 下的说明类文档:README、ChangeLog等
6. %license 后面可以跟~/rpmbuild/BUILD/%{name}-%{version}/ 下的版权文件:copying、license 等 | 必选 | | %changelog | Version不同或Release构建之间的包发生的更改的记录。
1. changlog 的格式正确,包括:日期、提交者个人信息、版本信息、描述信息等
2. Message 简洁易懂,清晰明确 | 必选 | diff --git "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/\345\246\202\344\275\225\344\270\213\350\275\275 Anolis OS \350\275\257\344\273\266\345\214\205\346\272\220\347\240\201\345\214\205.md" "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/\345\246\202\344\275\225\344\270\213\350\275\275 Anolis OS \350\275\257\344\273\266\345\214\205\346\272\220\347\240\201\345\214\205.md" index 033235c0b2714cda7106e4c2b54ea2791bbabe55..777e091d56ceb36089e0d26107879038816efcdc 100644 --- "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/\345\246\202\344\275\225\344\270\213\350\275\275 Anolis OS \350\275\257\344\273\266\345\214\205\346\272\220\347\240\201\345\214\205.md" +++ "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/\345\246\202\344\275\225\344\270\213\350\275\275 Anolis OS \350\275\257\344\273\266\345\214\205\346\272\220\347\240\201\345\214\205.md" @@ -1,4 +1,4 @@ - +# 如何下载 Anolis OS 软件包源码包 ## 1. 背景 由于部分软件包存在大文件导致上传失败、clone 过慢甚至失败的问题,影响软件包构建效率。在这种情况下,龙蜥社区选择使用专门的存储空间来解决大文件上传和下载问题。 diff --git "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/\351\276\231\350\234\245\347\244\276\345\214\272\350\275\257\344\273\266\345\214\205\345\274\225\345\205\245\345\222\214\347\256\241\347\220\206\345\216\237\345\210\231.md" "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/\351\276\231\350\234\245\347\244\276\345\214\272\350\275\257\344\273\266\345\214\205\345\274\225\345\205\245\345\222\214\347\256\241\347\220\206\345\216\237\345\210\231.md" index 86ecfea9365b6735d7941fc5adc48b0d3fd3b38b..d0b9dd5b9d03d71bbebeada5fc75139003309d3f 100644 --- "a/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/\351\276\231\350\234\245\347\244\276\345\214\272\350\275\257\344\273\266\345\214\205\345\274\225\345\205\245\345\222\214\347\256\241\347\220\206\345\216\237\345\210\231.md" +++ "b/DEVELOPER_DOCS/\350\277\233\351\230\266\345\274\200\345\217\221/\351\276\231\350\234\245\347\244\276\345\214\272\350\275\257\344\273\266\345\214\205\345\274\225\345\205\245\345\222\214\347\256\241\347\220\206\345\216\237\345\210\231.md" @@ -1,4 +1,4 @@ -# 304 龙蜥社区软件包引入和管理原则 +# 龙蜥社区软件包引入和管理原则 ## 1. 综述 @@ -162,7 +162,7 @@ must | 保证安全可靠,经过充分的测试保障 | 1. 闭源软件引入 ### 4.1 自验证构建 该过程为开发者自行在本地或模拟环境中对软件进行构建,以验证软件包本身的构建能力或产出测试包供后续测试。目前推荐的方式有两种: -- 本地通过 mock 机制构建,参考《[Anolis OS 8 软件包本地构建 · 语雀](https://www.yuque.com/anolis-docs/kbase/cvy9g3?view=doc_embed)》一文; +- 本地通过 mock 机制构建,参考《[Anolis OS 8 软件包本地构建](Anolis%20OS%208%20软件包本地构建.md)》一文; - 通过 Anolis Build System (ABS) 提供的个人工作空间机制进行自定义构建,可以参考[《使用ABS平台轻松胜任Anolis OS开发工作》](../基础开发/208-how-to-build-package-via-ABS.md) 一文的内容,进行构建。 - 构建过程中遇到的问题参考 「[rpmbuild 构建指导手册](../进阶开发/rpmbuild%20构建指导手册.md)」