静态代码分析有助于实现一致性和避免错误。尽管它的好处得到了经验证据的支持,但要解开它们还需要做太多的工作。为什么?
My last post讨论了自动格式化。静态分析提供了另一个很好的例子。原子主义者可以通过以下方式使介绍变得无痛:
什么是棘轮效应?在最近的推特对话中,微服务名人菲尔·卡尔卡多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的团队范围策略使您的交付更加一致和敏捷的一种方式。