package Ġorg . gradle . gradle build . build quality Ċ Ċ import Ġme . champ e au . gradle . j ap icmp . J ap icmp Task Ċ import Ġorg . gradle . api . Gradle Exception Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . Task Ċ import Ġorg . gradle . api . internal . tasks . testing . junit . result . TestResult Serializer Ċ import Ġorg . gradle . api . reporting . Reporting Ċ import Ġorg . gradle . api . tasks . testing . Test Ċ import Ġorg . gradle . gradle build . Build Environment Ċ import Ġorg . gradle . gradle build . build quality . class ycle . Class ycle Ċ import Ġorg . gradle . gradle build . docs . Find Broken Internal Links Ċ import Ġorg . gradle . gradle build . test . integration tests . Distribution Test Ċ import Ġorg . gradle . gradle build . testing . integration tests . cleanup . Test File Clean Up Extension Ċ import Ġorg . gradle . gradle build . testing . integration tests . cleanup . When NotEmpty Ċ import Ġorg . gradle . kotlin . dsl . get Ċ import Ġorg . gradle . kotlin . dsl . create Ċ import Ġorg . gradle . kotlin . dsl . with Gro ovy Builder Ċ import Ġorg . gradle . plugin . devel . tasks . Validate Plugins Ċ import Ġorg . gradle . testing . Distributed Performance Test Ċ import Ġjava . io . File ĊĊ Ċ /** Ċ Ġ* ĠWhen Ġrun Ġfrom Ġa ĠContinuous ĠIntegration Ġenvironment , Ġwe Ġonly Ġwant Ġto Ġarchive Ġa Ġsubset Ġof Ġreports , Ġmostly Ġfor Ċ Ġ* Ġfailing Ġtasks Ġonly , Ġto Ġnot Ġuse Ġup Ġunnecessary Ġdisk Ġspace Ġon ĠTeam ĠCity . ĠThis Ġalso Ġimproves Ġthe Ġperformance Ġof Ċ Ġ* Ġartifact Ġpublishing Ġby Ġreducing Ġthe Ġartifacts Ġand Ġpackaging Ġreports Ġthat Ġconsist Ġof Ġmultiple Ġfiles . Ċ Ġ* Ċ Ġ* ĠRed uc ing Ġthe Ġnumber Ġof Ġreports Ġalso Ġmakes Ġit Ġeasier Ġto Ġfind Ġthe Ġimportant Ġones Ġwhen Ġan alys ing Ġa Ġfailed Ġbuild Ġin Ċ Ġ* ĠTeam ĠCity . Ċ Ġ*/ Ċ open Ġclass ĠCi Reporting Plugin Ġ: ĠPlugin < Project > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ): ĠUnit Ġ= Ġproject . run Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġthe Ġtest Files Cleanup Ġpolicy Ġin Ġeach Ġsub project 's Ġbuild Ġscript ĊĠĠĠĠĠĠĠ Ġsub projects . forEach Ġ{ Ġit . extensions . create < Test File Clean Up Extension >(" test Files Cleanup ", Ġobjects ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build Environment . is Ci Server ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgradle . build Finished Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfailed Tasks Ġ= Ġproject . failed Tasks () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecuted Tasks Ġ= Ġproject . executed Tasks () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Test Files Ġ= Ġproject . sub projects . flatMap Ġ{ Ġit . tmp Test Files () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Reports For Ci Publishing ( failed Tasks , Ġexecuted Tasks , Ġtmp Test Files ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . clean Up ( tmp Test Files . map Ġ{ Ġit . first Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . verify Test Files Cleanup ( failed Tasks , Ġtmp Test Files ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAfter Ġarch iving Ġthe Ġtest Ġfiles , Ġdo Ġa Ġcleanup Ġto Ġget Ġrid Ġof ĠTeam City Ġ" XX Ġpublished Ġa Ġlot Ġof Ġsmall Ġartifacts " Ġwarning ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠProject . clean Up ( files To Clean Up : ĠList < File >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete ( files To Clean Up ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠProject . get Clean Up Policy ( child ProjectName : ĠString ) Ġ= Ġchild Projects [ child ProjectName ]?. extensions ?. getBy Type ( Test File Clean Up Extension :: class . java )?. policy ?. get () ĊĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠProject . verify Test Files Cleanup ( failed Tasks : ĠList < Task >, Ġtmp Test Files : ĠList < Pair < File , ĠString >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( failed Tasks . any Ġ{ Ġit Ġis ĠTest Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Files To Fail Ġ= Ġtmp Test Files . filter Ġ{ Ġget Clean Up Policy ( it . second ) Ġ!= ĠWhen NotEmpty . REPORT Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtest Files To Report Ġ= Ġtmp Test Files . filter Ġ{ Ġget Clean Up Policy ( it . second ) Ġ== ĠWhen NotEmpty . REPORT Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( test Files To Report . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Found Ġnon - empty Ġtest Ġfiles Ġdir :\ n ${ test Files To Report . join ToString ("\ n ") Ġ{ Ġit . first . absolute Path Ġ}} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( test Files To Fail . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠGradle Exception (" Found Ġnon - empty Ġtest Ġfiles Ġdir :\ n ${ tmp Test Files . join ToString ("\ n ") Ġ{ Ġit . first . absolute Path Ġ}} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠProject . prepare Reports For Ci Publishing ( failed Tasks : ĠList < Task >, Ġexecuted Tasks : ĠList < Task >, Ġtmp Test Files : ĠList < Pair < File , ĠString >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfailed Task Custom Reports Ġ= Ġfailed Tasks . flatMap Ġ{ Ġit . failed Task Generic Html Reports () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġattached Reports Ġ= Ġexecuted Tasks . flatMap Ġ{ Ġit . attached Report Locations () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexecuted Task Custom Reports Ġ= Ġfailed Tasks . flatMap Ġ{ Ġit . failed Task Custom Reports () Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġall Reports Ġ= Ġfailed Task Custom Reports Ġ+ Ġattached Reports Ġ+ Ġexecuted Task Custom Reports Ġ+ Ġtmp Test Files ĊĠĠĠĠĠĠĠ Ġall Reports . distinct By Ġ{ Ġ( report , Ġ_) Ġ-> Ġreport Ġ}. forEach Ġ{ Ġ( report , ĠprojectName ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Report For Ci Publishing ( report , ĠprojectName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠProject . tmp Test Files () Ġ= ĊĠĠĠĠĠĠĠ ĠFile ( build Dir , Ġ" tmp / test Ġfiles "). list Files ()?. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnon Empty Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . file Tree ( it ). visit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Empty Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnon Empty ĊĠĠĠĠĠĠĠ Ġ} ?. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġname ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġempty List () ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠProject . executed Tasks () Ġ= Ġgradle . task Graph . all Tasks . filter Ġ{ Ġit . state . executed Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠProject . failed Tasks () Ġ= Ġgradle . task Graph . all Tasks . filter Ġ{ Ġit . state . failure Ġ!= Ġnull Ġ|| Ġit . contains Failed Test () Ġ} ĊĊĠĠĠ Ġ// ĠWe Ġcount Ġthe Ġtest Ġtask Ġcontaining Ġflaky Ġresult Ġas Ġfailed ĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠTask . contains Failed Test (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ! is ĠTest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcontaining Failures Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= ĠTest Result Serializer ( binary Results Directory . get (). as File ) ĊĠĠĠĠĠĠĠ Ġif Ġ( serializer . is Has Results ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer . read Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( failures Count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Failures Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontaining Failures ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠTask . failed Task Generic Html Reports () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠReporting < *> Ġ-> ĠlistOf ( this . reports [" html "]. destination Ġto Ġproject . name ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠTask . failed Task Custom Reports () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠValidate Plugins Ġ-> ĠlistOf ( outputFile . get (). as File Ġto Ġproject . name ) ĊĠĠĠĠĠĠĠ Ġis ĠClass ycle Ġ-> ĠlistOf ( report File Ġto Ġproject . name ) ĊĠĠĠĠĠĠĠ Ġis ĠFind Broken Internal Links Ġ-> ĠlistOf ( report File . get (). as File Ġto Ġproject . name ) ĊĠĠĠĠĠĠĠ Ġis ĠDistribution Test Ġ-> ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgradle Installation For Test . gradle User Home Dir . dir (" worker - 1 / test - kit - daemon "). get (). as File Ġto Ġ" all - logs ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgradle Installation For Test . gradle User Home Dir . dir (" worker - 1 / kotlin - compiler - daemon "). get (). as File Ġto Ġ" all - logs ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgradle Installation For Test . daemon Registry . get (). as File Ġto Ġ" all - logs " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠTask . attached Report Locations () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠJ ap icmp Task Ġ-> ĠlistOf ( rich Report . destination Dir . resolve ( rich Report . report Name ) Ġto Ġproject . name ) ĊĠĠĠĠĠĠĠ Ġis ĠDistributed Performance Test Ġ-> ĠlistOf ( report Dir . parent File Ġto Ġproject . name ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate ĊĠĠĠ Ġfun ĠProject . prepare Report For Ci Publishing ( report : ĠFile , ĠprojectName : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( report . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest File Ġ= Ġroot Project . layout . build Directory . file (" report -$ projectName -${ report . name }. zip "). get (). as File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġant . with Gro ovy Builder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" zip " (" dest File " Ġto Ġdest File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" file set " (" dir " Ġto Ġreport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinto ( root Project . build Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrename Ġ{ Ġ" report -$ projectName -${ report . parent File . name }-${ report . name }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ