最近有需求要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 ]