最近準備轉向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都映射到內部,然後使用
來訪問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.添加用戶
使用
來訪問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分支即可。