SonarQube 6.0 pdf报告

SonarQube 6.0 pdf报告,sonarqube,Sonarqube,我正在使用SonarQube 6.0并尝试将分析报告导出为pdf格式。 不幸的是,我收到“报告不可用。安装插件后至少需要进行一次分析。”您不能使用此插件,因为该版本仅与SonarQube 4.5.7兼容。插件被插件(商业产品,不单独提供)取代,但该版本仅与兼容。你现在唯一的选择就是自己构建插件。但是请注意:可用的API可能会在不同的SonarQube版本之间发生变化。我已经使用sonar ws client创建了自己的报告,如果您愿意,您可以使用它,甚至您也可以在我创建报告时创建自己的.pdf报

我正在使用SonarQube 6.0并尝试将分析报告导出为pdf格式。
不幸的是,我收到“报告不可用。安装插件后至少需要进行一次分析。”

您不能使用此插件,因为该版本仅与SonarQube 4.5.7兼容。插件被插件(商业产品,不单独提供)取代,但该版本仅与兼容。你现在唯一的选择就是自己构建插件。但是请注意:可用的API可能会在不同的SonarQube版本之间发生变化。

我已经使用sonar ws client创建了自己的报告,如果您愿意,您可以使用它,甚至您也可以在我创建报告时创建自己的.pdf报告

注意:在使用以下代码之前,请将sonar ws-client导入类路径

import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.sonar.wsclient.SonarClient;
import org.sonar.wsclient.issue.Issue;
import org.sonar.wsclient.issue.IssueClient;
import org.sonar.wsclient.issue.IssueQuery;
import org.sonar.wsclient.issue.Issues;

public class SonarReport {

    public static void main(String args[]) {

        String login = "admin";
        String password = "admin";

        SonarClient client = SonarClient.create("http://10.20.120.47:9000");
        client.builder().login(login);
        client.builder().password(password);

        List<Issue> issuesList = new ArrayList<Issue>();
        IssueClient issueClient = client.issueClient();
        Issues issues = null;

        IssueQuery query = IssueQuery.create();
        //query.severities("BLOCKER","CRITICAL", "MAJOR");
        query.resolved(false);
        query.urlParams().put("types", "VULNERABILITY");


        int issueCount = 0;

        for (int i = 1; i < 7; i++) {

            query.pageIndex(i);
            query.pageSize(500);

            issues = issueClient.find(query);
            issuesList.addAll(issues.list());

            System.out.println("In progress ...");
        }

        createHTMLReport(issuesList);
    }

    private static void createHTMLReport(List<Issue> issueList) {

        try {
            String filename = "SonarIssues.html";

            PrintWriter pw = new PrintWriter(new FileWriter(filename));
            StringBuilder builder = new StringBuilder();

            // Construct report data
            Map<String,String> tableData = cunstructTableData(issueList);

            if(tableData!= null)
            {
                // HTML page construction
                builder.append("<!DOCTYPE>").append("\n");
                builder.append("<html>").append("\n");
                builder.append("<head>").append("\n");
                builder.append("<style>").append("\n");
                builder.append("table, th, td {").append("\n");
                builder.append(" border: 1px solid black;").append("\n");
                builder.append(" border-collapse: collapse;font-size: 13px !important;").append("\n");
                builder.append("}").append("\n");
                builder.append("th, td {  ").append("\n");
                builder.append(" padding: 10px;  ").append("\n");
                builder.append("}").append("\n");
                builder.append("table#alter tr:nth-child(even) { ").append("\n");
                builder.append("background-color: #eee;").append("\n");
                builder.append("}").append("\n");
                builder.append("table#alter tr:nth-child(odd) {  ").append("\n");
                builder.append("    background-color: #fff;  ").append("\n");
                builder.append("}  ").append("\n");
                builder.append("table#alter th {  ").append("\n");
                builder.append("    color: white; ").append("\n");
                builder.append("    background-color: gray;  ").append("\n");
                builder.append("}").append("\n");
                builder.append(" table {margin-bottom:50px;}").append("\n");
                builder.append(" table tr .title {background:#5f9be3;color:#fff;font-weight:bold;padding:5px; width:100px;   }").append("\n");
                builder.append(" table tr .text {padding-left:10px;}").append("\n");
                builder.append("</style>").append("\n");
                builder.append("</head>").append("\n");
                builder.append("<body style='font-family: Verdana, Geneva, sans-serif;'> ").append("\n");

                // Application version info
                builder.append("<table class='projectInfo' style='width:26%; margin-bottom:10px'><tr><td style='border-color: #fff;width: 86%;' class='title'> Project Version: v4.4.0</td>").append("\n");
                builder.append("</tr></table>").append("\n");

                // Table header info
                builder.append("<table class='statisticsInfo'><tr><td style='border-color: #fff;width: 86%;' class='title'>Total No. of issues:</td>").append("\n");
                builder.append("<td style='background-color: yellow;border-color: #fff;' class='text'>"+tableData.get("TotalNumberOfIssues")+"</td></tr>").append("\n");

                builder.append("<tr><td style='border-color: #fff;width: 86%;' class='title'>Blocker Issues:</td>").append("\n");
                builder.append("<td style='background-color: yellow;border-color: #fff;' class='text'>"+tableData.get("BlockerIssues")+"</td></tr>").append("\n");

                builder.append("<tr><td style='border-color: #fff;width: 86%;' class='title'>Critical Issues: </td>").append("\n");
                builder.append("<td style='background-color: yellow;border-color: #fff;' class='text'>"+tableData.get("CriticalIssues")+"</td></tr>").append("\n");

                builder.append("<tr><td style='border-color: #fff;width: 86%;' class='title'>Major Issues: </td>").append("\n");
                builder.append("<td style='background-color: yellow;border-color: #fff;' class='text'>"+tableData.get("MajorIssues")+"</td></tr>").append("\n");

                builder.append("<tr><td style='border-color: #fff;width: 86%;' class='title'>Minor Issues: </td>").append("\n");
                builder.append("<td style='background-color: yellow;border-color: #fff;' class='text'>"+tableData.get("MinorIssues")+"</td></tr></table>").append("\n");

                builder.append("<table id='alter'>").append("\n");
                // Header part
                builder.append("<tr><th>File name</th>");
                builder.append("<th>Severity</th>");
                builder.append("<th>Status</th>");
                builder.append("<th>Message</th></tr> ");

                builder.append(tableData.get("TableData")).append("\n");

                builder.append("</table>").append("\n");
                builder.append("</body>").append("\n");
                builder.append("</html>").append("\n");

                pw.println(builder.toString());
                pw.close();
            }

            System.out.println("HTML Report has been generated!");

        } catch (Exception ex) {
            System.out.println(ex);

        }
    }

    private static Map<String, String> cunstructTableData(List<Issue> issueList) {

         Map<String,String> result = new HashMap<String, String>();
         StringBuilder tableData = new StringBuilder();

         int blockerIssues = 0;
         int criticalIssues = 0;
         int majorIssues = 0;
         int minorIssues = 0;

         result.put("TotalNumberOfIssues", String.valueOf(issueList.size()));

         for (int i = 0; i < issueList.size(); i++) {

            String[] className = issueList.get(i).componentKey().split("/");

            tableData.append("<tr><td>"+className[className.length -1]+"</td>");
            tableData.append("<td>"+issueList.get(i).severity()+"</td>");
            tableData.append("<td>"+issueList.get(i).status()+"</td>");
            tableData.append("<td>"+issueList.get(i).message()+"</td></tr> ").append("\n");

            switch(issueList.get(i).severity()){

                case "BLOCKER":
                    ++blockerIssues;
                    break;
                case "CRITICAL":
                    ++criticalIssues;
                    break;
                case "MAJOR":
                    ++majorIssues;
                    break;
                case "MINOR":
                    ++minorIssues;
                    break;
            }
         }

         result.put("MajorIssues",String.valueOf(majorIssues));
         result.put("CriticalIssues",String.valueOf(criticalIssues));
         result.put("BlockerIssues",String.valueOf(blockerIssues));
         result.put("MinorIssues",String.valueOf(minorIssues));

         result.put("TableData", tableData.toString());

        return result;
    }

}
导入java.io.FileWriter;
导入java.io.PrintWriter;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入org.sonar.wsclient.sonaclient;
导入org.sonar.wsclient.issue.issue;
导入org.sonar.wsclient.issue.IssueClient;
导入org.sonar.wsclient.issue.IssueQuery;
导入org.sonar.wsclient.issue.Issues;
公开课声纳报告{
公共静态void main(字符串参数[]){
字符串login=“admin”;
字符串password=“admin”;
SonarClient=SonarClient.create(“http://10.20.120.47:9000");
client.builder().login(登录);
client.builder()密码(password);
List issuesList=new ArrayList();
IssueClient IssueClient=client.IssueClient();
Issues=null;
IssueQuery=IssueQuery.create();
//严重性(“拦截器”、“关键”、“重大”);
查询。已解决(错误);
query.urlParams().put(“类型”,“漏洞”);
int issueCount=0;
对于(int i=1;i<7;i++){
查询页面索引(i);
查询页面大小(500);
issues=issueClient.find(查询);
issuesList.addAll(issues.list());
System.out.println(“进行中…”);
}
创建HtmlReport(问题列表);
}
私有静态void createHTMLReport(列表发布列表){
试一试{
字符串filename=“SonarIssues.html”;
PrintWriter pw=新的PrintWriter(新的FileWriter(文件名));
StringBuilder=新的StringBuilder();
//构建报表数据
Map tableData=cunstructTableData(发布列表);
if(tableData!=null)
{
//HTML页面构造
builder.append(“”)。append(“\n”);
builder.append(“”)。append(“\n”);
builder.append(“”)。append(“\n”);
builder.append(“”)。append(“\n”);
append(“table,th,td{”).append(“\n”);
builder.append(“边框:1px纯黑;”)。append(“\n”);
append(“边框折叠:折叠;字体大小:13px!重要;”).append(“\n”);
builder.append(“}”).append(“\n”);
builder.append(“th,td{”).append(“\n”);
builder.append(“padding:10px;”)。append(“\n”);
builder.append(“}”).append(“\n”);
append(“表#alter tr:n子(偶数){”).append(“\n”);
builder.append(“背景色:#eee;”).append(“\n”);
builder.append(“}”).append(“\n”);
builder.append(“表#alter tr:nth child(奇数){”).append(“\n”);
builder.append(“背景色:#fff;”).append(“\n”);
builder.append(“}”).append(“\n”);
builder.append(“表#alter th{”).append(“\n”);
builder.append(“颜色:白色;”)。append(“\n”);
builder.append(“背景色:灰色;”)。append(“\n”);
builder.append(“}”).append(“\n”);
append(“表{margin bottom:50px;}”).append(“\n”);
append(“table tr.title{background:#5f9be3;color:#fff;font-weight:bold;padding:5px;width:100px;}”).append(“\n”);
append(“table tr.text{padding left:10px;}”).append(“\n”);
builder.append(“”)。append(“\n”);
builder.append(“”)。append(“\n”);
builder.append(“”)。append(“\n”);
//应用程序版本信息
builder.append(“项目版本:v4.4.0”).append(“\n”);
builder.append(“”)。append(“\n”);
//表格标题信息
builder.append(“发行总数:”).append(“\n”);
builder.append(“+tableData.get”(“TotalNumberOfIssues”)+”).append(“\n”);
builder.append(“阻止程序问题:”).append(“\n”);
builder.append(“+tableData.get”(“BlockerIssues”)+”).append(“\n”);
builder.append(“关键问题:”).append(“\n”);
builder.append(“+tableData.get”(“CriticalIssues”)+”).append(“\n”);
builder.append(“主要问题:”).append(“\n”);
builder.append(“+tableData.get”(“MajorIssues”)+”).append(“\n”);
builder.append(“次要问题:”).append(“\n”);
builder.append(“+tableData.get”(“MinorIssues”)+”).append(“\n”);
builder.append(“”)。append(“\n”);
//标题部分
builder.append(“文件名”);
附加(“严重性”);
建造商。附加(“状态”);
生成器。附加(“消息”);
builder.append(tableData.get(“tableData”)).append(“\n”);
builder.append(“”)。append(“\n”);
builder.append(“”)。append(“\n”);
builder.append(“”)。append(“\n”);
println(builder.toString());
关闭();
}
System.out.println(“已生成HTML报告