/* Ċ Ġ* Ġ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 . agent Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . tencent . devops . agent . runner . Work Runner Ċ import Ġcom . tencent . devops . common . api . enums . Enum Loader Ċ import Ġcom . tencent . devops . common . api . util . DH Util Ċ import Ġcom . tencent . devops . common . api . util . Ok http Utils Ċ import Ġcom . tencent . devops . common . pipeline . Element SubType Register Loader Ċ import Ġcom . tencent . devops . worker . common . AGENT _ ID Ċ import Ġcom . tencent . devops . worker . common . AGENT _ SECRET _ KEY Ċ import Ġcom . tencent . devops . worker . common . BUILD _ TYPE Ċ import Ġcom . tencent . devops . worker . common . Runner Ċ import Ġcom . tencent . devops . worker . common . Workspace Interface Ċ import Ġcom . tencent . devops . worker . common . api . Api Factory Ċ import Ġcom . tencent . devops . worker . common . env . Build Type Ċ import Ġcom . tencent . devops . worker . common . env . Docker Env Ċ import Ġcom . tencent . devops . worker . common . task . Task Factory Ċ import Ġcom . tencent . devops . worker . common . utils . Workspace Utils Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ import Ġjava . io . File Ċ import Ġjava . time . LocalDateTime Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġ// Ġ è°ĥçĶ¨ ĠDH Util ĠåĪĿå§ĭåĮĸ ĠSecurity Provider ĊĠĠĠ ĠDH Util ĊĠĠĠ ĠEnum Loader . enum Modified () ĊĠĠĠ ĠElement SubType Register Loader . register Element For Json Util () ĊĠĠĠ ĠApi Factory . init () ĊĠĠĠ ĠTask Factory . init () ĊĠĠĠ Ġval Ġbuild Type Ġ= ĠSystem . getProperty ( BUILD _ TYPE ) ĊĠĠĠ Ġwhen Ġ( build Type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBuild Type . DOCKER . name Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Pool Type Ġ= ĠDocker Env . get Job Pool () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æĹł ç¼ĸè¯ĳ æŀĦå»º ï¼Į è½® è¯¢ çŃīå¾ħ ä»»åĬ¡ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( job Pool Type Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Pool Type Ġ== Ġ" BUILD _ LESS " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwait Build Less Job Start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠRunner . run ( object Ġ: ĠWorkspace Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Workspace And Log Dir ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠPair < File , ĠFile > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworkspace Ġ= ĠSystem . getProperty (" devops _ workspace ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworkspace Dir Ġ= Ġif Ġ( workspace . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ("/ data / devops / workspace ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( workspace ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkspace Dir . mkdir s () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Path Dir Ġ= ĠWorkspace Utils . get Pipeline Log Dir ( pipeline Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( workspace Dir , Ġlog Path Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠBuild Type . WORK ER . name Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRunner . run ( object Ġ: ĠWorkspace Interface Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Workspace And Log Dir ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠPair < File , ĠFile > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworkspace Dir Ġ= ĠWorkspace Utils . get Pipeline Workspace ( pipeline Id , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( workspace Dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! workspace Dir . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Work Ġspace Ġdirectory Ġconflict : Ġ${ workspace Dir . canonical Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkspace Dir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Path Dir Ġ= ĠWorkspace Utils . get Pipeline Log Dir ( pipeline Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( workspace Dir , Ġlog Path Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠBuild Type . AGENT . name Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWork Runner . execute ( args ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( build Type . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" The Ġbuild Ġtype Ġis Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unknown Ġbuild Ġtype Ġ- Ġ$ build Type ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġwait Build Less Job Start () Ġ{ ĊĠĠĠ Ġvar Ġstart Flag Ġ= Ġfalse ĊĠĠĠ Ġval Ġdocker Host Ip Ġ= ĠDocker Env . get Docker Host Ip () ĊĠĠĠ Ġval Ġdocker Host Port Ġ= ĠInteger . valueOf ( Docker Env . get Docker Host Port ()) ĊĠĠĠ Ġval Ġhostname Ġ= ĠDocker Env . get Hostname () ĊĠĠĠ Ġval Ġloop Url Ġ= Ġ" http :// $ docker Host Ip :$ docker Host Port / api / build / task / claim ? container Id =$ hostname " ĊĊĠĠĠ Ġval Ġrequest Ġ= ĠRequest . Builder () ĊĠĠĠĠĠĠĠ Ġ. url ( loop Url ) ĊĠĠĠĠĠĠĠ Ġ. header (" Accept ", Ġ" application / json ") ĊĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ("${ LocalDateTime . now ()} ĠBuild Less Ġloop Url : Ġ$ loop Url ") ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOk http Utils . do Http ( request ). use Ġ{ Ġresp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Flag Ġ= Ġdo Response ( resp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ LocalDateTime . now ()} ĠGet Ġbuild Less Task Ġerror . Ġcontinue Ġloop ... Ġ\ n ${ e . stack Trace }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! start Flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġwhile Ġ(! start Flag ) Ċ } Ċ Ċ private Ġfun Ġdo Response ( ĊĠĠĠ Ġresp : ĠResponse Ċ ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġresponse Str Ġ= Ġresp . body ()?. string () Ġ?: Ġ"" ĊĠĠĠ Ġreturn Ġif Ġ( resp . is Successful Ġ&& Ġresponse Str . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuild Less Task : ĠMap < String , ĠString > Ġ= Ġj ack son ObjectMapper (). readValue ( response Str ) ĊĠĠĠĠĠĠĠ Ġbuild Less Task . forEach Ġ{ Ġ( t , Ġu ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( t ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" agent Id " Ġ-> ĠSystem . setProperty ( AGENT _ ID , Ġu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" secret Key " Ġ-> ĠSystem . setProperty ( AGENT _ SECRET _ KEY , Ġu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" projectId " Ġ-> ĠSystem . setProperty (" devops _ project _ id ", Ġu ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln ("${ LocalDateTime . now ()} ĠNo Ġbuild Less Task , Ġresp : Ġ${ resp . body ()} Ġcontinue Ġloop ...") ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ