一份完整的开源贡献指南(提供给第一次踏入开源伙伴秘籍)

任务分配 time:Within a week 完成 first contribute,目的:了解开源项目的贡献流程 完成 sealos 开发环境构建 了解 kuberentes 基本使用,核心概念,核心组件的作用 基本使用: 创建 一个 pod 并理解什么是 pod 创建一个 deployment 理解 deployment 与 pod 的关系 创建一个 configmap, 理解挂载配置文件给 pod 创建一个 service,通过 service 在集群内访问 pod 核心概念,核心组件的作用: kubectl apiserver controller-manager scheduler kubelet kube-proxy etcd 这些组件分别是做什么的 可以用一个 kubectl apply 一个 deployment 这些组件分别做了哪些事来梳理整个流程 🚸 next time:会分配一个具体的任务以及介绍 sealos 源码架构。 资源🗓️ 参考资料:...

September 16, 2023 · 6 分钟 · 1104 字 · 熊鑫伟,我

我的实践总结:开源社区的规范设计思路

社区不规范怎么办 作为 OpenIM 社区首席运营官,对整个社区的 communtiy 以及 GitHub 配置仓库 进行了全面的配置。并且对整个 OpenIM 的 Makefile 和 CICD 流,以及整个 OpenIM 使用的日志包 、错误码、协同流、贡献者文档以及 社区文档 进行架构和设计。 在这个时候总会有一些问题,即使你觉得自己的 贡献者文档 写的很牛逼了,很全面了,但是依旧很少有人愿意花心思去按照你写的规范去学习。这对我打造顶级的开源社区是一个非常大的阻碍,于是就有了今天的这个文档,我会将它记录在 GitHub Gists 上,提供拉取和使用的说明、链接,并且定期的维护它。 首先,我提供克隆的链接: git clone https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694 如何设计 首先是针对基础的功能,那就是我们熟知的 commit 信息和 push 信息。 我们可以对 commit 信息的格式进行设置 我们可以对 push 的大小进行设置 我们提供了 actions 的功能 我们提供了 Makefile 标记和清除 Hook 的能力 我之前在学习 git 的时候写了一篇很全的笔记,并且分享在 GitHub 上面,在这个 🤖 链接 上可以学习到 git 很多高级用法。 这篇文章讲解了 git 有哪些规范,寻找合适的 CICD 流: 统一格式: 统一格式:git commit -m 'type(scope): 描述(#issue)' 我们在提交的时候带上邮箱信息 -s 来签证,这是一个很好的习惯。...

September 16, 2023 · 7 分钟 · 1376 字 · 熊鑫伟,我

GoReleaser:自动化你的软件发布

GoReleaser 的目标是自动化发布软件时的大部分繁琐工作,通过使用合理的默认值并使最常见的用例变得简单。 准备工作: .goreleaser.yaml 文件:包含所有配置信息。(有关更多信息,请参阅 自定义) 干净的工作树:确保代码是最新的,并且已经提交了所有改动。 符合 SemVer 的版本号(例如 10.21.34-prerelease+buildmeta) GoReleaser 的运行步骤: GoReleaser 的运行主要分为以下四个步骤: defaulting:为每个步骤配置合理的默认值 building:构建二进制文件、档案、包、Docker 镜像等 releasing:将版本发布到配置的 SCM、Docker 注册表、blob 存储等 announcing:向配置的频道宣布您的发布 使用 -like 标志可能会跳过某些步骤,如 --skip-foo 快速开始 首先,运行 init 命令来创建示例的 .goreleaser.yaml 文件: goreleaser init 然后,我们运行一个“仅限本地”版本,看看它是否可以使用 release 命令运行: goreleaser release --snapshot --rm-dist 此时,您可以 自定义 生成的 .goreleaser.yaml 文件,或保持原样,这取决于您。最佳做法是将 .goreleaser.yaml 文件放入版本控制系统中。 您还可以使用 GoReleaser 为给定的 GOOS/GOARCH 构建二进制文件,这对于本地开发非常有用: goreleaser build --single-target 准备 GitHub 的 Token: export GITHUB_TOKEN="YOUR_GH_TOKEN" GoReleaser 将使用您存储库的最新 Git 标签。...

September 16, 2023 · 41 分钟 · 8621 字 · 熊鑫伟,我

我的第一个博客

你好,我是熊鑫伟 在光阴的长河中,我如此荣幸地踏入大四的这个重要时刻。不仅仅是一位学生,我热衷于编写那些跳动的代码,于是,我成为了开源的狂热追随者。欢迎你探索我的数字天地——我的GitHub。这里,你将看到我对技术的热爱,我的第三代博客,我期待它能成为我与这个世界对话的终极纽带。 在无数社区中,OpenIM 如同闪耀的北极星,引领我前行,灌溉我的技术之心,让我真实地行动起来。 然而,我的生命并非仅停留在屏幕前。从此,世界不再是书本,而是展开在我脚下的广阔天地。 户外的召唤使我欣喜,无论是我独自的冒险还是与朋友的欢聚,每一个步伐都是对自然的敬意和生命的探索。 我寻找开源的深意,并在阅读中不断地得到启示: 《开源的成功之路》:它让我明白,每一个成功都不是偶然,而是走过的那些布满荆棘的道路的回报。 《大教堂与集市》:开源并不仅仅是代码的分享,它更是心与心的交流,是一种对自由与创新的追求。 《黑客与画家》:这部作品是我至今的最爱,它提醒我,真正的价值不在于你拥有了什么,而在于你创造了什么。 > “你的价值取决于你创造了什么,而不是你拥有什么。" 这句话是我每日的座右铭,激励我持续前行,创造属于自己的美好。 开源,于我,是一个旅程,充满了未知与挑战。但我渴望在这条路上遇到更多的同路人,与你共同分享,共同创造。 我真心邀请你,与我一起,探索这个充满可能的世界。

September 14, 2023 · 1 分钟 · 15 字 · 熊鑫伟,我

关于我的 Hugo 博客 (教程)

重新搭建我的博客(静态) 冤大头回来了 … 太难了这次,准备简历的时候,发现我的博客没了,我最亲爱的,陪伴了一年的,备受好评的博客 nsddd.top 牺牲了 呜呜呜呜 别急别急,吸取教训,第一件事是什么,坚决不用动态博客了,从大一的第一代博客使用 workpress, 那时候用的服务器管理工具是 著名顶顶的 宝塔 , 虽然现在我还在用,哈哈哈,不过以后绝对绝对不会再用了 。第二代博客还记得吗 ,第二代博客就是我刚刚牺牲掉的博客,使用 docker 搭建,存活了两年(大二到大三),服务器中途都换了一次,不过得益于 Docker 优雅的移植性haha,所以我的博客得以存活。 那这次为啥挂了??? 挂的时间是 2023 年 9 月 1 日。原因是 Java 出现故障,发现 swtich 空间不足,然后,准备移植的,修复的,实在是觉得无力维护,我希望我的博客可以长久生存几年,十几年,甚至是几十年上百年。 所以,从头开始 !!! 选择合适的博客模板 之前用过 vuepress 做笔记,vuepress 相对来说不是特别合适我现在做的,因为已经有视觉疲惫了哈哈哈,看着很不舒服,所以用我很喜欢的一个开源项目,大家很多人也耳熟能详的顶级开源项目:hugo , GitHub 地址是:https://github.com/gohugoio/hugo 接下来就是选择合适的主题了,我参考了几个热门的 theme 选择了 https://github.com/adityatelange/hugo-PaperMod 安装 Hugo 我热衷于源码,可以随时改代码,提 PR ,于是用源码构建: ❯ git clone https://github.com/cubxxw/hugo.git ❯ cd hugo ❯ go build ❯ mv hugo /usr/bin 部署主题 选择我们使用的主题: ❯ git clone https://github....

September 12, 2023 · 9 分钟 · 1782 字 · 熊鑫伟,我

速读开源项目 Sealos 的源码

准备 这篇文章等的太久了,大致 四个月了把,也是自己经历 docker 跨越到 Kubernetes 以及 CloudNative 生态的过程。 反过来再去理解开源、理解 sealos、 理解 Kubernetes,有种豁然开朗的视角。 这篇文章和其他文章不一样的是,这篇是按照自己现在的思路来写的,具体为什么,在以前的文章中能找到答案~ 从 CMD 角度上对接源码,从最开始出发: 不管是 sealer 还是 sealctl,都离不开 镜像的构建核心》 buildah: package main import ( "github.com/containers/buildah" "github.com/labring/sealos/cmd/sealctl/cmd" ) func main() { if buildah.InitReexec() { return } cmd.Execute() } 从 InitReexec 调用 buildah 初始化开始,进行走进 sealos 的大门:Execute 在 cobra 中,Execute 只会执行一次,不管是正确的还是失败的~ 在调用的时候,会先执行 init 初始化函数,它 定义了一些初始化工作以及标志: func init() { cobra.OnInitialize(func() { logger.CfgConsoleLogger(debug, showPath) }) rootCmd.PersistentFlags().BoolVar(&debug, "debug", false, "enable debug logger") rootCmd.PersistentFlags().BoolVar(&showPath, "show-path", false, "enable show code path") } 哈哈,sealos 对于日志包的封装,还是很让我惊喜的,使用了 zap 进行二次开发和封装,用于适合自己的业务需要,这对我是有参考意义的,包括 horizon,未来可能需要在 日志包和 错误码设计上进行改进,这是成就一个优秀的开源项目的必要条件~...

September 11, 2023 · 12 分钟 · 2381 字 · 熊鑫伟, 我

我如何设计 DevOps 下的 OpenIM 标准开发流 & 敏捷体系 & 精益模式

DevOps DevOps 🔥 DevOps是一种软件开发和运营的文化和方法论,旨在通过自动化和协作来缩短软件开发周期和提高软件质量。 DevOps(Development和Operations的混成词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。 为什么 OpenIM 需要 DevOps? 我想用一句话来概括,DevOps 能解决 OpenIM 当前的团队管理,能高效组织团队,并且能通过 自动化 工具协作于沟通。 从而实现用更少的浪费、更频繁的交付更稳定的产品。 最开始的 OpenIM 是什么样子的? 找到了之前的一个很古老的版本,链接是:https://github.com/OpenIMSDK/Open-IM-Server/tree/test-tuoyun 几乎存在 commit 信息丢失,因为信息不全导致代码无法跟踪问题,导致文档缺失,代码不规范等一系列的问题。 我们跨越了从原始社会到传统的协作方式,再到后面的 devops 为什么说及时到现在,我依旧没有将 OpenIM 转变为 devops,一个很明显的判断标准,每一次运维和交互工作依旧需要我手动去做,无疑是区分了 dev 和 ops 的职责。不仅仅让成本变高,效率变低,更重要的是团队没有了更清晰的定位。 那么我后面的计划如何? 不管是 prow, actions, 等等 CI 工具,以及各种 ops(gitops, aiops, chatops,) 也不管是各种设计的 自动化 以及 自动化管理工具,自动化交互工具。 无疑他们是一套体系: 提供无感知的开发环境,无论交付是否频繁,每一个 feature 的 PR 都能快速的,规范并且经过大量自动化测试,更加快速上线,也能更快地响应客户需求。每一次发布的变更变少,所以风险,以及合并的冲突,工作量就变少。而且代码 code review 更方便,代码质量和团队水平提升很高的档次。 🔥 OpenIM 当时我的设计理念是 main 分支作为一个类似于传统的 dev 分支,保证代码的最新以及基本可靠,release-v* 分支作为稳定的分支。 DevOps 最重要的就是自动化,和自动化运维。非常鼓励自动化,甚至可以让开发者即使不会任何运维也能去走整套自动化的流程。 OpenIM 的团队约束制定:https://traveling-thistle-a0c.notion.site/OpenIM-standardization-ebd0c1529ab54e4fb92840e67a73aac1?pvs=4...

September 2, 2023 · 3 分钟 · 458 字 · 熊鑫伟,我

我是如何优雅设计 OpenIM 多进程管理策略的

主要模块 这篇文章将会从 OpenIM 最基本的单进程前台运行开始,到 nohup 后台运行,到 system 系统进程,然后再到 Supervisord,容器化管理,kubernetes 健康检测。 目前问题 阅读:https://github.com/cubxxw/Open-IM-Server/blob/refactor/feat-enhance/scripts/install/openim-crontask.sh 源码 目前 OpenIM 之前的进程管理策略是通过 nohup 在后台启动的。 整个项目由多个进程共同运行,现在需要一个可靠的保活机制,以便能够在进程崩溃的时候能够快速把它拉起来。openim 的解决方案无非就是写个保活脚本,在后台一直运行,如果发现某进程被关闭了,那么由脚本拉起来,或者是通过 docker compose 健康检测机制: healthcheck: test: ["CMD-SHELL", "./scripts/check-all.sh"] interval: 30s timeout: 10s retries: 5 但是脚本它自己挂掉怎么办?(总不能使用脚本继续保活保活脚本套娃吧)。此外,另一个办法就是配置出来一个服务,让Linux操作系统帮你守护进程,显然,这种办法完全不需要担心守护进程自己挂掉,毕竟是systemd帮你守护,如果它挂掉了,操作系统应该也没了。 我们适配通用的 Ubuntu 和 CentOS 即可,因为 其他 的操作系统比如说 alpine , Alpine Linux 并不使用 systemd 作为其默认的初始化系统。相反,Alpine Linux 使用 OpenRC 作为其默认的初始化系统。这也是许多人选择 Alpine Linux 的原因,因为它是轻量级的,并且没有引入 systemd。 现在新版的 Ubuntu 和 CentOS 都支持的,旧版的linux使用service httpd start启动服务,新版的linux使用systemctl start httpd来启动服务,此外使用initd作为初始化系统的操作系统添加服务是在/etc/init.d/中添加脚本,而使用systemd作为初始化系统的操作系统只需要在/etc/systemd/system/文件夹中添加配置文件就好了。 前台进程 前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失,这时就把Shell给占据了,我们无法进行其他操作。对于那些没有交互的进程,我们希望将其在后台启动,可以在启动参数的时候加一个’&’实现这个目的。 后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互;Linux的大多数服务器就是使用守护进程实现的。比如Web服务器的httpd等。 解决方案 1. 使用&后台运行程序:...

August 16, 2023 · 7 分钟 · 1477 字 · 熊鑫伟,我

如何安装和使用自主人工智能工具Auto-GPT

前言 🔮 在我的 Slack 工作区中,集成了多个 AI,分别有 ChatGPT 4、ChatGPT 3.5、Claude …… 我们可以通过 Slack 免费并且无限制的和 AI 交互,欢迎大家加入到 Slack,这里是 链接: https://join.slack.com/t/kubecub/shared_invite/zt-1se0k2bae-lkYzz0_T~BYh3rjkvlcUqQ 介绍 很早之前就了解到了 Auto-GPT,作为 GitHub 上近期增长速度最快的项目(没有之一),Auto-GPT 在开源社区可谓是人尽皆知,甚至 star 已经很快就超过 Kubernetes,目前有 125k star。 得益于 Auto-GPT 的出色技术,可以高精度和高效率地自动执行许多任务。 它利用了 GPT-4 强大的自然语言处理功能。 我们甚至可以通过它来实现更多的自动化的工作,比如说前一节 在 Sealos 上开发一款 AI 自动云原生化项目自动上线工具 什么是 AutoGPT 它的 GitHub 地址: GitHub 从本质上讲,Auto-GPT 利用 OpenAI 最新人工智能模型的多功能性与软件和服务进行在线互动,使其能够 “自主 “执行X和Y等任务。但正如我们在大型语言模型方面的学习,这种能力似乎像海洋一样宽广,但却像水坑一样深。 AutoGPT 是一个由人工智能驱动的应用程序,利用 GPT-4 等 LLM 的强大功能自主创建和处理各种工作。通过使用 Auto GPT,组织和个人可以简化报告创作、内容创建和数据分析等流程,以节省时间并减少错误。 AutoGPT 改变了任务自动化的游戏规则,使组织和个人能够专注于其他关键任务,同时将重复和琐碎的工作留给程序。 随着 LLM 的不断发展,我们可以期待看到像 Auto GPT 这样功能越来越强大的软件能够执行越来越复杂的任务。...

July 16, 2023 · 2 分钟 · 411 字 · 熊鑫伟,我

Go 调试测试以及调试工具 dlv 学习

调试Go工程 ::: tip prepare: vscode golang 1.92 ::: demo go mod init test In main.go file package main import ( "fmt" ) // Swap functions func swap(x, y *string) (string, string) { //XOR exchange *x, *y = *y, *x } func main() { fmt.Println("Hello, world!") //Swap functions for i := 0; i < 10; i++ { a := "a" b := "b" swap(&a, &b) fmt.Println(a, b) } } vscode一键生成测试 >gotest for package/function ::: tip 分别是为包生成测试单元,为函数生成测试单元。 :::...

June 19, 2023 · 9 分钟 · 1878 字 · 熊鑫伟,我