前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实用入门分享:如何向 OpenCloudOS 社区提交 patch?

实用入门分享:如何向 OpenCloudOS 社区提交 patch?

原创
作者头像
腾源会
发布2023-11-15 15:38:37
2260
发布2023-11-15 15:38:37
举报
文章被收录于专栏:腾源会

OpenCloudOS 是企业级社区研发的定制化服务器操作系统。该系统集成了众多服务器系列的优点,加入自主研发的软件,便于用户操作使用,提供全方位的操作系统支持。系统特点:安全、易用、稳定、快速、长久支持。 OpenCloudOS 社区的发展离不开用户的贡献。本文将从四个步骤,向大家介绍如何向 OpenCloudOS 的用户态软件提交 patch。

实验流程

一、获取源码。这部分会介绍如何获取目标软件的源码压缩包。

二、制作补丁。这部分会介绍如何为软件制作 patch 文件。

三、打包构建。这部分会介绍如何将制作好的 patch 文件加入构建过程,并进行构建测试。

四、提交代码。这部分会介绍如何向托管在 gitee 平台的 OpenCloudOS 项目提交代码。

首先我们需要一个 OpenCloudOS 8 系统环境,您可以在 https://www.opencloudos.org/iso 下载到最新镜像。您也可以在购买腾讯云 CVM 时,选择 OpenCloudOS 镜像。

本文以一个全新安装的 OpenCloudOS 8.6 为例,向大家详细介绍每一个步骤。

一、获取源码

进入系统后,我们打开终端。首先要安装基本的构建工具,并作基本的必要配置。当然,根据项目的不同,您可能需要额外安装不同的编译、构建工具。终端命令(以root用户执行):

代码语言:javascript
复制
dnf install -y git rpm-build make

如果您之前从未安装配置过 Git,此处我们配置一下基本信息。在实际项目中,请将 email:demo@opencloudos.org 和 name:opencloudos 替换为自己的信息。终端命令:

代码语言:javascript
复制
git config --global user.email "demo@opencloudos.org"
git config --global user.name "opencloudos"

OpenCloudOS 的用户态软件包源代码目前托管在 gitee 的 src-opencloudos-rpms 空间下,以 file 为例,我们在浏览器访问:https://gitee.com/src-opencloudos-rpms/file

我们在 OpenCloudOS 8 环境,因此选择 oc8 分支

将项目 Fork 至自己的空间。(此处需要您已经注册并登录 Gitee,如果有疑问,可以参考Gitee官方文档 https://help.gitee.com/

将 Fork 后的项目 clone 至本地并切换到一个固定版本方便演示。(******替换为你的用户名)终端命令:

代码语言:javascript
复制
git clone https://gitee.com/******/file.git
cd file
git checkout oc8
git reset --hard b0e54a57fc5917226d3971f4c812c9aa84d733f3

我们查看文件夹的结构:

代码语言:javascript
复制
[root@VM-16-5-opencloudos file]# tree
.
├── SOURCES
│   ├── file-4.17-rpm-name.patch
│   ├── file-5.04-volume_key.patch
│   ├── file-5.33-bound-file_strncmp.patch
│   ├── file-5.33-clamav.patch
│   ├── file-5.33-covscan.patch
│   ├── file-5.33-CVE-2018-10360.patch
│   ├── file-5.33-gif.patch
│   ├── file-5.33-more-python.patch
│   ├── file-5.33-msooxml-magic.patch
│   ├── file-5.33-other-languages.patch
│   ├── file-5.33-pie-executable-revert.patch
│   ├── file-5.33-ppc-swap.patch
│   ├── file-5.33-python-space.patch
│   ├── file-5.33-seccomp.patch
│   ├── file-5.33-whitespace-compare.patch
│   ├── file-5.34-ebpf-magic.patch
│   ├── file-5.35-man-apple.patch
│   ├── file-5.35-netpbm.patch
│   ├── file-5.35-ppc-core.patch
│   ├── file-5.37-CVE-2019-18218.patch
│   ├── file-5.37-jffs-magic.patch
│   ├── file-localmagic.patch
│   └── file-magic-filesystems.patch
└── SPECS
    └── file.spec
2 directories, 24 files

查看项目根目录全部文件

代码语言:javascript
复制
[root@VM-16-5-opencloudos file]# ls -lah
total 28K
drwxr-xr-x 5 root root 4.0K May 24 10:52 .
dr-xr-x--- 7 root root 4.0K May 24 10:51 ..
-rw-r--r-- 1 root root   66 May 24 10:52 .file.metadata
drwxr-xr-x 8 root root 4.0K May 24 10:52 .git
-rw-r--r-- 1 root root   25 May 24 10:52 .gitignore
drwxr-xr-x 2 root root 4.0K May 24 10:52 SOURCES
drwxr-xr-x 2 root root 4.0K May 24 10:52 SPECS

我们发现,除了 SOURCES、SPECS 文件夹,还有 .file.metadata 、 .gitignore 隐藏文件。

.file.metadata 文件记录了源代码压缩包的信息

代码语言:javascript
复制
[root@VM-16-5-opencloudos file]# cat .file.metadata
31a67e4dc0a3d7a8d1b850429c3f625314700240 SOURCES/file-5.33.tar.gz

.gitignore 文件记录了 git 忽略文件列表

代码语言:javascript
复制
[root@VM-16-5-opencloudos file]# cat .gitignore
SOURCES/file-5.33.tar.gz

根据 .file.metadata 的内容,可以下载项目的源码包(tarball)到 SOURCES 文件夹。终端命令:

代码语言:javascript
复制
curl https://git.opencloudos.tech/sources/file/oc8/31a67e4dc0a3d7a8d1b850429c3f625314700240 --output SOURCES/file-5.33.tar.gz

url 的路径中,file 为项目名,oc8 为分支名,31a67e4dc0a3d7a8d1b850429c3f625314700240 为 .metadata 文件里记录的源代码压缩包 tarball 的 sha1sum。

验证一下:

代码语言:javascript
复制
[root@VM-16-5-opencloudos file]# sha1sum SOURCES/file-5.33.tar.gz
31a67e4dc0a3d7a8d1b850429c3f625314700240  SOURCES/file-5.33.tar.gz

进入 SOURCES 文件夹,解压源代码压缩包,进入目标源代码路径

代码语言:javascript
复制
cd SOURCES
tar xf file-5.33.tar.gz
cd file-5.33/

二、制作补丁

利用 Git 生产补丁:

代码语言:javascript
复制
git init
git add .
git commit -m 'init'

我们将 file 源码包的原始状态记录下来

代码语言:javascript
复制
[root@VM-16-5-opencloudos file-5.33]# git status
On branch master
nothing to commit, working tree clean
[root@VM-16-5-opencloudos file-5.33]# git log
commit 23ebfe8b2078d674b6aa093e058ed4f402dc2e7e (HEAD -> master)
Author: opencloudos <demo@opencloudos.org>
Date:   Wed May 24 11:04:07 2023 +0800
    init

对源码作出需要的修改,以 file.c 的 help() 为例。我们安装 file 软件后,默认的 --help 指令为

代码语言:javascript
复制
[invain@localhost projects]$ file --help
Usage: file [OPTION...] [FILE...]
Determine type of FILEs.
      --help                 display this help and exit
  -v, --version              output version information and exit
  -m, --magic-file LIST      use LIST as a colon-separated list of magic
                               number files
  -z, --uncompress           try to look inside compressed files
  -Z, --uncompress-noreport  only print the contents of compressed files
  -b, --brief                do not prepend filenames to output lines
  -c, --checking-printout    print the parsed form of the magic file, use in
                               conjunction with -m to debug a new magic file
                               before installing it
  -e, --exclude TEST         exclude TEST from the list of test to be
                               performed for file. Valid tests are:
                               apptype, ascii, cdf, compress, elf, encoding,
                               soft, tar, text, tokens
  -f, --files-from FILE      read the filenames to be examined from FILE
  -F, --separator STRING     use string as separator instead of `:'
  -i, --mime                 output MIME type strings (--mime-type and
                               --mime-encoding)
      --apple                output the Apple CREATOR/TYPE
      --extension            output a slash-separated list of extensions
      --mime-type            output the MIME type
      --mime-encoding        output the MIME encoding
  -k, --keep-going           don't stop at the first match
  -l, --list                 list magic strength
  -L, --dereference          follow symlinks
  -h, --no-dereference       don't follow symlinks (default)
  -n, --no-buffer            do not buffer output
  -N, --no-pad               do not pad output
  -0, --print0               terminate filenames with ASCII NUL
  -p, --preserve-date        preserve access times on files
  -P, --parameter            set file engine parameter limits
                               indir        15 recursion limit for indirection
                               name         30 use limit for name/use magic
                               elf_notes   256 max ELF notes processed
                               elf_phnum   128 max ELF prog sections processed
                               elf_shnum 32768 max ELF sections processed
  -r, --raw                  don't translate unprintable chars to \ooo
  -s, --special-files        treat special (block/char devices) files as
                             ordinary ones
  -C, --compile              compile file specified by -m
  -d, --debug                print debugging messages
Report bugs to http://bugs.gw.com/

我们可以修改 file --help 的输出,在 src/file.c 的 help 函数里,文件的第 657 行加入 fprintf(stdout, "\nmodified by OpenCloudOS experiment\n");

代码语言:javascript
复制
sed -i '657i \\tfprintf(stdout, "\\nmodified by OpenCloudOS experiment\\n");' src/file.c

实际修改效果:

然后生成补丁:

代码语言:javascript
复制
git add src/file.c
git commit -m 'patch help'
git format-patch HEAD^

命令执行后,当前路径下会生成一个 0001-patch-help.patch 文件,将其移动到 SOURCES 文件夹

代码语言:javascript
复制
mv 0001-patch-help.patch ..

回到 file 文件夹路径

代码语言:javascript
复制
cd ../..

将补丁加入 spec 文件

代码语言:javascript
复制
sed -i '87i Patch1000: 0001-patch-help.patch' SPECS/file.spec

修改 release

代码语言:javascript
复制
sed -i '18s/}/}.1/' SPECS/file.spec

实际修改:

三、打包构建

我们知道,修改前`file --help`命令并不包含自定义的内容。我们此时构建新的带补丁的 file 版本,然后安装测试。

首先安装必要的依赖

代码语言:javascript
复制
yum-builddep -y SPECS/file.spec

然后构建

代码语言:javascript
复制
rpmbuild -bb --define "_topdir $(pwd)" SPECS/file.spec

这里我们将 file 项目的根路径作为 rpmbuild 的根路径,直接在当前路径生成二进制 rpm 包。

构建成功后进行安装。(演示的机器架构为 x86_64,如果您的机器架构为其他类型,请修改对应路径)

代码语言:javascript
复制
dnf install -y RPMS/x86_64/*.rpm RPMS/noarch/*.rpm

安装成功后,再次执行`file --help`,可以验证最后出现了"modified by OpenCloudOS experiment"。

四、提交代码

将修改提交到本地 Git

代码语言:javascript
复制
git add SPECS/file.spec SOURCES/0001-patch-help.patch
git commit -m 'add custom message to help'
git push

输入 Gitee 的用户名和密码,将代码提交到个人空间。

在浏览器访问 Gitee 个人空间:https://gitee.com/******/file/tree/oc8/,******替换为您的用户名。

创建 Pull Request 时,请您在「标题」里简明扼要的描述补丁的内容,并在「说明」中详细描述补丁解决的问题。

项目管理员在确认补丁内容后会合入您的代码。

管理员也可能驳回您的 Pull request,此时您应该作出必要的修改,重新提交。

代码正式合入后,构建工程师会提交新的构建,您的修改将进入测试流程,直至在下一个发布周期正式发布。

恭喜你!至此你已经完成了一次完整的 patch 提交!

相关链接

代码语言:javascript
复制
查阅 OpenCloudOS 文档库 : https://docs.opencloudos.org/
参与OpenCloudOS的讨论:https://bugs.opencloudos.tech/
内核源代码:https://gitee.com/OpenCloudOS/OpenCloudOS-Kernel
用户态软件源代码:
https://gitee.com/src-opencloudos-rpms/
https://gitee.com/src-opencloudos-modules/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实验流程
  • 一、获取源码
  • 二、制作补丁
  • 三、打包构建
  • 四、提交代码
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档