在jenkins上建立了一个job,通过标准的maven命令来执行打包测试和上传artifact到nexus仓库。mvn 命令为标准格式: clear deploy。
随后考虑到需要执行sonar,第一个解决方案是在jenkins中新建一个名为***_sonar的job,执行命令sonar:sonar。在原有job上通过设置Post-build Action / Build other projects, 将***_sonar加入到 Projects to build,实现sonar job的在原有job执行后触发。当时需要勾选"Trigger only if build succeeds",避免构建失败的时候也触发sonar的执行。
这个方案运行正常,但是随后发现有些性能问题:sonar的job执行时,需要重新update SCM,然后需要再次执行test,之后才能进行真正属于sonar的任务如代码检测等。明显update SCM 和执行test是重复了原有job,纯属浪费。这个重复执行问题随着测试案例和测试执行时间的增加,会越来越明显。因此需要考虑消除这里的重复问题,减少build的时间,并节约jenkins的资源。
首先考虑两次scm update的问题,这个问题的来源在于有两个jenkins的job,因此考虑将***_job废弃,直接在原有job上执行sonar。将maven命令修改为以"clear deploy sonar:sonar"。
这次理所当然的只update 一次scm,但是test 还是执行了两次。在install阶段执行第一次,在sonar:sonar阶段执行第二次。
试着在jenkins中安装sonar的plugin,然后将maven命令修改为原来的"clear deploy",在Post-build Actions勾选sonar,通过jenkins的sonar插件来执行sonar。很遗憾,还是两次test。
想了想问题还是在sonar这里,为什么不直接使用已经执行的test的结果?
google了一下,发现sonar自己的文档中也提到了这个两次执行test的问题,但是,居然没有给出解决的方法。
http://docs.codehaus.org/display/SONAR/Analyse+with+Maven
不过提到可以通过设置-Dmaven.test.failure.ignore=true 来要求sonar即使在test执行失败的情况下也要执行代码分析。
随后google到sonar的jira记录,有一个bug解决这个问题
http://jira.codehaus.org/browse/SONAR-415
jiar记录中明确提到,“for performance reasons. It avoids executing twice unit tests.”,呵呵,正和我意啊。
解决的方法,就是通过设置 sonar.dynamicAnalysis = reuseReports,使得sonar放弃运行 test 而直接复用已有的report,从而避免了二次执行test。
总结:最终的mvn 命令行
clean deploy sonar:sonar -Dsonar.dynamicAnalysis=reuseReports -Dmaven.test.failure.ignore=true