最近有需求要push review之後自動跑一些測試,若是經過就自動+2 不經過就-2,目前作法以下(jenkins gerrit均已配置好,Jenkins能夠鏈接gerrit並拉代碼):html
1. Jenkins上添加項目時,「源碼管理」 選擇git,並填寫正確的「路徑」和「分支」(分支留空或者填**會管理全部分支)git
2. jenkins項目的「構建觸發器」 選擇 "Gerrit Trigger"(Jenkins須要安裝此插件),「Trigger on」 選擇 「patchset created」,"Dynamic Trigger Configuration" 填寫正確的「gerrit項目名」和「分支」(分支pattern填**能夠監聽全部分支);若是但願comment也監聽到,則「Trigger on」同時選上「Comment Added Contains Regular Expression」,Value爲指望的正則表達式正則表達式
3.jenkins項目的「構建」選擇「execute shell」,command中填寫build命令shell
4.build命令中可使用Jenkins自帶的變量獲取一些信息(可用變量在Jenkins上能夠查看):bash
$JOB_NAME Jenkins項目名 eclipse
$JENKINS_HOME Jenkins根目錄ssh
$BUILD_NUMBER 當前構建號ide
$GERRIT_PROJECT gerrit項目名工具
$GERRIT_BRANCH gerrit分支測試
$GERRIT_EVENT_TYPE 觸發Jenkins進行build的gerrit事件類型(好比patchset-created)
$GERRIT_PATCHSET_REVISION gerrit的commit id
$GERRIT_REFSPEC 當咱們的commit Push到Gerrit等待review時,Gerrit會將此commit保存在一個名爲「refs/changes/xx/yy/zz」的一個暫存branch中
5.實例腳本(build.sh):
#!/bin/bash
#拉取發起code review的代碼,此時Jenkins沒法自動拉取(有人知道如何自動拉取請告知我),如下四種拉取方式均可以:
cd $gitrepodir
git pull ssh://$user@gerrit_addr/$GERRIT_PROJECT $GERRIT_REFSPEC #pull
#git fetch ssh://$user@gerrit_addr/$GERRIT_PROJECT $GERRIT_REFSPEC && git format-patch -1 --stdout FETCH_HEAD #Format Patch
#git fetch ssh://$user@gerrit_addr/$GERRIT_PROJECT $GERRIT_REFSPEC && git cherry-pick FETCH_HEAD #Cherry Pick
#git fetch ssh://$user@gerrit_addr/$GERRIT_PROJECT $GERRIT_REFSPEC && git checkout FETCH_HEAD #checkout,但願拉取多分支的話用這個,pull有問題
#do some test
if [ "x$?" == "x0" ] ; then #成功則+2
ssh -x -p $gerrit_port $user@$gerrit_addr gerrit review --project $GERRIT_PROJECT --code-review 2 $GERRIT_PATCHSET_REVISION
else
ssh -x -p $gerrit_port $user@$gerrit_addr gerrit review --project $GERRIT_PROJECT --code-review -2 $GERRIT_PATCHSET_REVISION
fi
6.修改~/.ssh/config文件,可使gerrit命令行簡化:
Host gerrit.xxx.com
User $user
Host gerrit
Hostname gerrit.xxx.com
Port $gerrit_port
User $user
修改完以後,命令行能夠省略gerrit hostname port及user,好比:
git pull ssh://$user@gerrit_addr/$GERRIT_PROJECT $GERRIT_REFSPEC #pull
能夠簡化爲:
git pull gerrit:$GERRIT_PROJECT $GERRIT_REFSPEC #pull
配置實例:
注:
檢查兩個分支(master和online)是否有不一樣的commit:
git log --pretty=format:'commit %h %d %s %cr' --abbrev-commit --date=relative origin/master..origin/online
[ 若是執行失敗,試試:
git log --no-merges --pretty=format:'commit %h %d %s %cr' --abbrev-commit --date=relative master..online //過濾merged
git log --pretty=format:'commit %h %d %s %cr' --abbrev-commit --date=relative master..online ]