Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¸ßЧ¿Í»§¶Ë³ÖÐø¼¯³Éʵ¼ù֮·
 
  2422  次浏览      27
2019-2-25 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚit168£¬,Ö÷Òª½éÉÜÁËÒÔiOS¶àbundleµÄ¹¤³ÌΪÀý£¬½²½âÏÂÈçºÎÓÃSpringBoot¡¢VueʵÏÖ³ÖÐø¼¯³É·½°¸£¬½«ÐèÇó - ´úÂë - ²âÊÔ¹ØÁª£¬×öµ½´úÂë½á¹¹»¯²¢³ÖÐø¼¯³É¡£

±³¾°

Ãô½Ý¿ª·¢ÒÔÓû§µÄÐèÇó½ø»¯ÎªºËÐÄ£¬²ÉÓõü´ú¡¢Ñ­Ðò½¥½øµÄ·½·¨½øÐÐÈí¼þ¿ª·¢¡£ÏÐÓãĿǰ²ÉÓÃÓ¾µÀÈÎÎñģʽ½øÐеü´ú¿ª·¢£¬¿ª·¢ÖÜÆÚÊÇÁ½ÖÜÒ»¸ö°æ±¾£¬·¢°æÆµÂʱȽϸߣ¬²¢Ðпª·¢µÄÒµÎñÐèÇóÓֺܶ࣬Ôõô²ÅÄܸßЧµÄµü´ú¿ª·¢?²âÊÔ×ÊÔ´Ïà¶Ô½ôȱ£¬ÈçºÎ±£Ö¤¿Í»§¶ËµÄÑз¢ÖÊÁ¿?ÓÚ´Ëͬʱ£¬µü´ú¹ý³ÌÖУ¬¹¹½¨¡¢¼¯³ÉÒÔ¼°²âÊÔ¶¼ÐèÒªÈ˹¤¸ÉÔ¤£¬¹µÍ¨³É±¾ºÍ³ö´í¸ÅÂʶ¼±È½Ï¸ß¡£

ÈçºÎÓÐЧµÄ½â¾öÉÏÃæÕâЩÎÊÌâ?Ê×ÏÈÏëµ½µÄÊdzÖÐø¼¯³É£¬Äܹ»×öµ½×Ô¶¯»¯¡¢¼¯³É²âÊԺͼ°Ê±·´À¡ÎÊÌ⣬²ÅÄܼõÉÙ¿ª·¢ºÍ²âÊԵijɱ¾£¬Ìá¸ßÍŶӵŤ³ÌÄÜЧ¡£ÏÐÓãÔÚ¿Í»§¶Ë³ÖÐø¼¯³É·½°¸ÉÏÃæ×öÁËЩ̽Ë÷ºÍʵ¼ù£¬±¾ÎÄÖ÷ÒªÒÔiOS¶àbundleµÄ¹¤³ÌΪÀý£¬½²½âÏÂÈçºÎÓÃSpringBoot¡¢VueʵÏÖ³ÖÐø¼¯³É·½°¸£¬½«ÐèÇó - ´úÂë - ²âÊÔ¹ØÁª£¬×öµ½´úÂë½á¹¹»¯²¢³ÖÐø¼¯³É¡£

1. Êý¾ÝÄ£ÐÍ

1.1 Ó¾µÀÄ£ÐÍ

Ê×ÏÈ£¬ÈÃÎÒÃÇÀ´¿´ÏÂÓ¾µÀÄ£ÐÍ£¬ÈÃÎÒÃǶÔËûÓиö´óÌåÁ˽⡣ÏÈÀ´¿´Ò»ÕÅͼ£º

ÕâÊÇ´ó¼Ò³£ÓõÄgit flowÄ£ÐÍ£¬¼¯³É·ÖÖ§¾ÍÊÇdevelop£¬Èç¹ûÐèÒª¿ª·¢ÐèÇ󣬾ʹӼ¯³É·ÖÖ§À­³ö¶ÔÓ¦µÄÌØÐÔ·ÖÖ§Feature£¬µÈ¿ª·¢½áÊø£¬ÔÙ½«FeatureºÏ²¢»Ødevelop·ÖÖ§£¬¼¯³É·ÖÖ§²âÊÔͨ¹ýµÄ»°£¬ÔÙÀ­³ö·¢²¼·ÖÖ§Release£¬ÓÉÓÚmaster·ÖÖ§²»ÊǺܳ£Óã¬ËùÒÔÔÚÏÐÓãÕâ±ßÔÝʱûÓá£

ÕâÊǵ¥¸ö¿âµÄÇé¿ö£¬¶¼±È½ÏºÃÀí½â£¬Ç°Ãæ±³¾°Ò²½éÉܹý£¬iOSµÄ¹¤³ÌÔÚ²ð¿â£¬²ð¿âµÄÇé¿ö´óÖÂÈçÏ£º

iOS»áÓÐÒ»¸öÖ÷¹¤³ÌÀ´¹ÜÀíÕâЩ×ӿ⣬ÕâÊÇ8¸ö×ӿ⣬Íâ¼ÓÒ»¸öÖ÷¹¤³Ì£¬Ò²¾ÍÒâζ×Å»áÓÐ9¸ögitµØÖ·£¬ÔÚ¿ª·¢ÐèÇóµÄʱºò£¬Ö÷Òª¸Ä¶¯µÄbundle¼¯ÖÐÔÚ£ºIFMatrix¡¢IFContainer;Èç¹û¸Ä¶¯µÄ¿âÒ»¶à£¬ÄǾÍÒâζ×Åÿ¸ö¿â¶¼ÐèÒªÀ­³öÒ»¸öFeature·ÖÖ§¡£µÈ²Ù×÷ÍêÁË£¬ÔÙ½øÐкϲ¢µ½Develop·ÖÖ§£¬ÓÖÊÇÒ»¸ö²»Ð¡µÄ¹¤×÷Á¿¡£

ÉÏÃæÖ»ÊǽéÉÜÁËÒ»¸öÐèÇóµÄÇé¿ö£¬Èç¹ûÓÐn¸öÐèÇ󣬶ÔÓÚ¼¯³ÉÈËÔ±À´Ëµ£¬¾ÍÊÇ9*nµÄ¹¤×÷Á¿¡£Õâ¸öÖ»ÊÇiOS¹¤³Ì£¬»¹ÓÐÒ»¸öandroid¹¤³Ì£¬ÒÔºó¿ÉÄÜ»¹ÓÐweexµÄ¡¢flutterµÄ£¬×µÄÇé¿ö£¬¹¤×÷Á¿¾ÍÊÇ4*9*n£¬ÏàÐŶÔÓÚÈκÎÒ»¸ö¿ª·¢/²âÊÔ/PM£¬¶¼ÊÇÒ»¸ö²»Ð¡µÄÌôÕ½¡£

ËùÒÔ£¬×Ô¶¯¼¯³É¶ÔÓÚÏÐÓãÀ´Ëµ£¬ÆÈÔÚü½Þ£¬ÒªÏë×ö¿Í»§¶Ë×Ô¶¯¼¯³É£¬°ÚÔÚÎÒÃÇÃæÇ°ÓÐÕâô¼¸¸öÎÊÌ⣺

¶à¸öÐèÇó£¬Ôõô²ÅÄܱ£Ö¤ÓÐÌõ²»ÎɵÉ?

ÈçºÎ³ÖÐø¼¯³É£¬·½°¸Ó¦¸ÃÈçºÎÉè¼Æ?

¼¯³É½áÊø£¬ÔõÑù´¥·¢²âÊÔ?

ÈÃÎÒÃÇÏÈÀ´¿´Ï¿ª·¢¹ý³Ì±ê×¼»¯£¬½«ÐèÇó¡¢´úÂë¡¢¼¯³É¹ØÁªÆðÀ´£¬×öµ½´ÓÔ´Í·µ½½áβµÄ×Ô¶¯»¯¡£

1.2 ¹ØÁªÐèÇóºÍ´úÂë

ÐèÇó¶¼ÊÇÔÚAoneƽ̨ÉÏÃæÀ´¹ÜÀíµÄ£¬Ã¿¸öÐèÇó¶¼¶ÔÓ¦ÓÐÒ»¸öid£¬Ôõô½«ÐèÇó¸ú´úÂë¹ØÁª?

×¢£ºAoneÊÇÒ»¸öÐèÇó¹ÜÀíÆ½Ì¨

ÏÐÓãµÄ½â¾ö·½°¸ÊÇ£ºÔÚgitÌá½»commitÖУ¬Ìí¼ÓÉÏÐèÇóµÄÐÅÏ¢£¬±ÈÈçÐèÇóµÄid¡£ÊµÏÖµÄÔ­Àí¾ÍÊÇÀ¹½Øgit commitʼþ£¬È»ºó½«Ïà¹ØµÄÐèÇóÌí¼Óµ½commetÖУ¬½ÓÏÂÀ´µÄÎÊÌâ¾ÍÊÇÔõôȡµ½Ïà¹ØÐèÇóµÄÐÅÏ¢?

ÓÐ2¸ö·½·¨£º

ͳһ·ÖÖ§ÃüÃû¹æ·¶£¬ÀýÈçtask/task_<AoneId>_<desc>

Ìá½»µÄʱºòÖ÷¶¯ÊäÈëÐèÇóÐÅÏ¢£¬ÀýÈç fix ##<AoneId>

ÕâÑùÔÚÌá½»µÄʱºò£¬¾Í¿ÉÒÔ»ñÈ¡µ½<AondId>£¬×îÖÕ½«´úÂëºÍÐèÇó¹ØÁªÆðÀ´£¬½á¹ûÈçÏÂͼËùʾ£º

µÚ2ÐоÍÊǹØÁªÐèÇóµÄÁ´½Ó£¬Ã¿¸öcommitÉÏÃæ¾ÍЯ´øÁËÐèÇóµÄÐÅÏ¢£¬Ö÷ÒªÊÇΪÁ˺óÃæ¶¨Î»²âÊÔ·¶Î§¡£Õâ¸öÐèÇóÔÚ²âÊÔͨ¹ýºó£¬¿ÉÒÔ¼àÌýÐèÇó״̬±ä¸üµÄmetaqÏûÏ¢£¬ÏȺϲ¢·ÖÖ§´úÂ룬ÔÙ×Ô¶¯É¾³ý·ÖÖ§¡£

¹ØÁªÐèÇóºÍ´úÂ룬ÏêÇé¿É²Î¿¼ÕâÆªÎÄÕ£ºHook GitʵÏÖ´úÂëÓëÐèÇóµÄÒ»ÖÂÐÔ

1.3 ¹ØÁªÐèÇóºÍ¼¯³ÉÏî

Ç°ÃæÒ²½»´ú¹ý±³¾°£¬ÏÐÓã²âÊÔ×éÆÚÍûÊÇÄÜ×öµ½¿ª·¢½×¶ÎºÍ¼¯³É½×¶Î¶¼ÄÜ´¥·¢Ïà¹ØµÄ¼¯³ÉºÍ²âÊÔ¼þ£¬Õâ¾ÍÒªÇóÎÒÃÇ£¬Òª×öµ½ÐèÇóÓ뼯³ÉÏî¹ØÁªÆðÀ´£¬Ò»¸öÐèÇó¶ÔÓ¦Ò»¸öĦÌìÂÖµÄÏîÄ¿¡£

×¢£ºÄ¦ÌìÂÖÊÇÒ»¸ö¹¹½¨Æ½Ì¨£¬¿ÉÒÔÅäÖÃÏà¹ØµÄÄ£¿éÒÀÀµ

ÔÚÊý¾Ý¿âÖУ¬¾Í¿ÉÒÔ½«²úÆ· - ÐèÇó - ĦÌìÂÖÏîÄ¿¹ØÁªÆðÀ´£¬Ã¿¸öprojectId¾Í¶ÔÓ¦Ò»¸öĦÌìÂÖµÄÏîÄ¿£¬Ã¿¸öĦÌìÂÖÏîÄ¿»á¶ÔÓ¦ºÜ¶à¸öÅäÖÃÏÊý¾Ý¿âÖоÍÓÐÁ˼¯³ÉÏîµÄÊý¾Ý¹ØÏµ£¬°üÀ¨¹¤³ÌÖ®¼äµÄÒÀÀµ¹ØÏµ¡£

½ÓÏÂÀ´µÚ2¸öÎÊÌ⣺ÈçºÎ³ÖÐø»¯¼¯³É£¬·½°¸Ó¦¸ÃÈçºÎÉè¼Æ?

2. ×Ô¶¯¼¯³É¿ò¼Ü

Êý¾ÝÖÐÒѾ­´æ´¢ÁËÐèÇó - ĦÌìÂÖÏîÄ¿µÄ¹ØÏµ£¬Ôõô½«¹ØÁªµÄ´úÂëÓ¦ÓÃÆðÀ´µÄ£¬×öµ½¿É³ÖÐø¼¯³É?ÏÐÓãĿǰ²ÉÓÃwebservice³ÐÔØ·þÎñÖ®¼äµÄ´®Áª£¬ÐγÉÁËÒ»¸öpiplineģʽ¡£

2.1 ƽ̨¼Ü¹¹

´Ëƽ̨ʹÓÃspringboot´î½¨£¬²ÉÓÃǰºó¶Ë·ÖÀëµÄÉè¼Æ£¬·þÎñ¶Ë¶ÔÍⱩ¶µÄ½Ó¿Ú¶¼ÊÇrestful£¬Ç°¶ËÓÃVue±àд£¬Í¨¹ýaxios·¢ËÍAJAXÇëÇóÓë·þÎñ¶ËͨѶ¡£ÐÅÏ¢À´Ô´³ýÁËgitlab¡¢Ä¦ÌìÂÖºÍAoneƽ̨֮Í⣬»¹»áÔÚ±¾µØÊý¾Ý¿â´æ´¢Ò»·Ý¹ØÏµÓ³Éä±í¡£

Õâ¸öͼÖУ¬¿ÉÒÔ¿´µ½Ö÷Òª·Ö³É¼¸¸ö´ó¿é£ºÊý¾Ý²ã¡¢ÒµÎñ²ã¡¢½Ó¿Ú²ãºÍǰ¶ËUI+¿Í»§¶Ë¡£Õû¸öƽ̨ËãÊÇÒ»¸ö´óµÄ¿Í»§¶Ë£¬ËùÒÔÕë¶Ôgitlab»ù´¡·þÎñ¡¢MTL»ù´¡·þÎñ¡¢Aone»ù´¡·þÎñºÍJenkins»ù´¡·þÎñ¶¼×÷Ϊһ¸öÊý¾Ý²ã¡£±¾µØµÄÊý¾Ý¿â£¬Ö÷Òª±£´æÐèÇó - ´úÂë - ´ò°üµÄÓ³Éä¹ØÏµ£¬±ÈÈç×Ó¿âµÄ´úÂë±ä¸ü£¬ÐèÒª´¥·¢Ä¦ÌìÂÖ¹¤³Ì´ò°ü£¬ÐèÒª·´Ïò²éÕÒ¡£

´Ë·þÎñÔÚÈÕ³£»·¾³µÄһ̨·þÎñÆ÷£¬µ«ÊÇ»áÁíÍâÒ»¸öÎÊÌ⣺ĦÌìÂÖÊÇÔÚÔ¤·¢»·¾³µÄ£¬ÈÕ³£»·¾³ºÍÔ¤·¢»·¾³±¾ÉíÊÇÍøÂç¸ôÀëµÄ£¬Ò²¾ÍÎÞ·¨Ö±½Óµ÷ÓÃĦÌì·ÌṩµÄhsf·þÎñ¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇÔÚÔ¤·¢»·¾³£¬´î½¨ÁËÒ»Ì×ÇŽӷþÎñ£¬Í¨¹ývipserverÀ´ÖÐת·þÎñ¡£

2.2 ʼþÇý¶¯

Õû¸öƽ̨ÊÇÓÉʼþÇý¶¯£¬Ö÷Òª·Ö3²¿·Ö£ºMerge Request¡¢Gitlab PushºÍ»úе´¥·¢(°üÀ¨ÊÖ¹¤¡¢¶¨Ê±)¡£

GitlabÌṩÁ˺ÜÈËÐÔ»¯µÄ½Ó¿Ú£¬¿ÉÒÔ¼àÌýµ½´úÂëµÄ±ä¸ü£¬ÅäÖ÷½·¨Ò²ºÜ¼òµ¥£¬¼ûÏÂͼ£º

Ö÷Òª´¦ÀíµÄÊÇpush eventºÍmerge request£¬Æ½Ì¨Ìṩһ¸öpostµÄrestfullµÄ½Ó¿Ú£¬È»ºóÅäÖÃÔÚgitlabÏîÄ¿ÀïÃæ£¬¾Í¿ÉÒÔ¼àÌýµ½´úÂë±ä¸ü¡£

/**
¡¡¡¡* ¼à¿Øgitlab webhookµÄÖ÷Èë¿Ú
¡¡¡¡* @param payload
¡¡¡¡*/@RequestMapping(value = "webhook", method = RequestMethod.POST)public void webhooks(@RequestBody String payload) {

¡¡¡¡logger.info(payload);
¡¡¡¡GitlabHookEvent event = JSON.parseObject(payload, GitlabHookEvent.class);
¡¡¡¡eventService.dispatchGitlabEvent(event);
¡¡¡¡}

×¢£ºgitlabµÄpushºÍmergeʼþ»áÓÐÖØ¸´·¢Ë͵ÄÇé¿ö£¬ËùÒÔÐèÒª×öÒ»ÏÂÈ¥ÖØµÄ´¦Àí

ÔÚÕâ±ß»á½âÎö³öGitlabHookEvent£¬È»ºóÔÙÓÉGitlabEventServiceÈ¥·Ö·¢£¬ÔÙÓɼ¯³ÉÄ£¿éÈ¥´¥·¢´ò°ü£¬ÄǾÍÈÃÎÒÃÇÀ´¿´Ï³ÖÐø´ò°üµÄ½â¾ö·½°¸¡£

2.3 ³ÖÐø´ò°ü

³ÖÐø¹¹½¨£¬ÓÅÏÈÒª½â¾öµÄÊÇbundleÖ®¼äµÄÒÀÀµ£¬ÏÖÔÚÖ»Ö§³Öµ¥ÏîÒÀÀµµÄ´¦Àí£¬Ó³Éä¹ØÏµ»áÔÚÊý¾Ý¿âÖлᱣ´æÒ»·Ý£¬µ±ÐèÒª´¥·¢Ò»¸öĦÌìÂÖÏîÄ¿¹¹½¨£¬¾Í¿ÉÒÔ½âÎö³öËü¶ÔÓ¦µÄÒÀÀµ¿â¡£Ö÷ÌåÁ÷³ÌÈçÏÂͼËùʾ£º

ͨ³£Çé¿öÏ£¬×Óbundle»á¸Ä¶¯¶à¸ö£¬Äõ½ÐèÒª¹¹½¨µÄ×ÓbundleÁбíÖ®ºó£¬Ïȼì²â×ÓbundleÊÇ·ñÐèÒªÖØÐ´ò°ü£¬¼ì²â¹æÔò£º¿ÉÒÔ¸ù¾Ý×îºóÒ»´ÎcommitÐÅÏ¢ºÍÉÏÒ»´Î¼¯³É³É¹¦µÄʱ¼ä²î£¬Èç¹û²îÖµ´óÓÚÒ»¸öãÐÖµ£¬±íÃ÷²»ÐèÒªÖØÐ´ò°ü;·ñÔò¼ÓÈëµ½´ò°ü¶ÓÁÐÀïÃæ¡£

Ö÷¹¤³Ì+×ÓbundleµÄÒ»¸ö¼¯ºÏ×÷Ϊһ¸öÕûÌ弯³ÉÈÎÎñ£¬Ìí¼Óµ½´ò°üÈÎÎñ¶ÓÁÐÀïÃæ£¬ÓÉÓÚû°ì·¨»ñÈ¡µ½Ä¦ÌìÂÖ´ò°ü³É¹¦µÄmetaqÏûÏ¢µÄ»Øµ÷£¬Ö»ÄÜÈ¥ÂÖѯ½á¹û¡£Ïȼì²â×ÓbundleÊÇ·ñÒѾ­½áÊø£¬Èç¹ûÒѾ­½áÊø£¬Ôò´¥·¢Ö÷¹¤³ÌµÄ´ò°ü;Èç¹ûûÓÐ×ÓbundleÔÚ´ò°ü£¬¾Í¼ì²éÖ÷¹¤³ÌÊÇ·ñ½áÊø¡£

private void triggerMTLBuildInterval(FMPackageTask task, MTLProduct product, int mtlProjectId){// ·ÖÎö×ÓÄ£¿é
ArrayList<MTLBuildConfig> modulesConfigs = gitlabMTLBridge.getModuleBuildConfigList(mtlProjectId);if (modulesConfigs != null) {for (MTLBuildConfig moduleConfig : modulesConfigs) {boolean rebuild = isNeedRebuildForConfig(moduleConfig);if (!rebuild) {continue;
¡¡¡¡}// ¼ì²âµ±Ç°ÊÇ·ñÔÚ´ò°ü£¬Èç¹ûÔÙ´ò°ü£¬ÐèҪȡÏûµ±Ç°µÄ±àÒë
¡¡¡¡MTLBuildResult latestBuildResult = mtlService.getLatestBuildResult(moduleConfig.id, null);if (latestBuildResult != null){
¡¡¡¡String status = latestBuildResult.buildStatus;if (status.equals(MTLBuildStatus.RUNNING.getValue()) ||
¡¡¡¡status.equals(MTLBuildStatus.WAITING.getValue())){
¡¡¡¡mtlService.cancelBuildTask(product.rpc_key, latestBuildResult.id);
¡¡¡¡logger.info("¡¾È¡Ïû´ò°ü¡¿:" + moduleConfig.toString());
¡¡¡¡}
¡¡¡¡}// Ö´Ðдò°ü²Ù×÷
¡¡¡¡int resultId = triggerBuildWithConfig(moduleConfig);if (resultId != 0) {
¡¡¡¡task.moduleConfigs.add(moduleConfig);
¡¡¡¡}
¡¡¡¡}
¡¡¡¡}// Èç¹ûÓÐ×Ó¹¤³Ì£¬ÐèÒªÏÈ´ò×Ô¹¤³Ì£¬È»ºóÔÙ´òÖ÷¹¤³Ì
¡¡¡¡if (task.moduleConfigs.isEmpty()){
¡¡¡¡triggerBuildWithConfig(task.mainConfig);
¡¡¡¡}
¡¡}

Òì³£Çé¿öµÄ´¦Àí£¬±ÈÈçÈκÎÒ»¸ö×Óbundleʧ°Ü£¬ÔòÐèҪȡÏûÕû¸ö¹¹½¨ÈÎÎñ¡£µÈ¹¹½¨½áÊø£¬»áͨ¹ýApplicationEvent¹ã²¥Ê¼þ£¬ÐèÒªµÄservice¼àÌýµ½½á¹û£¬ÔÙ×öÏà¹ØµÄ´¦Àí¡£

/**
¡¡¡¡* ¹ã²¥¹¹½¨Ê¼þ
¡¡¡¡* @param task
¡¡¡¡*/private void sendApplicationEvent(FMPackageTask task){
¡¡¡¡ ApplicationEventMTLPackage event = new ApplicationEventMTLPackage(context);
¡¡¡¡event.task = task;
¡¡¡¡context.publishEvent(event);
¡¡¡¡}

½ÓÏÂÀ´Òª¿´ÏµÚ3¸öÎÊÌ⣺×Ô¶¯¼¯³É½áÊø£¬ÔõÑù´¥·¢CI²âÊÔ?

3. ¼¯³É²âÊÔ

ÏÖÔÚÎÒÃÇÒѾ­µÃµ½Á˹¹½¨½á¹û£¬²»¹Ü³É¹¦»¹ÊÇʧ°Ü£¬¶¼»á´¥·¢Ïà¹ØµÄCI²âÊÔ£¬Ôõôȷ¶¨²âÊÔУÑé¼þµÄ²âÊÔ·¶Î§À´Ìá¸ß²âÊÔЧÂÊ?

Ê×ÏÈÒª½â¾ö2¸öÎÊÌ⣺

Ôõô¶¨Òå²âÊÔ·¶Î§?

¶ÔÓÚ¿Í»§¶ËÀ´Ëµ£¬»ùÓÚÒ³ÃæÀ´»Ø¹éÊDZȽϺÏÊÊ£¬ËùÒÔ¸ú²âÊÔϵͳ¶¨µÄЭÒ飬°´ÕÕÒ³ÃæµÄschemeÀ´»Ø¹é£¬ÕâÑù×ö»¹ÓиöºÃ´¦£¬¾ÍÊÇ¿ÉÒÔ¶¨ÖÆ»¯Ïà¹ØµÄ²ÎÊý£¬¶øÇÒ»¹Ö§³ÖweexºÍflutterÒ³Ãæ¡£

Ôõôȷ¶¨²âÊÔ·¶Î§?

ÔÚÇ°ÃæµÄÎÄÕÂÖУ¬ÎÒÃÇÒ²Ìáµ½ÁË£¬ÏÖÔÚ ÐèÇó - ´úÂë - ¹¹½¨ÏÖÔÚÊǹØÁªµÄ£¬Õë¶Ôÿ´Î¼¯³É£¬¶¼»áÓÐÏà¹ØµÄÇý¶¯Ê¼þ¡£

Merge Request£ºÓÐÏà¹ØµÄmr£¬¾Í¿ÉÒÔÄõ½commitsÁбí

Push£ºÕë¶Ôÿ´Îpush£¬Ò²¿ÉÒÔÄõ½Ïà¹ØµÄcommitsÁбí

»úе´¥·¢£º¿ÉÒÔÄõ½Ò»¶¨Ê±¼ä¼ä¸ôµÄcommitsÁбí

Õë¶ÔÉÏÃæ3¸öʼþÔ´£¬¶¼¿ÉÒÔÄõ½commitsÁÐ±í£¬½ÓמͿÉÒÔÄõ½ÎļþÐÞ¸ÄÁÐ±í¡¢Ð޸ĵÄÈËÔ±¡¢ÒÔ¼°¹ØÁªµÄÐèÇó;Äõ½ÉÏÃæÕâЩÐÅÏ¢£¬¾Í¿ÉÒÔ¿ò¶¨³ö´úÂë±ä¶¯·¶Î§¡£

ÿ´ÎÔÚÅÜCI²âÊÔµÄʱºò£¬¾ÍÄÜÖªµÀÕâÊǸĵÄÄĸöÐèÇó¡£

ʾÀý´úÂëÈçÏ£º

/**

¡¡¡¡* »ñÈ¡Ð޸ķ¶Î§
¡¡¡¡* @param projectId
¡¡¡¡* @param commits
¡¡¡¡* @return
¡¡¡¡*/public FMCITriggerParam getChangeScope(int projectId, String branch, ArrayList<GitlabCommit> commits){// »ñȡƽ̨ÐÅÏ¢
¡¡¡¡Repo projectRepo = repoMapper.getRepoByProjectId(projectId);
¡¡¡¡String platform = "ios";if (projectRepo != null){
¡¡¡¡platform = projectRepo.platform;
¡¡¡¡}// Ìá½»ÈËÔ±
¡¡¡¡ArrayList<String> authors = getCommitsAuthors(commits);// Ð޸ĵÄÎļþ
¡¡¡¡ArrayList<String> changeFiles = commitService.getCommitsChangeFiles(projectId, commits);// Ð޸ķ¶Î§
¡¡¡¡ArrayList<String> pages = getPagesByFiles(projectId, changeFiles);// ´¥·¢·½Ê½
¡¡¡¡ArrayList<String> triggerTypes = new ArrayList<>();
¡¡¡¡triggerTypes.add("uiauto");
¡¡¡¡triggerTypes.add("monkey");
¡¡¡¡FMCITriggerParam change = new FMCITriggerParam();
¡¡¡¡change.projectid = projectId;
¡¡¡¡change.platform = platform;
¡¡¡¡change.mergerequestid = 0;
¡¡¡¡change.branchName = branch;
¡¡¡¡change.userlist.addAll(authors);
¡¡¡¡change.pages = String.join(";", pages);
¡¡¡¡change.triggertype.addAll(triggerTypes);return change;
¡¡¡¡}

»ñÈ¡µ½Ìá½»ÈËÔ±¡¢Ð޸ķ¶Î§µÈÐÅÏ¢ºó£¬²âÊÔ¼þ¿ÉÒÔÌáʾÏà¹ØµÄ´íÎó¡£

4. ½á¹ûͳ¼Æ

ÏÂÃæÊÇÔÚÒ»ÖÜÖ®ÄÚ¼¯³ÉµÄÊýÁ¿£¬ÒÔ7.8 - 7.15ºÅµÄÖÜÆÚΪÀý(iOS¹¤³Ì)£º

´ÓÉÏÃæÊÇÒÑ·Ö֧ά¶Èͳ¼Æ£¬

¼¯³É·ÖÖ§develop£¬Ã¿Ìì¶¼»á¶¨Ê±´¥·¢Ïà¹Ø¼¯³É

ÐèÇó·ÖÖ§£¬ÔÚ¿ª·¢ÖÜÆÚÄÚ£¬»áÓнϸߵĴ¥·¢Á¿

´Óʼþ´¥·¢µÄά¶ÈÉÏ£º

Ö÷Òª»¹ÊÇÒÔ¶¨Ê±´¥·¢ÎªÖ÷

ÔÚ¿ª·¢ÖÜÆÚÄÚ£¬push´¥·¢µÄÊýÁ¿»áÓÐËùÔö³¤

Ŀǰ£¬¼¯³ÉµÄÐèÇó±È½ÏÉÙ£¬ËùÒÔÊýÁ¿Ò²Ïà¶Ô½ÏÉÙ£¬µ«×ÜÌåÀ´ËµÕû¸ö·½°¸ÊÇÎȶ¨µÄ£¬ºóÐø»áÍêÉÆÏà¹ØµÄÊý¾Ýͳ¼Æ£¬±ÈÈç¹¹½¨Ê±³¤¡¢ÐèÇ󿪷¢Ê±³¤µÈ¡£

5. ²È¿Ó¼ÍÒª

ÔÚ¿ª·¢¹ý³ÌÖУ¬²È¹ýһЩ¿ÓÒ²×öһЩ¼Ç¼¡£

5.1 AxiosÍøÂçÇëÇó

ÓÉÓÚ²ÉÓÃǰºó¶Ë·ÖÀëµÄÉè¼Æ£¬ËùÒÔÔÚµ÷ÊÔµÄʱºò»áÓпçÓòµÄÎÊÌ⣬½â¾ö·½°¸¾ÍÊÇÔÚvueµÄconfigÖÐ×öÏà¹ØµÄ´úÀíÉèÖá£

proxyTable: {'/fishci': {

¡¡¡¡target: 'http://127.0.0.1:8090', //api¶Ë¿Ú
¡¡¡¡// changeOrigin: true, //ÔÊÐí¿çÓò
¡¡¡¡pathRewrite: {'^/fishci': '/'
¡¡¡¡}
¡¡¡¡}
¡¡¡¡}

¿çÓòµÄÎÊÌâ½â¾öÁË£¬µ«ÊÇÔÚ¶Ô½ÓbucÈÏÖ¤µÄʱºò£¬ÐèÒªÖØ¶¨ÏòÇëÇó£¬Ç°¶ËÓõÄaxios£¬ÎÞ·¨À¹½Øµ½302µÄ·µ»Ø¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬·þÎñ¶ËÒ²×öÁËÏà¹Ø´¦Àí£¬·þÎñ¶Ë½«302µÄ·µ»Ø×ª»¯³É200µÄ·µ»Ø£¬²¢½«Öض¨ÏòµÄÄÚÈÝ·ÅÔÚresponseÀïÃæ£¬È»ºóÔÙÓÐǰ¶ËaxiosÀ¹½Øµ½½øÐд¦Àí¡£

Ê×ÏÈÔÚconfigurationÀïÃæÌí¼ÓÏà¹ØµÄFilter£¬Ìí¼ÓÏà¹ØÅäÖà registration.addInitParameter("HTTP_302_JSON_RESPONSE", "json");£¬Ç°¶ËÔÚÇëÇóµÄʱºò£¬ÒÔjson½áβµÄÇëÇó£¬Èç¹ûÐèÒªÖØ¶¨Ïò£¬¾ÍÄÜ»ñÈ¡µ½200µÄ·µ»Ø£¬Ö»²»¹ýÖØ¶¨ÏòµÄÄÚÈÝ»áÔÚresponseÀïÃæÒÔÎı¾ÐÎʽ³ÊÏÖ£¬È»ºóÔÙÈ¥×öÀ¹½Ø¡£

xios.interceptors.response.use((response) => {if (response.status === 200 && response.data.hasError) {return window.location = "<ÖØ¶¨ÏòµÄÁ´½Ó>";
¡¡¡¡}return response;
¡¡¡¡}, function (error) {return Promise.reject(error);
¡¡¡¡});

5.2 ¼¯³ÉÏÞÁ÷

µ¥¸öÐèÇóµÄ´ò°üÒµÎñÂß¼­Ïà¶Ô¼òµ¥£¬µ«ÊÇÓÉÓÚpush»òmerge¶¼»á´¥·¢È«Á¿´ò°ü£¬ÆµÂÊ»á±È½Ï¸ß£¬¾ÍÐèÒª×öÏà¹ØµÄÏÞÁ÷Âß¼­£¬ÈçÏÂͼËùʾ£º

»áÓÐ2¸ö¶ÓÁб£´æµ±Ç°µÄ´ò°üÈÎÎñ£ºÖ´ÐжÓÁк͵ȴý¶ÓÁÐ

ÐÂÀ´Feature2£¬µ±Ç°ÒѾ­ÓÐÖØ¸´ÈÎÎñÒѾ­ÔÚ¼¯³É£¬»á·ÅÔڵȴý¶ÓÁУ¬Èç¹ûÓÐÖØ¸´µÄÈÎÎñ£¬Ôòɾ³ý

ÐÂÀ´Feature5£¬µ±Ç°Ã»ÓÐÏàͬÈÎÎñÕýÔÚÖ´ÐУ¬Ö±½ÓÌí¼Óµ½Ö´ÐжÓÁÐ

Ö´ÐжÓÁÐÒѾ­´ïµ½×î´óÈÝÁ¿5£¬ÐÂÀ´µÄFeature6Ìí¼Óµ½µÈ´ý¶ÓÁÐ

µ±Ö´ÐжÓÁÐÀïÃæÈÎÎñ½áÊø£¬»á´ÓµÈ´ý¶ÓÁÐÀïÃæÑ¡È¡Ò»¸öûÓÐÔÚ´ò°üµÄÈÎÎñ£¬·Åµ½Ö´ÐжÓÁÐÀïÃæ¡£

6. ½áÓï

±¾ÆªÎÄÕÂÖ÷ÒªÊÇÕûÀí£¬ÔÚÓ¾µÀ¿ª·¢Ä£Ê½Ï£¬ÈçºÎÓÐЧµÄÌá¸ß¿Í»§¶Ë¹¤³ÌÄÜЧËù×öµÄʵ¼ù¡£ÏÖÔÚÖ÷ÌåÁ÷³ÌÒѾ­´®Í¨£¬½ÓÏÂÀ´¾Í¿ÉÒÔÓÐÕë¶ÔÐÔµÄͳ¼ÆÏà¹ØÊý¾Ý£¬±ÈÈç¹¹½¨µÄʱ¼ä³¤¶Ì¡¢²âÊÔÓÐЧÐԵĶÈÁ¿£¬ÓÐÁËÕâЩÊý¾Ý¾Í¿ÉÒÔ¶Ô¿Í»§¶ËµÄ¼¯³ÉЧÂÊÓÐÕûÌåµÄ¶ÈÁ¿£¬ÔÙ·´ÏòµÄÓÅ»¯¿Í»§¶ËµÄ¼¯³É·½°¸¡£

ÔÚÕûÌ×·½°¸ÖУ¬²âÊÔУÑéºÜÖØÒª£¬ÈçºÎ×öµ½¸ßЧµÄ²âÊÔ?Ô­ÔòÉϳɱ¾±È½ÏµÍµÄ£¬Åܵįµ´Î¿ÉÒԸߵ㣬ÀýÈ磺´úÂë¼ì²â¡¢µ¥Ôª²âÊÔ;³É±¾±È½Ï¸ßµÄ£¬Æµ´Î¿ÉÒԵ͵㣬ÀýÈ磺UI Automation¡£×ÜÌåÀ´Ëµ£¬ÏÖÔÚ´ÓÐèÇó - ´úÂë - ¹¹½¨¶¼¹ØÁªÆðÀ´£¬¾Í¿ÉÒÔͳ¼Æ³öÒ»¸öÐèÇóµÄ´úÂëÌá½»Á¿¡¢¹¹½¨ÊýÁ¿ºÍbugÊýÁ¿£¬·´ÏòµÄ¶ÔÐèÇó¾ÍÓÐÁËÒ»¸ö¶ÈÁ¿£¬±ÈÈçÐèÇó²ð·ÖµÄºÃ»µ¡¢¿ª·¢ÖÜÆÚµÄ³¤¶ÌµÈ¡£×îÖÕÄ¿µÄ£¬×÷Ϊһ¸ö¿Í»§¶ËÍŶӣ¬Äܹ»×ö¿ìËٵĵü´úÒµÎñ£¬Ìá¸ß¸÷ÍŶÓÖ®¼äµÄЭͬЧÂÊ£¬´Ó¶øÔÚÕûÌåÉÏÌá¸ßÄÜЧ¡£

   
2422 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ