我有一个ANT构建与三叶草和声纳目标,示例命令是
ant clover.all sonar_all
目前我使用
<clover-setup initstring="${clover.db.file}">
<fileset dir="${src.dir}">
...
target为clover检测设置源目录。我的测试运行了,我得到了一个三叶草报告。我的声纳目标
<target name="sonar_all">
<pathconvert pathsep="," property="echo.path.compile" refid="core.class.path"/>
<property name="sonar.libraries" value="${echo.path.compile}"/>
<property name="sonar.sources" value="${src.dir}"/>
<property name="sonar.projectName" value="Touchpoint"/>
<property name="sonar.binaries" value="${build.classes.dir}"/>
<property name="sonar.tests" value=""/>
<property name="sonar.host.url" value="${sonar.host.url}"/>
<property name="sonar.jdbc.url" value="${sonar.jdbc.url}"/>
<property name="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="sonar.jdbc.username" value="${sonar.jdbc.username}"/>
<property name="sonar.jdbc.password" value="${sonar.jdbc.password}"/>
<property name="sonar.exclusions" value=""/>
<property name="sonar.dynamicAnalysis" value="reuseReports"/>
<property name="sonar.surefire.reportsPath" value="${build.dir}/utest"/>
<property name="sonar.clover.reportPath" value="${build.dir}/clover/report/clover.xml"/>
<property name="sonar.java.source" value="1.6"/>
<property name="sonar.java.target" value="1.6"/>
<sonar:sonar key="xx" version="xx" xmlns:sonar="antlib:org.sonar.ant"/>
</target>
也可以正常工作,但似乎正在处理的是clover插装代码而不是原始源代码,这导致findbugs报告出现问题,因为clover插装代码会在findbugs中导致多次违规。我的声纳测量仪出问题了。目前作为一个解决方案,我们有两个CI构建,一个用于clover,第二个用于sonar,但这意味着我永远无法将代码覆盖率指标和sonar细节放在一起。
我尝试使用clover-instr目标来确保检测代码被放置在不同的目录中,但由于编译后的代码仍然生成到单个类目录中,因此出现了相同的问题。我想知道其他开发人员使用了什么策略来绕过这个问题。
在最底层,是否有一个属性(即-Dclover.useCompile=true|false)是由三叶草设置的。所有的目标都指向应该使用三叶草编译器的ant编译目标?我喜欢运行默认的三叶草。所有目标,然后在声纳目标中删除仪器化的源文件和类文件,重新生成不带clover选项的声纳目标并运行默认的声纳目标。
ant clover.all clover_off sonar_all
编辑1:如果在Clover、Ant和Findbugs上发现这个项目,建议在Ant脚本中编译两次。由于ant构建只会加载一次属性,我不知道如何在构建过程中切换属性以确保编译任务运行两次,一次启用clover,第二次没有。
这里的基本问题是三叉叉生成的源代码和类使sonar头痛,但不可能通过ant任务分离生成路径。我的破解方案是将所有的类文件从后三叶草阶段复制到声纳目标开始的一个新文件夹中,然后删除三叶草类,假设它们的名称中有字符串"$__CLR"。然后,我指示sonar使用原始类集生成其指标。
<target name="sonar">
<delete dir="${build.dir}/sonarclasses"/>
<mkdir dir="${build.dir}/sonarclasses/com"/>
<copy todir="${build.dir}/sonarclasses/com" verbose="true" failonerror="false">
<fileset dir="${build.classes.dir}/com" excludes="com/**/*$__CLR*.class"/>
</copy>
<pathconvert pathsep="," property="echo.path.compile" refid="core.class.path"/>
<property name="sonar.libraries" value="${echo.path.compile}"/>
<property name="sonar.sources" value="${src.dir}"/>
<property name="sonar.projectName" value="Touchpoint"/>
<property name="sonar.binaries" value="${build.dir}/sonarclasses"/>
<property name="sonar.tests" value=""/>
<property name="sonar.host.url" value="${sonar.host.url}"/>
<property name="sonar.jdbc.url" value="${sonar.jdbc.url}"/>
<property name="sonar.jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="sonar.jdbc.username" value="${sonar.jdbc.username}"/>
<property name="sonar.jdbc.password" value="${sonar.jdbc.password}"/>
<property name="sonar.exclusions" value=""/>
<property name="sonar.dynamicAnalysis" value="reuseReports"/>
<property name="sonar.surefire.reportsPath" value="${build.dir}/utest"/>
<property name="sonar.clover.reportPath" value="${build.dir}/clover/report/clover.xml"/>
<property name="sonar.java.source" value="1.6"/>
<property name="sonar.java.target" value="1.6"/>
<!--<property name="sonar.findbugs.reportPath" value="${build.dir}/findbugs/findbugs.xml"/>-->
<sonar:sonar