/* Ċ Ġ* Ġ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 . atom . vm Ċ Ċ import Ġcom . tencent . devops . common . api . util . Json Util Ċ import Ġcom . tencent . devops . common . event . dispatcher . pipeline . Pipeline EventDispatcher Ċ import Ġcom . tencent . devops . common . log . utils . Build Log Printer Ċ import Ġcom . tencent . devops . common . pipeline . container . VM Build Container Ċ import Ġcom . tencent . devops . common . pipeline . enums . Build Status Ċ import Ġcom . tencent . devops . process . engine . atom . Atom Response Ċ import Ġcom . tencent . devops . process . engine . atom . I Atom Task Ċ import Ġcom . tencent . devops . process . engine . atom . default Fail Atom Response Ċ import Ġcom . tencent . devops . process . engine . control . Building Heart Beat Utils Ċ import Ġcom . tencent . devops . process . engine . pojo . Pipeline Build Task Ċ import Ġcom . tencent . devops . process . pojo . mq . Pipeline Agent Shutdown Event Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . beans . factory . config . Configurable BeanFactory Ċ import Ġorg . springframework . context . annotation . Scope Ċ import Ġorg . springframework . stereotype . Component Ċ Ċ @ Component Ċ @ Scope ( Configurable BeanFactory . SCOPE _ PRO TOT YPE ) Ċ class ĠDispatch VM Shutdown Task Atom Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġbuild Log Printer : ĠBuild Log Printer , ĊĠĠĠ Ġprivate Ġval Ġpipeline EventDispatcher : ĠPipeline EventDispatcher , ĊĠĠĠ Ġprivate Ġval Ġbuilding Heart Beat Utils : ĠBuilding Heart Beat Utils Ċ ) Ġ: ĠI Atom Task < VM Build Container > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Param Element ( task : ĠPipeline Build Task ): ĠVM Build Container Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJson Util . map To ( task . task Params , ĠVM Build Container :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Dispatch VM Shutdown Task Atom :: class . java ) ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( ĊĠĠĠĠĠĠĠ Ġtask : ĠPipeline Build Task , ĊĠĠĠĠĠĠĠ Ġparam : ĠVM Build Container , ĊĠĠĠĠĠĠĠ Ġrun Variables : ĠMap < String , ĠString > ĊĠĠĠ Ġ): ĠAtom Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvm Seq Id Ġ= Ġtask . container Id ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild Id Ġ= Ġtask . build Id ĊĊĠĠĠĠĠĠĠ Ġval ĠprojectId Ġ= Ġtask . projectId ĊĊĠĠĠĠĠĠĠ Ġval Ġpipeline Id Ġ= Ġtask . pipeline Id ĊĊĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Agent Shutdown Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" shutdown VM Task Atom ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġtask . starter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm Seq Id Ġ= Ġvm Seq Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Result Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute Key Suffix Ġ= Ġparam . dispatch Type ?. route Key Suffix ?. route Key Suffix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġtask . execute Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġ åĲĮæŃ¥ Job æī§è¡Į çĬ¶æĢģ ĊĠĠĠĠĠĠĠ Ġbuild Log Printer . stop Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġtask . container Hash Id Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġtask . container Hash Id Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġtask . execute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġissues _ 5 5 3 0 Ġstop æĹ¶ åħ³éĹŃ å¿ĥ è·³ ĊĠĠĠĠĠĠĠ Ġbuilding Heart Beat Utils . drop Heartbeat ( build Id Ġ= Ġbuild Id , Ġvm Seq Id Ġ= Ġvm Seq Id , Ġexecute Count Ġ= Ġtask . execute Count ) ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| SHUT DOWN _ VM | stage Id =${ task . stage Id }| container =${ task . container Id }| vm Seq Id =$ vm Seq Id ") ĊĠĠĠĠĠĠĠ Ġreturn ĠAtom Response ( Build Status . SU CCE ED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtry Finish ( ĊĠĠĠĠĠĠĠ Ġtask : ĠPipeline Build Task , ĊĠĠĠĠĠĠĠ Ġparam : ĠVM Build Container , ĊĠĠĠĠĠĠĠ Ġrun Variables : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġforce : ĠBoolean ĊĠĠĠ Ġ): ĠAtom Response Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( force ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . status . is Finish ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAtom Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġtask . status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġtask . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġtask . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg Ġ= Ġtask . error Msg ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġ å¼º åĪ¶ ç»Ī æŃ¢ çļĦ è®¾ç½®ä¸º å¤±è´¥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ("[ ${ task . build Id }] |[ FORCE _ STOP _ IN _ SHUT DOWN _ TASK ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Agent Shutdown Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" force _ stop _ shutdown VM ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġtask . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġtask . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġtask . starter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġtask . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm Seq Id Ġ= Ġtask . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Result Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute Key Suffix Ġ= Ġparam . dispatch Type ?. route Key Suffix ?. route Key Suffix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġtask . execute Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Fail Atom Response ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAtom Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġtask . status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġtask . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġtask . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg Ġ= Ġtask . error Msg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ