增量测试:在单一回购的配置项上节省时间和资金

2020-05-06 10:49:15

是否使用单一回购是一个永恒的争论。每种方式都有其利弊。假设您决定使用monorepo,随着时间的推移,您将面临的一个主要问题是测试速度慢。想象一下一个Monorepo,由一个Android应用程序、一个iOS应用程序、一些后端代码和一些Web前端代码组成。只有在极少数情况下,有人会同时修改其中的一个以上。

此外,大多数受限于其目录的项目也将使用不同的构建系统,例如,用于Android的Gradle、用于Javascript的YAR/npm、用于后端的go/rust/java/npm。总的构建时间和测试时间只会随着时间的推移而增长。对代码库的部分进行小的修改会让开发人员感到恼火。这就大大减慢了发展速度。

在我之前的工作中,我最终编写了增量测试代码的初级版本。论文的主题是,我们有一组目录,大多数目录彼此无关,也有一些目录相互依赖。只要我们找到一个良好的目录依赖关系树,脚本就会检查Pull请求中是否有文件修改了这些依赖关系中的任何一个;如果是,测试将继续,如果没有,则跳过。我们可以构建增量测试,并减少大量无关的构建。我们的目标不是消除所有无关的构建,而是将最大的违规者降到最低。仅凭这一点,测试就变得更容易管理了。我们通过减少预留的Circle CI实例数量节省了资金,并且提高了开发速度(在像我们这样的单库中,您可以预期测试时间快5-10倍)。

代码是开源的,所以我可以在这里很容易地引用它。我们使用了Circle CI,但是该方法非常通用,也可以在任何其他构建系统上使用。

#用法:CI_CHECK_IF_TEST_SHOW_RUN_v2.sh<;要检查的路径的逗号分隔列表>;DIRS_TO_CHECK=${1}CHANGED=$(node-r ts-node/register../../scripts/check_if_test_shout_run_v2.ts--dirs${DIRS_TO_CHECK})CD-如果[$CHANGED=FALSE];则ECHO";在${1}中没有更改-跳过测试"。#https://discuss.circleci.com/t/ability-to-return-successfully-from-a-job-before-completing-all-the-next-steps/12969/6 Cireci Step停止0出口FI ECHO";$发生变化,不应跳过测试";

在这里可以看到检查出基本分支上的这个拉请求的补丁端的完整脚本。最关键的方法是,

异步函数checkIfTestShouldRun(){const currentBranch:string=await getCurrentBranch()const isCriticalBranch:boolean=isStagingBranch(CurrentBranch)||isProductionBranch(CurrentBranch)||isMasterBranch(CurrentBranch)If(IsCriticalBranch){logMessage(';We is on Staging or Production Branch';)console.info(';true&#。)process.exit(1)}for(分支提交的常量提交){logMessage(`\n检查提交${Commit}.`)常量路径:string[]=dirs.Concat([';../../ya n.lock';])const anyPathsChanged:boolean=等待checkIfAnyPathsChangedInCommit(Commit,Path)if(AnyPathsChanged){console.info(';true&