/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ċ Ġ* Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ċ Ġ* Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe Ċ Ġ* ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN Ċ Ġ* ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , Ċ Ġ* ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . devops . process . engine . control Ċ Ċ import Ġcom . tencent . devops . common . event . dispatcher . pipeline . Pipeline EventDispatcher Ċ import Ġcom . tencent . devops . common . event . enums . ActionType Ċ import Ġcom . tencent . devops . common . event . pojo . pipeline . Pipeline Build Finish Broad Cast Event Ċ import Ġcom . tencent . devops . common . pipeline . Model Ċ import Ġcom . tencent . devops . common . pipeline . container . Trigger Container Ċ import Ġcom . tencent . devops . common . pipeline . container . VM Build Container Ċ import Ġcom . tencent . devops . common . pipeline . enums . Build Status Ċ import Ġcom . tencent . devops . common . pipeline . enums . Start Type Ċ import Ġcom . tencent . devops . common . pipeline . pojo . Build No Type Ċ import Ġcom . tencent . devops . common . redis . Redis Lock Ċ import Ġcom . tencent . devops . common . redis . Redis Operation Ċ import Ġcom . tencent . devops . process . engine . pojo . Build Info Ċ import Ġcom . tencent . devops . process . engine . pojo . Latest Running Build Ċ import Ġcom . tencent . devops . process . engine . pojo . event . Pipeline Build Atom Task Event Ċ import Ġcom . tencent . devops . process . engine . pojo . event . Pipeline Build Finish Event Ċ import Ġcom . tencent . devops . process . engine . pojo . event . Pipeline Build Start Event Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Build Detail Service Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Repository Service Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Runtime Service Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Service Ċ Ċ /** Ċ Ġ* Ġ æŀĦå»º æİ§åĪ¶åĻ¨ Ċ Ġ* Ġ@ version Ġ 1 . 0 Ċ Ġ*/ Ċ @ Service Ċ class ĠBuild End Control Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġpipeline EventDispatcher : ĠPipeline EventDispatcher , ĊĠĠĠ Ġprivate Ġval Ġredis Operation : ĠRedis Operation , ĊĠĠĠ Ġprivate Ġval Ġpipeline Repository Service : ĠPipeline Repository Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Runtime Service : ĠPipeline Runtime Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Build Detail Service : ĠPipeline Build Detail Service Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Build End Control :: class . java ) !! ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠEX PI RED _ SECONDS : ĠLong Ġ= Ġ 2 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle ( event : ĠPipeline Build Finish Event ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpipeline Id Ġ= Ġevent . pipeline Id ĊĠĠĠĠĠĠĠ Ġval ĠprojectId Ġ= Ġevent . projectId ĊĠĠĠĠĠĠĠ Ġval Ġbuild Id Ġ= Ġevent . build Id ĊĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ çĬ¶æĢģ è®¾ç½® æŃ£ç¡® ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġif Ġ( Build Status . is Finish ( event . status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . status ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Status . SU CCE ED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġredis Lock Ġ= ĠRedis Lock ( redis Operation , Ġ" process . pipeline . build . shutdown .$ build Id ", ĠEX PI RED _ SECONDS ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredis Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Info Ġ= Ġpipeline Runtime Service . get Build Info ( build Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå½ĵåīį æŀĦå»º æķ´ ä½ĵ çļĦ çĬ¶æĢģ ï¼Į åı¯èĥ½ æĺ¯ è¿Ĳè¡Į ä¸Ń ï¼Į ä¹Ł åı¯èĥ½ å·²ç»ı å¤±è´¥ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å·²ç»ı ç»ĵæĿŁ çļĦ æŀĦå»º ï¼Į ä¸į åĨį åıĹ çĲĨ ï¼Į æĬĽ å¼ĥ æ¶Īæģ¯ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( build Info Ġ== Ġnull Ġ|| ĠBuild Status . is Finish ( build Info . status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| REPEAT _ FIN ISH _ EVENT | event =$ event | Ġaband on !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ pipeline Id ]| Ġfinish Ġthe Ġbuild [$ build Id ] Ġevent Ġ(${ event . status }) ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeal Running Task ( build Id , Ġevent , ĠprojectId , Ġpipeline Id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġè®¾ç½® ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdone Build ( build Info , Ġstatus ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġèİ·åıĸ ä¸ĭ ä¸Ģä¸ª æİĴ éĺŁ çļĦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Build ( pipeline Id , ĠprojectId ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" [$ build Id ]| $ pipeline Id Ġbuild Ġfinish Ġfail : Ġ$ ignored ", Ġignored ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredis Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Build ( pipeline Id : ĠString , ĠprojectId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Queue Build Info Ġ= Ġpipeline Runtime Service . getNext Queue Build Info ( pipeline Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( next Queue Build Info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Start Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġjava Class . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġnext Queue Build Info . start User , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġnext Queue Build Info . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġnext Queue Build Info . first TaskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġnext Queue Build Info . status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAction Type . START ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdeal Running Task ( ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ Ġevent : ĠPipeline Build Finish Event , ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Build Task Ġ= Ġpipeline Runtime Service . getAll Build Task ( build Id ) ĊĊĠĠĠĠĠĠĠ Ġall Build Task . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ æīĢæľī è¿ĺ åľ¨ è¿Ĳè¡Į ä¸ŃçļĦ ä»»åĬ¡ åħ¨éĥ¨ ç»ĵæĿŁ æİī ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Status . isRunning ( it . status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æŀĦå»º æľº çĽ´æİ¥ ç»ĵæĿŁ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . container Type Ġ== ĠVM Build Container . class Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Runtime Service . update Task Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĠtaskId Ġ= Ġit . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġevent . userId , Ġbuild Status Ġ= ĠBuild Status . TERMIN ATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Atom Task Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġjava Class . simple Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , Ġpipeline Id Ġ= Ġpipeline Id , ĠuserId Ġ= Ġit . starter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġit . stage Id , Ġbuild Id Ġ= Ġit . build Id , Ġcontainer Id Ġ= Ġit . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Type Ġ= Ġit . container Type , ĠtaskId Ġ= Ġit . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Param Ġ= Ġit . task Params , Ġaction Type Ġ= ĠAction Type . TERMIN ATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdone Build ( build Info : ĠBuild Info , Ġstatus : ĠBuild Status ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlogger . info ("[ ${ build Info . build Id }] ĠThe Ġbuild (${ build Info . build Id }) Ġshutdown Ġwith Ġstatus ($ status )") ĊĊĠĠĠĠĠĠĠ Ġ// Ġ è®°å½ķ æľ¬ æµģ æ°´ çº¿ æľĢåĲİ ä¸Ģæ¬¡ æŀĦå»º çļĦ çĬ¶æĢģ ĊĠĠĠĠĠĠĠ Ġpipeline Runtime Service . finish Latest Running Build ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Running Build Ġ= ĠLatest Running Build ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġbuild Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Info . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġbuild Info . start User , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Count Ġ= Ġbuild Info . task Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Num Ġ= Ġbuild Info . build Num ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Build Status Ġ= Ġbuild Info . status ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( build Info . trigger Ġ== ĠStart Type . PIPELINE . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Pipeline Call ( build Info , Ġstatus ) Ġ// Ġ éĢļçŁ¥ çĪ¶ æµģ æ°´ çº¿ çĬ¶æĢģ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġpipeline Repository Service . getModel ( build Info . pipeline Id ) ĊĊĠĠĠĠĠĠĠ Ġset Build No ( build Info . pipeline Id , Ġmodel !! , Ġstatus ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġè®¾ç½® çĬ¶æĢģ ĊĠĠĠĠĠĠĠ Ġpipeline Build Detail Service . build End ( build Info . build Id , Ġstatus ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ å¹¿ æĴŃ ç»ĵæĿŁ äºĭä»¶ ĊĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Finish Broad Cast Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" build _ finish _${ build Info . build Id }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġbuild Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġbuild Info . start User , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Info . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġstatus . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Build No ( pipeline Id : ĠString , Ġmodel : ĠModel , Ġbuild Status : ĠBuild Status ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtrigger Container Ġ= Ġmodel . stages [ 0 ]. containers [ 0 ] Ġas ĠTrigger Container ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild No Ġ= Ġtrigger Container . build No Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild No Lock Ġ= ĠRedis Lock ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredis Operation , Ġ" process . pipeline . build no . update .$ pipeline Id ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEX PI RED _ SECONDS ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild No Lock . lock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Summary Ġ= Ġpipeline Runtime Service . get Build Summary Record ( pipeline Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( build Summary Ġ== Ġnull Ġ|| Ġbuild Summary . build No Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" The Ġpipeline [$ pipeline Id ] Ġdon 't Ġhas Ġthe Ġbuild Ġno ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild No Int Ġ= Ġcalculate ( build No . build No Type , Ġbuild Summary . build No , Ġbuild Status ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( build Summary . build No Ġ!= Ġbuild No Int ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Runtime Service . update Build No ( pipeline Id , Ġbuild No Int ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild No Lock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate ( build No Type : ĠBuild No Type , Ġcurrent Build No : ĠInt , Ġbuild Status : ĠBuild Status ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( build No Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild No Type . CON SIST ENT Ġ-> Ġcurrent Build No ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild No Type . SUCCESS _ BUILD _ INCREMENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Status . is Success ( build Status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Build No Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Build No ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild No Type . E VERY _ BUILD _ INCREMENT Ġ-> Ġcurrent Build No Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Pipeline Call ( build Info : ĠBuild Info , Ġbuild Status : ĠBuild Status ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġparent TaskId Ġ= Ġbuild Info . parent TaskId Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Build Task Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Runtime Service . get Build Task ( build Info . parent Build Id !! , Ġbuild Info . parent TaskId !! ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Build Task Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" The Ġparent Ġbuild (${ build Info . parent Build Id }) Ġtask (${ build Info . parent TaskId }) Ġnot Ġexist Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info ("[ ${ build Info . build Id }] | build Id =${ parent Build Task . build Id }| task =$ parent TaskId | status =$ build Status ") ĊĊĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Atom Task Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" sub _ pipeline _ build _${ build Info . build Id }", Ġ// ĠæĿ¥ æºĲ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġparent Build Task . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġparent Build Task . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġparent Build Task . starter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġparent Build Task . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġparent Build Task . stage Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġparent Build Task . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Type Ġ= Ġparent Build Task . container Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġparent Build Task . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Param Ġ= Ġparent Build Task . task Params , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAction Type . REFRESH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ