最近有需求要push review以后自動跑一些測試,如果通過就自動+2 不通過就-2,目前做法如下(jenkins gerrit均已配置好,Jenkins可以連接gerrit並拉代碼):
1. Jenkins上添加項目時,“源碼管理” 選擇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命令
4.build命令中可以使用Jenkins自帶的變量獲取一些信息(可用變量在Jenkins上可以查看):
$JOB_NAME Jenkins項目名
$JENKINS_HOME Jenkins根目錄
$BUILD_NUMBER 當前構建號
$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 ]