/* Ċ Ġ* Ġ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 . service Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . tencent . devops . common . api . exception . Remote ServiceException Ċ import Ġcom . tencent . devops . common . api . pojo . ErrorType Ċ import Ġcom . tencent . devops . common . api . util . Json Util Ċ import Ġcom . tencent . devops . common . api . util . Object Replace Env Var Util Ċ import Ġcom . tencent . devops . common . api . util . Ok http Utils Ċ import Ġcom . tencent . devops . common . api . util . timestamp milli Ċ import Ġcom . tencent . devops . common . client . Client Ċ 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 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 . pipeline . enums . Build Task Status Ċ import Ġcom . tencent . devops . common . pipeline . pojo . element . Run Condition Ċ import Ġcom . tencent . devops . common . pipeline . utils . Heart Beat Utils Ċ import Ġcom . tencent . devops . common . redis . Redis Operation Ċ import Ġcom . tencent . devops . log . utils . Log Utils Ċ import Ġcom . tencent . devops . process . engine . control . Control Utils Ċ import Ġcom . tencent . devops . process . engine . pojo . Pipeline Build Task Ċ import Ġcom . tencent . devops . process . engine . service . measure . Measure Service Ċ import Ġcom . tencent . devops . process . engine . utils . Container Utils Ċ import Ġcom . tencent . devops . process . j mx . elements . J mx Elements Ċ import Ġcom . tencent . devops . process . pojo . Build Task Ċ import Ġcom . tencent . devops . process . pojo . Build Task Result Ċ import Ġcom . tencent . devops . process . pojo . Build Variables Ċ import Ġcom . tencent . devops . process . pojo . mq . Pipeline Build Container Event Ċ import Ġcom . tencent . devops . process . service . Build Variable Service Ċ import Ġcom . tencent . devops . process . service . Pipeline Task Service Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ ELEMENT _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ TUR BO _ TASK _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ VM SEQ _ ID Ċ import Ġcom . tencent . devops . process . utils . Pipeline Var Util Ċ import Ġcom . tencent . devops . store . api . container . Service Container App Resource Ċ import Ġcom . tencent . devops . store . pojo . app . Build Env Ċ import Ġokhttp 3 . Request Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . amqp . rabbit . core . Rabbit Template Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . cloud . consul . discovery . Cons ul Discovery Client Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjavax . ws . rs . NotFoundException Ċ Ċ @ Service Ċ class ĠPipeline VM Build Service Ġ@ Autowired ( required Ġ= Ġfalse ) Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġpipeline Runtime Service : ĠPipeline Runtime Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Build Detail Service : ĠPipeline Build Detail Service , ĊĠĠĠ Ġprivate Ġval Ġbuild Variable Service : ĠBuild Variable Service , ĊĠĠĠ Ġ@ Autowired ( required Ġ= Ġfalse ) ĊĠĠĠ Ġprivate Ġval Ġmeasure Service : ĠMeasure Service ?, ĊĠĠĠ Ġprivate Ġval Ġrabbit Template : ĠRabbit Template , ĊĠĠĠ Ġprivate Ġval Ġpipeline EventDispatcher : ĠPipeline EventDispatcher , ĊĠĠĠ Ġprivate Ġval Ġpipeline Task Service : ĠPipeline Task Service , ĊĠĠĠ Ġprivate Ġval Ġredis Operation : ĠRedis Operation , ĊĠĠĠ Ġprivate Ġval Ġj mx Elements : ĠJ mx Elements , ĊĠĠĠ Ġprivate Ġval Ġcons ul Client : ĠCons ul Discovery Client ?, ĊĠĠĠ Ġprivate Ġval Ġclient : ĠClient Ċ ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDispatch Ġservice Ġstartup Ġthe Ġvm Ġfor Ġthe Ġbuild Ġand Ġthen Ġnotify Ġto Ġprocess Ġservice ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġvm Started By Dispatch ( ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Seq Id : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Name : ĠString ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Heart Beat ( build Id , Ġvm Seq Id , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġset Start Up VM Status ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , Ġvm Seq Id Ġ= Ġvm Seq Id , Ġbuild Status Ġ= ĠBuild Status . SU CCE ED ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º æľº æĬ¥ åĳĬ åĲ¯åĬ¨ å®Į æ¯ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild VM Started ( build Id : ĠString , Ġvm Seq Id : ĠString , Ġvm Name : ĠString ): ĠBuild Variables Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Info Ġ= Ġpipeline Runtime Service . get Build Info ( build Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( build Info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" The Ġpipeline Ġbuild Ġ($ build Id ) Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotFound Exception (" Pipeline Ġbuild Ġ($ build Id ) Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| Start Ġthe Ġbuild Ġvm Seq Id ($ vm Seq Id ) Ġand Ġvm Name ($ vm Name )") ĊĠĠĠĠĠĠĠ Ġredis Operation . delete ( Container Utils . getContainer Startup Key ( build Info . pipeline Id , Ġbuild Id , Ġvm Seq Id )) ĊĊĠĠĠĠĠĠĠ Ġval Ġvariables Ġ= Ġbuild Variable Service . getAll Variable ( build Id ) ĊĠĠĠĠĠĠĠ Ġval Ġvariables WithType Ġ= Ġbuild Variable Service . getAll Variable WithType ( build Id ) ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġ( pipeline Build Detail Service . get Build Model ( build Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNotFound Exception (" Does Ġnot Ġexist Ġresource Ġin Ġthe Ġpipeline ")) ĊĠĠĠĠĠĠĠ Ġvar Ġvm Id Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġmodel . stages . forEach Indexed Ġ{ Ġindex , Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Indexed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs . containers . forEach Ġc @{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vm Id . toString () Ġ== Ġvm Seq Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild En vs Ġ= Ġif Ġ( it Ġis ĠVM Build Container ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . build Env Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < Build Env >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= ĠArrayList < Build Env >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . build Env !!. forEach Ġ{ Ġbuild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenv Ġ= Ġclient . get ( Service Container App Resource :: class ). get Build Env ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . base OS . name . toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( env Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" The Ġcontainer Ġapp ($ build ) Ġis Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( env ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Build Detail Service . container Start ( build Id , Ġvm Seq Id . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Heart Beat ( build Id , Ġvm Seq Id , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Start Up VM Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Info . projectId , Ġpipeline Id Ġ= Ġbuild Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , Ġvm Seq Id Ġ= Ġvm Seq Id , Ġbuild Status Ġ= ĠBuild Status . SU CCE ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild Variables ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm Seq Id Ġ= Ġvm Seq Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm Name Ġ= Ġvm Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġbuild Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables Ġ= Ġvariables , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild En vs Ġ= Ġbuild En vs , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġit . id !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Hash Id Ġ= Ġit . container Id Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables WithType Ġ= Ġvariables WithType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm Id ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . warn (" Fail Ġto Ġfind Ġthe Ġvm Ġbuild Ġcontainer ($ vm Seq Id ) Ġof Ġ$ model ") ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Fail Ġto Ġfind Ġthe Ġvm Ġbuild Ġcontainer ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Start Up VM Status ( ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Seq Id : ĠString , ĊĠĠĠĠĠĠĠ Ġbuild Status : ĠBuild Status ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Tasks Ġ= Ġpipeline Runtime Service . list Container Build Tasks ( build Id , Ġvm Seq Id ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| set Start Up VM Status | vm Seq Id =$ vm Seq Id | status =$ build Status | size =${ build Tasks . size }") ĊĠĠĠĠĠĠĠ Ġif Ġ( build Tasks . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Up VM Task Ġ= Ġbuild Tasks [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ æĺ¯ æĪĲåĬŁ çļĦ çĬ¶æĢģ ï¼Į åĪĻ æĽ´æĸ° æŀĦå»º æľº åĲ¯åĬ¨ æıĴä»¶ çļĦ çĬ¶æĢģ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Status . is Finish ( build Status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Runtime Service . update Task Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġstart Up VM Task . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġstart Up VM Task . starter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġbuild Status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¤±è´¥ çļĦè¯Ŀ å°± åıĳ ç»Ī æŃ¢ äºĭä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmessage : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Type Ġ= Ġif Ġ( Build Status . is Failure ( build Status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" æŀĦå»º æľº åĲ¯åĬ¨ å¤±è´¥ ï¼Į æīĢæľī æıĴä»¶ è¢« ç»Ī æŃ¢ " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Type . TERMIN ATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Type . START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Container Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" container _ startup _$ build Status ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġstart Up VM Task . starter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġstart Up VM Task . stage Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġstart Up VM Task . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Type Ġ= Ġstart Up VM Task . container Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= Ġaction Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Build Detail Service . update Start VM Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġstart Up VM Task . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġbuild Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġfun Ġplugin Claim Task ( build Id : ĠString , Ġvm Seq Id : ĠString , Ġvm Name : ĠString ): ĠBuild Task Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġreturn Ġbuild Claim ( build Id , Ġvm Seq Id , Ġvm Name ) Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º æľº è¯·æ±Ĥ æī§è¡Į ä»»åĬ¡ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Claim Task ( build Id : ĠString , Ġvm Seq Id : ĠString , Ġvm Name : ĠString ): ĠBuild Task Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Claim ( build Id , Ġvm Seq Id , Ġvm Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Heart Beat ( build Id : ĠString , Ġvm Seq Id : ĠString , Ġtime : ĠLong , Ġretry : ĠInt Ġ= Ġ 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredis Operation . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHeart Beat Utils . gen Heart Beat Key ( build Id , Ġvm Seq Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime . toString (), ĠTimeUnit . MIN UTES . to Seconds ( 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( retry Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Fail Ġto Ġset Ġheart Ġbeat Ġvariable ($ vm Seq Id Ġ-> Ġ$ time ) Ġof Ġ$ build Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Heart Beat ( build Id , Ġvm Seq Id , Ġtime , Ġretry Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Claim ( build Id : ĠString , Ġvm Seq Id : ĠString , Ġvm Name : ĠString ): ĠBuild Task Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Info Ġ= Ġpipeline Runtime Service . get Build Info ( build Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" [$ build Id ]| Ġbuild Info Ġnot Ġfound , ĠEnd ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild Task ( build Id , Ġvm Seq Id , ĠBuild Task Status . END ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġall Tasks Ġ= Ġpipeline Runtime Service . list Container Build Tasks ( build Id , Ġvm Seq Id ) ĊĠĠĠĠĠĠĠ Ġval Ġqueue Tasks : ĠMutable List < Pipeline Build Task > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġval Ġrunning Tasks : ĠMutable List < Pipeline Build Task > Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġvar Ġis Container Failed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġhas Failed Task In In Success Container Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġcontinue When Pre Task Failed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġall Variable Ġ= Ġbuild Variable Service . getAll Variable ( build Id ) ĊĠĠĠĠĠĠĠ Ġall Tasks . forEach Indexed Ġ{ Ġindex , Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Options Ġ= Ġtask . additional Options ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Status . is Failure ( task . status ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Container Failed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Be hind List Ġ= Ġall Tasks . sub List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ+ Ġ 1 Ġ> Ġall Tasks . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Tasks . size Ġelse Ġindex Ġ+ Ġ 1 , Ġall Tasks . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Be hind List . forEach Ġ{ Ġtask Be hind Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build Status . is Ready To Run ( task Be hind . status )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task Be hind . additional Options Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Be hind . additional Options !!. enable Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( task Be hind . additional Options !!. run Condition Ġ== ĠRun Condition . PRE _ TASK _ FAILED _ B UT _ CANCEL Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Be hind . additional Options !!. run Condition Ġ== ĠRun Condition . PRE _ TASK _ FAILED _ ONLY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| container Id =$ vm Seq Id | name =${ task Be hind . task Name }| taskId =${ task Be hind . taskId }| vm =$ vm Name | Ġwill Ġrun Ġwhen Ġpre Ġtask Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue When Pre Task Failed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ å¤±è´¥ çļĦ ä»»åĬ¡ èĩªå·± æľ¬ èº« æ²¡æľī å¼ĢåĲ¯ " å¤±è´¥ ç»§ç»Ń " ï¼Į åĲĮæĹ¶ ï¼Į åĲİ ç»Ń å¾ħ æī§è¡Į çļĦ ä»»åĬ¡ ä¹Ł æ²¡æľī å¼ĢåĲ¯ " åīį éĿ¢ å¤±è´¥ è¿ĺ è¦ģ è¿Ĳè¡Į " ï¼Į åĪĻ ç»Ī æŃ¢ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( additional Options ?. continue When Failed Ġ== Ġfalse Ġ&& Ġ! continue When Pre Task Failed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| container Id =$ vm Seq Id | name =${ task . task Name }| vm =$ vm Name | Ġfailed , ĠEnd ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild Task ( build Id , Ġvm Seq Id , ĠBuild Task Status . END ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ å¤±è´¥ çļĦ ä»»åĬ¡ èĩªå·± æľ¬ èº« å¼ĢåĲ¯ äºĨ " å¤±è´¥ ç»§ç»Ń " ï¼Į åĪĻ container è®¤ä¸º æĺ¯ æĪĲåĬŁ çļĦ ï¼Į åĲİ ç»Ń æīĢæľīçļĦ æıĴä»¶ éĥ½ è¦ģ åĬłåħ¥ å¾ħ æī§è¡Į éĺŁåĪĹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( additional Options ?. continue When Failed Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Container Failed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Failed Task In In Success Container Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Status . is Ready To Run ( task . status ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ å½ĵåīį Container å·²ç»ı æī§è¡Į å¤±è´¥ äºĨ ï¼Į ä½Ĩæĺ¯ æľī éħįç½® äºĨ åīį ç½® å¤±è´¥ è¿ĺ è¦ģ æī§è¡Į çļĦ æıĴä»¶ ï¼Į åĪĻ åıªèĥ½ æ·»åĬł è¿Ļæł· çļĦ æıĴä»¶ åĪ° éĺŁåĪĹ ä¸Ń ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Container Failed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( continue When Pre Task Failed Ġ&& Ġadditional Options Ġ!= Ġnull Ġ&& Ġadditional Options . enable Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( additional Options . run Condition Ġ== ĠRun Condition . PRE _ TASK _ FAILED _ B UT _ CANCEL Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Options . run Condition Ġ== ĠRun Condition . PRE _ TASK _ FAILED _ ONLY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Tasks . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// Ġå½ĵåīį Container æĪĲåĬŁ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( additional Options Ġ== Ġnull Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Options . run Condition Ġ!= ĠRun Condition . PRE _ TASK _ FAILED _ ONLY Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( additional Options . run Condition Ġ== ĠRun Condition . PRE _ TASK _ FAILED _ ONLY Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Failed Task In In Success Container ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Control Utils . check Custom Variable Skip ( build Id Ġ= Ġbuild Id , Ġadditional Options Ġ= Ġadditional Options , Ġvariables Ġ= Ġall Variable )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Tasks . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Build Detail Service . task Skip ( build Id , Ġtask . taskId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Status . isRunning ( task . status ) Ġ-> Ġrunning Tasks . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( running Tasks . size Ġ> Ġ 0 ) Ġ{ Ġ// Ġ å·²ç»ı æľī è¿Ĳè¡Į ä¸ŃçļĦ ä»»åĬ¡ ï¼Į ç¦ģ æŃ¢ åĨį è®¤ é¢Ĩ ï¼Į åĲĮ ä¸Ģä¸ª å®¹åĻ¨ ä¸į åħģè®¸ å¹¶ è¡Į ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| container Id =$ vm Seq Id | running Tasks =${ running Tasks . size }| vm =$ vm Name | Ġwait Ġfor Ġrunning Ġtask Ġfinish !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild Task ( build Id , Ġvm Seq Id , ĠBuild Task Status . WAIT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( queue Tasks . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| container Id =$ vm Seq Id | queue Tasks Ġis Ġempty | vm =$ vm Name | ĠEnd ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild Task ( build Id , Ġvm Seq Id , ĠBuild Task Status . END ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( queue Tasks . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Tasks . forEach Ġnext Queue Task @{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclaim ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġbuild Info . start User , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm Seq Id Ġ= Ġvm Seq Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Variable Ġ= Ġall Variable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn @ next Queue Task ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Task Ġ= Ġclaim ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask Ġ= Ġqueue Tasks [ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġbuild Info . start User , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm Seq Id Ġ= Ġvm Seq Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Variable Ġ= Ġall Variable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( build Task Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Task ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| container Id =$ vm Seq Id | no Ġfound Ġqueue Ġtask , Ġwait !") ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild Task ( build Id , Ġvm Seq Id , ĠBuild Task Status . WAIT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclaim ( ĊĠĠĠĠĠĠĠ Ġtask : ĠPipeline Build Task , ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Seq Id : ĠString , ĊĠĠĠĠĠĠĠ Ġall Variable : ĠMap < String , ĠString > ĊĠĠĠ Ġ): ĠBuild Task ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info ("[ ${ task . pipeline Id }] | userId =$ userId | Claim ing Ġtask [ ${ task . taskId }-${ task . task Name }] ") ĊĠĠĠĠĠĠĠ Ġif Ġ( task . taskId Ġ== Ġ" end -${ task . task Seq }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Runtime Service . claim Build Task ( build Id , Ġtask , ĠuserId ) Ġ// Ġ åĪ·æĸ° ä¸Ģä¸ĭ è¿Ļä¸ª ç»ĵæĿŁ çļĦ ä»»åĬ¡ èĬĤçĤ¹ æĹ¶éĹ´ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åħ¨éĥ¨ å®ĮæĪĲ äºĨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild Task ( build Id , Ġvm Seq Id , ĠBuild Task Status . END ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ æİĴ éĻ¤ éĿŀ æŀĦå»º æľº çļĦ æıĴä»¶ ä»»åĬ¡ Ġ ç»§ç»Ń çŃīå¾ħ çĽ´ åĪ° å®ĥ å®ĮæĪĲ ĊĠĠĠĠĠĠĠ Ġif Ġ( task . task Atom . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| taskId =${ task . taskId }| task Atom =${ task . task Atom }| do Ġnot Ġrun Ġin Ġvm Ġagent , Ġskip !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBuild Task ( build Id , Ġvm Seq Id , ĠBuild Task Status . WAIT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtur bo TaskId Ġ= Ġget Tur bo Task ( task . pipeline Id , Ġtask . taskId ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ è®¤ é¢Ĩ ä»»åĬ¡ ĊĠĠĠĠĠĠĠ Ġpipeline Runtime Service . claim Build Task ( build Id , Ġtask , ĠuserId ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild Variable Ġ= Ġmutable Map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPI PE LINE _ VM SEQ _ ID Ġto Ġvm Seq Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPI PE LINE _ ELEMENT _ ID Ġto Ġtask . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPI PE LINE _ TUR BO _ TASK _ ID Ġto Ġtur bo TaskId ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠPipeline Var Util . fill Old Var ( build Variable ) ĊĊĠĠĠĠĠĠĠ Ġbuild Variable . put All ( all Variable ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild Task Ġ= ĠBuild Task ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvm Seq Id Ġ= Ġvm Seq Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBuild Task Status . DO , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġtask . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Id Ġ= Ġtask . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Name Ġ= Ġtask . task Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtask . task Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= Ġtask . task Params . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobj Ġ= ĠObject Replace Env Var Util . replace Env Var ( it . value , Ġbuild Variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . key Ġto ĠJson Util . toJson ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . first . startsWith ("@ type ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Variable Ġ= Ġbuild Variable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Type Ġ= Ġtask . container Type ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| Claim Ġthe Ġtask Ġ- Ġ($ build Task )") ĊĠĠĠĠĠĠĠ Ġpipeline Build Detail Service . task Start ( build Id , Ġtask . taskId ) ĊĊĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Status Broad Cast Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" vm - build - claim ($ vm Seq Id )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġtask . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġtask . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġtask . starter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġtask . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAction Type . START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġj mx Elements . execute ( task . task Type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Task ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º æľº å®ĮæĪĲ ä»»åĬ¡ è¯·æ±Ĥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Complete Task ( build Id : ĠString , Ġvm Seq Id : ĠString , Ġvm Name : ĠString , Ġresult : ĠBuild Task Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Info Ġ= Ġpipeline Runtime Service . get Build Info ( build Id ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! result . success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . type . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" The Ġelement Ġtype Ġis Ġnull Ġof Ġbuild Ġ$ build Id Ġand Ġresult Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj mx Elements . fail ( result . type !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġåıª è¦ģ build Result ä¸į ä¸ºç©º ï¼Į éĥ½ åĨĻåħ¥ åĪ° çİ¯å¢ĥ åıĺéĩı éĩĮéĿ¢ ĊĠĠĠĠĠĠĠ Ġif Ġ( result . build Result . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| ĠAdd Ġthe Ġbuild Ġresult (${ result . build Result }) Ġto Ġvar ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Variable Service . batch Set Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġbuild Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables Ġ= Ġresult . build Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĺ² æŃ¢ åĽłä¸º åıĺéĩı åŃĹç¬¦ è¿ĩ éķ¿ èĢĮ å¤±è´¥ ãĢĤ åģļ ä¸ĭ æĭ ¦ æĪª ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" [$ build Id ]| Ġsave Ġvar Ġfail : Ġ${ ignored . message }", Ġignored ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| ERROR CODE | complete Claim Build Task | error Type =${ result . error Type }| errorCode =${ result . errorCode }| message =${ result . message }] Ġ") ĊĠĠĠĠĠĠĠ Ġval Ġerror Type Ġ= Ġif Ġ(! result . error Type . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠError Type . valueOf ( result . error Type !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġbuild Status Ġ= Ġif Ġ( result . success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Task Service . remove Retry Cache ( build Id , Ġresult . taskId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ¸ ħ çĲĨ æıĴä»¶ éĶĻè¯¯ ä¿¡æģ¯ ï¼Ī éĩį è¯ķ æıĴä»¶ æĪĲåĬŁ çļĦ æĥħåĨµä¸ĭ ï¼ī ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Task Service . remove Fail Var When Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġbuild Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġresult . taskId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Status . SU CCE ED ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pipeline Task Service . is Retry When Fail ( result . taskId , Ġbuild Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" task Ġfail , user Ġsetting Ġretry , Ġbuild [$ build Id ], ĠtaskId [ ${ result . taskId }, Ġelement Id [ ${ result . element Id } ]] ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæŃ¤ å¤Ħ ä¼ ĳ çľ ł 5 s ä½ľä¸º éĩį è¯ķ çļĦ åĨ · åį´ æĹ¶éĹ´ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Status . RETRY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è®°å½ķ éĶĻè¯¯ æıĴä»¶ ä¿¡æģ¯ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Task Service . create Fail Element Var ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġbuild Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġresult . taskId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Status . FAILED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpipeline Build Detail Service . pipeline Task End ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġresult . element Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġbuild Status , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġerror Type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġresult . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg Ġ= Ġresult . message ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ åıĳéĢģ åº¦ éĩı æķ°æį® ĊĠĠĠĠĠĠĠ Ġsend Element Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġresult . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġresult . success , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġresult . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġresult . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġresult . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg Ġ= Ġresult . message ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Complete Ġthe Ġtask (${ result . taskId }) Ġof Ġbuild ($ build Id ) Ġand Ġseq Id ($ vm Seq Id )") ĊĠĠĠĠĠĠĠ Ġpipeline Runtime Service . complete Claim Build Task ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġresult . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġbuild Info . start User , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġbuild Status , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġerror Type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġresult . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg Ġ= Ġresult . message ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Status Broad Cast Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" task - end -${ result . taskId }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġbuild Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġbuild Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġbuild Info . start User , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Info . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġresult . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAction Type . END ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠLog Utils . stop Log ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrabbit Template Ġ= Ġrabbit Template , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġresult . element Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġresult . container Id Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æŀĦå»º æľº ç»ĵæĿŁ å½ĵåīį Job ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild End Task ( build Id : ĠString , Ġvm Seq Id : ĠString , Ġvm Name : ĠString ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġtasks Ġ= Ġpipeline Runtime Service . list Container Build Tasks ( build Id , Ġvm Seq Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . taskId Ġ== Ġ" end -${ it . task Seq }" Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( tasks . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" [$ build Id ]| name =$ vm Name | container Id =$ vm Seq Id | There Ġare Ġno Ġstop VM Ġtasks !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( tasks . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" [$ build Id ]| name =$ vm Name | container Id =$ vm Seq Id | There Ġare Ġmultiple Ġstop VM Ġtasks !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġredis Operation . delete ( Heart Beat Utils . gen Heart Beat Key ( build Id , Ġvm Seq Id )) ĊĠĠĠĠĠĠĠ Ġpipeline Runtime Service . complete Claim Build Task ( build Id , Ġtasks [ 0 ]. taskId , Ġtasks [ 0 ]. starter , ĠBuild Status . SU CCE ED ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" Success Ġto Ġcomplete Ġthe Ġbuild ($ build Id ) Ġof Ġseq ($ vm Seq Id )") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġheartbeat ( build Id : ĠString , Ġvm Seq Id : ĠString , Ġvm Name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| Do Ġthe Ġheart Ġ($ vm Seq Id $ vm Name )") ĊĠĠĠĠĠĠĠ Ġadd Heart Beat ( build Id , Ġvm Seq Id , ĠSystem . currentTimeMillis ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Element Data ( ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ ĠtaskId : ĠString , ĊĠĠĠĠĠĠĠ Ġsuccess : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġtype : ĠString ?, ĊĠĠĠĠĠĠĠ Ġerror Type : ĠString ?, ĊĠĠĠĠĠĠĠ ĠerrorCode : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġerror Msg : ĠString ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( measure Service Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġpipeline Runtime Service . get Build Task ( build Id , ĠtaskId ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Status Ġ= Ġif Ġ( success ) ĠBuild Status . SU CCE ED Ġelse ĠBuild Status . FAILED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġatom Code Ġ= Ġtask . task Params [" atom Code "] Ġas ĠString ? Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Service ?. post Task Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġtask . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġtask . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= ĠtaskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatom Code Ġ= Ġatom Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġtask . task Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= Ġtask . startTime ?. timestamp milli () Ġ?: Ġ 0 L , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġbuild Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġtask . execute Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= Ġerror Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠerrorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Msg Ġ= Ġerror Msg , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġtask . starter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" [$ build Id ]| ĠFail Ġto Ġsend Ġthe Ġmeasure Ġelement Ġdata ", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") Ġ// ĠFIXME : ĠéľĢè¦ģ éĩįæĸ° å®ļä¹ī æİ¥åı£ æĭ Ĩ åĪĨ å®ŀçİ° ï¼Į æŃ¤ å¤Ħ éĿŀ å¼ĢæºĲ æīĢ éľĢè¦ģ ĊĠĠĠ Ġfun Ġget Tur bo Task ( pipeline Id : ĠString , Ġelement Id : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstances Ġ= Ġcons ul Client !!. get Instances (" tur bo ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( instances . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"${ if Ġ( instances [ 0 ]. is Secure ) Ġ" https " Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" http "} ://${ instances [ 0 ]. host }:${ instances [ 0 ]. port }/ api / service / tur bo / task / pipeline /$ pipeline Id /$ element Id " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Get Ġtur bo Ġtask Ġinfo , Ġrequest Ġurl : Ġ$ url ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder (). url ( url ). get (). build () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOk http Utils . do Http ( request ). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġresponse . body ()?. string () Ġ?: Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Get Ġtur bo Ġtask Ġinfo , Ġresponse : Ġ$ data ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRemote ServiceException ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Data : ĠMap < String , ĠAny > Ġ= Ġj ack son ObjectMapper (). readValue ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġresponse Data [" status "] Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 0 Ġ== Ġcode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Map Ġ= Ġresponse Data [" data "] Ġas ĠMap < String , ĠAny > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata Map [" taskId "] Ġas ĠString ? Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRemote ServiceException ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Get Ġtur bo Ġtask Ġinfo Ġfailed , Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Pipeline VM Build Service :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ