win7下使用docker安装gerrit和openLDAP

最近准备转向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分支即可。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章