V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
robinshen
V2EX  ›  程序员

一个人(公司摸鱼+业余时间)开发了五年的开源项目:可用于自建 Git 服务,自带看板和 CI/CD,可替代 GitHub/GitLab(功能级的替代,而非小而美)

  robinshen · 2022-02-11 22:53:34 +08:00 · 18168 次点击
这是一个创建于 1014 天前的主题,其中的信息可能已经有所发展或是发生改变。

前两天发了一个版本更新的贴,没啥关注。腆着脸再发一个,详细介绍下这个项目的背景、特点、和相关技术栈。希望众 V 友轻喷。🙏

项目地址: https://github.com/theonedev/onedev

项目背景

在一家公司做 DevOps 相关工作,若干年前为了解决我们自己的痛点,开发了这个产品内部使用,饱受好评,我也就继续维护这个产品。行业的关系,公司难有大发展,但也倒不了,所以氛围宽松,基本上只要自己负责的那摊事不出问题,没人管你干什么。感谢公司对我摸鱼的宽容,做这个产品很开心,因为没有产品经理,没有业绩压力,不用处理无效需求,感觉每行代码都在让产品变得更好。也感谢来自客户的持续反馈,让我不至于空中楼阁鬼画符。

相比 GitHub/GitLab 有什么特点?

开箱即用的符号跳转

我们内部的一个需求是代码 Review 或者在线看代码时,要能够方便跳转到符号定义:

symbol.gif

这个功能使用 ANTLR 分析主流语言的语法,并提取符号定义进行增量存储,速度快,占用空间小。目前支持 Java, JavaScript, C, C++, CSharp, Go, PHP, Python, CSS, SCSS, LESS and R 。GitHub 前两年加入了这个功能,但是好像只是针对主分支; GitLab 需要在 CI 里做 LSIF 相关配置,并会占用大量空间。

静态分析结果直接标注在源码上,作为 Review 的辅助信息

annotation.png

当然 GitHub 有很多第三方工具可以做这个事情,但发现的问题都是显示在各个产品自己的网站上,与 Code Review 流程割裂开来了(比如说我们可以直接对某个代码风格问题加 Review 的相关说明等等)。另外这些第三方工具一般都需要额外收费。

Issue 字段和状态可定制,以及和 CI/CD 的深度集成

这里 GitHub/GitLab 的简单的 Open/Close 的状态完全不能满足我们的需求,特别是牵涉到客户创建的 Issue 时,比如说如果开发人员在 Commit 相关代码时 Close 相关 Issue ,客户得到通知会认为这个问题已经解决,会问应该更新到哪个发行版本;而如果在产品发布时 Close 相关 Issue ,测试人员在拿到测试版时也会困扰,因为相关 Issue 还是 Open 状态,不知道应该测试哪些 Issue 。为解决这个问题,我们定制了四个 Issue 状态:Open ,Committed ,Test Ready 和 Released 。当开发人员 Commit 代码时,相关 Issue 自动迁移到 Committed 状态;当包含这些 Commit 的代码被构建并部署到测试环境中时,相关 Issue 自动迁移到 Test Ready 状态,并通知 QA ,QA 可以在 Issue 的详情页面里了解部署到了哪个测试环境;当测试通过代码发布时,相关 Issue 自动迁移到 Released 状态,并通知客户,客户在 Issue 的详情页里可以得知关联的发行版。

custom-field.png


fixing-build.png

强大易用的 Commit/Issue/Build/Pull Request 查询语言

这个也是基于 ANTLR 做的,对语法规则进行预测来实现自动提示。这样无需学习语法就可以直接进行复杂查询,比如下面是我们客户经常做的事情:在升级前查询当前版本和最新版本之前都有哪些改动:

changes.gif

或者查询所有分配给我的高优先级的 Issue ,在指定的两个发行版之间改动了某个文件的所有 Commit 等等。查询可以保存并订阅,这样符合相关条件的事件发生时可以及时得到通知。

全功能的 CI/CD ,无需了解 Yaml 语法,上手非常简单

CI/CD 是花精力最多的部分了,虽然 CI/CD 的定义也是以 Yaml 文件的方式存储在仓库中,但提供了 UI 来生成该文件,用户无需了解任何相关语法即可进行配置

job-command.gif

而且在 Commit 页面可以直接运行 CI/CD 任务,使得 GitOps 来的更直观。灵活可定制的 CI/CD 选项页面让非开发人员也可以很容易的进行部署。

build-option.gif

部署一个用于构建的集群及其方便,只需一个 helm 命令就可以部署到 Kubernetes 中,将每个构建任务作为 Pod 运行,同时支持 Windows 和 Linux ;在没有 Kubernetes 的环境中,一行 docker 命令即可启动一个构建的 Agent ,而且 Agent 免于维护,自动升级。V 友们可以试试 GitLab 的构建集群配置,相对而言还是比较麻烦的。

摒弃 Organization ,将项目以树形结构组织以方便设置的继承

自从 GitHub 使用 Organization 后,似乎所有类似的软件都采用这种方式来组织项目了。这种方式对于面向公共服务的云平台而言可能比较合适,但对于公司内部使用感觉没有太大必要,而且还会带来很多麻烦,比如 GitLab 在 Group 级提供 Epic 功能,而在 Project 级提供 Issue 功能,但很多用户要求这两个功能能同时在 Group 级和 Project 级提供等等。我们的做法是将项目以树形结构组织,下级项目可以自动继承上级项目的设置,也可以按需复写。这使得大量项目的设置维护非常容易维护。

随时对代码进行标注和讨论,而不用依赖于 Pull Request

在浏览源码或者 Diff 时,可以对任意代码块即时发起讨论。讨论的内容将作为代码文档的一部分(即使代码改动甚至更名),方便其他人事后对代码进行阅读和理解。不同于其他的 Git 工具,代码 Comment 在侧边显示,避免割裂代码上下文,影响阅读。

file-comment.gif

另外每处讨论形成单独的 Topic ,使相关的人很容易知道哪里有新的改动或回复。

threaded-comments.png

资源占用相比 GitLab 小很多,速度快

个人使用的话,一台 1 核 2G 的机器足够了。比 Gitea/Gogs 的资源占用还是多的,不过如果 Gitea/Gogs 要做类似功能,受限于 Golang 的生态,可能要启动一些其他语言写的微服务(比如各种 Language Server ,Elastic Search 等),最终资源消耗一定不会小。

还有一个优点就是主服务可以运行在 Linux ,Mac ,Windows ,FreeBSD 等多平台上,可以使用内置文件数据库,也可以充分利用公司现有资源连接到 MySql/MariaDB/PostgreSQL/Oracle/SQL Server 等外置数据库。

技术栈

不够时髦,甚至有点羞于启齿,从头到脚 Java 一把撸(之前被一些 V 友喷用 Java 不够云原生😊)。不分前后端,所有的功能在一个 Maven 项目中( 40 万行代码左右)。使用 Wicket (估计很少人听说)直接把界面交互和后端逻辑封装在一个组件中,大部分配置界面通过 Annotation 自动生成。依赖注射和插件体系基于 Guice 。在 Eclipse 中启动项目大概耗时 20 秒,不过大部分时间热部署,改动代码后直接刷新页面就可以看到改动。

感谢 V 友们支持🙏

第 1 条附言  ·  2022-02-12 13:44:20 +08:00

再贴两个我们也经常用的功能

对仓库进行实时符号搜索: symbol-search 对仓库进行正则表达式搜索: regex-search

虽然 IDE 也可以做这些事情,但是我们经常需要切换到以前的 commit 搜索(比如某个 Issue 对应的 Commit ),这在 IDE 里需要切换工作环境有点麻烦,不如直接打开 onedev 搜索方便

仓库代码使用 Lucene 分词,正则表达式本身先进行分词进行粗略查询,然后在结果里再进行精确匹配来提高速度。google code search 也采用类似方式: https://swtch.com/~rsc/regexp/regexp4.html

GitLab 好像一直没有做这个功能,也许是考虑到服务器负载问题。

第 2 条附言  ·  2022-02-12 14:50:31 +08:00
有兴趣尝试的 V 友点这个五分钟教程(创建 react demo app ,并运行 CI ):
https://zhuanlan.zhihu.com/p/103410072
第 3 条附言  ·  2022-02-12 22:24:01 +08:00
内存配置可以通过 conf/wrapper.conf 里修改,可以将 wrapper.java.maxmemory.percent=60 修改为 wrapper.java.maxmemory=512 (项目不大也可以改成 256 ),这样 JVM 和 git 总共消耗不会超过 1G ,对于一般的项目都足够了。
144 条回复    2024-03-18 15:06:17 +08:00
1  2  
feather12315
    101
feather12315  
   2022-02-12 18:24:49 +08:00
建议改成 GPL 协议,MIT 协议的话就要做好用爱发电的准备了。
liangddyy
    102
liangddyy  
   2022-02-12 18:49:36 +08:00   ❤️ 3
你这是摸了一条大鲨鱼🐴
Jin2018
    103
Jin2018  
   2022-02-12 18:50:57 +08:00
respect
besscroft
    104
besscroft  
   2022-02-12 19:55:51 +08:00
膜拜大佬,正好 Java 写的我这个 Javaer 还可以学习学习。
creanme
    105
creanme  
   2022-02-12 20:09:19 +08:00
太强了。。。。
1M163W1E2fyRhLt4
    106
1M163W1E2fyRhLt4  
   2022-02-12 20:13:58 +08:00
好强
shunia
    107
shunia  
   2022-02-12 20:54:29 +08:00
并不建议 MIT 协议哦,还是建议改成偏商业化的协议。这样可以通过 EE 版来提供你想要提供的任何免费功能,同时也可以通过协议里面的强制部分来避免以后遇到让人火大的事儿。
另外,这个项目作为一个几乎纯个人项目,真的是让人膜拜不已,star 奉上。
最后还有一个小问题是如果可能,是不是可以再降低一下配置,以供一些更低端的设备使用?比如现在有不少人都有在自家的 NAS 等低功耗设备上搭建备用仓库服务的需求。
Hef
    108
Hef  
   2022-02-12 21:20:32 +08:00 via Android
我辈楷模😂
ningfan120
    109
ningfan120  
   2022-02-12 21:49:22 +08:00
@shunia #107 应该 NAS 也能支持的吧,我现在 NAS 上跑了个 gitlab ,按道理应该也能撑住
robinshen
    110
robinshen  
OP
   2022-02-12 22:16:26 +08:00   ❤️ 1
@shunia License 选择的事以后可能要再琢磨下,谢谢!内存配置可以通过 conf/wrapper.conf 里修改,可以将 wrapper.java.maxmemory.percent=60 修改为 wrapper.java.maxmemory=512 ,这样一般来说 JVM 和 git 总共消耗不会超过 1G ,对于一般的项目都足够了。
robinshen
    111
robinshen  
OP
   2022-02-12 22:18:40 +08:00
@ningfan120 能跑 GitLab 就一定可以跑 OneDev ,按上面修改下配置,总消耗不超过 1G
shunia
    112
shunia  
   2022-02-13 00:13:10 +08:00
@robinshen #110 有用
怎么设置中文?
robinshen
    113
robinshen  
OP
   2022-02-13 08:01:39 +08:00
@shunia 中文版暂时还没有做
vex757
    114
vex757  
   2022-02-13 11:54:50 +08:00
大佬牛 x ,膜拜+star
Breadth
    115
Breadth  
   2022-02-13 12:42:24 +08:00
其他的还没细看,貌似不提供 git 协议?
Breadth
    116
Breadth  
   2022-02-13 13:10:03 +08:00
@Breadth #115 手动部署了下,发现有 git ,忽略我
nilai
    117
nilai  
   2022-02-13 16:16:32 +08:00
厉害, 请收下我的膝盖
nilai
    118
nilai  
   2022-02-13 16:22:13 +08:00
系统能加一个中文语言切换么?
robinshen
    119
robinshen  
OP
   2022-02-13 16:30:29 +08:00
@nilai 中文版暂时还没有
kylix
    120
kylix  
   2022-02-13 19:28:08 +08:00
先收藏为敬!🐮🍺
andyangyu
    121
andyangyu  
   2022-02-13 20:46:06 +08:00
一个人干了我们一个团队的事,跟您比我们才是在摸鱼
whwlsfb
    122
whwlsfb  
   2022-02-13 22:06:11 +08:00
作者效率很高,提了个小 bug 的 PR ,马上就合并+CI/CD 👍
whwlsfb
    123
whwlsfb  
   2022-02-13 22:11:20 +08:00
插一句,如果师傅想在国内铺开的话最好还是加入 i18n 模块

很难见到这么用心的项目,很赞!
robinshen
    124
robinshen  
OP
   2022-02-13 22:15:39 +08:00
@whwlsfb 谢谢提交,已经在下面的版本中改正:
https://github.com/theonedev/onedev/releases/tag/v6.3.5
whwlsfb
    125
whwlsfb  
   2022-02-13 22:22:44 +08:00
@robinshen 👌看到了,已经重新拉镜像了
scyuns
    126
scyuns  
   2022-02-14 03:05:49 +08:00 via Android
强呀,太厉害了
MatDK
    127
MatDK  
   2022-02-14 06:09:37 +08:00
看上去挺好看的,过阵子搭建试试!
showhand
    128
showhand  
   2022-02-14 08:57:11 +08:00
记得以前在 reddit 上看到过,😄
xrr2016
    129
xrr2016  
   2022-02-14 14:26:41 +08:00
强👍
xrr2016
    130
xrr2016  
   2022-02-14 14:27:25 +08:00
原来我已经 star 过了🤣
robinshen
    131
robinshen  
OP
   2022-02-14 15:14:18 +08:00
@xrr2016 太谢谢了 🙏
Akiya
    132
Akiya  
   2022-02-14 15:56:13 +08:00
必须支持一下
lookStupiToForce
    133
lookStupiToForce  
   2022-02-14 18:21:19 +08:00
真心牛逼,而且从头到尾居然都是用 java 撸的,给大佬跪了
yuekcc
    134
yuekcc  
   2022-02-15 00:30:36 +08:00
确实强大。

今天还在想自己能不能撸个简单的代码托管服务,只需要 github 的一部分功能。结果就看到这个。牛逼。
AllenHua
    135
AllenHua  
   2022-04-05 18:23:51 +08:00
真心🐂️🍺️,有空部署一个看看。star 为敬,作者的坚持和用爱发电才是最难能可贵的,但其实我不太提倡。MIT 太宽松了吧……
Envov
    136
Envov  
   2022-04-06 10:31:42 +08:00
牛皮,一直需要这个
FrankHB
    137
FrankHB  
   2022-04-09 11:43:05 +08:00
可以考虑移除 git 的硬依赖。你提供的功能基本上各家 DVCS 都能支持或者都不支持(所以要自己实现),没有特别 git 的部分,甚至有背道而驰的( git 向来鼓吹的依赖 pr )。
毕竟支持 git 的服务不缺,DVCS 中立的服务从 Bitbucket 之后基本就凉了( OSDN 那坨没统一前端的就算了),你能把基本功能都支持上你就是市场上最靓的仔。
TomorJM
    138
TomorJM  
   2022-05-16 20:19:38 +08:00
真的厉害咯
xuxuzhaozhao
    139
xuxuzhaozhao  
   2022-05-17 09:14:03 +08:00
太牛批了!!
bthulu
    140
bthulu  
   2022-05-17 09:18:29 +08:00
@FrankHB 移除 git 的硬依赖是啥意思? 是指将代码仓库从 github 迁移到微软的 tfs 上面么? 还是说不要支持 git, 改支持 SVN? 还是说把 git 库相关的代码全部自己写一遍?
objcat
    141
objcat  
   2023-09-08 11:59:21 +08:00
这不是一般人能写出来
shmilypeter
    142
shmilypeter  
   2023-09-08 12:57:16 +08:00
很厉害
forgottencoast
    143
forgottencoast  
   2023-09-08 21:21:14 +08:00
@bthulu
意思是背后的源代码管理不要依赖 git ,可以自由选择是否用 git 还是 SVN 或别的。
hongye
    144
hongye  
   249 天前
楼主如何联系?可以商务聊一波
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2791 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 28ms · UTC 13:42 · PVG 21:42 · LAX 05:42 · JFK 08:42
Developed with CodeLauncher
♥ Do have faith in what you're doing.