/* Ċ Ġ* Ġ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 . api . pojo . ErrorType Ċ 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 . event . pojo . pipeline . Pipeline Build Status Broad Cast Event Ċ import Ġcom . tencent . devops . common . pipeline . container . VM Build Container Ċ import Ġcom . tencent . devops . common . pipeline . enums . Build Status Ċ import Ġcom . tencent . devops . common . redis . Redis Operation Ċ import Ġcom . tencent . devops . process . engine . control . lock . Build Id Lock Ċ import Ġcom . tencent . devops . process . engine . control . lock . Pipeline Build Start Lock Ċ 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 . Pipeline Build Task Ċ 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 Build Service Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Runtime Ext 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 Build Service : ĠPipeline Build Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Runtime Service : ĠPipeline Runtime Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Build Detail Service : ĠPipeline Build Detail Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Runtime Ext Service : ĠPipeline Runtime Ext Service Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( java Class ) !! ĊĊĠĠĠ Ġfun Ġhandle ( event : ĠPipeline Build Finish Event ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwith ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Id Lock Ġ= ĠBuild Id Lock ( redis Operation , Ġbuild Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" [$ build Id ]| BUILD _ FIN ISH _ ERR |$ pipeline Id Ġbuild Ġfinish Ġfail : Ġ$ e ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Start Lock Ġ= ĠPipeline Build Start Lock ( redis Operation , Ġpipeline Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Start Lock . lock () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Next Build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Start Lock . unlock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPipeline Build Finish Event . finish () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġå°Ĩ çĬ¶æĢģ è®¾ç½® æŃ£ç¡® ĊĠĠĠĠĠĠĠ Ġval Ġbuild Status Ġ= Ġif Ġ( Build Status . is Finish ( status ) Ġ|| Ġstatus . name Ġ== ĠBuild Status . STAGE _ SUCCESS . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Status . SU CCE ED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ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 ]| BUILD _ FIN ISH _ REPEAT _ FIN ISH _ EVENT | STATUS =${ build Info ?. status }| Ġaband on !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ pipeline Id ]| BUILD _ FIN ISH | Ġfinish Ġthe Ġbuild [$ build Id ] Ġevent Ġ($ status )") ĊĊĠĠĠĠĠĠĠ Ġfix Task ( build Info , Ġbuild Status ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ è®°å½ķ æľ¬ æµģ æ°´ çº¿ æľĢåĲİ ä¸Ģæ¬¡ æŀĦå»º çļĦ çĬ¶æĢģ ĊĠĠĠĠĠĠĠ Ġpipeline Runtime Service . finish Latest Running Build ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlatest Running Build Ġ= ĠLatest Running Build ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , Ġpipeline Id Ġ= Ġpipeline Id , Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġbuild Info . start User , Ġstatus Ġ= Ġbuild Status , Ġtask Count Ġ= Ġbuild Info . task Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Num Ġ= Ġbuild Info . build Num ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Build Status Ġ= Ġbuild Info . status , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġbuild Info . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġbuild Info . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg Ġ= Ġbuild Info . error Msg ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġè®¾ç½® çĬ¶æĢģ ĊĠĠĠĠĠĠĠ Ġpipeline Build Detail Service . build End ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġbuild Status , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġbuild Info . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġbuild Info . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg Ġ= Ġbuild Info . error Msg ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ å¹¿ æĴŃ ç»ĵæĿŁ äºĭä»¶ ĊĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Finish Broad Cast Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" build _ finish _$ build Id ", ĠprojectId Ġ= ĠprojectId , Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= ĠuserId , Ġbuild Id Ġ= Ġbuild Id , Ġstatus Ġ= Ġbuild Status . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= Ġbuild Info . startTime , ĠendTime Ġ= Ġbuild Info . endTime , Ġtrigger Type Ġ= Ġbuild Info . trigger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġif Ġ( build Info . error Type Ġ== Ġnull ) Ġnull Ġelse Ġbuild Info . error Type !!. name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġbuild Info . errorCode , Ġerror Msg Ġ= Ġbuild Info . error Msg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Status Broad Cast Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġsource , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAction Type . END ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPipeline Build Finish Event . fix Task ( build Info : ĠBuild Info , Ġbuild Status : ĠBuild Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ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 Ġ= ĠuserId , Ġbuild Status Ġ= ĠBuild Status . TERMIN ATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġerror Type , ĠerrorCode Ġ= ĠerrorCode , Ġerror Msg Ġ= Ġerror Msg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ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 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ æĺ¯ åıĸæ¶Ī çļĦ æŀĦå»º ï¼Į åĪĻ ä¼ļ ç»Łä¸Ģ åıĸæ¶Ī åŃĲ æµģ æ°´ çº¿ çļĦ æŀĦå»º ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Status . is Cancel ( build Status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterminate Sub Pipeline ( build Info . build Id , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ä¼ĺåħĪ ä¿ĿåŃĺ SYSTEM éĶĻè¯¯ ï¼Į èĭ¥ æĹł SYSTEM éĶĻè¯¯ ï¼Į å°Ĩ Build Data ä¸Ń éĶĻè¯¯ ä¿¡æģ¯ æĽ´æĸ° ä¸º ç¼ĸ æİĴ é¡ºåºı çļĦ æľĢåĲİ ä¸Ģä¸ª Element éĶĻè¯¯ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . error Type Ġ!= Ġnull Ġ&& Ġbuild Info . error Type Ġ!= ĠError Type . SYSTEM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Info . error Type Ġ= Ġit . error Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Info . errorCode Ġ= Ġit . errorCode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Info . error Msg Ġ= Ġit . error Msg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġterminate Sub Pipeline ( build Id : ĠString , Ġbuild Task : ĠPipeline Build Task ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! build Task . sub Build Id . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Build Info Ġ= Ġpipeline Runtime Service . get Build Info ( build Task . sub Build Id !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sub Build Info Ġ!= Ġnull Ġ&& Ġ! Build Status . is Finish ( sub Build Info . status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Build Service . build Manual Shutdown ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġsub Build Info . start User , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġsub Build Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġsub Build Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġsub Build Info . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Code Ġ= Ġsub Build Info . channel Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Permission Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" [$ build Id ]| Terminate Sub Pipeline | sub Build Id =${ sub Build Info . build Id }| e =$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠPipeline Build Finish Event . pop Next Build () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġèİ·åıĸ ä¸ĭ ä¸Ģä¸ª æİĴ éĺŁ çļĦ ĊĠĠĠĠĠĠĠ Ġval Ġnext Queue Build Info Ġ= Ġpipeline Runtime Ext Service . pop Next Queue Build Info ( projectId Ġ= ĠprojectId , Ġpipeline Id Ġ= Ġpipeline Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( next Queue Build Info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| FETCH _ QUEUE |$ pipeline Id Ġno Ġqueue Ġbuild !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| FETCH _ QUEUE | next Ġbuild : Ġ${ next Queue Build Info . build Id } Ġ${ next Queue Build Info . status }") ĊĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Start Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" build _ finish _$ build Id ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġnext Queue Build Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġnext Queue Build Info . 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 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ