在 Jenkins 中通过邮件共享格式化报告

Sharing formatted reports over the mail in Jenkins

工作原理 - 我们目前正在使用 testng emailable format and allure 为当前测试执行生成格式化报告。这些在我们当地工作得很好。 /target/report 结构可以在图像中看到,分别为 allure(/site) 和 testng(/surefire) 报告描绘了 2 个不同的文件夹:


尝试 - 当我们尝试使用相同的步骤使用Jenkins实现CI时就像在我们本地一样,测试执行得很好,并且也生成了相应的报告。

使用 TestNG 插件 并指定模式 **/target/surefire-reports/testng-results.xml 可以很好地显示 testNG 结果图。

我还可以使用 Email ext 插件将 .html 报告附加到发送给指定附件字段详细信息的收件人的邮件中: **/target/surefire-reports/emailable-report.html, **/target/surefire-reports/index.html


什么不起作用 - 我们最终收到了带有 HTML 报告的电子邮件,但这些可能没有格式化因为所有链接到这些的 CSS 都被留下了。有办法克服这个问题吗?


注- 试过这些:

  1. 在附件中附加所有 .css 文件和 .html 文件,但是,一个是蛮力,第二个它仍然不起作用。

  2. 一种方法是 scp 将报告 (/target) 目录从 Jenkins 实例发送到另一台主机,并通过电子邮件通知共享该机器上的报告路径并获取格式化 报告共享。但是这需要额外的资源和对它的依赖,这是我们想要避免的。

  3. 在 post 执行此操作时,我看到一个 HTML publisher 插件似乎在做类似的事情。尝试安装并使用它。但我假设因为我们正在使用 Jenkins 2.6 并且插件注释显示为

Starting in versions 1.625.3 and 1.641, Jenkins restricted what kind of content could be displayed when serving static files. This can impact how HTML files archived using this plugin are displayed. See Configuring Content Security Policy for more information.

我们在 post 构建操作中没有获得 Publish HTML Reports 的选项。


我们非常欢迎任何建议,如果需要更多信息,请务必询问。

Edit :添加到上面的注释 2 中,我们设置中使用的 Jenkins 实例显然是 docker 从属使生成的报告或目标不持久。

以下是您可以考虑做的事情。

选项 1

  1. IExecutionListener 构建一个实现,其中您创建逻辑来基本上压缩所有您想要的报告并将其作为电子邮件发送。
  2. 在此侦听器中接线,应该小心。

PS :当前 IExecutionListener 的实现被调用 "before" 报告生成阶段。我已将此更改为 this 提交的一部分。因此,如果您想继续使用这种方法,那么您可能想等到 TestNG 发布新版本(应该在几天内发生)

选项 2

  • 构建一个包装器报告程序(实现 IReporter)并仅连接此报告程序。
  • 在此报告器中,您明确实例化了您希望在报告阶段被调用的所有报告器。请参阅下面的示例。
public class ChainedReporter implements IReporter {

    private List<IReporter> reporters = new ArrayList<>;

    public ChainedReporter() {
        reporters.add(new FooReporter() );//Here FooReporter is a custom reporter. Replace it with yours.
        reporters.add(new BarReporter() );//Here BarReporter is a custom reporter. Replace it with yours.
    }
    public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
        for (IReporter reporter : reporters) {
            reporter.generateReport(xmlSuites, suites, outputDirectory);
        }
        //By now we have ensured that all the reporting logic has been triggered and we have reports generated.
        zipReports(); //  This method would take care of creating zipped files of all the reports.
        emailReports(); // This emthod would take care of emailing the actual reports.

    }
}