工作中经常因为代码提交之前没有进行必要的smoke test,导致有问题的代码merge进主分支,从而影响到其他同事的工作和整体工作效率。为了解决这个问题,在gerrit中submit代码之前,必须运行smoke test。思路就是:让gerrit触发jenkins的pipline自动运行,去编译代码和运行smoke test,并且返回结果到gerrit中,如果成功就merge代码。

工具

  1. Jenkins 2.263.3 (安装必要插件,包括Gerrit Trigger)
  2. Gerrite 3.2.7

语言

jenkinsfile,Groovy,shell

Jenkins界面配置

安装了Gerrit Trigger后,在Jenkins的configure中可见如下界面,Choose a Server填上自己所用gerrit的网址,Trigger on添加需要的触发条件,比如下图中选择了code review +2的时候触发jenkins pipline。

下图中需要添加能够触发的Gerrit Project的代码模块,代码分支。

代码示例

和上面界面配置的对应的jenkins file代码如下。请注意code review +2这个条件在代码中的书写格式,我刚开始的时候也是尝试了很多次,都写的格式不对,后来干脆看了gerrit trigger的源码。大家如果用其他的触发条件,遇到问题也可以下载插件源码学习下。

    triggers {
        gerrit(
                serverName: 'gerrite1.xxxxxxx.com',
                silentMode: true,
                gerritProjects: [[compareType:'PLAIN', pattern:'component', branches:[[compareType:'PLAIN', pattern:'master']]]],
                triggerOnEvents: [
                    commentAdded(commentAddedTriggerApprovalValue: '+2', verdictCategory: 'Code-Review')
                ],
                skipVote: [
                    onSuccessful: true,
                    onFailed    : true,
                    onUnstable  : true,
                    onNotBuilt  : true
                ]
            )
    }

设计逻辑

gerrit中的每个code review都有唯一的change number,被触发后这个值保存到jenkins全局变量GERRIT_CHANGE_NUMBER中,另外,考虑到gerrit中code review的时候,如果一个项目包含多个代码模块的同时修改,并且这些模块是有依赖关系的,那就要用到Topic设置,jenkins中全局变量是GERRIT_TOPIC。

总结

Jenkinsfile中使用的代码是groovy的代码语法,当然其中会嵌套shell脚本,当然shell脚本中就可以调用python文件,用Python文件的目的主要是因为Python方便我们抓取网页信息和处理。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐