/* Ċ Ġ* Ġ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 . service . builds Ċ Ċ import Ġcom . tencent . devops . common . api . exception . ErrorCode Exception Ċ import Ġcom . tencent . devops . common . api . exception . Param Blank Exception Ċ 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 . common . service . utils . Message Code Util Ċ import Ġcom . tencent . devops . process . constant . Process Message Code Ċ import Ġcom . tencent . devops . process . engine . common . VM Utils Ċ import Ġcom . tencent . devops . process . engine . pojo . Pipeline Build Container Ċ import Ġcom . tencent . devops . process . engine . pojo . Pipeline Build Task Ċ import Ġcom . tencent . devops . process . engine . pojo . event . Pipeline Build Container 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 . Task Build Detail Service Ċ import Ġorg . jooq . DSL Context Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjavax . ws . rs . core . Response Ċ Ċ @ Service Ċ class ĠPipeline Retry Facade Service Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġval Ġd sl Context : ĠDSL Context , ĊĠĠĠ Ġval Ġpipeline EventDispatcher : ĠPipeline EventDispatcher , ĊĠĠĠ Ġval Ġpipeline Task Service : ĠPipeline Task Service , ĊĠĠĠ Ġval Ġpipeline Container Service : ĠPipeline Container Service , ĊĠĠĠ Ġval Ġtask Build Detail Service : ĠTask Build Detail Service , ĊĠĠĠ Ġprivate Ġval Ġbuild Log Printer : ĠBuild Log Printer Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġrunning Build Task Retry ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ ĠtaskId : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" running Build Task Retry Ġ$ userId |$ projectId |$ pipeline Id |$ build Id |$ taskId }") ĊĠĠĠĠĠĠĠ Ġif Ġ( taskId . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĬ Ľ å¼Ĥå¸¸ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParam Blank Exception (" Invalid ĠtaskId ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtask Info Ġ= Ġpipeline Task Service . get Build Task ( projectId , Ġbuild Id , ĠtaskId ) ĊĠĠĠĠĠĠĠ Ġif Ġ( task Info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" running Build Ġtask Ġretry Ġtask Ġempty Ġ$ projectId |$ pipeline Id |$ build Id |$ taskId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĬ Ľ å¼Ĥå¸¸ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= ĠResponse . Status . NOT _ FOUND . statusCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠProcess Message Code . ERROR _ NO _ BUILD _ EXISTS _ BY _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Message Ġ= Ġ" æŀĦå»º ä»»åĬ¡ ${ build Id } ä¸įåŃĺåľ¨ ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠarrayOf ( build Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠåĪ¤æĸŃ å¾ħ éĩį è¯ķ task æīĢ å±ŀ job æĺ¯åĲ¦ ä¸º ç»Ī æĢģ ãĢĤ Ġ éĿŀ ç»Ī æĢģ åĪ¤æĸŃ æĺ¯åĲ¦ æĺ¯ åħ³ æľº æľª å®ĮæĪĲ ãĢĤ åħ¶ä»ĸ task çĽ´æİ¥ æĬ¥éĶĻ ĊĠĠĠĠĠĠĠ Ġ// ĠæŃ¤ å¤Ħ è¯·æ±Ĥ åı¯èĥ½ æĹ© äºİ åħ³ æľº åĪ° è¾¾ ãĢĤ Ġ èĭ¥ è¿ĺ æľª åħ³ æľº å°± çĤ¹åĩ» éĩį è¯ķ ï¼Į æıĲç¤º çĶ¨æĪ· ç¨ į åĲİ åĨį è¯ķ ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Info Ġ= Ġpipeline Container Service . getContainer ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġtask Info . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ æł¡éªĮ å½ĵåīį job çļĦ åħ³ æľº äºĭä»¶ æĺ¯åĲ¦ æľī å®ĮæĪĲ ĊĠĠĠĠĠĠĠ Ġcheck Stop Task ( projectId , Ġbuild Id , Ġcontainer Info !! ) ĊĠĠĠĠĠĠĠ Ġ// Ġ åĪ·æĸ° å½ĵåīį job çļĦ å¼Ģ åħ³ æľº ä»¥åıĬ job çĬ¶æĢģ ï¼Į Ġcontainer çĬ¶æĢģ ï¼Į Ġdetail æķ°æį® ĊĠĠĠĠĠĠĠ Ġrefresh Task And Job ( userId , ĠprojectId , Ġbuild Id , ĠtaskId , Ġcontainer Info ) ĊĠĠĠĠĠĠĠ Ġ// Ġ åıĳéĢģ container ĠRef re ash äºĭä»¶ ï¼Į éĩįæĸ° å¼Ģå§ĭ task å¯¹åºĶçļĦ è°ĥ åº¦ ĊĠĠĠĠĠĠĠ Ġsend Container Event ( task Info , ĠuserId ) ĊĠĠĠĠĠĠĠ Ġbuild Log Printer . add Yellow Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ"$ userId Ġretry Ġfail Ġtask Ġ${ task Info . task Name } Ġwhen Ġrunning ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= ĠtaskId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġcontainer Info . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġtask Info . execute Count Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ åıĳéĢģ container åĪ·æĸ° äºĭä»¶ ï¼Į å°Ĩ éĩį ç½® åĲİçļĦ job éĩįæĸ° ä¸ ¢ åħ¥ å¼ķ æĵ İ ä¸Ń è°ĥ åº¦ ĊĠĠĠ Ġprivate Ġfun Ġsend Container Event ( task Info : ĠPipeline Build Task , ĠuserId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpipeline EventDispatcher . dispatch ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPipeline Build Container Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġ" running Build Retry ${ task Info . build Id }| ${ task Info . taskId }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġtask Info . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Hash Id Ġ= Ġtask Info . container Hash Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġtask Info . stage Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġtask Info . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġtask Info . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= ĠuserId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġtask Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Type Ġ= ĠAction Type . REFRESH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Type Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ èĭ¥ å½ĵåīį job çĬ¶æĢģ è¿ĺ æľª å®ĮæĪĲ ï¼Į æĬ¥éĶĻ è®© çĶ¨æĪ· ç¨ į åĲİ åĨį éĩį è¯ķ ãĢĤ åĲ¦åĪĻ ä¼ļ åĽłä¸º å¼Ģ æľº æ¯Ķ åħ³ æľº æĹ© åĪ° å¼ķ åıĳ å¼ķ æĵ İ è°ĥ åº¦ éĹ®é¢ĺ ĊĠĠĠ Ġprivate Ġfun Ġcheck Stop Task ( ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ Ġcontainer Info : ĠPipeline Build Container ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! container Info . status . is Finish ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" retry Ġrunning Job : Ġ$ projectId |$ build Id ï½ ľ ${ container Info . container Id } Ġis Ġrunning ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠProcess Message Code . ERROR _ JOB _ RUNNING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Message Ġ= ĠMessage Code Util . getCode Lan Message ( Process Message Code . ERROR _ JOB _ RUNNING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ åĪ·æĸ° è¦ģ éĩį è¯ķ task æīĢ å±ŀ job çļĦ å¼Ģ åħ³ æľº çĬ¶æĢģ ï¼Į task çĬ¶æĢģ ãĢĤ Ġcontainer çĬ¶æĢģ ï¼Į detail çĽ¸åħ³ ä¿¡æģ¯ ĊĠĠĠ Ġprivate Ġfun Ġrefresh Task And Job ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ ĠtaskId : ĠString , ĊĠĠĠĠĠĠĠ Ġcontainer Info : ĠPipeline Build Container ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Records Ġ= Ġpipeline Task Service . list Container Build Tasks ( projectId , Ġbuild Id , Ġcontainer Info . container Id ) ĊĠĠĠĠĠĠĠ Ġ// Ġ å¾ħ éĩį è¯ķ task æīĢ å±ŀ job å¯¹åºĶçļĦ start Vm ï¼Į stop Vm ï¼Į end Task ï¼Į å¯¹åºĶ task çĬ¶æĢģ éĩį ç½® ä¸º Queue ĊĠĠĠĠĠĠĠ Ġval Ġstart And End Task Ġ= Ġmutable ListOf < Pipeline Build Task >() ĊĠĠĠĠĠĠĠ Ġtask Records . forEach Ġ{ Ġtask Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . taskId Ġ== ĠtaskId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart And End Task . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( task . task Name . startsWith ( VM Utils . get Clean Vm Label ()) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . taskId . startsWith ( VM Utils . get Stop Vm Label ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart And End Task . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( task . task Name . startsWith ( VM Utils . get Prepare Vm Label ()) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . taskId . startsWith ( VM Utils . getStart Vm Label ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart And End Task . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( task . task Name . startsWith ( VM Utils . get Wait Label ()) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . taskId . startsWith ( VM Utils . getEnd Label ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart And End Task . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( task . status Ġ== ĠBuild Status . UN EXEC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart And End Task . add ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstart And End Task . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Task Service . update Task Status ( task Ġ= Ġit , ĠuserId Ġ= ĠuserId , Ġbuild Status Ġ= ĠBuild Status . QUEUE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġä¿®æĶ¹ å®¹åĻ¨ çĬ¶æĢģ ä½į è¿Ĳè¡Į ĊĠĠĠĠĠĠĠ Ġpipeline Container Service . update Container Status ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġcontainer Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġcontainer Info . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage Id Ġ= Ġcontainer Info . stage Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= Ġcontainer Info . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Status Ġ= ĠBuild Status . QUEUE ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Pipeline Retry Facade Service :: class . java ) ĊĠĠĠ Ġ} Ċ } Ċ