为什么你可能不使用静态分析(以及如何改变)


静态代码分析有助于实现一致性和避免错误。尽管它的好处得到了经验证据的支持,但要解开它们还需要做太多的工作。为什么?

  • 设置开销。通常,这包括在许多项目中更改构建脚本。更糟糕的是,这种开销是持续的,因为增加的内容需要维护。
  • 大量即时工作。当我们设置静态分析工具时,它们会立即punish us通过发现许多问题。当我们有其他事情要做时,这就创造了工作。
  • 如果你唯一的锤子打破了建筑,你要节约使用Traditionally,静态分析工具应用于构建管道。当静态分析可能会立即中断构建时,将静态分析添加到现有项目中是一个很大的阻碍。

My last post讨论了自动格式化。静态分析提供了另一个很好的例子。原子主义者可以通过以下方式使介绍变得无痛:

  • 一个始终如一的方法水平,避免重复和随时间漂移。
  • A棘轮效应方法,而不是立即屠杀,只有新的违规被标记。
  • 一个集成的用户界面,如松弛到表面问题,而不依赖于构建破损。

什么是棘轮效应?在最近的推特对话中,微服务名人菲尔·卡尔卡多made an interesting point关于检查现有项目。

我用来处理这个问题的方法有时被称为“棘轮效应”。假设第一次引入时解决一个问题(lint、测试覆盖率等)更容易,那么让您的预签入测试检查没有添加新的问题,但是不要破坏构建bc现有的问题

最初的红色浪潮消失了。我们专注于提高未来的质量。我们改变得越多,进步就越大。

使用检查样式和原子的棘轮

让我们使用Checkstyle,一种常见的Java工具。默认情况下,检查样式将标记一个许多所以消除遗留噪声是很重要的。

创建一个Checkstyle抑制文件是可能的,但是这需要大量的手工工作。此外,基线化是一个普遍的问题,所以最好独立于Checkstyle来处理它。

原子论者来拯救。

Atomist支持一致的团队范围策略。决定到底应该发生什么,然后为你所有的项目都这样做。

添加检查样式跨所有项目,我们使用代码检查 goal。这可以在每次分析项目状态时运行。它不会阻止或破坏构建。

const checkstyleReviewer = checkstyleReviewerRegistration({
    checkstylePath: `${process.cwd()}/bin/checkstyle-8.8-all.jar`,
});
const sendMessageToUsers: ReviewListenerRegistration = {
    name: "messager",
    listener: async rii => {
        return rii.addressChannels(`There are ${rii.review.comments.length} issues`);
    },
};
const inspectGoal = withLegacyFiltering(
    new AutoCodeInspection()
        .with(checkstyleReviewer)
        .withListener(sendMessageToUsers));


检查目标由审查者配置。在这种情况下,它包括现成的Checkstyle集成和监听器,它们可以路由结果审查输出。

我们可以通过推送规则将这个目标安排在任何Java项目上运行:

sdm.withPushRules(
    whenPushSatisfies(IsJava).setGoals(inspectGoal),
);


接下来,我们需要添加一个原子扩展包来执行遗留过滤(棘轮):

sdm.addExtensionPacks(legacyFiltering({inspectGoal, autofixGoal}));


基线

原子目标使用检查样式命令行来执行分析。这checkstyleReviewerRegistration原子论者的功能开箱即用Checkstyle extension pack

因为我们启用了“遗留过滤”,所以Atomist增加了额外的价值,使Checkstyle更容易采用。

当它第一次看到一个项目的推进时,检查目标将执行一个初步的分析作为基线。它使用Atomist的核心将分析结果保存在回购文件中autofix support。以下输出显示了第一次审查时发生的情况:

# spring-format-sdm Running Checkstyle on ... to establish baseline: file is .atomist/legacyIssues_Checkstyle.json


在随后的推送中,将再次执行Checkstyle,但基线违规将被忽略。但是,任何新的违规行为被报道。

在几分钟内将静态分析添加到所有项目中

您可以在本地或云中使用这个SDM,对所有的Java项目应用Checkstyle。简单地克隆https://github.com/atomist-blogs/spring-format-sdm,结帐checkstyle分支,npm安装并运行atomist start --local

在运行云时,您可以让它引发问题,并向Slack报告,如下所示:

进一步的可能性

这种方法允许基线化任何的静态分析工具,允许您在团队级别放下工具,而不会被眼前的额外工作压垮。如果它有一个应用编程接口或一个命令行,原子可以在每次推送时运行它。Atomist集成了现成的流行工具,并且使用them as a guide

在团队级别应用检查,而不是逐个修改项目,可以帮助您找到满足您需求的理想静态分析解决方案。这只是Atomist的团队范围策略使您的交付更加一致和敏捷的一种方式。