/* Ċ Ġ* Ġ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 . dispatch . b cs . client Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . tencent . devops . common . api . util . Json Util Ċ import Ġcom . tencent . devops . common . api . util . Ok http Utils Ċ import Ġcom . tencent . devops . common . dispatch . sdk . Build FailureException Ċ import Ġcom . tencent . devops . dispatch . b cs . common . Constants Message Ċ import Ġcom . tencent . devops . dispatch . b cs . common . ErrorCode Enum Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Build Image Req Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Builder Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Builder Status Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Builder Status Enum Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Delete Builder Params Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Oper ate Builder Params Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Result Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Start Builder Params Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . B cs Stop Builder Params Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . getCode Message Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . isRunning Ċ import Ġcom . tencent . devops . dispatch . b cs . pojo . b cs . resp . B cs Task Resp Ċ import Ġokhttp 3 . MediaType Ċ import Ġokhttp 3 . RequestBody Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . net . Socket TimeoutException Ċ Ċ @ Component Ċ class ĠB cs Builder Client Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġprivate Ġval ĠobjectMapper : ĠObjectMapper , ĊĠĠĠ Ġprivate Ġval Ġclient Common : ĠB cs Client Common Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( B cs Builder Client :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Builder Detail ( ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Seq Id : ĠString , ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġretry Time : ĠInt Ġ= Ġ 3 ĊĠĠĠ Ġ): ĠB cs Result < B cs Builder Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"/ api / v 1 / devops / builder /$ name " ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġrequest Ġurl : Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġclient Common . base Request ( userId , Ġurl ). get (). build () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOk http Utils . do Http ( request ). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Content Ġ= Ġresponse . body () !!. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġbuilder Name : Ġ$ name Ġresponse : Ġ$ response Content ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠobjectMapper . readValue ( response Content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( retry Time Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġretry Time Local Ġ= Ġretry Time Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Builder Detail ( build Id , Ġvm Seq Id , ĠuserId , Ġname , Ġretry Time Local ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Constants Message . T RO UBLE _ SHO OT ING } èİ·åıĸ æŀĦå»º æľº è¯¦æĥħ æİ¥åı£ å¼Ĥå¸¸ " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ï¼Ī Fail Ġto Ġget Ġbuilder Ġdetail , Ġhttp Ġresponse Ġcode : Ġ${ response . code () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æİ¥åı£ è¶ħæĹ¶ å¤±è´¥ ï¼Į éĩį è¯ķ ä¸ī æ¬¡ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( retry Time Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġbuilder Name : Ġ$ name Ġget Builder Detail ĠSocket TimeoutException ." Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġretry :$ retry Time ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Builder Detail ( build Id , Ġvm Seq Id , ĠuserId , Ġname , Ġretry Time Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" [$ build Id ]| [$ vm Seq Id ] Ġbuilder Name : Ġ$ name Ġget Builder Detail Ġfailed .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage Ġ= ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" èİ·åıĸ æŀĦå»º æľº è¯¦æĥħ æİ¥åı£ è¶ħæĹ¶ , Ġurl : Ġ$ url " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġoperate Builder ( ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Seq Id : ĠString , ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġparam : ĠB cs Oper ate Builder Params ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"/ api / v 1 / devops / builder /$ name " ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠObjectMapper (). writeValue AsString ( param ) ĊĠĠĠĠĠĠĠ Ġval Ġ( request , Ġaction ) Ġ= Ġwhen Ġ( param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB cs Delete Builder Params Ġ-> ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Common . base Request ( userId , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. delete ( RequestBody . create ( MediaType . parse (" application / json ; Ġcharset = utf - 8 "), Ġbody )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" delete " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB cs Stop Builder Params Ġ-> ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Common . base Request ( userId , Ġ"$ url / stop ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( RequestBody . create ( null , Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" stop " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠB cs Start Builder Params Ġ-> ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Common . base Request ( userId , Ġ"$ url / start ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( RequestBody . create ( MediaType . parse (" application / json ; Ġcharset = utf - 8 "), Ġbody )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" start " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġrequest Ġurl : Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġrequest Ġbody : Ġ$ body ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOk http Utils . do Http ( request ). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Content Ġ= Ġresponse . body () !!. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ ERROR . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ ERROR . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ ERROR . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Constants Message . T RO UBLE _ SHO OT ING } æĵįä½ľ æŀĦå»º æľº æİ¥åı£ å¼Ĥå¸¸ " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ï¼Ī Fail Ġto Ġ$ action Ġdocker , Ġhttp Ġresponse Ġcode : Ġ${ response . code () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġresponse : Ġ$ response Content ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Data : ĠB cs Result < B cs Task Resp > Ġ= ĠobjectMapper . readValue ( response Content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Data . is Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse Data . data !!. taskId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"${ response Data . message Ġ?: Ġresponse Data . getCode Message () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ FAIL . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ FAIL . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ FAIL . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Constants Message . T RO UBLE _ SHO OT ING } æĵįä½ľ æŀĦå»º æľº æİ¥åı£ è¿ĶåĽŀ å¤±è´¥ ï¼ļ $ msg " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" [$ build Id ]| [$ vm Seq Id ] Ġoperate Builder Ġget ĠSocket TimeoutException .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ FAIL . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ FAIL . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage Ġ= ĠErrorCode Enum . OPER ATE _ VM _ INTERFACE _ FAIL . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ"${ Constants Message . T RO UBLE _ SHO OT ING } æĵįä½ľ æŀĦå»º æľº æİ¥åı£ è¶ħæĹ¶ , Ġurl : Ġ$ url " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Builder ( ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Seq Id : ĠString , ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġb cs Builder : ĠB cs Builder ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"/ api / v 1 / devops / builder /${ b cs Builder . name }" ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠObjectMapper (). writeValue AsString ( b cs Builder ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġrequest Ġurl : Ġ$ url ") ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġrequest Ġbody : Ġ$ body ") ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġclient Common . base Request ( userId , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( RequestBody . create ( MediaType . parse (" application / json ; Ġcharset = utf - 8 "), Ġbody )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOk http Utils . do Http ( request ). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Content Ġ= Ġresponse . body () !!. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ build Id ]| [$ vm Seq Id ] Ġhttp Ġcode Ġis Ġ${ response . code ()}, Ġ$ response Content ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ ERROR . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ ERROR . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ ERROR . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Constants Message . T RO UBLE _ SHO OT ING } åĪĽå»º æŀĦå»º æľº æİ¥åı£ å¼Ĥå¸¸ : ĠFail Ġto Ġcreate Builder , Ġhttp Ġresponse Ġcode : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ response . code () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Data : ĠB cs Result < B cs Task Resp > Ġ= Ġj ack son ObjectMapper (). readValue ( response Content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Data . is Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse Data . data !!. taskId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"${ response Data . message Ġ?: Ġresponse Data . getCode Message () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Constants Message . T RO UBLE _ SHO OT ING } åĪĽå»º æŀĦå»º æľº æİ¥åı£ è¿ĶåĽŀ å¤±è´¥ : Ġ$ msg " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" [$ build Id ]| [$ vm Seq Id ] Ġcreate Ġbuilder Ġget ĠSocket TimeoutException ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage Ġ= ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ"${ Constants Message . T RO UBLE _ SHO OT ING } åĪĽå»º æŀĦå»º æľº æİ¥åı£ è¶ħæĹ¶ , Ġurl : Ġ$ url " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwait Container Running ( ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġbuild Id : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Seq Id : ĠString , ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġcontainer Name : ĠString ĊĠĠĠ Ġ): ĠB cs Builder Status Enum Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġloop @ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ- ĠstartTime Ġ> Ġ 1 0 Ġ* Ġ 6 0 Ġ* Ġ 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" dev Ġcloud Ġcontainer Ġstart Ġtimeout ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠB cs Builder Status Enum . ERROR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 Ġ* Ġ 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ è½® è¯¢ å®¹åĻ¨ çĬ¶æĢģ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Finish Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Response Ġ= Ġget Builder Detail ( build Id , Ġvm Seq Id , ĠuserId , Ġcontainer Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Response . is Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġstatus Response . data !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status . isRunning ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Finish Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Finish Ġ-> Ġcontinue @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" execute Ġjob Ġfailed , Ġmsg : Ġ$ status Response ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB cs Builder Status Enum . ERROR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠB cs Builder Status Enum . RUNNING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Websocket Url ( ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġstaff Name : ĠString , ĊĠĠĠĠĠĠĠ Ġbuilder Name : ĠString ĊĠĠĠ Ġ): ĠB cs Result < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"/ api / v 1 / devops / builder /$ builder Name / terminal " ĊĠĠĠĠĠĠĠ Ġlogger . info (" request Ġurl : Ġ$ url , Ġstaff Name : Ġ$ staff Name ") ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġclient Common . base Request ( staff Name , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOk http Utils . do Http ( request ). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Content Ġ= Ġresponse . body () !!. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" response : Ġ$ response Content ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthrow ĠOperation Exception (" Fail Ġto Ġget Ġcontainer Ġwebsocket ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . WEB SOCKET _ URL _ INTERFACE _ ERROR . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . WEB SOCKET _ URL _ INTERFACE _ ERROR . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . WEB SOCKET _ URL _ INTERFACE _ ERROR . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" èİ·åıĸ websocket æİ¥åı£ å¼Ĥå¸¸ ï¼Ī Fail Ġto Ġget Websocket , Ġhttp Ġresponse Ġcode : Ġ${ response . code () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb cs Result : ĠB cs Result < String > Ġ= ĠobjectMapper . readValue ( response Content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b cs Result . result Ġ== Ġnull Ġ|| Ġ! b cs Result . result !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( b cs Result . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġb cs Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" [$ projectId ]| [$ pipeline Id ] Ġbuilder Name : Ġ$ builder Name Ġget Websocket Url Ġfailed .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= ĠErrorCode Enum . WEB SOCKET _ URL _ INTERFACE _ ERROR . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠErrorCode Enum . WEB SOCKET _ URL _ INTERFACE _ ERROR . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage Ġ= ĠErrorCode Enum . WEB SOCKET _ URL _ INTERFACE _ ERROR . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" èİ·åıĸ çĻ»å½ķ è°ĥè¯ķ éĵ¾æİ¥ æİ¥åı£ è¶ħæĹ¶ , Ġurl : Ġ$ url , Ġ${ e . message }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild And Push Image ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġbuilder Name : ĠString , ĊĠĠĠĠĠĠĠ Ġb cs Build Image Req : ĠB cs Build Image Req ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġ"/ api / v 1 / devops / builder /$ builder Name / images " ĊĠĠĠĠĠĠĠ Ġlogger . info (" Build Ġand Ġpush Ġimage , Ġrequest Ġurl : Ġ$ url , Ġstaff Name : Ġ$ userId ") ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġclient Common . base Request ( userId , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. post ( RequestBody . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMediaType . parse (" application / json ; Ġcharset = utf - 8 "), ĠJson Util . toJson ( b cs Build Image Req ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOk http Utils . do Http ( request ). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Content Ġ= Ġresponse . body () !!. string () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ("$ userId Ġbuild Ġand Ġpush Ġimage Ġresponse : Ġ$ response Content ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! response . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ IMAGE _ INTERFACE _ ERROR . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ IMAGE _ INTERFACE _ ERROR . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ IMAGE _ INTERFACE _ ERROR . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" æŀĦå»º å¹¶ æİ¨ éĢģ æİ¥åı£ å¼Ĥå¸¸ ï¼Ī Fail Ġto Ġbuild Ġimage , Ġhttp Ġresponse Ġcode : Ġ${ response . code () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Data : ĠB cs Result < B cs Task Resp > Ġ= ĠobjectMapper . readValue ( response Content ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Data . is Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse Data . data !!. taskId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"${ response Data . message Ġ?: Ġresponse Data . getCode Message () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠErrorCode Enum . CREATE _ VM _ INTERFACE _ FAIL . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Constants Message . T RO UBLE _ SHO OT ING } Ġ æŀĦå»º å¹¶ éķľ åĥı æİ¥åı£ è¿ĶåĽŀ å¤±è´¥ : Ġ$ msg " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ("$ userId Ġbuilder Name : Ġ$ builder Name Ġbuild Ġand Ġpush Ġimage Ġfailed .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠBuild FailureException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Type Ġ= ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . error Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . errorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat ErrorMessage Ġ= ĠErrorCode Enum . VM _ STATUS _ INTERFACE _ ERROR . format ErrorMessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġ" æŀĦå»º å¹¶ æİ¨ éĢģ æİ¥åı£ è¶ħæĹ¶ , Ġurl : Ġ$ url " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ