最近准备转向git来管理代码,但是由于有较高的权限管理要求,而且希望增加代码审查功能。考虑了两种方案,一种是gitlab,另一种是gerrit。
getlab使用了虚拟机安装,安装过程还比较顺利,但是启动起来,访问的时候一直报错,后来发现是内存不够,给虚拟机分配了2G内存,后来把内存改成4G,能够正常运行了。但是对于我来说,这个消耗太大了,所以考虑使用更轻量级的gerrit,使用openLDAP来管理用户。希望更少的资源占用,所以考虑用docker来安装。
参考https://hub.docker.com/r/gerritcodereview/gerrit
1.启动docker终端。
使用docker pull gerritcodereview/gerrit获取镜像
还需要另外openLDAP来管理用户权限,phpldapadmin来作为openLDAP的客户端
所以使用
docker pull osixia/openldap
docker pull osixia/phpldapadmin
来获取这两个镜像
2.按照gerrit docker的说明,使用docker-compose来管理
新建一个docker-compose.yaml文件,内容如下
version: '3'
services:
gerrit:
image: gerritcodereview/gerrit
ports:
- "29418:29418"
- "80:8080"
depends_on:
- ldap
volumes:
- /external/gerrit/etc:/var/gerrit/etc
- /external/gerrit/git:/var/gerrit/git
- /external/gerrit/db:/var/gerrit/db
- /external/gerrit/index:/var/gerrit/index
- /external/gerrit/cache:/var/gerrit/cache
environment:
- CANONICAL_WEB_URL=http://localhost
# entrypoint: /entrypoint.sh init
ldap:
image: osixia/openldap
ports:
- "389:389"
- "636:636"
environment:
- LDAP_ADMIN_PASSWORD=secret
volumes:
- /external/gerrit/ldap/var:/var/lib/ldap
- /external/gerrit/ldap/etc:/etc/ldap/slapd.d
ldap-admin:
image: osixia/phpldapadmin
ports:
- "6443:443"
environment:
- PHPLDAPADMIN_LDAP_HOSTS=ldap
使用/external/gerrit作为外部存储,但是由于使用的dockertoolbox,所以需要在virtualbox虚拟机中将win7的目录与docker主机关联,使用文件共享,把e:\exteral目录映射为/external,然后新建gerrit目录。
第一次启动前,将 # entrypoint: /entrypoint.sh init一行前面的#去掉,需要执行初始化操作。
然后执行
docker-compose up gerrit
进行初始化。
然后再重新将entrypoint: /entrypoint.sh init一行前面加#注释掉
再次使用
docker-compose up -d
来作为服务启动。到目前一切顺利。以上是按照正常步骤进行的。
这时坑来了。下面是调试的方法
3.打开virtualbox的虚拟机端口映射,把80,6443,389,636,29418都映射到内部,然后使用
https://localhost:6443
来访问phpldapadmin,注意是https,
能够打开,也能显示login登录框,使用用户名cn=admin,dc=example,dc=org,密码secret登录,但是使用点击登录之后显示无法连接,提示
Unable to connect to LDAP server ldap |
Error: Can't contact LDAP server (-1) for user |
从提示上看是无法连接ldap服务器。那么查看一下吧
使用docker container list查看当前的容器。
发现只有两条,没有ldap。
使用docker-compose down来删掉已经启动的容器
这次使用docker-compose up 来启动,不带-d,也就是不使用后台启动,这样能显示出更多的信息。在一串大量的屏幕信息中,向上找到ldap_1开头的行,发现最后一行是killing all processes,确定没有启动成功。
再次使用docker-compose up ldap只启动ldap,发现报了一些信息,最后是exit with code 1.说明退出了。
下面希望查到更详细的信息,找到为什么没启动成功。
在docker-compose.yaml文件的ldap节增加一行
command: [--loglevel,debug]
设置日志级别为调试。
再次使用docker-compose up ldap启动ldap,打出了更多的信息,最后一行是
backend_startup_one (type=mdb, suffix="dc=example,dc=org"): bi_db_open failed! (22)
这个问题没有找到原因。
后来把yaml文件中ldap节中volumes节注释掉,再次启动,启动成功了。
在另一个终端,使用docker exec -it xxx bash来打开交互,查看/var/lib/ldap 和/etc/ldap/slapd.d文件夹下的内容
发现确实跟外部存储里的内容不同,外部存储中没有data.mdb文件。
考虑将这些文件拷贝到外部存储
使用docker cp xxx:/var/lib/ldap /external/gerrit和 docker cp xxx:/etc/ldap/slapd.d /external/gerrit 将这两个文件夹拷贝出来放到正确的位置。
使用ctrl+c结束docker启动的终端
再次尝试使用外部存储启动,仍然报错。
可能这个镜像在处理dockertoolbox作为docker主机时使用外部存储还有问题。
暂时先这样运行。
4.使用固定ip供外部访问
上面是使用localhost本地访问,如果使用固定ip来访问的话,把yaml文件中的localhost缓存ip,重新再执行第2步就可以了,查看/etc/gerrit.config文件,就可以看到canonicalWebUrl已经被修改了。
5.添加用户
使用
https://localhost:6443
来访问phpldapadmin,使用用户名cn=admin,dc=example,dc=org,密码secret登录,之后可以新建用户,点击Create new entry here
选择Courier Mail: Account,安装https://hub.docker.com/r/gerritcodereview/gerrit
建立gerritadmin用户.然后按照同样的步骤建立user1,user2,auditor1用户,分别对应普通用户和审核用户。
6.openid的问题
完成上一步后打开localhost,这是gerrit的主页。点击login,如果出现了openid登录,那可能是第2步生成的配置文件/etc/gerrit.config文件有问题,查看文件中auth节type是否为ldap,如果是openid,则会使用openid登录。
解决方法是,拷贝一份例子中的配置到gerrit.config 文件,然后再重新执行第2步,重新配置。
7.使用gerritadmin登录,在browse下选择repositories,可以看到仓库,当前有两个,然后点击creatnew生成新的仓库repo1,owner选择gerritadmin,生成一个pubrepo,owner留空。我们希望生成了一个私有仓库和一个公共仓库。
但是由于gerrit默认会给所有用户赋read权限,所以在repo1的access中增加read权限,group选anoymous user,前面选择deny。
其他用户需要重新登录才能看到仓库权限的变化。
8.sshkey的使用
使用user1登录,既可以看到repo1了。下面配置sshkey免密码提交了。
我安装了tortoisegit来操作git,同时还是需要gitbash的。但是由于安装tortoisegit的时候选择了putty来管理ssh,打开tortoisgit目录下的puttygen,点击generate生成key,保存private key,将上面生成的一串ssh-rsa开头的字符串复制。
然后打开页面setting,sshkeys,newsshkey,粘贴到里面。点击save change。
然后打开pageant,addkey,加载刚才保存的private key文件
新建一个目录,然后右键git bash,使用ssh将repo1 clone下来,可以参考页面上Clone with commit-msg hook提示的命令,既可以clone下来了。
9.提交审核
user1用户设计为提交代码后不会直接入库,需要审核。
user1用户在本地commit后,push的时候,remote 分支选择refs/for/master来提交。这样提交之后就会是待审核状态
10.审核
设计auditor为审核用户,在repo1的access中增加label code-review和submit权限。
最好新建组,将权限赋值给组,然后用户属于某个组来管理权限
auditor用户登录后就可以看到changes,可以进行审核,提交了。
11直接提交
如果需要某个用户直接提交,不经过审核,那就赋给push权限,然后push时直接push到master分支即可。