(轉(zhuǎn)載)CI持續(xù)集成系統(tǒng)環(huán)境--Gitlab+Gerrit+Jenkins完整對(duì)接

近年來(lái)悠夯,由于開源項(xiàng)目癌淮、社區(qū)的活躍熱度大增,進(jìn)而引來(lái)持續(xù)集成(CI)系統(tǒng)的誕生沦补,也越發(fā)的聽到更多的人在說(shuō)協(xié)同開發(fā)乳蓄、敏捷開發(fā)、迭代開發(fā)夕膀、持續(xù)集成和單元測(cè)試這些拉風(fēng)的術(shù)語(yǔ)虚倒。然而美侦,大都是僅僅聽到在說(shuō)而已,國(guó)內(nèi)也很少有公司能有完整的 CI 體系流程魂奥。反之一些開源項(xiàng)目都有完整的 CI體系菠剩,比如openstack。

為了實(shí)現(xiàn)代碼托管->代碼審核->代碼發(fā)布的一套自動(dòng)化流程耻煤,我特意在IDC服務(wù)器上部署了Gitlab+Gerrit+Jenkins對(duì)接環(huán)境具壮,以下記錄了操作過(guò)程:

----------------------------------------------------------------------------------------------------------------------------------------

1)Gitlab上進(jìn)行代碼托管

在gitlab上創(chuàng)建的項(xiàng)目設(shè)置成Private,普通用戶對(duì)這個(gè)項(xiàng)目就只有pull權(quán)限哈蝇,不能直接進(jìn)行push

Git自帶code review功能

強(qiáng)制Review :在 Gitlab 上創(chuàng)建的項(xiàng)目棺妓,指定相關(guān)用戶只有Reporter權(quán)限,這樣用戶沒(méi)有權(quán)限使用git push功能买鸽,只能git review到Gerrit 系統(tǒng)上,Jenkins在監(jiān)聽Gerrit上的項(xiàng)目事件會(huì)觸發(fā)構(gòu)建任務(wù)來(lái)測(cè)試代碼贯被,?Jenkins 把測(cè)試結(jié)果通過(guò) ssh gerrit 給這個(gè)項(xiàng)目打上 Verified (信息校驗(yàn))成功或失敗標(biāo)記眼五,成功通知其它人員 Review(代碼審核)?。

Gitlab保護(hù)Master 分支:在 Gitlab 上創(chuàng)建的項(xiàng)目可以把 Master 分支保護(hù)起來(lái)彤灶,普通用戶可以自己創(chuàng)建分支并提交代碼到自己的分支上看幼,沒(méi)有權(quán)限直接提交到Master分支,用戶最后提交申請(qǐng)把自己的分支 Merge 到 Master 幌陕,管理員收到 Merge 請(qǐng)求后诵姜, Review 后選擇是否合并。

可以將gitlab和gerrit部署在兩臺(tái)機(jī)器上搏熄,這樣gitlab既可以托管gerrit代碼棚唆,也可以作為gerrit的備份。

因?yàn)間itlab和gerrit做了同步心例,gerrit上的代碼會(huì)同步到gitlab上宵凌。

這樣即使gerrit部署機(jī)出現(xiàn)故障,它里面的代碼也不會(huì)丟失止后,可以去gitlab上拿瞎惫。

2)Gerrit審核代碼

Gerrit是一款被Android開源項(xiàng)目廣泛采用的code review(代碼審核)系統(tǒng)。普通用戶將gitlab里的項(xiàng)目clone到本地译株,修改代碼后瓜喇,雖不能直接push到代碼中心 ,但是可以通過(guò)git review提交到gerrit上進(jìn)行審核歉糜。gerrit相關(guān)審核員看到review信息后乘寒,判斷是否通過(guò),通過(guò)即commit提交匪补。然后肃续,gerrit代碼會(huì)和gitlab完成同步黍檩。

grrit的精髓在于不允許直接將本地修改同步到遠(yuǎn)程倉(cāng)庫(kù)∈济客戶機(jī)必須先push到遠(yuǎn)程倉(cāng)庫(kù)的refs/for/*分支上刽酱,等待審核。

gerrit上也可以對(duì)比代碼審核提交前后的內(nèi)容狀態(tài)瞧捌。

3)jenkins代碼發(fā)布

當(dāng)用戶git review后棵里,代碼通過(guò)jenkins自動(dòng)測(cè)試(verified)、人工review 后姐呐,代碼只是merge到了Gerrit的項(xiàng)目中殿怜,并沒(méi)有merge到 Gitlab的項(xiàng)目中,所以需要當(dāng) Gerrit 項(xiàng)目倉(cāng)庫(kù)有變化時(shí)自動(dòng)同步到Gitlab的項(xiàng)目倉(cāng)庫(kù)中曙砂。Gerrit 自帶一個(gè) Replication 功能头谜,同時(shí)我們?cè)诎惭b Gerrit 時(shí)候默認(rèn)安裝了這個(gè) Plugin,通過(guò)添加replication.config 給 Gerrit即可(下文有介紹)

----------------------------------------------------------------------------------------------------------------------------------------

一鸠澈、基礎(chǔ)環(huán)境搭建(參開下面三篇文檔)

CI持續(xù)集成系統(tǒng)環(huán)境---部署gerrit環(huán)境完整記錄

CI持續(xù)集成系統(tǒng)環(huán)境---部署Gitlab環(huán)境完整記錄

CI持續(xù)集成系統(tǒng)環(huán)境---部署Jenkins完整記錄

二柱告、Gitlab+Gerrit+Jenkins的對(duì)接

1)Gitlab配置

gitlab上的管理員賬號(hào)是gerrit,郵箱是gerrit@xqshijie.cn

創(chuàng)建了一個(gè)普通賬號(hào)wangshibo笑陈,郵箱是wangshibo@xqshijie.cn

[root@115]# su - gerrit

[gerrit@115 ~]$ ssh-keygen -t rsa -C gerrit@xqshijie.cn ? ? ? ? //產(chǎn)生公私鑰

[gerrit@115 ~]$ cat ~/.ssh/id_rsa.pub?

將上面gerrit賬號(hào)的公鑰內(nèi)容更新到Gitlab上际度。

使用gerrit賬號(hào)登陸Gitlab,點(diǎn)擊頁(yè)面右上角的Profile Settings - 點(diǎn)擊左側(cè)的SSH Keys小鑰匙圖標(biāo) - 點(diǎn)擊Add SSH Key涵妥。

在Key對(duì)應(yīng)的輸入框中輸入上段落$cat .ssh/id_rsa.pub顯示的公鑰全文乖菱,點(diǎn)擊Title,應(yīng)該會(huì)自動(dòng)填充為gerrit@xqshijie.cn蓬网。如下:

在Gitlab上創(chuàng)建wangshibo用戶

然后在機(jī)器上生成wangshibo公鑰(先提前在機(jī)器上創(chuàng)建wangshibo用戶窒所,跟上面一樣操作),然后將公鑰內(nèi)容更新到Gitlab上(用wangshibo賬號(hào)登陸Gitlab)

用gerrit登陸Gitlab帆锋,新建group組為dev-group墩新,然后創(chuàng)建新項(xiàng)目test-project1(在dev-group組下,即項(xiàng)目的Namespace為dev-group窟坐,將wangshibo用戶添加到dev-group組內(nèi)海渊,權(quán)限為Reporter),具體如下截圖:

創(chuàng)建的項(xiàng)目設(shè)置成Private即私有的哲鸳,這樣普通用戶這它就只有pull權(quán)限臣疑,沒(méi)有push權(quán)限。

在test-project1工程里創(chuàng)建文件徙菠,創(chuàng)建過(guò)程此處省略......

文件創(chuàng)建后讯沈,如下:

在linux系統(tǒng)上登錄wangshibo賬號(hào)下,克隆工程test-project1.git婿奔,測(cè)試權(quán)限

[root@115]# su - wangshibo

[wangshibo@115 ~]$?git clone git@103.10.86.30:dev-group/test-project1.git

Initialized empty Git repository in /home/wangshibo/test-project1/.git/

remote: Counting objects: 15, done.

remote: Compressing objects: 100% (9/9), done.

remote: Total 15 (delta 0), reused 0 (delta 0)

Receiving objects: 100% (15/15), done.

[wangshibo@115 ~]$ cd ~/test-project1/

[wangshibo@115 ~]$ git config --global user.name 'wangshibo'

[wangshibo@115 ~]$ git config --global user.email 'wangshibo@xqshijie.cn'

[wangshibo@115 ~]$ touch testfile

[wangshibo@115 ~]$ git add testfile

[wangshibo@115 ~]$ git commit -m 'wangshibo add testfile'

[wangshibo@115 ~]$git push?

GitLab: You are not allowed to push code to this project.

fatal: The remote end hung up unexpectedly

上面有報(bào)錯(cuò)缺狠,因?yàn)槠胀ㄓ脩魶](méi)有直接push的權(quán)限问慎。需要先review到gerrit上進(jìn)行審核并commit后,才能更新到代碼中心倉(cāng)庫(kù)里挤茄。

2)Gerrit配置

在linux服務(wù)器上切換到gerrit賬號(hào)下生成公私鑰

[gerrit@115]$ ssh-keygen -t rsa -C gerrit@xqshijie.cn

將id_rsa.pub公鑰內(nèi)容更新到gerrit上(管理員gerrit賬號(hào)登陸)的SSH Public Keys里

同樣的如叼,將gerrit的其他兩個(gè)普通賬號(hào)wangshibo和jenkins也在linux服務(wù)器上生產(chǎn)公私鑰,郵箱分別是wangshibo@xqshijie.cn和jenkins@xqshijie.cn

并將兩者的公鑰id_rsa.pub內(nèi)容分別更新到各自登陸的gerrit的SSH Public Keys里

3)Jenkins配置

Jenkins系統(tǒng)已經(jīng)創(chuàng)建了管理員賬戶jenkins并安裝了Gerrit Trigger插件和Git plugin插件

在“系統(tǒng)管理”->“插件管理"->”可選插件"->搜索上面兩個(gè)插件進(jìn)行安裝

使用jenkins賬號(hào)登陸jenkins穷劈,進(jìn)行Jenkins系統(tǒng)的SMTP設(shè)置 (根據(jù)具體情況配置)

“主頁(yè)面->系統(tǒng)管理->系統(tǒng)設(shè)置”笼恰,具體設(shè)置如下:

首先管理員郵件地址設(shè)置成jenkins@xqshijie.cn

設(shè)置SMTP的服務(wù)器地址,點(diǎn)擊“高級(jí)”

jenkins@xqshijie.cn的密碼要確認(rèn)填對(duì)歇终,然后測(cè)試郵件發(fā)送功能社证,如果如下出現(xiàn)successfully,就成功了评凝! 點(diǎn)擊“保存”

接下來(lái)設(shè)置Gerrit Trigger

Add New Server : Check4Gerrit

勾選 Gerrit Server With Default Configurations


具體設(shè)置如下:

設(shè)置好之后追葡,點(diǎn)擊“Test Connection”,如果測(cè)試連接出現(xiàn)如下的Success奕短,即表示連接成功宜肉!

點(diǎn)擊左下方的Save保存。

-----------------------------------------------------------------------------------------

如果上一步在點(diǎn)擊“Test Connection”測(cè)試的時(shí)候篡诽,出現(xiàn)下面報(bào)錯(cuò):

解決辦法:

管理員登錄gerrit

Projects->List->All-Projects

Projects->Access

Global Capabilities->Stream Events 點(diǎn)擊 Non-Interactive Users

添加 Jenkins@zjc.com 用戶到 ‘Non-Interactive Users’ 組

-----------------------------------------------------------------------------------------

4)Gerrit 和 Jenkins 整合

讓Gerrit支持Jenkins

如果安裝Gerrit時(shí)沒(méi)有或者沒(méi)有選擇添加Verified標(biāo)簽功能[‘lable Verified’]崖飘,需要自己添加榴捡。

如下是手動(dòng)添加Verified標(biāo)簽功能的設(shè)置(由于我在安裝Gerrit的時(shí)候已經(jīng)選擇安裝Verified標(biāo)簽功能了杈女,所以下面橙色字體安裝操作可省略)

[如果在安裝gerrit的時(shí)候沒(méi)有選擇安裝這個(gè)標(biāo)簽功能,就需要在此處手動(dòng)安裝下吊圾。具體可以登陸gerrit达椰,ProjectS->list->All-Projects->Access->Edit->Add Permission 看里面是否有Verfied的選項(xiàng)]

# su - gerrit

$ git init cfg; cd cfg

$ git config --global user.name 'gerrit'

$ git config --global user.email 'gerrit@xqshijie.cn'

$ git remote add origin ssh://gerrit@103.10.86.30:29418/All-Projects

$ git pull origin refs/meta/config

$ vim project.config

[label "Verified"]

? ? function = MaxWithBlock

? ? value = -1 Fails

? ? value = 0 No score

? ? value = +1 Verified

$ git commit -a -m 'Updated permissions'

$ git push origin HEAD:refs/meta/config

$ rm -rf cfg

用gerrit管理員賬號(hào)登錄Gerrit

現(xiàn)在提交的Review請(qǐng)求只有Code Rivew審核,我們要求的是需要Jenkins的Verified和Code Review雙重保障项乒,在 Projects 的 Access 欄里啰劲,針對(duì) Reference: refs/heads/ 項(xiàng)添加 Verified 功能,如下如下:

Projects -> List -> All-Projects

Projects -> Access -> Edit -> 找到 Reference: refs/heads/* 項(xiàng) -> Add Permission -> Label Verified -> Group Name 里輸入 Non-Interactive Users -> 回車 或者 點(diǎn)擊Add 按鈕 -> 在最下面點(diǎn)擊 Save Changes 保存更改檀何。

(注意:提前把jenkins用戶添加到Non-Interactive Users組內(nèi))

權(quán)限修改結(jié)果如下:

截圖如下:

添加Verified后的權(quán)限如下



Gitlab上設(shè)置test-project1工程

前面我們?cè)贕itlab上搭建了一個(gè) test-project1 的工程蝇裤,普通用戶是沒(méi)有辦法去 push 的,只能使用 git review 命令提交. 而 git review 命令需要 .gitreview 文件存在于項(xiàng)目目錄里频鉴。

用 gerrit用戶添加.gitreview 文件

[root@115]# su - gerrit

[gerrit@115]$ git clone git@103.10.86.30:dev-group/test-project1.git

[gerrit@115]$ cd test-project1

[gerrit@115]$ vim .gitreview

1

2

3

4

[gerrit]

host=103.10.86.30

port=29418

project=test-project1.git

添加.gitreview到版本庫(kù)

[gerrit@115]$git add .gitreview

[gerrit@115]$git config --global user.name 'gerrit'

[gerrit@115]$git config --global user.email 'gerrit@xqshijie.cn'

[gerrit@115]$git commit .gitreview -m 'add .gitreview file by gerrit.'

[gerrit@115]$git push origin master

用gerrit用戶添加.testr.conf 文件

Python 代碼我使用了 testr栓辜,需要先安裝 testr 命令

[root@115]# easy_install pip

[root@115]# pip install testrepository

在 test-project1 這個(gè)項(xiàng)目中添加 .testr.conf 文件

[root@115]#su - gerrit

[gerrit@115]$cd test-project1

[gerrit@115]$vim .testr.conf

1

2

3

4

5

6

7

[DEFAULT]

test_command=OS_STDOUT_CAPTURE=1

OS_STDERR_CAPTURE=1

OS_TEST_TIMEOUT=60

${PYTHON:-python} -m subunit.run discover -t ./ ./ $LISTOPT $IDOPTION

test_id_option=--load-list $IDFILE

test_list_option=-list

提交到版本庫(kù)中

[gerrit@115]$git add .testr.conf

[gerrit@115]$git commit .testr.conf -m 'add .testr.conf file by gerrit'

[gerrit@115]$git push origin master

Gerrit上設(shè)置 test-project1工程

在Gerrit上創(chuàng)建 test-project1 項(xiàng)目

要知道review是在gerrit上,而gerrit上現(xiàn)在是沒(méi)有項(xiàng)目的垛孔,想讓gitlab上的項(xiàng)目能在gerrit上review的話藕甩,必須在gerrit上創(chuàng)建相同的項(xiàng)目,并有相同的倉(cāng)庫(kù)文件.

用gerrit用戶在 Gerrit 上創(chuàng)建 test-project1 項(xiàng)目

[root@115]# su - gerrit

[gerrit@115]$ ssh-gerrit gerrit create-project test-project1?(gerrit環(huán)境部署篇里已經(jīng)設(shè)置好的別名周荐,方便連接gerrit)?

登陸gerrit界面狭莱,發(fā)現(xiàn)test-project1工程已經(jīng)創(chuàng)建了僵娃。(這種方式創(chuàng)建的項(xiàng)目是空的)

clone --bare Gitlab上的倉(cāng)庫(kù)到 Gerrit?(gerrit上的項(xiàng)目最好是從gitlab上git clone --bare過(guò)來(lái),并且項(xiàng)目不要為空)

因?yàn)間errit用戶無(wú)訪問(wèn)gitlab的權(quán)限腋妙。所以要先看是否gerrit用戶下已經(jīng)存在了id_rsa密鑰默怨,如果沒(méi)有則創(chuàng)建,然后把公鑰加入到gitlab的管理員賬戶上(因?yàn)楹竺鍳errit系統(tǒng)還會(huì)有個(gè)復(fù)制git庫(kù)到 Gitlab的功能需要管理員權(quán)限)(這個(gè)測(cè)試環(huán)境辉阶,gitlab和gerrit的管理員我用的都是gerrit先壕,所以秘鑰也是共用)

[gerrit@115]$ cd /home/gerrit/gerrit_site/git/??//即登陸到gerrit安裝目錄的git下

[gerrit@115 git]$ rm -fr test-project1.git

[gerrit@115 git]$ git clone --bare git@103.10.86.30:dev-group/test-project1.git?//創(chuàng)建并將遠(yuǎn)程gitlab上的這個(gè)項(xiàng)目?jī)?nèi)容發(fā)布到gerrit上

[gerrit@115 git]$ ls

All-Projects.git test-project1.git

[gerrit@115 git]$ cd test-project1.git/?

[gerrit@115 git]$ ls?? ? //即test-project1工程和gerrit里默認(rèn)的All-Projects.git工程結(jié)構(gòu)是一樣的了

branches config description HEAD hooks info objects packed-refs refs

同步 Gerrit的test-project1 項(xiàng)目到 Gitlab 上的 test-project1 項(xiàng)目目錄中

當(dāng)用戶git review后,代碼通過(guò) jenkins 測(cè)試谆甜、人工 review 后垃僚,代碼只是 merge 到了 Gerrit 的 test-project1 項(xiàng)目中,并沒(méi)有 merge 到 Gitlab 的 test-project1 項(xiàng)目中规辱,所以需要當(dāng)?Gerrit test-project1 項(xiàng)目倉(cāng)庫(kù)有變化時(shí)自動(dòng)同步到 Gitlab 的 test-project1 項(xiàng)目倉(cāng)庫(kù)中谆棺。

Gerrit 自帶一個(gè) Replication 功能,同時(shí)我們?cè)诎惭b Gerrit 時(shí)候默認(rèn)安裝了這個(gè) Plugin罕袋。

現(xiàn)在只需要添加一個(gè) replication.config 給 Gerrit

[gerrit@115]$ cd /home/gerrit/gerrit_site/etc/

[gerrit@115]$ vim replication.config

1

2

3

4

5

6

7

[remote?"test-project1"]

projects =?test-project1

url = git@103.10.86.30:dev-group/test-project1.git

push = +refs/heads/*:refs/heads/*

push = +refs/tags/*:refs/tags/*

push = +refs/changes/*:refs/changes/*

threads = 3

設(shè)置gerrit用戶的 ~/.ssh/config

[gerrit@115]$ vim /home/gerrit/.ssh/config

1

2

3

Host 103.10.86.30:

???????IdentityFile ~/.ssh/id_rsa

???????PreferredAuthentications publickey

在gerrit用戶的~/.ssh/known_hosts 中改淑,給103.10.86.30 添加 rsa 密鑰

[gerrit@115]$ sh -c "ssh-keyscan -t rsa 103.10.86.30 >> /home/gerrit/.ssh/known_hosts"

[gerrit@115]$ sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"

----------------------------------------------特別注意----------------------------------------------

上面設(shè)置的~/.ssh/config文件的權(quán)限已定要設(shè)置成600

不然會(huì)報(bào)錯(cuò):“Bad owner or permissions on .ssh/config“

----------------------------------------------------------------------------------------------------

重新啟動(dòng) Gerrit 服務(wù)

[gerrit@115]$/home/gerrit/gerrit_site/bin/gerrit.sh restart

Gerrit 的復(fù)制功能配置完畢

在 gerrit 文檔中有一個(gè) ${name} 變量用來(lái)復(fù)制 Gerrit 的所有項(xiàng)目肤京,這里并不需要壁袄。如果有多個(gè)項(xiàng)目需要復(fù)制,則在 replication.config 中添加多個(gè) [remote ….] 字段即可辣吃。務(wù)必按照上面步驟配置復(fù)制功能榆纽。

在 Jenkins 上對(duì) test-project1 項(xiàng)目創(chuàng)建構(gòu)建任務(wù)

Jenkins上首先安裝git插件:Git Plugin

登陸jenkins仰猖,“系統(tǒng)管理”->“管理插件”->“可選插件”->選擇Git Pluin插件進(jìn)行安裝

Jenkins上創(chuàng)建項(xiàng)目

添加 test-project1工程



下面添加url:http://103.10.86.30:8080/p/test-project1.git

添加分支:origin/$GERRIT_BRANCH

如下:


構(gòu)建Excute Shell,添加如下腳本

cd $WORKSPACE?

[ ! -e .testrepository ] && testr init?

testr run

測(cè)試

linux系統(tǒng)上用wangshibo賬號(hào)提交一個(gè)更改

用wangshibo登錄

刪除目錄 test-project1

克隆 test-project1 工程

進(jìn)入 test-project1 目錄

添加文件奈籽、提交

git review 增加 review 到Gerrit

[root@115]# su - wangshibo

[wangshibo@115]$ rm -rf test-project1/

[wangshibo@115]$ git clone git@103.10.86.30:dev-group/test-project1.git

[wangshibo@115]$ cd test-project1/

[wangshibo@115]$ touch testfile

[wangshibo@115]$ git add testfile

[wangshibo@115]$ git commit -m "wangshibo add this testfile"

[wangshibo@115]$?git review?//提交review代碼審核請(qǐng)求

The authenticity of host '[103.10.86.30]:29418 ([103.10.86.30]:29418)' can't be established.

RSA key fingerprint is 83:ff:31:e8:68:66:6d:49:29:08:91:aa:ef:36:77:3e.

Are you sure you want to continue connecting (yes/no)? yes

Creating a git remote called "gerrit" that maps to:

ssh://wangshibo@103.10.86.30:29418/test-project1.git

Your change was committed before the commit hook was installed

Amending the commit to add a gerrit change id

remote: Resolving deltas: 100% (1/1)

remote: Processing changes: new: 1, refs: 1, done?

To ssh://wangshibo@103.10.86.30:29418/test-project1.git

* [new branch] HEAD -> refs/publish/master

----------------------------------------小提示----------------------------------------

安裝git-review

[root@115]# git clone git://github.com/facebook/git-review.git?

[root@115]# cd git-review?

[root@115]# python setup.py install

[root@115]# pip install git-review==1.21

[root@115]# yum install readline-devel

--------------------------------------------------------------------------------------

代碼審核處理

用gerrit管理員賬號(hào)登錄 Gerrit 饥侵,點(diǎn)擊"All“->”O(jiān)pen“-> 打開提交的review

打開后就能看見jenkins用戶已經(jīng)Verified【原因下面會(huì)提到】。

然后點(diǎn)擊Review進(jìn)行審核


由于上面已經(jīng)配置了gerrit跟jenkins的對(duì)接工作衣屏,所以當(dāng)git review命令一執(zhí)行躏升,jenkins上的test-project1工程的測(cè)試任務(wù)就會(huì)自動(dòng)觸發(fā)

如下:如果任務(wù)自動(dòng)執(zhí)行成功了,就說(shuō)明jenkins測(cè)試通過(guò)狼忱,然后jenkins會(huì)利用ssh連接gerrit并給提交的subject打上verified信息校驗(yàn)結(jié)果膨疏,然后審核人員再進(jìn)行review。

所以用gerrit管理員登陸后發(fā)現(xiàn)钻弄,jenkins已經(jīng)通過(guò)了Verified佃却,如下

注意:

等到j(luò)enkins上Verified通過(guò)后,即看到下圖右下角出現(xiàn)“Verified +1 jenkins"后

才能點(diǎn)擊"Code-Review+2",如下:

然后點(diǎn)擊“Submit"斧蜕,提交審核過(guò)的代碼


再次查看双霍,review請(qǐng)求已被審核處理,并且已經(jīng)Merged合并了!

最后登錄 Gitlab查看?test-project1?工程洒闸,可以看到新增加文件操作已經(jīng)同步過(guò)來(lái)了


注意:在審核人員進(jìn)行review和submit操作前染坯,要先等到j(luò)enkins測(cè)試并通過(guò)ssh方式連上gerrit給相應(yīng)提交審核的subjects帶上Verified通過(guò)后才能進(jìn)行。(gitlab+gerrit+jenkins環(huán)境配置后丘逸,提交到gerrit上審核的subjects的review人員中會(huì)默認(rèn)第一個(gè)是jenkins单鹿,jenkins有結(jié)果并verified后,其他人員才能veriew和submit深纲。也就是說(shuō)當(dāng)開發(fā)人員使用git review上報(bào)gerrit進(jìn)行code review后仲锄,jenkins會(huì)自動(dòng)觸發(fā)測(cè)試任務(wù),通過(guò)后會(huì)在gerrit的subject審核界面顯示verified結(jié)果湃鹊,當(dāng)顯示的結(jié)果是“verified +1 jenkins“后就可以進(jìn)行Review和submit了儒喊,最后同步到gitlab中心倉(cāng)庫(kù)。)

查看同步日志:

可以在gerrit服務(wù)器上查看replication日志:

[gerrit@115 logs]$ pwd

/home/gerrit/gerrit_site/logs

[gerrit@115 logs]$ cat replication_log

.........................

[2016-07-14 15:30:13,043] [237da7bf] Replication to git@103.10.86.30:dev-group/test-project1.git completed in 1288 ms

[2016-07-14 15:32:29,358] [] scheduling replication test-project1:refs/heads/master => git@103.10.86.30:dev-group/test-project1.git

[2016-07-14 15:32:29,360] [] scheduled test-project1:refs/heads/master => [03b983c0] push git@103.10.86.30:dev-group/test-project1.git to run after 15s

[2016-07-14 15:32:44,360] [03b983c0] Replication to git@103.10.86.30:dev-group/test-project1.git started...

[2016-07-14 15:32:44,363] [03b983c0] Push to git@103.10.86.30:dev-group/test-project1.git references: [RemoteRefUpdate[remoteName=refs/heads/master, NOT_ATTEMPTED, (null)...dda55b52b5e5f78e2332ea2ffcb7317120347baa, srcRef=refs/heads/master, forceUpdate, message=null]]

[2016-07-14 15:32:48,019] [03b983c0] Replication to git@103.10.86.30:dev-group/test-project1.git completed in 3658 ms

----------------------------------------------------------------------------------------------------

關(guān)于jenkins上的結(jié)果:

如上币呵,在服務(wù)器上wangshibo賬號(hào)下

git review命令一執(zhí)行怀愧,即代碼審核只要一提出,Jenkins 就會(huì)自動(dòng)獲取提交信息并判斷是否verified

如下余赢,當(dāng)jenkins上之前創(chuàng)建的工程test-project1執(zhí)行成功后芯义,那么jenkins對(duì)提交到gerrit上的review請(qǐng)求

就會(huì)自動(dòng)執(zhí)行Verified(如上)

----------------------------------------------注意----------------------------------------------

有個(gè)發(fā)現(xiàn):

jenkins上測(cè)試并返回給gerrit上提交的subject打上Verified信息核實(shí)通過(guò)的標(biāo)簽后,會(huì)將代碼拿到自己本地相應(yīng)工程的workspace目錄下

這里的jenkins代碼路徑是:/usr/local/tomcat7/webapps/jenkins/workspace/test-project1

不過(guò)值得注意的是妻柒,jenkins拿過(guò)來(lái)的代碼只是每次git review修改前的代碼狀態(tài)

可以把這個(gè)當(dāng)做每次代碼修改提交前的備份狀態(tài)

即:代碼修改后扛拨,在gerrit里面審核,commit后同步到gitlab举塔,修改前的代碼狀態(tài)存放在jenkins里面

-----------------------------------------------------------------------------------------------

手動(dòng)安裝gerrit插件

[gerrit@115r ~]$ pwd

/home/gerrit

[gerrit@115r ~]$ ls

gerrit-2.11.3.war gerrit_site

進(jìn)行插件安裝绑警,下面安裝了四個(gè)插件

[gerrit@115r ~]$?java -jar gerrit-2.11.3.war init -d gerrit_site --batch --install-plugin replication

Initialized /home/gerrit/gerrit_site

[gerrit@115r ~]$?java -jar gerrit-2.11.3.war init -d gerrit_site --batch --install-plugin reviewnotes

Initialized /home/gerrit/gerrit_site

[gerrit@115r ~]$?java -jar gerrit-2.11.3.war init -d gerrit_site --batch --install-plugin commit-message-length-validator

Initialized /home/gerrit/gerrit_site

[gerrit@115r ~]$?java -jar gerrit-2.11.3.war init -d gerrit_site --batch --install-plugin download-commands

Initialized /home/gerrit/gerrit_site

查看plugins目錄,發(fā)現(xiàn)已經(jīng)有插件了

[gerrit@115r ~]$ cd gerrit_site/plugins/

[gerrit@115r ~]$ ls

commit-message-length-validator.jar download-commands.jar replication.jar reviewnotes.jar

查看安裝了哪些插件

[gerrit@115r ~]$ ssh-gerrit gerrit plugin ls

Name ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Version ? ? ? ? ? ? ? ?Status ? ? ? ? ? ? ? ? File

-------------------------------------------------------------------------------

commit-message-length-validator?v2.11.3 ENABLED commit-message-length-validator.jar

download-commands?v2.11.3 ENABLED download-commands.jar

replication?v2.11.3 ENABLED replication.jar

reviewnotes?v2.11.3 ENABLED reviewnotes.jar

或者登陸gerrit也可查看

------------------------------------------------注意------------------------------------------------

gerrit手動(dòng)同步代碼到gitlab中心倉(cāng)庫(kù)上

[gerrit@115r ~]$ ssh-gerrit gerrit --help//查看幫助啤贩,發(fā)現(xiàn)gerrit COMMAND --help可查找命令幫忙

[gerrit@115r ~]$ ssh-gerrit replication start --help//查看replication同步命令的用法

replication start [PATTERN ...] [--] [--all] [--help (-h)] [--url PATTERN] [--wait]

PATTERN : project name pattern

-- : end of options

--all?: push all known projects

--help (-h) : display this help text

--url PATTERN : pattern to match URL on

--wait : wait for replication to finish before exiting

[gerrit@115r ~]$ ssh-gerrit replication start --all??//同步所有工程

-------------------------------------------------------------------------------------------------------

重載replication的同步服務(wù)

[gerrit@115r ~]$ ssh-gerrit gerrit plugin reload replication

如果報(bào)錯(cuò):fatal: remote plugin administration is disabled

解決辦法:

在/home/gerrit/gerrit_site/etc/gerrit.config文件里添加下面內(nèi)容:

[plugins]

allowRemoteAdmin = true

然后重啟gerrit服務(wù)即可:

[gerrit@115r ~]$ /home/gerrit/gerrit_site/bin/gerrit.sh restart

Stopping Gerrit Code Review: OK

Starting Gerrit Code Review: OK

----------------------------------------------------------------------

ssh-gerrit是別名

[gerrit@115r ~]$ cat ~/.bashrc?

# .bashrc

# Source global definitions

if [ -f /etc/bashrc ]; then

. /etc/bashrc

fi

alias ssh-gerrit='ssh -p 29418 -i ~/.ssh/id_rsa 103.10.86.30 -l gerrit'?

# User specific aliases and functions

-------------------------------------------------------------------------------------------


多個(gè)工程在Gitlab上可以放在不同的group下進(jìn)行管理

如下面兩個(gè)工程(多個(gè)工程待秃,就在后面追加配置就行)

dev-group /test-project1

app/xqsj_android

多個(gè)工程的replication

[gerrit@Zabbix-server etc]$ cat replication.config

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

[remote?"test-project1"]

projects =?test-project1

url = git@103.10.86.30:dev-group/test-project1.git

push = +refs/heads/*:refs/heads/*

push = +refs/tags/*:refs/tags/*

push = +refs/changes/*:refs/changes/*

threads = 3


[remote?"xqsj_android"]

projects = xqsj_android

url = git@103.10.86.30:app/xqsj_android.git

push = +refs/heads/*:refs/heads/*

push = +refs/tags/*:refs/tags/*

push = +refs/changes/*:refs/changes/*

threads = 3

然后在每個(gè)代碼庫(kù)里添加.gitreview和.testr.conf 文件拜秧,

注意.gitreview文件里的項(xiàng)目名稱

按照上面同步配置后痹屹,Gerrit里面的代碼就會(huì)自動(dòng)同步到Gitlab上,包括master分支和其他分支都會(huì)自動(dòng)同步的枉氮。

如果志衍,自動(dòng)同步失效或者有問(wèn)題的話,可以嘗試手動(dòng)同步(下面有提到)

另外:為了減少錯(cuò)誤聊替,建議在配置的時(shí)候楼肪,gitlab和gerrit里的賬號(hào)設(shè)置成一樣的,共用賬號(hào)/郵箱/公鑰

gerrit默認(rèn)的兩個(gè)project:All-Project和All-Users絕不能刪除H乔摹春叫!

--------------------------------------------去掉jenkins測(cè)試的方式---------------------------------------------

如果gerrit不跟jenkins結(jié)合,不通過(guò)jenkins測(cè)試并返回verified核實(shí)的方式,可以采用下面的代碼審核流程(必須先對(duì)提交的審核信息進(jìn)行verified核實(shí)暂殖,然后再進(jìn)行代碼的review審核价匠,最后submit提交):

[去掉上面gerrit和jenkins對(duì)接設(shè)置,即關(guān)閉jenkins服務(wù)(關(guān)停對(duì)應(yīng)的tomcat應(yīng)用)呛每,gerrit的access授權(quán)項(xiàng)verified里刪除“Group Non-Interactive Users”(在這個(gè)組內(nèi)踢出jenkins用戶)踩窖,并刪除gerrit上的jenkins用戶]

1)上傳代碼者(自己先verified核實(shí),然后通知審核者審核)

修改代碼晨横,驗(yàn)證后提交到 Gerrit 上洋腮。

代碼提交后登陸 Gerrit,自己檢查代碼(重點(diǎn)看縮進(jìn)格式跟原文件是否一致手形;去掉紅色空格部分啥供;修改內(nèi)容是否正確;命名是否有意義库糠;注釋內(nèi)容是否符合要求等)滤灯。

自己檢查沒(méi)問(wèn)題后,點(diǎn) “Reply”按鈕曼玩,在“Verified”中 +1鳞骤,在“Code Review”中 +1,并點(diǎn)“Post“

在”Reviewer”欄中黍判,點(diǎn)擊”Add"添加審核者 [如果不添加審核者豫尽,上傳者自己也可以審核并完成提交。注意:只有Review是+2的時(shí)候顷帖,才能出現(xiàn)submit的提交按鈕]

如果代碼審核沒(méi)有通過(guò)美旧,請(qǐng)重復(fù)步驟1,2贬墩,3榴嗅。

流程截圖:

代碼提交后,上傳者自行登陸gerrit陶舞,找到提交的subject嗽测,點(diǎn)擊"Reply"


2)審核者

收到郵件通知后登陸 Gerrit,審核代碼肿孵。

如果審核通過(guò)唠粥,點(diǎn) “Reply”按鈕,在“Verified”中 +1停做,在“Code Review”中 +2晤愧,并點(diǎn)“Post”,最后點(diǎn)擊“Submit“提交蛉腌!

如果代碼審核沒(méi)有通過(guò)官份,點(diǎn) “Review”按鈕只厘,在“Code Review”中 -2,寫好評(píng)論后舅巷,點(diǎn)“Post”懈凹。

流程截圖:

如上,subject的owner添加審核者后悄谐,審核者登陸gerrit進(jìn)行review

點(diǎn)擊“Reply"


這樣介评,就完成了一個(gè)代碼的審核全部過(guò)程!

登陸gitlab爬舰,就會(huì)發(fā)現(xiàn)gerrit上審核通過(guò)并提交后的代碼已經(jīng)同步過(guò)來(lái)了们陆!

注意:

如上的設(shè)置,在gerrit里授權(quán)的時(shí)候:

Revified權(quán)限列表里添加“Project Owners“(-1和+1)和審核者組(-1和+1)

Review權(quán)限列表里添加“Project Owners“和審核者組(都要設(shè)置-2和+2)

附授權(quán)截圖:

------------------------------------讓非管理員用戶也有g(shù)itweb訪問(wèn)權(quán)限--------------------------------------

發(fā)現(xiàn)在gerrit與gitweb集成后情屹,默認(rèn)情況下坪仇,只有g(shù)errit的管理員才有g(shù)itweb的訪問(wèn)權(quán)限,普通用戶點(diǎn)擊gitweb鏈接顯示404錯(cuò)誤垃你。

最后發(fā)現(xiàn)使用gitweb需要有【refs/*】下所有的read權(quán)限和【refs/meta/config】的read權(quán)限椅文!

默認(rèn)情況下:

【refs/*】下的read權(quán)限授予對(duì)象是:Administrators和Anonymous Users(所有用戶都是匿名用戶,這個(gè)范圍很大惜颇,已默認(rèn)包括所有用戶)

【refs/meta/config】的read權(quán)限授予對(duì)象是:Administrators和Project Owners

如想要比如上面的xqsh-app組內(nèi)的用戶能正常訪問(wèn)gitweb皆刺,那么就在【refs/meta/config】分支下授予這個(gè)組的Allow權(quán)限即可!凌摄!

截圖如下:

使用普通用戶wangshibo(在xqsj-app組內(nèi))登陸gerrit羡蛾,發(fā)現(xiàn)能打開xqsj_android項(xiàng)目的gitweb超鏈接訪問(wèn)了

---------------------------------------------------------------------------------------------------------

后續(xù)應(yīng)開發(fā)人員的要求:Gitlab+gerrit+jenkins環(huán)境下,gerrit有幾個(gè)細(xì)節(jié),都是需要設(shè)置好的:

1)項(xiàng)目A的開發(fā)人員對(duì)于除A以外的項(xiàng)目沒(méi)有訪問(wèn)權(quán)限锨亏;

2)每個(gè)開發(fā)人員應(yīng)該有+2和submit痴怨,以及創(chuàng)建分支的權(quán)限;

3)給teamleader配置force push的權(quán)限器予;

設(shè)置方案:

第1個(gè)要求:

在gerrit里面設(shè)置read權(quán)限浪藻,即"refs/*"下的"Read"權(quán)限。

先保持將All-Projects默認(rèn)權(quán)限不變乾翔!

然后重新Edit項(xiàng)目A的權(quán)限去覆蓋掉All-Projects繼承過(guò)來(lái)的這個(gè)權(quán)限(下面會(huì)提到)

如下截圖(前面的Exclusive一定要打勾爱葵,覆蓋效果才能生效)

其實(shí),開發(fā)人員是沒(méi)有必要開通gitlab賬號(hào)末融!只要gerrit提前和gitlab做好同步對(duì)接工作钧惧,那么直接設(shè)置好gerrit權(quán)限暇韧,開發(fā)人員可直接通過(guò)ssh方式登陸gerrit進(jìn)行代碼操作(git clone代碼勾习,然后修改,提交審核懈玻,自動(dòng)同步等)所以巧婶,只需要給開發(fā)人員開通gerrit賬號(hào)即可乾颁!

<如下,通過(guò)ssh方式連接gerrit上的項(xiàng)目艺栈,進(jìn)行g(shù)it clone代碼或git pull操作等>

如下:

按照gerrit上的ssh連接方式clone項(xiàng)目代碼(前提是把本地服務(wù)器的公鑰上傳到gerrit上)

可以復(fù)制下圖中的clone或clone with commit-msg hook地址在本地進(jìn)行代碼clone

第2個(gè)要求:

a)在gerrit里面設(shè)置英岭,創(chuàng)建組比如xqsj-app,然后把這個(gè)組添加到gerrit界面相對(duì)應(yīng)項(xiàng)目的”access“授權(quán)里的“refs/heads/*”->Label Code-Review內(nèi)湿右,以及Submit內(nèi)诅妹,這樣就保證每個(gè)開發(fā)人員有+2和submit權(quán)限

b)將上面創(chuàng)建的xqsh-app組添加到gerrit界面相對(duì)應(yīng)項(xiàng)目的”access“授權(quán)里的“refs/heads/*”->“Create Reference”內(nèi),這樣就能保證每個(gè)開發(fā)人員有創(chuàng)建分支的權(quán)限了毅人。

第3個(gè)要求:

創(chuàng)建teamleader組吭狡,比如xqsj-app-teamleader,將這個(gè)組添加到A項(xiàng)目編輯的下面兩個(gè)權(quán)限里丈莺,去覆蓋從All-Projects繼承過(guò)來(lái)的權(quán)限划煮!

“refs/heads/*”->"Push"

“refs/meta/config”->“Push”

這兩個(gè)地方地Push權(quán)限最好只賦給Administrators管理員和teamleader組,這樣就保證了每個(gè)teamleader有force push的權(quán)限了缔俄。

(注意弛秋,勾上在后面的“force push”前的小框,如下截圖)

這樣俐载,xqsj-app-teamleader組內(nèi)的用戶通過(guò)ssh方式連接gerrit蟹略,git clone下載代碼,修改后可直接git push了(不需要review審核)

在這里還講一下下面/refs/for/refs/*的兩個(gè)Push權(quán)限遏佣,這個(gè)All-Projects里默認(rèn)是賦予Registered Users注冊(cè)用戶的

那么科乎,在給項(xiàng)目新編輯權(quán)限去覆蓋的時(shí)候,最好把權(quán)限賦予對(duì)象改成項(xiàng)目所在的組贼急!

(如上面所說(shuō)的茅茂,修改代碼push的中心倉(cāng)庫(kù)的權(quán)限就只關(guān)聯(lián)到上面兩個(gè)權(quán)限,跟這個(gè)無(wú)關(guān))

如下:

將wangshibo用戶拉到xqsj-app-teamleader組內(nèi)太抓,上面已經(jīng)設(shè)置了“Force Push”權(quán)限空闲,所以wangshibo用戶連接gerrit

修改后的代碼可直接push了!然后同步到gitlab走敌!

[wangshibo@115 ~]$?git clone ssh://wangshibo@103.10.86.30:29418/xqsj_android

Initialized empty Git repository in /home/wangshibo/www/xqsj_android/.git/

remote: Counting objects: 653, done

remote: Finding sources: 100% (653/653)

remote: Total 653 (delta 180), reused 653 (delta 180)

Receiving objects: 100% (653/653), 2.86 MiB, done.

Resolving deltas: 100% (180/180), done.

[wangshibo@Zabbix-server www]$ ls

xqsj_android

[wangshibo@115 ~]$?cd xqsj_android/

[wangshibo@115 ~]$?vim testfile?//修改代碼

[wangshibo@115 ~]$?git add testfile

[wangshibo@115 ~]$?git commit -m "222"

[master 87a02b7] 222

1 files changed, 1 insertions(+), 0 deletions(-)

[wangshibo@115 ~]$?git push??//直接push即可碴倾!如果wangshibo不在teamleader組內(nèi),就不能直接push了掉丽,就只能git review審核了跌榔!

Counting objects: 5, done.

Delta compression using up to 32 threads.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 261 bytes, done.

Total 3 (delta 1), reused 0 (delta 0)

remote: Resolving deltas: 100% (1/1)

remote: Processing changes: refs: 1, done?

To ssh://wangshibo@103.10.86.30:29418/xqsj_android

1840a0c..87a02b7 master -> master

這樣,一個(gè)項(xiàng)目的開發(fā)人員在修改代碼并提交gerrit后捶障,就可以指定有相應(yīng)權(quán)限的人員進(jìn)行review和submit了僧须。

另外注意:

修改gerrit上創(chuàng)建的group組名或增刪等操作,可以直接在服務(wù)器上的mysql里面操作项炼。

---------------------------------------------------特別注意-------------------------------------------------------

如果要想讓新建立的項(xiàng)目不繼承或不完全繼承All-Project項(xiàng)目權(quán)限担平,可以自己重新修改或添加權(quán)限示绊,以便去覆蓋掉不想繼承的權(quán)限!

這里以我測(cè)試環(huán)境的一個(gè)項(xiàng)目xqsj_android做個(gè)例子說(shuō)明:

首先在gerrit上創(chuàng)建一個(gè)組xqsj_android暂论,將wangshibo普通用戶放到這個(gè)組內(nèi)面褐!

1)想要wangshibo登陸gerrit后,只能訪問(wèn)它所在的項(xiàng)目xqsj_android

設(shè)置方法:

上面已講到取胎,即將All-Projects的access里的"refs/*"-"Read"權(quán)限只給Administors(就只保留管理員的這個(gè)read權(quán)限)展哭,這樣,project工程就只有管理員權(quán)限才能訪問(wèn)到了闻蛀!

<因?yàn)槠渌陆ǖ捻?xiàng)目默認(rèn)都是繼承All-Projects權(quán)限的摄杂,設(shè)置上面的Read權(quán)限只保留Administors后,其他的項(xiàng)目如果不Edit自己的權(quán)限去覆蓋繼承過(guò)來(lái)的權(quán)限循榆,那么這些項(xiàng)目?jī)?nèi)的用戶登陸后析恢,都訪問(wèn)不了這些項(xiàng)目的>

然后再在xqsj_android項(xiàng)目上創(chuàng)建Reference權(quán)限,去覆蓋繼承過(guò)來(lái)的All-Project權(quán)限秧饮!

特別注意下面的“Exclusive”映挂,這個(gè)一定要勾上!盗尸!勾上了才能生效柑船,才能覆蓋All-Project項(xiàng)目的權(quán)限。

截圖如下:

如上截圖泼各,發(fā)現(xiàn)“refs/*”的“Read”權(quán)限除給了管理員Administrators鞍时,也添加了xqsj_android組,由于wangshibo在這個(gè)組內(nèi)扣蜻,

所以wangshibo登陸gerrit后逆巍,有訪問(wèn)xqsj_android項(xiàng)目的權(quán)限。

注意:

All-Projects默認(rèn)的權(quán)限最好都保持不變莽使,不要?jiǎng)樱?/p>

新建項(xiàng)目有的權(quán)限可以自行Edit編輯锐极,然后去覆蓋All-Projects繼承過(guò)來(lái)的權(quán)限(新建的Reference時(shí)吮蛹,后面的Exclusive一定要在前面的小方框內(nèi)打上勾敌蚜,這樣覆蓋才能生效!)

下面貼一下本人線上的gerrit項(xiàng)目修改后的權(quán)限:

------------------------------------------------------------------------------------------------------

git clone下載代碼奴艾,可以根據(jù)gitlab上的ssh方式克隆亿笤,也可以根據(jù)gerrit上的ssh方式克隆代碼翎迁。

具體采用哪種,根據(jù)自己的需要判斷净薛。

注意:當(dāng)審核未通過(guò)打回時(shí)汪榔,我們?cè)傩薷耐瓿芍螅瑘?zhí)行:

git add 文件名

git commit --amend ##注意會(huì)保留上次的 change-id 罕拂,不會(huì)生成新的評(píng)審任務(wù)編號(hào)揍异,重用原有的任務(wù)編號(hào)全陨,將該提交轉(zhuǎn)換為老評(píng)審任務(wù)的新補(bǔ)丁集

git review

-------------------------------------------------------------------------------------------------------

如果想讓某個(gè)用戶只有讀權(quán)限爆班,沒(méi)有寫權(quán)限衷掷。即登陸gerrit后只能查看,不能進(jìn)行下載柿菩,上傳提交等操作

解決:

1)創(chuàng)建一個(gè)read的用戶組戚嗅,然后將這個(gè)只讀用戶拉到這個(gè)read組內(nèi)

2)在相應(yīng)項(xiàng)目的access授權(quán)里添加這個(gè)用戶組,如下枢舶,只需添加下面兩個(gè)地方的Read部分即可:

其中懦胞,“refs/meta/config”里的Read授權(quán),可以讓用戶查看到gitlab


----------------------------------------------添加tag權(quán)限----------------------------------------------

如上凉泄,已經(jīng)給teamleader用戶組內(nèi)的用戶授權(quán)直接push了躏尉,但是后面發(fā)現(xiàn)teamleader里的用戶只能直接push推送代碼到gerrit里,

而不能直接push推送tag標(biāo)簽到gerrit里后众!

這是因?yàn)樯厦娴膒ush權(quán)限是針對(duì)“refs/heads/*”和“refs/meta/config”設(shè)置的

而push tag需要針對(duì)“refs/tags/*”進(jìn)行設(shè)置

所以胀糜,需要添加refs/tags/*部分的設(shè)置,并給與push權(quán)限蒂誉,如下:

--------------------------------------------------------------------------------------------------------------

gerrit完整遷移

將遠(yuǎn)程gerrit上的代碼遷移到本地新的gerrit上

要求:

遠(yuǎn)程gerrit里的代碼分支和提交記錄都要遷移過(guò)來(lái)教藻,【即Git倉(cāng)庫(kù)遷移而不丟失log】(push的時(shí)候使用--mirrot鏡像方式即可)

流程:

1)將遠(yuǎn)程gerrit的項(xiàng)目比如A進(jìn)行g(shù)it clone –bare克隆裸版本庫(kù)到本地

2)在本地新的gerrit上創(chuàng)建同名項(xiàng)目A(創(chuàng)建空倉(cāng)庫(kù))

3)然后將克隆過(guò)來(lái)的A項(xiàng)目?jī)?nèi)容git push --mirror到本地新gerrit上的項(xiàng)目A內(nèi)

git push --mirror git@gitcafe.com/username/newproject.git (新gerrit上項(xiàng)目A的訪問(wèn)地址)

這種方式就能保證分支和提交記錄都能完整遷移過(guò)來(lái)了!S蚁恰括堤!

----------------------------------------------------------------------------------------------------------

后續(xù)對(duì)項(xiàng)目代碼進(jìn)行操作,在登陸gerrit審核后绍移,查看代碼(對(duì)比代碼提交前后的內(nèi)容)時(shí)候出現(xiàn)了一個(gè)錯(cuò)誤悄窃,具體如下:

其實(shí)代碼review通過(guò)并submit后,查看代碼有兩種方式:

1)通過(guò)項(xiàng)目的gitweb查看蹂窖。當(dāng)然广匙,這種方法查看也比較繁瑣,沒(méi)有下面的第(2)種方法查看起來(lái)方便

2)通過(guò)submit提交后的界面(也就是merged合并后的界面)恼策,如下點(diǎn)擊紅色方框內(nèi)的審核代碼進(jìn)行查看:

但是點(diǎn)擊上面紅色方框內(nèi)的審核代碼進(jìn)行查看鸦致,出現(xiàn)如下報(bào)錯(cuò):

經(jīng)過(guò)排查,發(fā)現(xiàn)造成這個(gè)報(bào)錯(cuò)的原因是由于nginx的反代配置有誤造成的涣楷,如下:

proxy_pass http://103.10.86.30:8080/;

需要將上面的反向代理改為:

proxy_pass http://103.10.86.30:8080;

也就是說(shuō)代理后的url后面不能加"/"分唾,這個(gè)細(xì)節(jié)在前期配置的時(shí)候沒(méi)有注意啊Jǘ贰绽乔!

gerrit.conf最后完整配置如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

[root@localhost vhosts]# pwd

/usr/local/nginx/conf/vhosts

[root@localhost vhosts]# cat gerrit.conf

server {

listen 80;

server_name localhost;


#charset koi8-r;

????#access_log? /var/log/nginx/log/host.access.log? main;

location / {

??????????auth_basic?"Gerrit Code Review";

??????????auth_basic_user_file?/home/gerrit/gerrit_site/etc/passwords;

??????????proxy_pass????????????? http://103.10.86.30:8080;

??????????proxy_set_header??????? X-Forwarded-For $remote_addr;

??????????proxy_set_header??????? Host $host;

????}

}


[root@localhost vhosts]# /usr/local/nginx/sbin/nginx -s reload

對(duì)比代碼在review前后的狀態(tài):修改了哪些內(nèi)容(右邊部分是review修改后的代碼狀態(tài)。點(diǎn)擊右邊"Patch Set 1"后面的圖標(biāo)碳褒,可以下載或修改代碼)

-------------------------------------------------------------------------------------------------------------

以上部署環(huán)境中折砸,有一個(gè)不安全的地方看疗,就是用戶提交代碼后,自己對(duì)代碼都有review最終審核權(quán)限睦授,即"用戶自己review提交審核-自己+1/+2審核-自己submit"两芳,這樣設(shè)計(jì)不是很合理!

現(xiàn)在做下調(diào)整:

用戶自己review提交代碼后去枷,自己只有Code-Review +2的權(quán)限和Submit怖辆,Verfied +1的權(quán)限統(tǒng)一交由專門的審核人員去處理,比如teamleader組删顶。

這樣竖螃,代碼審核的過(guò)程:

1)用戶自己review提交代碼審核

2)teamleader組內(nèi)人員收到審核后,通過(guò)Verfied +1審核

3) 用戶自己通過(guò)Code-Review +2審核

4)用戶自己Submit提交逗余,Merged合并處理特咆。

具體的權(quán)限設(shè)置調(diào)整如下:

----------------------------------------------------------------------------------------------------------------------------------

有一個(gè)問(wèn)題:

如果給某個(gè)賬號(hào)開了push權(quán)限,他在代碼commit提交后录粱,就可以直接git push上傳到gerrit里面腻格,可以不經(jīng)過(guò)git review審核提交的代碼。如下授權(quán)截圖:

但是這樣直接git push的話关摇,在gerrit界面的Merged處就追蹤不到這個(gè)賬號(hào)提交代碼的記錄了荒叶,也就是說(shuō),只有經(jīng)過(guò)review審核提交的代碼記錄才能在gerrit界面的Merged下追蹤到!如下:


如上所說(shuō)输虱,那么直接push提交代碼的記錄該怎么追蹤到呢些楣?

莫慌!

其實(shí)不管是push直接提交代碼的記錄宪睹,還是經(jīng)過(guò)review審核提交的代碼記錄愁茁,都可以在gitweb的log里追蹤到的!

雖然授權(quán)了push權(quán)限亭病,但是也還是可以使用git review命令進(jìn)行審核的鹅很,這樣在gerrit界面的Merged里也能追蹤到提交記錄了。

如果是直接git push的罪帖,那么提交代碼的時(shí)候就會(huì)直接繞過(guò)review審核了促煮,這樣當(dāng)然不會(huì)在gerrit的Merged里留有記錄。

----------------------------------------------------------------------------------------------------------------------------------

到此整袁!

gerrit環(huán)境部署及其中遇到的一些問(wèn)題菠齿,權(quán)限設(shè)置等已經(jīng)收錄完成,希望對(duì)有用到gerrit的朋友們有所幫助W肌绳匀!

***************當(dāng)你發(fā)現(xiàn)自己的才華撐不起野心時(shí),就請(qǐng)安靜下來(lái)學(xué)習(xí)吧***************

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疾棵,隨后出現(xiàn)的幾起案子戈钢,更是在濱河造成了極大的恐慌,老刑警劉巖是尔,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殉了,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嗜历,警方通過(guò)查閱死者的電腦和手機(jī)宣渗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門抖所,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梨州,“玉大人,你說(shuō)我怎么就攤上這事田轧”┙常” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵傻粘,是天一觀的道長(zhǎng)每窖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)弦悉,這世上最難降的妖魔是什么窒典? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮稽莉,結(jié)果婚禮上瀑志,老公的妹妹穿的比我還像新娘。我一直安慰自己污秆,他們只是感情好劈猪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著良拼,像睡著了一般战得。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庸推,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天常侦,我揣著相機(jī)與錄音,去河邊找鬼贬媒。 笑死聋亡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掖蛤。 我是一名探鬼主播杀捻,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了致讥?” 一聲冷哼從身側(cè)響起仅仆,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垢袱,沒(méi)想到半個(gè)月后墓拜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡请契,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年咳榜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爽锥。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涌韩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氯夷,到底是詐尸還是另有隱情臣樱,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布腮考,位于F島的核電站雇毫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏踩蔚。R本人自食惡果不足惜棚放,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馅闽。 院中可真熱鬧飘蚯,春花似錦、人聲如沸捞蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拟杉。三九已至庄涡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搬设,已是汗流浹背穴店。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拿穴,地道東北人泣洞。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像默色,于是被迫代替她去往敵國(guó)和親球凰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容