/* Ċ Ġ* Ġ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 . pipeline Ċ Ċ import Ġcom . tencent . devops . common . api . exception . ErrorCode Exception Ċ import Ġcom . tencent . devops . common . api . util . Json Util Ċ import Ġcom . tencent . devops . common . pipeline . Model Ċ import Ġcom . tencent . devops . common . pipeline . container . Trigger Container Ċ import Ġcom . tencent . devops . common . pipeline . enums . Build Form PropertyType Ċ import Ġcom . tencent . devops . common . pipeline . enums . Channel Code Ċ import Ġcom . tencent . devops . common . pipeline . enums . Start Type Ċ import Ġcom . tencent . devops . common . pipeline . pojo . Build Parameters Ċ import Ġcom . tencent . devops . common . pipeline . pojo . element . Element Ċ import Ġcom . tencent . devops . common . pipeline . pojo . element . Element Base Info Ċ import Ġcom . tencent . devops . common . pipeline . pojo . element . market . Market Build Atom Element Ċ import Ġcom . tencent . devops . common . pipeline . pojo . element . market . Market Build Less Atom Element Ċ import Ġcom . tencent . devops . common . pipeline . pojo . element . quality . Quality Gate In Element Ċ import Ġcom . tencent . devops . common . pipeline . pojo . element . quality . Quality Gate Out Element Ċ import Ġcom . tencent . devops . common . pipeline . utils . Parameter Utils Ċ import Ġcom . tencent . devops . common . pipeline . utils . Skip Element Utils Ċ import Ġcom . tencent . devops . common . redis . concurrent . Simple Rate Limiter Ċ import Ġcom . tencent . devops . process . constant . Process Message Code Ċ import Ġcom . tencent . devops . process . engine . cfg . Model TaskId Generator Ċ import Ġcom . tencent . devops . process . engine . compatibility . Build Parameters Compatibility Transformer Ċ import Ġcom . tencent . devops . process . engine . interceptor . Intercept Data Ċ import Ġcom . tencent . devops . process . engine . interceptor . Pipeline Interceptor Chain Ċ import Ġcom . tencent . devops . process . engine . pojo . Pipeline Info Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Build Quality Service Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Element Service Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Repository Service Ċ import Ġcom . tencent . devops . process . engine . service . Pipeline Runtime Service Ċ import Ġcom . tencent . devops . process . engine . utils . Quality Utils Ċ import Ġcom . tencent . devops . process . service . Build Startup Param Service Ċ import Ġcom . tencent . devops . process . template . service . Template Service Ċ import Ġcom . tencent . devops . process . util . Build Msg Utils Ċ import Ġcom . tencent . devops . process . utils . BUILD _ NO Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ BUILD _ MSG Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ CREATE _ USER Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ NAME Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ RETRY _ COUNT Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ CHANNEL Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ MOB ILE Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ PARENT _ BUILD _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ PARENT _ BUILD _ TASK _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ PARENT _ PIPELINE _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ PIPELINE _ USER _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ TYPE Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ USER _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ USER _ NAME Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ START _ WEB HOOK _ USER _ ID Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ UPDATE _ USER Ċ import Ġcom . tencent . devops . process . utils . PIPELINE _ VERSION Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjavax . ws . rs . core . Response Ċ Ċ @ Suppress (" ALL ") Ċ @ Service Ċ class ĠPipeline Build Service ( ĊĠĠĠ Ġprivate Ġval Ġpipeline Interceptor Chain : ĠPipeline Interceptor Chain , ĊĠĠĠ Ġprivate Ġval Ġpipeline Repository Service : ĠPipeline Repository Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Runtime Service : ĠPipeline Runtime Service , ĊĠĠĠ Ġprivate Ġval Ġbuild Startup Param Service : ĠBuild Startup Param Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Build Quality Service : ĠPipeline Build Quality Service , ĊĠĠĠ Ġprivate Ġval Ġpipeline Element Service : ĠPipeline Element Service , ĊĠĠĠ Ġprivate Ġval Ġbuild Param Compatibility Transformer : ĠBuild Parameters Compatibility Transformer , ĊĠĠĠ Ġprivate Ġval Ġtemplate Service : ĠTemplate Service , ĊĠĠĠ Ġprivate Ġval Ġmodel TaskId Generator : ĠModel TaskId Generator , ĊĠĠĠ Ġprivate Ġval Ġsimple Rate Limiter : ĠSimple Rate Limiter Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Pipeline Build Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNO _ LIMIT _ CHANNEL Ġ= ĠlistOf ( Channel Code . CODE CC ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetModel ( pipeline Id : ĠString , Ġversion : ĠInt ? Ġ= Ġnull ) Ġ= ĊĠĠĠĠĠĠĠ Ġpipeline Repository Service . getModel ( pipeline Id , Ġversion ) Ġ?: Ġthrow ĠErrorCode Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= ĠResponse . Status . NOT _ FOUND . statusCode , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠProcess Message Code . ERROR _ PIPELINE _ MODEL _ NOT _ EXISTS , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Message Ġ= Ġ" æµģ æ°´ çº¿ ç¼ĸ æİĴ ä¸įåŃĺåľ¨ " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġsub Pipeline Startup ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġstart Type : ĠStart Type Ġ= ĠStart Type . PIPELINE , ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġparent Pipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġparent Build Id : ĠString , ĊĠĠĠĠĠĠĠ Ġparent TaskId : ĠString , ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġchannel Code : ĠChannel Code , ĊĠĠĠĠĠĠĠ Ġparameters : ĠMap < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġis Mobile : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġtrigger User : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġready To Build Pipeline Info Ġ= Ġpipeline Repository Service . get Pipeline Info ( projectId , Ġpipeline Id , Ġchannel Code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠErrorCode Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= ĠResponse . Status . NOT _ FOUND . statusCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠProcess Message Code . ERROR _ PIPELINE _ NOT _ EXISTS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Message Ġ= Ġ" æµģ æ°´ çº¿ ä¸įåŃĺåľ¨ ") ĊĊĠĠĠĠĠĠĠ Ġval Ġstart Epoch Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠgetModel ( pipeline Id Ġ= Ġpipeline Id , Ġversion Ġ= Ġready To Build Pipeline Info . version ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrigger Container Ġ= Ġmodel . stages [ 0 ]. containers [ 0 ] Ġas ĠTrigger Container ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Build Param Ġ= Ġmutable ListOf < Build Parameters >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Build Param . add ( Build Parameters ( key Ġ= ĠPI PE LINE _ START _ PIPELINE _ USER _ ID , Ġvalue Ġ= Ġtrigger User Ġ?: ĠuserId )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Build Param . add ( Build Parameters ( key Ġ= ĠPI PE LINE _ START _ PARENT _ PIPELINE _ ID , Ġvalue Ġ= Ġparent Pipeline Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Build Param . add ( Build Parameters ( key Ġ= ĠPI PE LINE _ START _ PARENT _ BUILD _ ID , Ġvalue Ġ= Ġparent Build Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Build Param . add ( Build Parameters ( key Ġ= ĠPI PE LINE _ START _ PARENT _ BUILD _ TASK _ ID , Ġvalue Ġ= Ġparent TaskId )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Build Param . add ( Build Parameters ( key Ġ= Ġit . key , Ġvalue Ġ= Ġit . value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Param Ġ= Ġmutable ListOf < Build Parameters >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrigger Container . params . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Param . add ( Build Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġit . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġit . defaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Type Ġ= Ġit . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreadOnly Ġ= Ġit . readOnly )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Params WithType Ġ= Ġbuild Param Compatibility Transformer . transform ( input Build Param , Ġdefault Param ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åŃĲ æµģ æ°´ çº¿ çļĦ è°ĥçĶ¨ ä¸į åıĹ é¢ĳ çİĩ éĻĲåĪ¶ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsub Build Id Ġ= Ġstart Pipeline ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġready To Build Pipeline Info . last Modify User , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġready To Build Pipeline Info Ġ= Ġready To Build Pipeline Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Type Ġ= Ġstart Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Params WithType Ġ= Ġstart Params WithType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchannel Code Ġ= Ġchannel Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Mobile Ġ= Ġis Mobile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġmodel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrequency Limit Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠæĽ´æĸ° çĪ¶ æµģ æ°´ çº¿ åħ³èģĶ åŃĲ æµģ æ°´ çº¿ æŀĦå»º id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Runtime Service . update Task Sub Build Id ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġparent Build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġparent TaskId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Build Id Ġ= Ġsub Build Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub ProjectId Ġ= Ġready To Build Pipeline Info . projectId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsub Build Id ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" It Ġtake (${ System . currentTimeMillis () Ġ- Ġstart Epoch }) ms Ġto Ġstart Ġsub - pipeline ($ pipeline Id )") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Pipeline ( ĊĠĠĠĠĠĠĠ ĠuserId : ĠString , ĊĠĠĠĠĠĠĠ Ġready To Build Pipeline Info : ĠPipeline Info , ĊĠĠĠĠĠĠĠ Ġstart Type : ĠStart Type , ĊĠĠĠĠĠĠĠ Ġstart Params WithType : ĠList < Build Parameters >, ĊĠĠĠĠĠĠĠ Ġchannel Code : ĠChannel Code , ĊĠĠĠĠĠĠĠ Ġis Mobile : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġmodel : ĠModel , ĊĠĠĠĠĠĠĠ Ġsign Pipeline Version : ĠInt ? Ġ= Ġnull , Ġ// ĠæĮĩå®ļ çļĦ çīĪæľ¬ ĊĠĠĠĠĠĠĠ Ġfrequency Limit : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġbuild No : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġstart Values : ĠMap < String , ĠString >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġhandle Post Flag : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpipeline Id Ġ= Ġready To Build Pipeline Info . pipeline Id ĊĠĠĠĠĠĠĠ Ġvar Ġacquire Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval ĠprojectId Ġ= Ġready To Build Pipeline Info . projectId ĊĠĠĠĠĠĠĠ Ġval Ġpipeline Setting Ġ= Ġpipeline Repository Service . get Setting ( pipeline Id ) ĊĠĠĠĠĠĠĠ Ġval Ġbucket Size Ġ= Ġpipeline Setting !!. max Con Running Queue Size ĊĠĠĠĠĠĠĠ Ġval Ġlock Key Ġ= Ġ" Pipeline RateLimit :$ pipeline Id " ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( frequency Limit Ġ&& Ġchannel Code Ġ! in ĠNO _ LIMIT _ CHANNEL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġacquire Ġ= Ġsimple Rate Limiter . acquire ( bucket Size , Ġlock Key Ġ= Ġlock Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! acquire ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= ĠProcess Message Code . ERROR _ START _ BUILD _ FREQ U ENT _ LIMIT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Message Ġ= Ġ" Frequency Ġlimit : Ġ$ bucket Size ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams Ġ= ĠarrayOf ( bucket Size . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġå¦Ĥæŀľ æĮĩå®ļ äºĨ çīĪæľ¬ åı· ï¼Į åĪĻ è®¾ç½® æĮĩå®ļçļĦ çīĪæľ¬ åı· ĊĠĠĠĠĠĠĠĠĠĠĠ Ġready To Build Pipeline Info . version Ġ= Ġsign Pipeline Version Ġ?: Ġready To Build Pipeline Info . version ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Params List Ġ= Ġstart Params WithType . to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Params Ġ= Ġstart Params List . associate Ġ{ Ġit . key Ġto Ġit . value Ġ}. to Mutable Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åıªæľī æĸ° æŀĦå»º æīį éľĢè¦ģ å¡« åħħ Post æıĴä»¶ ä¸İ è´¨ éĩı çº¢ çº¿ æıĴä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! start Params . containsKey ( PIPELINE _ RETRY _ COUNT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfill Element When New ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Ġ= Ġmodel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Values Ġ= Ġstart Values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Params List Ġ= Ġstart Params List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Params Ġ= Ġstart Params , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Post Flag Ġ= Ġhandle Post Flag ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintercept Result Ġ= Ġpipeline Interceptor Chain . filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInter cept Data ( pipeline Info Ġ= Ġready To Build Pipeline Info , Ġmodel Ġ= Ġmodel , Ġstart Type Ġ= Ġstart Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intercept Result . isNot Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åıĳéĢģ æİĴ éĺŁ å¤±è´¥ çļĦ äºĭä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstatusCode Ġ= ĠResponse . Status . NOT _ FOUND . statusCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġintercept Result . status . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Message Ġ= Ġ" Pipeline Ġstart Ġfailed : Ġ[ ${ intercept Result . message }] " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= Ġwhen Ġ( start Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStart Type . PIPELINE Ġ-> ĠParameter Utils . getList Value ByKey ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġstart Params List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠPI PE LINE _ START _ PIPELINE _ USER _ ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStart Type . WEB _ HOOK Ġ-> ĠParameter Utils . getList Value ByKey ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġstart Params List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠPI PE LINE _ START _ WEB HOOK _ USER _ ID ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStart Type . MAN UAL Ġ-> ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠuserId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Msg Ġ= ĠBuild Msg Utils . get Build Msg ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Msg Ġ= ĠParameter Utils . getList Value ByKey ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġstart Params WithType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠPI PE LINE _ BUILD _ MSG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġstart Type Ġ= Ġstart Type , Ġchannel Code Ġ= Ġchannel Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¢ŀåĬł å¯¹ containsKey ( PIPELINE _ NAME ) çļĦ éĢ»è¾ĳ åĪ¤æĸŃ , å¦Ĥæŀľ æľī ä¼ł åĢ¼ ï¼Į é»ĺè®¤ ä½¿çĶ¨ ãĢĤ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams WithType Ġ= Ġstart Params List . as Sequence (). plus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Parameters ( PIPELINE _ VERSION , Ġready To Build Pipeline Info . version )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ START _ USER _ ID , ĠuserId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ START _ TYPE , Ġstart Type . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ START _ CHANNEL , Ġchannel Code . name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ START _ MOB ILE , Ġis Mobile )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Values ?. containsKey ( PIPELINE _ NAME ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Parameters ( PIPELINE _ NAME , Ġstart Values [ PIPELINE _ NAME ]. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuild Parameters ( PIPELINE _ NAME , Ġready To Build Pipeline Info . pipeline Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ START _ USER _ NAME , ĠuserName Ġ?: ĠuserId )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ BUILD _ MSG , Ġbuild Msg )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ CREATE _ USER , Ġready To Build Pipeline Info . creator )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ UPDATE _ USER , Ġready To Build Pipeline Info . last Modify User )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. plus ( Build Parameters ( PIPELINE _ ID , Ġready To Build Pipeline Info . pipeline Id )). toList () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Id Ġ= Ġpipeline Runtime Service . start Build ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Info Ġ= Ġready To Build Pipeline Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfull Model Ġ= Ġmodel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Params WithType Ġ= Ġparams WithType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild No Ġ= Ġbuild No , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Num Rule Ġ= Ġpipeline Setting . build Num Rule ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĩį åĨĻ åĲ¯åĬ¨ åıĤæķ° ï¼Į èĭ¥ ä¸º æıĴä»¶ éĩį è¯ķ æŃ¤ å¤Ħ å°Ĩ åĨĻåħ¥ åĲ¯åĬ¨ åıĤæķ° çļĦ æľĢæĸ° æķ° åĢ¼ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Start Param Keys Ġ= Ġ( model . stages [ 0 ]. containers [ 0 ] Ġas ĠTrigger Container ). params . map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Startup Param Service . add Param ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġready To Build Pipeline Info . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġbuild Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam Ġ= ĠJson Util . toJson ( start Params . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Start Param Keys . contains ( it . key ) Ġ|| Ġit . key Ġ== ĠBUILD _ NO Ġ|| Ġit . key Ġ== ĠPI PE LINE _ BUILD _ MSG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġformatted Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æŀĦå»º è¿ĩç¨ĭä¸Ń åı¯ èİ·åıĸ æŀĦå»º åĲ¯åĬ¨ åıĤæķ° Ġ# 2 8 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Runtime Service . init Build Parameters ( build Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuild Id ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( acquire ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Rate Limiter . release ( lock Key Ġ= Ġlock Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfill Element When New ( ĊĠĠĠĠĠĠĠ Ġmodel : ĠModel , ĊĠĠĠĠĠĠĠ ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġstart Values : ĠMap < String , ĠString >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġstart Params List : ĠMutable List < Build Parameters >, ĊĠĠĠĠĠĠĠ Ġstart Params : ĠMutable Map < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġhandle Post Flag : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemplate Id Ġ= Ġif Ġ( model . instance From Template Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Service . get Template Id By Pipeline ( pipeline Id ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrule Match List Ġ= Ġpipeline Build Quality Service . get Match Rule List ( projectId , Ġpipeline Id , Ġtemplate Id ) ĊĠĠĠĠĠĠĠ Ġval Ġquality Rule Flag Ġ= Ġrule Match List . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġvar Ġbefore Element Set : ĠList < String >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġafter Element Set : ĠList < String >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġelement Rule Map : ĠMap < String , ĠList < Map < String , ĠAny >>> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( quality Rule Flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtriple Ġ= Ġpipeline Build Quality Service . generate Quality Rule Element ( rule Match List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Element Set Ġ= Ġtriple . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Element Set Ġ= Ġtriple . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Rule Map Ġ= Ġtriple . third ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġq a Set Ġ= Ġset Of ( Quality Gate In Element . class Type , ĠQuality Gate Out Element . class Type ) ĊĠĠĠĠĠĠĠ Ġmodel . stages . forEach Indexed Ġ{ Ġindex , Ġstage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach Indexed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage . containers . forEach Ġ{ Ġcontainer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Element List Ġ= Ġmutable ListOf < Element >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Element List Ġ= Ġcontainer . elements ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement ItemList Ġ= Ġmutable ListOf < Element Base Info >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Element List . forEach Indexed Ġnext Element @{ Ġelement Index , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ¸ ħ ç©º è´¨ éĩı çº¢ çº¿ çĽ¸åħ³ çļĦ element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . getClass Type () Ġin Ġq a Set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ nextElement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Values Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ä¼ĺåĮĸ å¾ªçİ¯ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠSkip Element Utils . get Skip Element Variable Name ( element . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Values [ key ] Ġ== Ġ" true ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Params List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= ĠBuild Parameters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġ" true ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Type Ġ= ĠBuild Form PropertyType . TEMP OR ARY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Params [ key ] Ġ= Ġ" true " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" [$ pipeline Id ]| ${ element . id }| ${ element . name } Ġwill Ġbe Ġskipped .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¤ĦçĲĨ è´¨ éĩı çº¢ çº¿ éĢ»è¾ĳ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! quality Rule Flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Element List . add ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠSkip Element Utils . get Skip Element Variable Name ( element . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġskip Ġ= Ġstart Params [ key ] Ġ== Ġ" true " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! skip Ġ&& Ġbefore Element Set !!. contains ( element . get Atom Code ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinsert Element Ġ= ĠQuality Utils . get Insert Element ( element , Ġelement Rule Map !! , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( insert Element Ġ!= Ġnull ) Ġfinal Element List . add ( insert Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Element List . add ( element ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! skip Ġ&& Ġafter Element Set !!. contains ( element . get Atom Code ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinsert Element Ġ= ĠQuality Utils . get Insert Element ( element , Ġelement Rule Map !! , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( insert Element Ġ!= Ġnull ) Ġfinal Element List . add ( insert Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handle Post Flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ å¤ĦçĲĨ æıĴä»¶ post éĢ»è¾ĳ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠMarket Build Atom Element Ġ|| Ġelement Ġis ĠMarket Build Less Atom Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġversion Ġ= Ġelement . version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġ" 1 .* " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġatom Code Ġ= Ġelement . get Atom Code () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġelement Id Ġ= Ġelement . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Id Ġ= Ġmodel TaskId Generator . getNext Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement ItemList . add ( Element Base Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Id Ġ= Ġelement Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Name Ġ= Ġelement . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġatom Code Ġ= Ġatom Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġversion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Job Index Ġ= Ġelement Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handle Post Flag Ġ&& Ġelement ItemList . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æł¡éªĮ æıĴä»¶ æĺ¯åĲ¦ èĥ½ æŃ£å¸¸ ä½¿çĶ¨ å¹¶ è¿ĶåĽŀ å¸¦ post å±ŀæĢ§ çļĦ æıĴä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Element Service . handle Post Elements ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= ĠprojectId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement ItemList Ġ= Ġelement ItemList , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal Element List Ġ= Ġoriginal Element List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Element List Ġ= Ġfinal Element List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Values Ġ= Ġstart Values , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Stage Ġ= Ġstage . finally ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( final Element List . size Ġ> Ġoriginal Element List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æľĢç»Ī çĶŁæĪĲ çļĦ åħĥç´ł éĽĨåĲĪ æ¯Ķ åİŁ åħĥç´ł éĽĨåĲĪ æķ°éĩı å¤ļ ï¼Į åĪĻ è¯´æĺİ åĮħåĲ« post ä»»åĬ¡ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . contain Post Task Flag Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . elements Ġ= Ġfinal Element List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ