使用 email-ext 插件从 Jenkins 发送 Cppcheck 结果/报告

Posted

技术标签:

【中文标题】使用 email-ext 插件从 Jenkins 发送 Cppcheck 结果/报告【英文标题】:Sending Cppcheck result/report on email from Jenkins using email-ext plugin 【发布时间】:2012-12-15 01:03:55 【问题描述】:

我正在尝试使用来自 Jenkins 构建的 email-ext 插件发送关于电子邮件的 cppcheck 报告。到目前为止,唯一的方法似乎是创建一个自定义模板——果冻或 groovy。从这篇文章——“Can I configure jenkins to send an email with a static analysis report summary?”——看起来我应该能够实例化 CppcheckBuildAction 并使用它的方法,但由于某种原因,它似乎没有实例化(即对象为空)。这是我在果冻模板中放入的代码来检查这个:

<j:set var="cppcBuildAction" value="$it.getAction('com.thalesgroup.hudson.plugins.cppcheck.CppcheckBuildAction')"/>
<j:if test="$cppcBuildAction==null">
<p><i>cppcBuildAction is null!</i></p>
</j:if>

(我也试过 hudson.plugins.cppcheck.CppcheckBuildAction) 而且,果然,我在构建结果电子邮件中收到 cpppcBuildAction is null!。 (我必须在果冻上添加“if”子句来测试它,因为它不会抛出任何错误,否则。在 groovy 模板中,我实际上收到错误消息,如“异常:javax.script.ScriptException:java.lang .NullPointerException:如果我尝试在对象上调用 getResult 方法,则无法在空对象上获取属性 'getResult')。

有没有人尝试使用这个 email-ext 插件或其他方式通过电子邮件发送 Cppcheck 结果/报告?

顺便说一句,还有另一个帖子,其他人正在尝试做我想做的事情,但该线程似乎没有处于活动状态,或者那里没有真正的互动——“What's wrong with following jelly script template for cppcheck in email-ext plugin of hudson”

【问题讨论】:

使用这个 Groovy 代码进行调试 - %> 【参考方案1】:

你只是使用了错误的命名空间,正确的是:org.jenkinsci.plugins.cppcheck.CppcheckBuildAction。

您可以使用以下代码进行调试:

<j:forEach var="a" items="$build.getActions()">
action: $a.getClass().getName()
<BR/>
</j:forEach>

最后下面的代码对我有用:

<!-- CppCheck TEMPLATE -->

<j:set var="cppcheckAction" value="$it.getAction('org.jenkinsci.plugins.cppcheck.CppcheckBuildAction')" />
<j:if test="$cppcheckAction!=null">
    <j:set var="cppcheckResult" value="$cppcheckAction.getResult()" />
    <j:if test="$cppcheckResult!=null">
        <TABLE >
            <TR><TD class="bg1" colspan="2"><B>CPPCHECK RESULT</B></TD></TR>
            <TR bgcolor="white"><TD class="test_failed" colspan="2"><B><li><a href="$rooturl$build.urlcppcheckResult">Found: $cppcheckResult.report.getNumberTotal()</a></li></B></TD></TR>
        </TABLE>
        <BR/>
    </j:if>
</j:if>

享受吧!

【讨论】:

在哪里可以看到任何给定插件(即 cppcheck)可用的方法,以便我可以使用我需要的信息设置自己的模板?【参考方案2】:

我发现自己想做同样的事情:发送包含 cppcheck 分析结果的 email-ext 电子邮件。

这个果冻脚本与上面提供的 Sergey 一起工作,并制作了一个类似于结果页面中的表格。

希望这能在某个地方为某人节省一个小时。

<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define">
  <html>
    <j:set var="cppcheckAction" value="$it.getAction('org.jenkinsci.plugins.cppcheck.CppcheckBuildAction')" />
      <j:if test="$cppcheckAction!=null">
    <j:set var="cppcheckResult" value="$cppcheckAction.getResult()" />
    <j:if test="$cppcheckResult!=null">
      <h2>Summary</h2>
        <style type="text/css">
    #cppcheckStatistics  width: auto; 
    #cppcheckStatistics .number  text-align: right; 
        </style>
        <table class="pane sortable" id="cppcheckStatistics">
          <thead>
            <tr>
              <td class="pane-header">Severity</td>
              <td class="pane-header">Count</td>
              <td class="pane-header">Delta</td>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td class="pane">Error</td>
              <td class="pane number">$cppcheckResult.statistics.getNumberErrorSeverity()</td>
              <td class="pane number">$cppcheckResult.getDiff().getNumberErrorSeverity()</td>
            </tr>
            <tr>
              <td class="pane">Warning</td>
              <td class="pane number">$cppcheckResult.statistics.getNumberWarningSeverity()</td>
              <td class="pane number">$cppcheckResult.getDiff().getNumberWarningSeverity()</td>
            </tr>
            <tr>
              <td class="pane">Style</td>
              <td class="pane number">$cppcheckResult.statistics.getNumberStyleSeverity()</td>
              <td class="pane number">$cppcheckResult.getDiff().getNumberStyleSeverity()</td>
            </tr>
            <tr>
              <td class="pane">Performance</td>
              <td class="pane number">$cppcheckResult.statistics.getNumberPerformanceSeverity()</td>
              <td class="pane number">$cppcheckResult.getDiff().getNumberPerformanceSeverity()</td>
            </tr>
            <tr>
              <td class="pane">Portability</td>
              <td class="pane number">$cppcheckResult.statistics.getNumberPortabilitySeverity()</td>
              <td class="pane number">$cppcheckResult.getDiff().getNumberPortabilitySeverity()</td>
            </tr>
            <tr>
              <td class="pane">Information</td>
              <td class="pane number">$cppcheckResult.statistics.getNumberInformationSeverity()</td>
              <td class="pane number">$cppcheckResult.getDiff().getNumberInformationSeverity()</td>
            </tr>
            <tr>
              <td class="pane">No category</td>
              <td class="pane number">$cppcheckResult.statistics.getNumberNoCategorySeverity()</td>
              <td class="pane number">$cppcheckResult.getDiff().getNumberNoCategorySeverity()</td>
            </tr>
          </tbody>
          <tfoot>
            <tr class="sortbottom">
              <td class="pane-header">Total</td>
              <td class="pane-header number"><B><a href="$rooturl$build.urlcppcheckResult">$cppcheckResult.report.getNumberTotal()</a></B></td>
              <td class="pane-header number"><B><a href="$rooturl$build.urlcppcheckResult/source.all/?before=5&amp;after=5&amp;states=new">$cppcheckResult.getDiff().getNumberTotal()</a></B></td>
            </tr>
          </tfoot>
        </table>
      </j:if>
    </j:if>
  </html>
</j:jelly>

【讨论】:

您从哪里获得此代码文件?或者您是否创建了此代码? @user6521303 这段代码应该来自cppcheck jenkins插件源代码 我知道这是一篇旧帖子,但我正在尝试相同的方法(通过电子邮件发送 cppcheck 报告),我发现我想尝试这个模板,我刚刚在 $JENKINS_HOME\email-templates 创建了一个 file.template然后将这样的阶段添加到我的管道emailext( mimeType: 'text/html', body: '$SCRIPT, template="my_email.template"', subject: "[Jenkins] $jobName", to: "$mailRecipients"),但我没有收到模板,而是收到了字符串$SCRIPT, template="my_email.template" 对于 Jelly 模板,我认为您需要使用 $JELLY_SCRIPT,template="blah"。更多信息在这里:plugins.jenkins.io/email-ext 对不起,我只是复制粘贴错误我正在使用$JELLY_SCRIPT,template="blah",但如果使用您的模板,如果使用$JELLY_SCRIPT,template="html" 的默认模板或使用此处官方文档中的模板,我会收到一封空电子邮件@ 987654322@我收到了正确的电子邮件,有什么提示吗?

以上是关于使用 email-ext 插件从 Jenkins 发送 Cppcheck 结果/报告的主要内容,如果未能解决你的问题,请参考以下文章

使用 email-ext 替换 Jenkins 的默认邮件通知

如何在 Jenkins Email-Ext 中引用 groovy 脚本

如何使用 groovy 模板在 Jenkins 中发送电子邮件?

如何在 Jenkins 电子邮件中包含 git changelog?

如何从 Jenkins (Hudson) 卸载插件?

无法使用部署到容器插件从 jenkins 部署对 Tomcat 的战争