/* Ċ Ġ* Ġ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 . command . container . impl Ċ Ċ import Ġcom . tencent . devops . common . event . dispatcher . pipeline . Pipeline EventDispatcher Ċ import Ġcom . tencent . devops . common . event . enums . ActionType Ċ import Ġcom . tencent . devops . common . log . utils . Build Log Printer Ċ import Ġcom . tencent . devops . common . pipeline . enums . Build Status Ċ import Ġcom . tencent . devops . process . engine . common . VM Utils Ċ import Ġcom . tencent . devops . process . engine . control . Mutex Control Ċ import Ġcom . tencent . devops . process . engine . control . command . Cmd Flow State Ċ import Ġcom . tencent . devops . process . engine . control . command . container . Container Cmd Ċ import Ġcom . tencent . devops . process . engine . control . command . container . Container Context Ċ import Ġcom . tencent . devops . process . engine . pojo . event . Pipeline Build Stage Event Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Container Service Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Task Service Ċ import Ġcom . tencent . devops . process . engine . service . detail . Container Build Detail Service Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . time . LocalDateTime Ċ Ċ @ Service Ċ class ĠUpdate State Container Cmd Finally ( ĊĠĠĠ Ġprivate Ġval Ġmutex Control : ĠMutex Control , ĊĠĠĠ Ġprivate Ġval Ġpipeline Container Service : ĠPipeline Container Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Task Service : ĠPipeline Task Service , ĊĠĠĠ Ġprivate Ġval Ġcontainer Build Detail Service : ĠContainer Build Detail Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline EventDispatcher : ĠPipeline EventDispatcher , ĊĠĠĠ Ġprivate Ġval Ġbuild Log Printer : ĠBuild Log Printer Ċ ) Ġ: ĠContainer Cmd Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcan Execute ( command Context : ĠContainer Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcommand Context . cmd Flow State Ġ== ĠCmd Flow State . FIN ALLY Ġ&& Ġ! command Context . container . status . is Finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( command Context : ĠContainer Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠæĽ´æĸ° çĬ¶æĢģ æ¨¡åŀĭ ĊĠĠĠĠĠĠĠ Ġupdate Container Status ( command Context Ġ= Ġcommand Context ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ç»ĵæĿŁ æĹ¶ æīį ä¼ļ éĩĬæĶ¾ éĶģ å®ļ åıĬ è¿ĶåĽŀ ĊĠĠĠĠĠĠĠ Ġif Ġ( command Context . build Status . is Finish ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĩĬæĶ¾ äºĴ æĸ ¥ ç»Ħ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex Release ( command Context Ġ= Ġcommand Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ åıĳéĢģ åĽŀ Stage ĊĠĠĠĠĠĠĠ Ġif Ġ( command Context . build Status . is Finish () Ġ|| Ġcommand Context . build Status Ġ== ĠBuild Status . UNKNOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġcommand Context . event . source ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Id Ġ= Ġcommand Context . container . build Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstage Id Ġ= Ġcommand Context . container . stage Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Id Ġ= Ġcommand Context . container . container Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatrix GroupId Ġ= Ġcommand Context . container . matrix GroupId ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ENGINE |$ build Id |$ source | CONTAINER _ FIN |$ stage Id | j ($ container Id )| " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" matrix GroupId =$ matrix GroupId | ${ command Context . build Status }| ${ command Context . latest Summary }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ# 4 5 1 8 Ġå¦Ĥæŀľ è¯¥ å®¹åĻ¨ ä¸į å±ŀ äºİ æŁĲä¸ª çŁ©éĺµ æĹ¶ ä¸Ĭ æĬ¥ stage å¤ĦçĲĨ ï¼Į åĲ¦åĪĻ ä¸Ĭ æĬ¥ åıĳ åĩº ä¸Ģä¸ª çŁ©éĺµ ç»Ħ äºĭä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matrix GroupId . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Back Stage ( command Context Ġ= Ġcommand Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Context . event . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAction Type . REFRESH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġmatrix GroupId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Hash Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġcommand Context . latest Summary , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreason Ġ= Ġ" Matrix (${ command Context . container . container Id }) Ġinner Ġcontainer Ġfinished " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĩĬæĶ¾ [ command Context ] ä¸Ń æĮĩå®ļçļĦ äºĴ æĸ ¥ ç»Ħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmutex Release ( command Context : ĠContainer Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġè¿ĶåĽŀ stage çļĦæĹ¶åĢĻ ï¼Į éľĢè¦ģ è§£ éĶģ ĊĠĠĠĠĠĠĠ Ġmutex Control . release Container Mutex ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġcommand Context . event . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġcommand Context . event . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġcommand Context . event . stage Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġcommand Context . event . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutex Group Ġ= Ġcommand Context . mutex Group ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæĽ´æĸ° [ command Context ] ä¸ĭ æĮĩå®ļçļĦ Container çļĦ çĬ¶æĢģ ä»¥åıĬ ç¼ĸ æİĴ æ¨¡åŀĭ çĬ¶æĢģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Container Status ( command Context : ĠContainer Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġcommand Context . event ĊĠĠĠĠĠĠĠ Ġval Ġbuild Status Ġ= Ġcommand Context . build Status ĊĊĠĠĠĠĠĠĠ Ġvar ĠstartTime : ĠLocalDateTime ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( build Status Ġ== ĠBuild Status . SKIP Ġ|| Ġcommand Context . container . status . is Ready To Run ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar ĠendTime : ĠLocalDateTime ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( build Status . is Finish ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠendTime Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpipeline Container Service . update Container Status ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġevent . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġevent . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġevent . stage Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġevent . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġbuild Status , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartTime Ġ= ĠstartTime , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠendTime Ġ= ĠendTime ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( build Status Ġ== ĠBuild Status . SKIP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Context . container Tasks . forEach Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Task Service . update Task Status ( task Ġ= Ġtask , ĠuserId Ġ= Ġtask . starter , Ġbuild Status Ġ= Ġbuild Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĪ·æĸ° Model çĬ¶æĢģ ä¸º SKIP ï¼Į åĮħåĲ« container Id ä¸ĭçļĦ æīĢæľī æıĴä»¶ ä»»åĬ¡ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Build Detail Service . container Skip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġevent . projectId , Ġbuild Id Ġ= Ġevent . build Id , Ġcontainer Id Ġ= Ġevent . container Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( command Context . container . status . is Ready To Run () Ġ|| Ġbuild Status . is Finish ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĪ·æĸ° Model çĬ¶æĢģ - ä»ħ æĽ´æĸ° container çĬ¶æĢģ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Build Detail Service . update Container Status ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġevent . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġevent . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġevent . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= Ġbuild Status , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġcommand Context . execute Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå°Ĩ [ command Context ] ä¸Ń èİ·å¾Ĺ æĮĩå®ļ stage Id , å¹¶ åıĳéĢģ Stage äºĭä»¶ åĽŀ stage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsend Back Stage ( command Context : ĠContainer Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( command Context . event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecute Count Ġ= Ġcommand Context . execute Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Stage Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" From _ j ($ container Id )", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġstage Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAction Type . REFRESH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" [$ execute Count ]| ĠFinish ĠJob # ${ this . container Id }| Ġ${ command Context . latest Summary }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= ĠVM Utils . gen Start VM TaskId ( container Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġcontainer Hash Id Ġ?: Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( Update State Container Cmd Finally :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ