所需軟件
Git:代碼版本管理
Java:最低1.7版本
Gerrit:安裝包是個war包
數(shù)據(jù)庫:Gerrit支持H2(內(nèi)置) / MySQL / PostgreSQL蜓氨,本安裝選擇PostgreSQL豆挽,完全開源且適合大規(guī)模數(shù)據(jù)的部署
身份認(rèn)證:審核的前提是做身份認(rèn)證來登陸Web鸽扁,Gerrit支持OpenID / HTTP / LDAP污呼,本安裝選擇已經(jīng)搭建好的LDAP,但會講解HTTP方式的認(rèn)證舟肉,需要Apache做反向代理。
安裝部分以ubuntu為例
Git安裝
sudo apt-get install git
JDK安裝
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jdk //當(dāng)前安裝為 jdk1.8.0_101
配置Java環(huán)境變量
PATH黄琼,指定命令搜索路徑,在shell下執(zhí)行命令時整慎,會到PATH變量指定的路徑中查找相應(yīng)命令程序脏款,如java/javac
CLASSPATH,指定類搜索路徑撤师,JVM通過它尋找類
JAVA_HOME拧揽,其他軟件通過它找到j(luò)dk的安裝目錄
vi /etc/profileexportJAVA_HOME=?/usr/java/jdk1.8.0_101/exportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATHexportPATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHsource/etc/profilejava -version
如果安裝了多個jdk,就選擇一個默認(rèn)的
sudoupdate-alternatives --config java
PostgreSQL安裝(目前用現(xiàn)有的Postgre數(shù)據(jù)庫新建數(shù)據(jù)庫和用戶)
sudoapt-get install postgresql
初次安裝后万俗,會默認(rèn)生成名為postgres的Linux系統(tǒng)用戶、數(shù)據(jù)庫和數(shù)據(jù)庫用戶(作為數(shù)據(jù)庫管理員)闰歪,首先修改postgres數(shù)據(jù)庫用戶的密碼,然后增加Gerrit需要的數(shù)據(jù)庫
sudo-u postgres psqlpostgres=# \password postgres(input password twice)postgres=# \q
sudo-u postgres createuser -RDIElPS gerritsudo-u postgres psqlpostgres=# \password gerrit(input password twice)sudo-u postgres createdb -E UTF-8-O gerrit reviewdb
Gerrit安裝
從官網(wǎng)下載Gerrit的安裝包临扮,為了方便改名為gerrit.war教翩,建議創(chuàng)建一個Linux用戶來安裝,本人安裝在gerrit2用戶的review_site目錄下
sudoadduser gerritsudosu gerritjava -jar gerrit.war init-d/home/gerrit/review_site
然后就會進行很多配置饱亿,大部分默認(rèn)即可,要注意的是數(shù)據(jù)庫和身份認(rèn)證钻注,這些配置也可以在安裝完成后在~/review_site/etc/gerrit.config文件中修改配猫。
當(dāng)前gerrit.config配置為:
[gerrit]
basePath = /home/gerrit/git
serverId = 7e182d87-75eb-4046-8547-496b55ea7ad9
canonicalWebUrl =http://gerrit.*****-net.com:8080
[database]
type = postgresql
hostname = 172.17.3.132
database = gerrit
username = gerrit
[auth]
type = LDAP
[ldap]
server =ldap://172.17.3.101
username = svc.jenkins
accountBase = dc=*****-net,dc=com
groupBase = dc=*****-net,dc=com
[receive]
enableSignedPush = false
[sendemail]
smtpServer = 172.17.3.201
smtpUser = svc.jenkins
smtpPass =******* ? ? ? ? ? ? ?//具體為郵件用戶密碼
from=CodeReview*****-net.com> ? ?//發(fā)件人顯示
[container]
user = gerrit
javaHome = /usr/java/jdk1.8.0_101/jre
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = proxy-http://*:8080/
[cache]
directory = cache
配置好gerrit.config文件后泵肄,啟動Gerrit,需要用絕對路徑
/home/gerrit/review_site/bin/gerrit.shstart
在瀏覽器輸入http://localhost:8080彈出Gerrit的頁面腐巢。
登錄管理員
第一次登錄的用戶為管理員賬號系忙,ID為1000000,默認(rèn)只有這個系統(tǒng)管理員才有Create權(quán)限(創(chuàng)建group和Project)
在gerrit本機上使用下面的命令生成管理員賬號(這里將gerrit作為管理員)的公私鑰并將公鑰上傳至gerrit管理員用戶下银还。
ssh-keygen -t rsa #生成sshkey
ls ~/.ssh/ #可查看sshkey
cat ~/.ssh/id_rsa.pub #查看sshkey
Gitlab配置
Gitlab上的項目必須被保護,被保護的項目只允許master權(quán)限的用戶進行push操作戒财,其他用戶無push提交權(quán)限捺弦。
普通用戶沒有直接push的權(quán)限孝扛。需要先review到gerrit上進行審核并commit后幽崩,才能更新到代碼中心倉庫里。
項目賦予gerrit用戶master權(quán)限慌申,給普通用戶只有develop或者reporter權(quán)限。
Gerrit用戶配置
普通用戶登錄gerrit蹄溉,將本機公鑰提交到gerrit,設(shè)置郵箱。
提交gerrit的用戶名和郵箱必須與git配置相同役电。
Jenkins配置
Jenkins系統(tǒng)已經(jīng)創(chuàng)建了管理員賬戶jenkins并安裝了Gerrit Trigger插件和Git plugin插件
在“系統(tǒng)管理”->“插件管理"->”可選插件"->搜索上面兩個插件進行安裝棉胀。
設(shè)置Gerrit Trigger
Add New Server :gerrit.*****-net.com
勾選 Gerrit Server With Default Configurations
配置trigger信息并測試連接
如果上一步在點擊“Test Connection”測試的時候,出現(xiàn)下面報錯:
解決辦法:
管理員登錄gerrit
Projects->List->All-Projects
Projects->Access
Global Capabilities->Stream Events 點擊 Non-Interactive Users
添加Jenkins@zjc.com用戶到 ‘Non-Interactive Users’ 組瓢谢。
Gerrit 和 Jenkins 整合
讓Gerrit支持Jenkins
如果安裝Gerrit時沒有或者沒有選擇添加Verified標(biāo)簽功能[‘lable Verified’]畸写,需要自己添加枯芬。
如下是手動添加Verified標(biāo)簽功能的設(shè)置
[如果在安裝gerrit的時候沒有選擇安裝這個標(biāo)簽功能,就需要在此處手動安裝下千所。具體可以登陸gerrit,ProjectS->list->All-Projects->Access->Edit->Add Permission 看里面是否有Verfied的選項]
# su - gerrit
$ git init cfg; cd cfg
$ git config --globaluser.name'gerrit'
$ git config --global user.email 'gerrit@devops_gerrit'
$ git remote add originssh://gerrit@http://gerrit.*****-net.com: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管理員賬號登錄Gerrit
現(xiàn)在提交的Review請求只有Code Review審核最楷,我們要求的是需要Jenkins的Verified和Code Review雙重保障,在 Projects 的 Access 欄里籽孙,針對 Reference: refs/heads/ 項添加 Verified 功能火俄,如下如下:
Projects -> List -> All-Projects
Projects -> Access -> Edit -> 找到 Reference: refs/heads/* 項 -> Add Permission -> Label Verified -> Group Name 里輸入 Non-Interactive Users -> 回車 或者 點擊Add 按鈕 -> 在最下面點擊 Save Changes 保存更改瓜客。
(注意:提前把jenkins用戶添加到Non-Interactive Users組內(nèi))
權(quán)限修改結(jié)果如下:
如不需要經(jīng)過jenkins Verified僅經(jīng)過code review竿开,則去掉Label Verified設(shè)置并暫停jenkins上gerrit trigger服務(wù)。
Gerrit工程建立
登錄gerrit頁面否彩,CreateNewProject嗦随。想讓gitlab上的項目能在gerrit上review的話,必須在gerrit上創(chuàng)建相同的項目肌毅,并有相同的倉庫文件姑原。
需要確認(rèn)gerrit賬戶在gitlab上是否有權(quán)限,如沒有權(quán)限需要在gitlab上為svc.gerrit用戶導(dǎo)入gerrit服務(wù)器的id_rsa.pub
ssh登錄gerrit服務(wù)器
$ /home/gerrit/git
$ rm -rf gerrittest.git
$?git clone --baregit@172.17.3.60:boyang.chen/gerrittest.git
gerrit即存在與gitlab相同的項目笨奠。
Gerrit同步到Gitlab配置
當(dāng)用戶修改文件唤殴,git add、git commit,提交push到gerrit的repo后蔚袍,代碼通過 jenkins 測試配名、人工review后,代碼只是 merge 到了 Gerrit 的 gerrittest項目中宇整,并沒有 merge 到 Gitlab 的 test-project1 項目中芋膘,所以需要當(dāng)Gerrit ?項目倉庫有變化時自動同步到 Gitlab 的 gerrittest 項目倉庫中。
Gerrit 自帶一個 Replication 功能臂拓,同時我們在安裝 Gerrit 時候默認(rèn)安裝了這個 Plugin潜腻。
1、現(xiàn)在只需要添加一個 replication.config 給 Gerrit
$ cd /home/gerrit/etc/
$ vim replication.config為項目配置同步信息
[remote "DCode"]
projects = DCode
url =git@gitlab.*****-net.com:sen.zhao/DCode.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
[remote "ProjectC"]
projects = ProjectC
url =git@gitlab.*****-net.com:boyang.chen/ProjectC.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
[remote "gerrittest"]
projects = gerrittest
url =git@gitlab.*****-net.com:boyang.chen/gerrittest.git
push = +refs/heads/*:refs/heads/*
push = +refs/tags/*:refs/tags/*
push = +refs/changes/*:refs/changes/*
threads = 3
2童番、設(shè)置gerrit用戶的 ~/.ssh/config
$ vim /home/gerrit/.ssh/config
Hostnamegitlab.*****-net.com
Protocol 2
HostKeyAlgorithms ssh-rsa,ssh-dss
上面設(shè)置的~/.ssh/config文件的權(quán)限已定要設(shè)置成600
不然會報錯:“Bad owner or permissions on .ssh/config“
3剃斧、在gerrit用戶的~/.ssh/known_hosts 中,給gitlab服務(wù)器和gerrit服務(wù)器 添加 rsa 密鑰
$ sh -c "ssh-keyscan -t rsagitlab.*****-net.com,172.17.3.60?>> /home/gerrit/.ssh/known_hosts"
$ sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"
$ sh -c "ssh-keyscan -t rsa?[gerrit.*****-net.com]:29418,[172.21.129.31]?>> /home/gerrit/.ssh/known_hosts"
$ sh -c "ssh-keygen -H -f /home/gerrit/.ssh/known_hosts"
配置后如下:
重新啟動 Gerrit 服務(wù)
$/home/gerrit/bin/gerrit.sh restart
Gerrit 的復(fù)制功能配置完畢臂容。
在 Jenkins 上對 gerrittest項目創(chuàng)建構(gòu)建任務(wù)
Jenkins上首先安裝git插件:Git Plugin
登陸jenkins根蟹,“系統(tǒng)管理”->“管理插件”->“可選插件”->選擇Git Pluin插件進行安裝
Jenkins上創(chuàng)建項目
添加 gerrittest工程
下面添加url(gerrit項目地址):ssh://svc.jenkins@gerrit.*****-net.com:29418/gerrittest
添加分支:$GERRIT_BRANCH
添加項目具體單元測試build腳本
Gerrit+Jenkins+Gitlab實現(xiàn)code review流程
普通用戶操作:
Git Bash:
1、clone gerrit上項目并下載commit-msg文件:
git clonessh://svc.jenkins@gerrit.*****-net.com:29418/gerrittest&& scp -p -P 29418svc.jenkins@gerrit.*****-net.com:hooks/commit-msg gerrittest/.git/hooks/
2球散、修改本地文件
3散庶、添加修改文件
git add .
4悲龟、提交修改
git commit
輸入提交信息
5、提交push到代碼審核分支:
git push origin HEAD:refs/for/master
Jenkins自動執(zhí)行build,build成功
登錄Gerrit頁面须教,會看到j(luò)enkins自動檢測了提交操作并且執(zhí)行了build操作,build成功羹奉,標(biāo)記Verified +1
開發(fā)者可指定審核人進行Review操作约计,或者管理員及ProjectOwner有權(quán)限進行Review評分迁筛。
可添加或刪除審核人
添加審核人后细卧,審核人會收到郵件提示
開發(fā)者等待審核人提交審核反饋,審核人CodeReview評分+2則通過審核贪庙。
代碼審核者(Administrator,ProjectOwner,CodeReviewer)操作:
收到審核郵件后登陸Gerrit
選擇要進行審核的提交記錄(Open)
經(jīng)過jenkins自動評分Verified時:
不經(jīng)過jenkins進行Verified評分時:
執(zhí)行Submit后止邮,gerrit會自動同步修改到gitlab庫奏窑。
可通過查看replication日志了解同步情況:
其他操作:
gerrit手動同步代碼到gitlab中心倉庫上
[gerrit@devops_gerrit]$ ssh-gerrit gerrit --help//查看幫助屈扎,發(fā)現(xiàn)gerrit COMMAND --help可查找命令幫忙
[gerrit@devops_gerrit]$ 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@devops_gerrit]$ ssh-gerrit replication start --all//同步所有工程
重載replication的同步服務(wù)
[gerrit@devops_gerrit]$ ssh-gerrit gerrit plugin reload replication
如果報錯:fatal: remote plugin administration is disabled
解決辦法:
在/home/gerrit/etc/gerrit.config文件里添加下面內(nèi)容:
[plugins]
allowRemoteAdmin = true
然后重啟gerrit服務(wù)即可:
[gerrit@devops_gerrit]$ /home/gerrit/bin/gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK
竅門:
Gitbash Push簡潔操作:
在工程路徑下寫入下面的命令:
$ git config remote.origin.push refs/heads/*:refs/for/*
這行命令的意思是鹰晨,當(dāng)執(zhí)行?push?命令時,將會推送到refs/for/當(dāng)前head所在的分支上漠趁。
設(shè)置之后即可按照之前的方式提交:
提交時
git push origin master或git push??? 即push修改內(nèi)容到refs/for/分支