法律合规是第一步,也是最重要的一步
“开源” 这两个字在很大程度上代表了自由,奔放,随心所欲。符合工程师天生追求“自由飞翔”的特质。 但开源并不是法外之地,法律合规是一个社区健康发展最重要的前提,没有之一。任何一个工程师,如果想要参与到 openEuler 项目中,第一步就是要签署 CLA 协议。协议的签署网址是: CLA 协议签署网址 https://openeuler.org/en/cla.html协议内容并不复杂,作为一个工程师,通常我都对这类法律文书都是免疫。 我们连需要给自己赔钱的保险合同都不会多花上一分钟时间看上一眼,对于这种需要自己奉献的条款又怎会关注呢?还有更关键的是,如果码农看懂了法律文书,那还是码农么? 这很大程度是我们工程师的现状,但是我还是建议大家认真阅读一下协议,了解一下权益范围并没有坏处。 openEuler 社区是开源的 openEuler 社区原则上只接受开源协议的软件,哪些开源协议是社区认可的开源协议呢?大家可以参考下面的网址。 对于社区本身,我们默认使用 mulan V2 协议,这是一个非常友好的开源协议,也欢迎大家更多的使用这个协议来开发开源软件。 木兰宽松许可证 https://opensource.org/licenses/MulanPSL-2.0
我能做点什么 在签署完 CLA 协议和了解 openEuler 社区所认可的开源协议以后,下面要进行的就是完成社区的注册。 由于 openEuler 本身是开放到 gitee.com 上,因此需要大家拥有 gitee 账号,如果没有,请去注册一个。 你完成上面这部的时候,恭喜你,你已经是 openEuler 社区的一员了。 所以,我能够做点什么?参与社区有很多种形式,如果总结起来,大体有下面的四类: 提交一些需求或 bug :简单来说就是发现哪里用的不爽,直接提 issue。或者在用 openEuler 的过程中发现了一些问题,把这个问题反馈给社区。 为社区修正 bug:这是更高一个层面的参与社区了,在这个层面,工程师实质上是以一个开发者角色进入到了 openEuler 社区中。我们提倡大家提出问题,我们也希望大家能够解决问题。 贡献软件包 :发现 openEuler 缺失了一个软件包,帮 openEuler 把这个软件包补上。实际上贡献软件包的过程就是帮助 openEuler 丰富功能的过程。只有大家的不断的贡献软件包,openEuler 才能够成为一个“无所不有”的软件生态系统。 开发新软件 :有一些新想法,想独立开发一个全新的软件,并将这个软件贡献到 openEuler 社区,成为 openEuler 发行版本中的一份子。 下面我们就来看看这 4 种参与方式如何进行吧。
提交一些需求或 bug
最基本参与社区的方式当然是要先用一用社区的物件,看看还有哪些需要改进的地方。提出一些有价值的建议和意见了。这几乎是最简单参与社区的方式了。
在社区中,我们提交问题都是通过“issue”机制来进行。但是在提交之前,提交人得先明确这个 issue 要提交给谁。在社区里,我们是一个个“repo”来对功能进行分组的。比如我们著名的Linux操作系统的“内核”(kernel)就有一个独立的“repo”(通常我们称之为“仓”)。 如果你发现了一个内核的问题,或者需求,那么就需要找到内核相关的 repo 地址。 openEuler Kernel 地址 https://gitee.com/openeuler/kernel 它的界面这个样子。


修复 bug
在社区里,通常我们希望提出问题并同时解决问题,如果有一个问题,当然最好的情况是同时提供问题解决的 patch 补丁。我们以社区的轻量化容器引擎 iSulad 为例 ,假定我们需要为 iSulad 提交一个 patch 补丁,基本流程如下:第一步:建立自己的分支

第二步,修改代码并生成 Pull Request(简称PR)
当 fork 完毕以后,大家可以在下图的红圈1中发现,目录已经从 openEuler 切换成了自己的账户。


- 被 iSulad 社区接受。
- 被 iSulad 社区残忍的拒绝。
- 提出修改意见,修改后再提交 PR。goto 1
参与方式三:贡献软件包
在能够为 openEuler 贡献一个软件包之前,需要我们的开发者理解两个基本的概念:- 什么是 Linux 的软件包。或者说 Linux 操作系统是怎么组织的。
- 如何制作一个软件包。
OS是怎么组织的
显然这是一个非常巨大的话题,可能需要写一本书来讲 OS 是怎么组织,怎么构建出来的。在这里我只能简要的给大家介绍一下。 实际上,一个 OS 系统的组成既复杂,也简单。 何所谓简单呢,其实 OS 本质上就是一堆安装包的大杂烩,就类似我们不论使用 Windows 也好,使用 Android 也罢,或者使用 Linux,我们都经历过“安装”这个概念,就是从网上,或者是从“仓库”中下载一个安装包,然后安装到系统上,所以大家可以看到安装的“进度条”。实际上,一个 OS 的安装过程和在 Andorid 上安装微信的道理一模一样。只不过所谓的安装 OS 是需要一次性的要把几千个软件包按照一定的顺序安装到机器中。 那么 OS 所谓的组织很复杂呢,大家可以想象一下,几千个软件,他们之间会有很多的交联关系,通常我们叫做“依赖关系”,就好比,如果你想用微信小程序,那么前提是必须先得有微信,那么安装微信小程序的前提就是必须要先安装微信。因此,即使我们考虑一个 OS 的安装过程,其实也是非常复杂的,必须要精确的计算哪些软件需要先安装,哪些需要后安装。随着系统的膨胀,那么这些软件包之间就形成了复杂的网状关系。即使我们这些行业内的人都为此头痛不已。 讲了这么多,和我们的 openEuler 社区开发有啥关系呢?其实,上面的讲解是要让大家理解,任何 OS 的基本零件就是软件包,就类似组成人体的基本零件是细胞一样。这一个个软件包就是构成 OS 的一个个基本零件。 在 Linux 的世界,有两种基本的安装包格式:RPM
这个格式是 redhat、SUSE、WindRiver、openEuler 等所选用,目前在企业市场,基本是以这些厂家为主,因此 RPM 格式在商用企业市场用的比较多。Deb
这个格式是 Debian, Ubuntu, Android 使用的,目前在 desktop,终端则用的比较广泛。 这两种格式本身没有什么优劣之分,只是不用厂商的选择而已。当然,对于客户,开发者来说,世界被割裂成为两个互不兼容的部分总归是一种不必要的残忍。对于这个问题社区也有不同的尝试,但目前为止还没有出现某个大一统的软件包格式能够终结这个分裂的世界。 不过幸好我们有容器,很大程度上,容器的出现缓解了这个问题。那未来能不能找到一条优雅的技术道路将这些不兼容,将这些复杂的软件包的依赖带来的诸多痛苦一并解决掉呢?我把这个问题留给本文的爱好者吧,也许在你们中间就会出现这样的“历史终结者”。 所以,一个软件从源代码到能进入到我们的 OS 安装光盘中,要经历三个步骤。
第一步:源代码开发阶段,也就是写程序的阶段。这个阶段可以在任何地方,可以在 github,gitlab, gitee 等代码托管平台上,也可以是自己的笔记本电脑上。
第二步:将代码编译,生成二进制可执行程序。并且制作 RPM 软件包,其中“制作 RPM”的过程实际上也是一种“编程”,只不过使用的是一种定义好的脚本语言,“程序”是一种叫做 spec 的文件。讲真,spec 的编写是非常不符合老派程序员思维的,那种分段式的,跳跃式的,宏式的写法绝对挑战老派程序员的神经。所以,我们有很多很好的程序员,但是却很少有程序员能将一个程序真正制作成一个 rpm 包(或者 deb 包)。希望大家能挑战一下自己,成为一个 RPMer。真的,不难,但是够你手忙脚乱一阵的。
我们有一个 RPM 的编写规范,可以供大家参考。 https://gitee.com/openeuler/community/blob/master/zh/contributors/packaging.md第三步:将这些 RPM 包放在 ISO 中,做成安装光盘。这一步一般的工程师不用感知,后台有自动化的系统来完整整个工作,而且相关的工具我们也会开源到 openEuler 中。也就是说,后续任何人都可以简单的为自己构建一个 My Linux。
那就让我们看看如果你有一个项目在 github 上,我们如何将它最终转变成为安装光盘上的一个软件包吧。首先,你得有一个组织
人生活在社会中,无时无刻不属于某个组织,并受到一些人的领导,比如白天,你需要属于某一个公司组织,晚上,你需要属于一个家庭组织。 社区也一样,在你想要把一个软件做成软件包放到 openEuler 系统中之前,你需要明确两件事情:- 你自己属于哪个组织?
- 你要加入的这个软件包属于哪个组织?
- 寻找到和你具有同样“特殊爱好”的小组,然后申请加入。
- 你的爱好太“特殊”以至于目前还没有志同道合的人,自己申请建一个。
组织结构
openEuler 是一个完全开放的组织架构,而且非常简单, 这里可以看到基本的情况。
开始干活,先要弄明白干什么
当然,即使你完全不属于任何一个 SIG 组,理论上也能提交一个软件包到 openEuler 中,只是被接受的概率相对较低而已。其主要原因是很难来评估相关提交的质量,SIG 组很大的意义就在于一些专业方面的人能够为每次提交做出质量的保证。 软件包本身必须是要属于某一个 SIG 的。以我自己常用的一个软件包为例,我每次写完程序以后,都总会执行一下 cloc 这个命令,看一下今天又新增了多少行代码,以期获得一下码农与生俱来的成就感,并中和一下写 PPT 带来的空虚和乏力感。 显然 cloc 是一个开发类的工具,帮助码农统计代码行,幸运的是,拥有同样“特殊爱好”的人并不在少数,他们建立了一个 dev-utils 的 SIG 组。 https://gitee.com/openeuler/community/tree/master/sig/dev-utils 我们可以将 cloc 这个软件归属于这个 SIG 组。如何把大象放到冰箱里
一般来说,增加一个软件包到 openEuler 中,需要如下的几个大步骤- 让系统为你的 cloc 软件包建立一个“仓”,也就是 git 仓。
- 上传制作 cloc 软件包所需要的“零件”
- 将这个软件系统加入到 openEuler 的自动化编译系统中,由系统自动化构建出软件。
建仓
建仓其实就是提交一个PR,一般来说需要修改三个文件。- https://gitee.com/openeuler/community/blob/master/sig/dev-utils/README.md
- https://gitee.com/openeuler/community/blob/master/sig/sigs.yaml
- https://gitee.com/openeuler/community/blob/master/repository/src-openeuler.yaml
上传软件包
一般来说,一个软件只需要上传两个“原材料”就足够制作一个软件包了。如下图所示:
加入构建系统
openEuler 现在使用 OBS 作为构建工具系统,大家可以参考下面的这个链接把自己的软件加入到 OBS 中 https://gitee.com/openeuler/community/blob/master/zh/contributors/create-obs-package.md 加入到构建系统中,就意味着你的软件可以被系统自动编译,自动生成 RPM 包,继而在后续的 openEuler 发行版本中出现。TIPS
在整个过程中有几点需要开发者要注意:- 能够本地构建:提交的软件包首先要在自己的笔记本,或者服务器上能够编译通过。也就是如果你的软件包在本地无法构建成功,那么上传到 openEuler 社区也不会构建成功。因此。我们建议最好能下载最新的 openEuler 版本,安装以后通过 rpmbuild 等命令来进行构建验证。
- 保证软件包可用:软件除了能够被编译和生成软件包,还要能正确运行,因此,在本地环境要保证制作出来的软件包能够:
- 保证多体系架构支持:openEuler 目前支持 x86_64 和 ARM64 两种指令集,因此在构建过程中需要能够保证软件包在这两种环境下都能被正确编译和运行。虽然然 ARM64 环境可能并不那么容易获取,但幸运的是,一般性软件在这两个系统上没有那么大的差异。
- 保证正确的依赖关系:一个软件通常都需要依赖其它的一些软件才能运行,比如所有软件都需要依赖 glibc 这个库来执行,一些复杂的软件可能会依赖很多软件包来提供功能。这些软件包可能已经在 openEuler 社区中有了,也可能没有。如果没有,那么就需要同时在 openEuler 社区中将这这些软件包补齐才行。比如 cloc 这样一个小软件,却需要依赖如下的几个 perl 的软件包:

- 保证 spec 文件的规范性:要保证 spec 文件是“规范”的,避免将外部的 spec 直接引入到 openEuler 中,因为如前所述,因为选择包的范围,依赖关系,版本等都不相同,同时保证所有软件包 spec 是一致的,请依照前面的 RPM 制作规范中的内容来书写 spec 文件。
参与方式四:开发新软件
上面讲的过程都是怎么给“别人”的软件提意见,怎么把“别人”做的软件添加到 openEuler 社区。但是每一个真正做软件的人内心都希望能拥有属于自己的作品,那么如何建立自己的作品,如何将自己的作品融入到 openEuler 社区呢? 将自己的作品融入到 openEuler 社区有如下两种方法:方法一:在其它社区开发,集成到 openEuler 中
假定你已经在 github,gitlab 或者 gitee上 拥有了自己的项目,那么只需要按照参与方式三那样,将软件加入到 src-openeuler 这个 repo 仓就可以了。方法二:在 openEuler 社区中开发,在 openEuler 中集成
另外一种方法是,直接在 openeuler 社区中建立项目,类似将项目“托管”到 openEuler 社区。比如现在社区中的 iSula 和 A-Tune 这样的项目就是这样的模式。
在 TC 委员会的例会 meeting 中申请一个开源项目,比如项目名称叫 做“broken_dream”。
如果 TC 委员会认为这是一个很好的 idea,并且认为值得为破碎的梦想提供一个机会,那么我们会在openEuler 社区中建立一个 repo,网址就 是https://gitee.com/openeuler/broken_dream
这个项目在 openEuler 社区中持续开发和孵化,直到有一天,大家认 为broken_dream 已经足以成熟到为所有人提供破碎的梦想服务了,那么就可以 在src-openeuler 中建立一个仓,为 broken_dream 提供相关的 spec 文件,制作成为一个 RPM。
最终 broken_dream.rpm 会随着 openEuler 的发布版本走遍全世界,为世界人民提供 broken_dream 功能。
我始终认为,一个工程师,在他的职业生涯中,至少要有一个,哪怕只有一个项目和他自己的名字是息息相关的。只有这样,才能在孙子,孙女骑在我们背上,问我们这辈子做的最棒的事情是什么的时候,我们可以让他们爬下来,然后直起身,看着他们天真无邪,对未来充满憧憬的大眼睛,认真的问他们:你知道 broken_dream 的作者是谁吗? 最后,我要感谢 openEuler 社区中每一个贡献者,特别是文档的撰写者们,文档对于码农们来说永远是痛苦的源泉,但正是各位文档的撰写者的辛勤工作,才使得本文能够有一个机会为大家呈现一个完整的 openEuler 参与之旅。openEuler 社区欢迎大家。
欢迎开源爱好者在 openEuler 成立 SIG
或加入现有 SIG
共同构建支持多处理器架构
统一和开放的操作系统
推动软硬件应用生态繁荣发展
记得分享点赞再看哦
本文分享自微信公众号 - openEuler(openEulercommunity)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。