package Ġcom . tencent . bk . devops . plugin . executor . docker Ċ Ċ import Ġcom . fasterxml . jackson . core . type . Type Reference Ċ import Ġcom . tencent . bk . devops . atom . utils . json . Json Util Ċ import Ġcom . tencent . bk . devops . plugin . exception . docker . Docker Pull Exception Ċ import Ġcom . tencent . bk . devops . plugin . pojo . docker . Docker Run Log Request Ċ import Ġcom . tencent . bk . devops . plugin . pojo . docker . Docker Run Log Response Ċ import Ġcom . tencent . bk . devops . plugin . pojo . docker . Docker Run Request Ċ import Ġcom . tencent . bk . devops . plugin . pojo . docker . Docker Run Response Ċ import Ġcom . tencent . bk . devops . plugin . pojo . docker . common . Docker Status Ċ import Ġcom . tencent . bk . devops . plugin . utils . script . Script Utils Ċ import Ġcom . tencent . bk . devops . plugin . utils . Machine Env Utils Ċ import Ġcom . tencent . bk . devops . plugin . utils . Param Utils . bei J 2 UTC Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . File Ċ import Ġjava . lang . StringBuilder Ċ Ċ object ĠThird Part Executor Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Third Part Executor :: class . java ) ĊĊĠĠĠ Ġfun Ġexecute ( param : ĠDocker Run Request ): ĠDocker Run Response Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( param ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Login ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Docker Pull ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Id Ġ= Ġdo Docker Run ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDocker Run Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextra Options Ġ= Ġmap Of (" start Timestamp " Ġto ĠSystem . currentTimeMillis (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" docker Container Id " Ġto Ġcontainer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Logout ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Docker Run ( param : ĠDocker Run Request ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdocker Workspace Ġ= Ġif Ġ( Machine Env Utils . get OS () Ġ== ĠMachine Env Utils . OS Type . WINDOWS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/" Ġ+ Ġparam . workspace . canonical Path . replace ("\\ ", Ġ"/ "). replace (" :", Ġ"") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam . workspace . canonical Path ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" docker Ġrun Ġ- d Ġ- v Ġ$ docker Workspace :$ docker Workspace Ġ${ get Env Var ( param . env Map )} Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ param . image Name } Ġ${ param . command . join ToString (" Ġ") }" ĊĠĠĠĠĠĠĠ Ġlogger . info (" execute Ġcommand : Ġ$ command ") ĊĠĠĠĠĠĠĠ Ġreturn ĠScript Utils . execute ( command , Ġparam . workspace ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Docker Pull ( param : ĠDocker Run Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpull Cmd Ġ= Ġ" docker Ġpull Ġ${ param . image Name }" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScript Utils . execute ( pull Cmd , Ġparam . workspace ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDocker Pull Exception ( e . message Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Env Var ( env Map : ĠMap < String , ĠString >? ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġenv Map ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . append ("-- env Ġ${ it . key } =${ it . value } Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcommand . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Logs ( param : ĠDocker Run Log Request ): ĠDocker Run Log Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Timestamp Ġ= Ġparam . extra Options [" start Timestamp "] ?. to Long () Ġ?: Ġthrow ĠRuntimeException (" start Timestamp Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Id Ġ= Ġparam . extra Options [" docker Container Id "] Ġ?: Ġthrow ĠRuntimeException (" docker Container Id Ġis Ġnull ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstatus Pair Ġ= Ġget Container Status ( container Id , Ġparam . workspace ) ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġstatus Pair . first ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= Ġif Ġ( status Ġ== ĠDocker Status . running ) Ġbei J 2 UTC ( start Timestamp ) Ġelse Ġstatus Pair . second ĊĠĠĠĠĠĠĠ Ġval Ġpre StartTime Ġ= Ġbei J 2 UTC ( start Timestamp Ġ- Ġparam . time Gap ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġfail To Get Log Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar ĠerrorMessage Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġlog Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" docker Ġlogs Ġ-- until =\" $ startTime \" Ġ-- since =\" $ pre StartTime \" Ġ$ container Id " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScript Utils . execute ( command , Ġparam . workspace , Ġprint Log Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e Ġ: Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġe . message Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail To Get Log Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠDocker Status . running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fail To Get Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" fail Ġto Ġget Ġlog : Ġ$ errorMessage ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġ" docker Ġlogs Ġ$ container Id " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= ĠScript Utils . execute ( command , Ġparam . workspace , Ġprint Log Ġ= Ġfalse , Ġfail Exit Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Rm ( container Id , Ġparam . workspace ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDocker Run Log Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog Ġ= ĠlistOf ( log ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" get Ġlog ...", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Options Ġ= Ġparam . extra Options . plus ( map Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" start Timestamp " Ġto Ġ( start Timestamp Ġ+ Ġparam . time Gap ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Container Status ( container Id : ĠString , Ġworkspace : ĠFile ): ĠPair < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinspect Result Ġ= ĠScript Utils . execute ( script Ġ= Ġ" docker Ġinspect Ġ$ container Id ", Ġdir Ġ= Ġworkspace , Ġprint Log Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġinspect Map Ġ= ĠJson Util . fromJson ( inspect Result , Ġobject Ġ: ĠType Reference < List < Map < String , ĠAny >> >() Ġ{}). first () ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġinspect Map [" State "] Ġas ĠMap < String , ĠAny > ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġstate [" Status "] Ġas ĠString ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ" running ") Ġreturn ĠPair ( Docker Status . running , Ġ"") ĊĊĠĠĠĠĠĠĠ Ġval Ġexit Code Ġ= Ġstate [" ExitCode "] Ġas ĠInt ĊĊĠĠĠĠĠĠĠ Ġval Ġfinished At Ġ= Ġstate [" Finished At "] Ġas ĠString ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( exit Code Ġ!= Ġ 0 ) ĠPair ( Docker Status . failure , Ġfinished At ) ĊĠĠĠĠĠĠĠ Ġelse ĠPair ( Docker Status . success , Ġfinished At ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdocker Rm ( container Id : ĠString , Ġworkspace : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcmd Ġ= Ġ" docker Ġrm Ġ$ container Id " ĊĠĠĠĠĠĠĠ Ġlogger . info ("[ execute Ġscript ]: Ġ$ cmd ") ĊĠĠĠĠĠĠĠ ĠScript Utils . execute ( script Ġ= Ġcmd , Ġdir Ġ= Ġworkspace , Ġfail Exit Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdocker Login ( param : ĠDocker Run Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( param . docker Login Username . isNull Or Blank ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġparam . docker Login Username ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġparam . docker Login Password ĊĠĠĠĠĠĠĠ Ġval Ġlogin Host Ġ= Ġparam . image Name . split ("/ "). first () ĊĠĠĠĠĠĠĠ Ġ// ĠWARNING ! ĠUsing Ġ-- password Ġvia Ġthe ĠCLI Ġis Ġin secure . ĠUse Ġ-- password - stdin . ĊĠĠĠĠĠĠĠ Ġval Ġcommand Str Ġ= Ġ" docker Ġlogin Ġ$ login Host Ġ-- username Ġ$ username Ġ-- password Ġ$ password " ĊĠĠĠĠĠĠĠ Ġlogger . info ("[ execute Ġscript ]: Ġ" Ġ+ ĠString . format (" docker Ġlogin Ġ% s Ġ-- username Ġ% s Ġ Ġ-- password Ġ*** ", Ġlogin Host , Ġusername )) ĊĠĠĠĠĠĠĠ ĠScript Utils . execute ( command Str , Ġparam . workspace ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdocker Logout ( param : ĠDocker Run Request ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( param . docker Login Username . isNull Or Blank ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġlogin Host Ġ= Ġparam . image Name . split ("/ "). first () ĊĠĠĠĠĠĠĠ Ġval Ġcommand Str Ġ= Ġ" docker Ġlogout Ġ$ login Host " ĊĠĠĠĠĠĠĠ Ġlogger . info ("[ execute Ġscript ]: Ġ$ command Str ") ĊĠĠĠĠĠĠĠ ĠScript Utils . execute ( command Str , Ġparam . workspace ) ĊĠĠĠ Ġ} Ċ }