如何从Gradle中的Findbugs插件生成XML和HTML报告

时间:2016-09-08 19:26:51

标签: gradle findbugs

现在我在build.gradle中有FindBugs,如下所示

 apply plugin: 'findbugs'
        findbugs {
            ignoreFailures = true
        }
        tasks.withType(FindBugs) {
            reports {
                xml.enabled = false
                html.enabled = true
            }
        }

但是,如果我尝试同时启用HTML报告(供开发人员在他们的计算机上查看)和XML报告(我的jenkins CI计算机),我会得到以下内容

  

FindBugs任务只能启用一个报告,但不止一个   一份报告已启用。您需要禁用其中一个。

是否有某种方式/黑客能够让我生成两者 - 即使是通过两个不同的任务?

3 个答案:

答案 0 :(得分:2)

你可能可以,但是在插件的当前状态下,看起来你必须定义一个从FindBugs扩展的单独任务,但配置与标准配置不同。 问题是你确实会运行两次FindBugs,这可能会对任何体面的代码库造成性能损失。

显然你不能使用tasks.withType(FindBugs) { ... }配置你的任务,你必须明确地通过任务名称来完成。

注意:如果您正在运行此操作,例如: Jenkins,你希望你的build.gradle生成xml报告,让Jenkins从xml报告中生成html报告。这样,它就不会在你的构建中执行两次。

答案 1 :(得分:1)

我通过配置Gradle脚本解决了这个问题,因此它为XML和HTML报告生成了findbugs任务,然后生成一个取决于其他两个任务的任务。

def findbugsTask = task('findbugs') {
    group 'Verification'
}

[ 'Html', 'Xml' ].each { reportType ->
    findbugsTask.dependsOn task("findbugs${reportType}", type: FindBugs) {
        dependsOn 'compileJavaWithJavac'
        reports {
            html.enabled = reportType == 'Html'
            xml.enabled = reportType == 'Xml'
        }
    }
}

请注意,这将运行Findbugs工具两次,这通常不应该是持续集成的问题(除非您的代码库很大)。

答案 2 :(得分:1)

您可以生成两个报告,而无需两次运行FindBugs,但这并不直观。如果您看一下FindBugs generates its html report的方式,您会发现它实际上首先生成了xml,而只是使用xslt将其转换为html。知道了这一点,并随后提供了记录解决方案的spotbugs issue资源,我使用与FindBugs相同的方法。

在build.gradle文件中,我仅生成xml报告,然后运行新任务,该任务使用FindBugs provided stylesheets之一将xml报告转换为html。

server {
    listen 80;
    listen [::]:80;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name mydomain.org www.mydomain.org;
    root /var/www/mydomain.org/html/frontend/site;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /admin {
        try_files $uri $uri/ /admin/index.html;
    }
}