分享 gitlab-shell for gitlab v5.0

Saito · 2013年02月22日 · 最后由 vkill 回复于 2013年03月14日 · 9517 次阅读

之前我分享过关于 gitlab 背后的一些小知识:https://speakerdeck.com/saito/how-gitlab-works

其中提到了 backend 部分如何实现。并且列出了 gitolite/gitsis, patch sshd, replace sshd 三种不同的实现举例..

在即将发布的 gitlab v5.0 系列,gitlab 将完全移除对于 gitolite 的依赖。这个问题其实很早以前我们就讨论过。( Thread 是从下往上的顺序...

twitter plus

当时的讨论最终我贡献了 gitlab 中 HTTP protocol 系列的访问,而 gitolite 没有被最终移除..

gitolite 与 gitlab 的适配问题其实是导致很多人安装困难的主要原因,我当时提出的解决方案是 HTTP Only. 不过这个也不是一个完美的解决方案。终于在 5.0 移除了这个祸害..

简单介绍一下 gitolite 与 gitlab-shell 的实现异同:

首先他们都是 SSH-magic-command 的忠实信徒 ( 名词解释参考 slide. gitolite 最终将 command 导向了自己的 auth 程序。而 gitlab-shell 则用 gitlab 的 HTTPS API 去认证。

gitolite 有自己的认证体系,所以之前与 gitlab 的结合需要冗余一份数据在 gitolite 里面,而异构系统之前的状态同步是"世界难题"... 所以经常会需要同步状态.. 而 gitlab-shell 则利用 mysql 内部的所有 Repo 认证信息来做认证,现在 HTTPS 与 SSH 的认证被统一在 Ruby 程序中了。

gitolite 自身的配置文件是利用 git 管理的,而面对较大数据量的文件。性能极差... gitlab-shell 保守提高了 10x 的性能。

其实这次 gitlab-shell 的调整也是因为 gitlab.com 本身在 randx 加入后,网站本身也在不断扩容。碰到了这样的性能问题,平时运维也出现了麻烦。所以才会做出这样的变化..

随着 gitlab.com 越做越大。肯定会有更多的新东西出来..

希望 gitlab 成为 git 库管理中的 redmine 越做越成熟

还是 Twisted Conch + dulwich 方便,爱咋整咋整

另外,共用系统的 sshd 终究是个安全隐患。

即便是这样,用AuthorizedKeysCommand这个配置项也比用authorized_keys这个文件好。

我倒是有一个 concern,最近我的 GitLab 不太稳定,如果用了 gitlab-shell 以后,是不是 gitlab 出现问题的时候用户就无法 checkin 了?

#3 楼 @gene_wu 是的,如果用了 gitlab-shell. 必须保证自己的 Gitlab 是一直可以访问的。因为它涉及到调用 Gitlab 自身的 API, 现在跟 HTTP clone 其实使用了同一块验证模块。

#4 楼 @Saito 看来我的理解是正确的,我倒是在想是否有办法双轨制度,可以让用户来决定用哪个机制?

另外我不大清楚这句话的细节:“gitolite 自身的配置文件是利用 git 管理的,而面对较大数据量的文件。性能极差... gitlab-shell 保守提高了 10x 的性能.”

具体是什么文件的数据量大?是指 gitolite 的用户库,还是指 checkin 的文件尺寸。

#5 楼 @gene_wu 这里要讲清楚比较麻烦,我就省略了。

实际上是这样的,抛开 gitlab. 本身 gitolite 就是完整的一套系统。

gitolite 自己的配置是通过 git 管理的,每次配置的时候就需要 clone gitolite 的 config repo. 然后修改完成后 push 回去。

push 回去会经历几个过程,gitolite 会先 编译一次自己的 config 文件。形成一个编译后的版本。然后 rebuild 整个 authorized_keys 文件。

gitlab-shell 添加 key 的方式是 直接修改 authorized_keys 文件,删除做 sed 调用。这个里面就节省了很多时间。

还有一个更大的问题,其实 gitlab-shell / gitolite 都没解决,就是 authorized_keys 的查询时间。这个是线性的。更好的做法是把查询 authorized_keys 变成 O(1). 将 keys 存在数据库里面。这样就会压缩成 O(1). 这样就会再提高一下很多性能。

@Saito 哦,经你这么一提醒,我想起来了,gitlolite 的确是把所有的 repository 放在一个 git 里面的,当 project 变多了以后的确很费时间。

按你上述的表述,如果已经修改了 authorized_key,那应该 gitlab-shell 不会因为 gitlab 下线而影响 Checkin 的吧,倒不是到时候还要查询 GitLab 来确认自己的权限?

那我倒是很好奇,GitHub 理论上来说已经上百万的用户了,他 SSH 倒是不算慢,怎么做到的呢?莫非他自己改写了 ssh 的 PAM 认证?

#7 楼 @gene_wu 是的,你可以看一下我的 speakerdeck 的 slide. github 自己把 ssh 认证 patch 到了 数据库里面。所以这个校验时间是很快的。这是一个特定操作系统版本,特定 ssh 版本的 patch. 所以 Gitlab 这种开源项目很难使用。

以后如果 gitlab-api 的项目分离出来的话就不会影响了。现在 gitlab-api 是绑定在主项目里面的。gitlab-shell 是使用 gitlab-api 的。

#6 楼 @Saito

还有一个更大的问题,其实 gitlab-shell / gitolite 都没解决

请用 Twisted ...

这是一个特定操作系统版本,特定 ssh 版本的 patch. 所以 Gitlab 这种开源项目很难使用。

现在可以用 AuthorizedKeysCommand 了,至少 RHEL 6+ 都可以了...

这应该也意味着安装会简单许多了吧?!

#10 楼 @huacnlee 是的,不需要配置 gitolite 了。这个月 22 号会发布 5.0 版本。

#11 楼 @Saito 我从 4.1 升级到 4.2 以后发现我的服务器有点不稳定了,经常一天左右就挂了,sidekiq 莫名其妙就死了,只能 restart gitlab service

hi @Saito 看了 #6 的回复,现在 gitlab 还是通过修改 authorized_key,指定使用自己的 ssh magic command 用脚本来实现从数据库中匹配 user 和 repo 的关系吧?听了第六期的 http://teahour.fm/2013/03/11/git-github-and-gitlab.html ,再看 #7 #8 回复,这里有个疑问,如果不用 authorized_key,是选择修改 sshd pam 呢?还是选择类似于用 eventmachine 写个 sshd 来实现呢?pam 中如何指定 command 能否给个参考资料呢?谢谢

#13 楼 @vkill pam 我一直知道有这么个方案,但是我从来没有实施过。经常用 pam + ldap 来做一些事情。

用 eventmachine 也是可以实现的,em 跟 python 的 twisted 是一样的。

pam 的参考资料太少,有大牛知道的话可以顺道提供一下。

#13 楼 @vkill PAM 不能解决 SSH 公钥验证的问题。公钥验证还是要 AuthorizedKeysCommand。另外,利用用来登录系统的 SSH 服务是一件很不靠谱的事。

Twisted 已经实现了 SSH Server,如果你打算自己抄一遍到 EventMachine 上也不是不可以,就是略蛋疼了一点点....接着你再把 dulwich 用 Ruby 抄一遍......你就可以纯 Ruby 操作 Git 了.....再下去你可以再把 Mercurial 抄一遍.....

谢谢 #14 #15 楼 @Saito @bhuztez 兄科普,我只实施过 pam_mysql 和 nss 来用数据库中用户登录。pam 方面的资料确实少,同希望大牛顺道提供。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号