在 Jenkins Violations 插件中单击 FxCop 会导致空白页面

Posted

技术标签:

【中文标题】在 Jenkins Violations 插件中单击 FxCop 会导致空白页面【英文标题】:Clicking on FxCop results in Jenkins Violations plugin leads to blank page 【发布时间】:2013-04-09 14:47:55 【问题描述】:

我有一份 Jenkins 工作,我在其中指定类似于以下 FxCop 命令的内容:

FxCopCmd.exe"/file:"test.dll" /out:"FxCop_Output.xml" /ignoregeneratedcode /project:"C:\Jenkins\extra\Modified_Rules.FxCop" /s /searchgac

运行 Jenkins 作业时,它会发现许多代码违规,并显示一个图表以及文件名列表以及文件中的违规数量。但是,如果我单击非 C-Sharp 文件,我会转到一个带有红色三角形感叹号的页面,但是没有显示代码,也没有 FxCop 错误列表。

http://i.stack.imgur.com/VNKF6.jpg

我是否缺少某种 FxCop 配置?如何让 Violations 插件显示这些文件的代码违规?

【问题讨论】:

您是否在“源路径模式”中提供了源文件的路径?它位于项目配置中 Violations 插件设置的末尾。 应该在原始问题中包含该信息。我现在使用 Violations 插件版本 0.7.15 运行 Jenkins 1.514。 【参考方案1】:

我最终下载并修改了 Violations 插件代码以显示没有源代码的文件的违规表,然后重新编译 Violations 插件(并将修改后的插件手动加载到 Jenkins 中)。

文件名也没有显示,正如你在我的原始屏幕截图中看到的那样,“getFileNameAlt”函数只是正确地获取了名称,下面的果冻脚本中的“File: $it.fileNameAlt”行显示了它(请参阅下面的屏幕截图链接)。

我将以下内容添加到 ~\violations\src\main\java\hudson\plugins\violations\render\FileModelProxy.java 以呈现表格:

public String getFileNameAlt() 
    return new File(fileModel.getDisplayName()).getName();


public String getSummaryTable() 

    StringBuilder gst = new StringBuilder();
    int count = 0;

    gst.append(" <table class='violations' width='100%'>\n");
    gst.append("   <tr>\n");
    gst.append("     <td class='violations-header'> # </td>\n");
    gst.append("     <td class='violations-header'> Type </td>\n");
    gst.append("     <td class='violations-header'> Class</td>\n");
    gst.append("     <td class='violations-header'> Message</td>\n");
    gst.append("     <td class='violations-header'> Description</td>\n");
    gst.append("   </tr>\n");

    Set<Violation> violations = fileModel.getLineViolationMap().get(0);

    for (Violation v: violations) 
        ++count;
        gst.append("   <tr>\n");
        gst.append("     <td class='violations'>");
        gst.append(count);
        gst.append("</td>\n");
        gst.append("     <td class='violations'>");
        gst.append(v.getType());
        gst.append("</td>\n");
        gst.append("     <td class='violations'>");
        gst.append(v.getSource());
        gst.append("</td>\n");
        gst.append("     <td class='violations'>");
        gst.append(v.getMessage());
        gst.append("</td>\n");
        gst.append("     <td class='violations'>");
        gst.append(v.getPopupMessage());
        gst.append("</td>\n");
        gst.append("   </tr>\n");
    
    //
    gst.append(" </table>\n");
    gst.append("<p><br>\n");
    gst.append("<h3>Total Number of violations:  \n");
    gst.append(count);
    gst.append("</h3><p>\n");
    return gst.toString();

然后更新了 ~\violations\target\classes\hudson\plugins\violations\render\FileModelProxy\index.jelly 文件,将其添加到将在源代码中显示违规的代码上方(这对我有用),就是下面的“”总结行:

<j:set
  var="iconDir"
  value="$rootURL/plugin/violations/images/16x16"/>

<j:set var="href" value="$it.showLines"/>
<h1><img src="$image"/> File: $it.fileNameAlt</h1>

<j:out value="$it.summaryTable"/>

<j:forEach var="t" items="$model.typeMap.entrySet()">
  <table class="pane">
    <tbody>
      <tr><td class="pane-header" colspan="5"><j:out value="$it.typeLine(t.key)"/></td></tr>
      <j:forEach var="v" items="$t.value">
        <tr>
          <td class="pane">
            <j:if test="$href">
              <a href="#line$v.line">$v.line</a>
            </j:if>
            <j:if test="$!href">
              $v.line
            </j:if>
          </td>
          <!--<td class="pane">$v.source</td> -->
          <td class="pane"><j:out value="$it.severityColumn(v)"/></td>
          <td class="pane" >$v.message</td>
        </tr>
      </j:forEach>
    </tbody>
  </table>
  <p></p>
</j:forEach>

最后我玩了一下 style.css 文件,添加了一个名为“violations”的表格样式定义(~\violations\target\violations\css\style.css):

.violations  
  margin-top: 4px;

.violations td 
  padding: 4px 4px 3px 4px;


table.violations 
  width: 100%;
  border-collapse: collapse;
  border: 1px #bbb solid;

table.violations > tbody > tr > td:last-child 
  border-right: 1px #bbb solid;


td.violations 
  border: 1px #bbb solid;
  padding: 3px 4px 3px 4px;
  vertical-align: middle;


td.violations-header 
  border: 1px #bbb solid;
  border-right: none;
  border-left: none;
  background-color: #f0f0f0;
  font-weight: bold;


th.violations 
  border: 1px #bbb solid;
  font-weight: bold;

下图显示了没有源代码的文件的结果表。在我的情况下,文件不以“.cs”结尾

http://i.stack.imgur.com/StChP.jpg

【讨论】:

我听从了您的建议并修复了插件。它的一个版本可以在这里下载:github.com/MoJo2600/violations-plugin/releases 能否以类似的方式解决 StyleCop 的问题? @MoJo2600 如何使用你创建的插件。请帮忙 @MoJo2600 你能更新 Jenkins 的插件,以便人们可以使用更新的版本吗?【参考方案2】:

我想您可能会看到this violations plugin issue(在 Jenkins JIRA 中报告)。显示 StyleCop 结果也存在类似问题。您能否确认您的 Jenkins 和 Violation 插件版本?

【讨论】:

以上是关于在 Jenkins Violations 插件中单击 FxCop 会导致空白页面的主要内容,如果未能解决你的问题,请参考以下文章

TeamCity - MSBuild 代码分析

jenkins 安装插件出现问题怎么解决

Jenkins插件开发

jenkins 安装插件出现问题怎么解决

Jenkins系列-Jenkins插件备份

Jenkins - 插件管理