使用Jenkins、Perforce和Ant,如何仅在自上次绿色构建以来发生更改的文件上运行PMD



假设:

  • 似乎没有简单的方法可以在Jenkins中获得"更改"文件的列表(请参阅此处和此处)
  • 似乎没有快速的方法来获取自标签xxxx以来更改的文件列表

我该如何优化我们的构建,以便在运行PMD时,它只针对自上次绿色构建以来已修改的文件运行。

备份一点…我们的PMD对大约150万行代码运行需要3-4分钟,如果发现问题,报告总是在完成之前耗尽内存。我很想把我们的构建时间缩短几分钟,并得到一份关于失败的好报告。我最初的方法是:

  • 从Jenkins那里获取更改列表
  • 根据该列表和PMD_failures.txt的内容的并集运行PMD
  • 如果PMD失败,请在PMD_failures.txt中包含失败文件的列表

比我想要的更复杂,但值得拥有一个更快但仍然可靠的构建。

当我意识到詹金斯不会轻易给我想要的东西时,我意识到还有另一种可能的方法。我们为每一个绿色建筑贴上标签。我可以简单地获得自标签以来更改的文件列表,然后我可以完全取消pmd_failures.txt。

没有骰子。从Perforce获得自标签xxxx以来更改的文件列表的想法似乎从未从中得到简化

$p4文件//路径/到/分支/@label>label.out$p4文件//路径/到/分支/@now>now.out$diff label.out now.out

令人烦恼,但更重要的是,对于我们成千上万的文件来说,比简单地运行PMD还要慢。

因此,现在我正在考虑尝试将PMD与其他构建并行运行,这仍然会浪费时间和资源,并使我们的构建更加复杂。在我看来,我无法轻易地从Jenkins或Perforce那里获得更改文件的列表是愚蠢的。其他人找到了解决这些问题的合理方法吗?

我想我已经找到了答案,如果答案有效,我会将其标记为正确。

这比我想要的要复杂一些,但我认为节省3-4分钟(以及潜在的内存问题)是值得的。

  1. 在一个好的构建结束时,将好的变更列表保存为Perforce计数器。(生成后任务)。如下所示:
    $p4计数器last_green_trunk_cl%P_4_CHANGELIST%
  2. 运行PMD时,将计数器读取到属性last.green.cl中,并从以下位置获取文件列表:
    $p4文件//路径/到/my/branch/@${last.green.cl},现在//路径/to/my/branch/myfile.txt#123-编辑更改123456(文本)//路径/to/my/branch/meotherfile.txt#123-添加更改123457(文本)等(必须解析输出)
  3. 对这些文件运行PMD

这样,我们就不需要pmd_failures.txt,并且我们只对自上次绿色构建以来更改的文件运行pmd。

[EDIT:将其更改为使用p4计数器,这比签入文件快得多。此外,这非常成功,所以我将标记为已应答]

我不能100%确定,因为我从未将Perforce与Jenkins一起使用过,但我相信Perforce通过环境变量$P4_CHANGELIST传递变更列表编号。这样,您就可以运行p4 filelog -c $P4_CHANGELIST,它将为您提供特定变更列表中的文件。从那里开始,编写一些脚本来获取更改的文件(加上PMD中的旧故障)应该不难。

我已经很久没有使用Perforce了,但我相信-Ztag参数可以更容易地解析各种脚本语言的P4输出。

您想过使用自动标签吗?它们基本上只是变更列表编号的别名,因此更容易获得两个自动标签之间不同的文件集。

相关内容

  • 没有找到相关文章

最新更新