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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Git ¹ÜÀíʵս£¨¶þ£©£º¶à·ÖÖ§×ÓÄ£¿é³ÖÐø¼¯³É
 
  2984  次浏览      31
 2019-1-18
 
±à¼­ÍƼö:

±¾ÎÄÀ´×Ôhahack£¬ÎÄÕÂÌÖÂÛÁ˶Ô×ÓÄ£¿é½øÐгÖÐø¼¯³ÉµÄÈýÖÖ·½°¸£¬²¢ÀûÓÃ×Ô¶¯»¯ÊÖ¶ÎʵÏÖÖð²ãÍùÉÏÌá½»×ÓÄ£¿é commit id ´Ó¶ø´¥·¢Ö÷¹¤³Ì¹¹½¨¡£ÕâЩ¹¹½¨½á¹ûΪÎÒÃÇ¿ìËÙ¶¨Î»¹¤³ÌµÄ±àÒëÎÊÌâÌṩÁËÖØÒªµÄÏßË÷¡£

ÐèÇóÃèÊö

ÔÚ ÉÏһƪÎÄÕ ÖУ¬ÎÒ¼òµ¥ÃèÊöÁËÎÒÃÇÒ»¸öÏîÄ¿µÄ¸´Ôӳ̶ȣº×ÓÄ£¿é¡¢Ç¶Ì××ÓÄ£¿é¡¢¶à·ÖÖ§¡£³ýÁ˹¤³Ì·ÖÖ§Çл»Éϵĸ´ÔÓ£¬ÎÒÃÇ»¹Óöµ½ÁíÒ»¸öÎÊÌ⣺×ÓÄ£¿é³ÖÐø¼¯³É¡£

Ö÷¹¤³Ì³ÖÐø¼¯³É

ÏÈ˵˵Ö÷¹¤³ÌÈçºÎ×ö³ÖÐø¼¯³É¡£ÎÒÃÇʹÓà Gitlab ×Ô´øµÄ Gitlab-Ci ×÷ΪÎÒÃǵijÖÐø¼¯³Éϵͳ¡£Android ¶ËµÄÖ÷¹¤³ÌµÄ³ÖÐø¼¯³É½Å±¾ÈçÏ£º

build:
tags:
- android
script:
- ./fmanager checkout -f $CI_BUILD_REF_NAME
- ./fmanager update
- gradle clean
- gradle aR

ÆäÖУ¬ CI_BUILD_REF_NAME Ö¸¶¨Òª±àÒëÄĸö·ÖÖ§µÄÖ÷¹¤³Ì¡£µ±ÎÒÃÇÍÆËÍ´úÂ뵽ij¸ö·Ö֧ʱ£¬¸Ã·Ö֧ϵijÖÐø¼¯³É½Å±¾¾Í»á±»µ÷Óã¬CI_BUILD_REF_NAME ±äÁ¿¾Í»áÊÇÄǸö·ÖÖ§µÄÃû×Ö¡£ÔÚÖ´Ðй¹½¨Ç°£¬ÏÈÓà fmanager Íê³ÉÖ÷¹¤³ÌºÍËùÓÐÄ£¿éµÄ·ÖÖ§Çл» £¬Ö®ºóÔÙÓà fmanager ¸üÐÂÕû¸öÏîÄ¿µÄ´úÂë¡£×îºóÔÙÖ´ÐбàÒëÖ¸Áî¡£

Ö÷¹¤³ÌµÄ³ÖÐø¼¯³É¾ÍÊÇÕâô¼òµ¥¡£È»¶øÕâÔ¶Ô¶²»ÄÜÂú×ãÎÒÃǵÄÐèÇó£ºÎÒÃǵŤ³ÌÓжà¸ö×ÓÄ£¿é¡£Ò»¸ö×ÓÄ£¿éµÄij¸ö·ÖÖ§¿ÉÄܱ»¶à¸ö¸¸Ä£¿éµÄ¶à¸ö·ÖÖ§ÒÀÀµ¡£ÀýÈ磬common Ä£¿éµÄ master_dev ·ÖÖ§¿ÉÄܱ» framework Ä£¿éµÄ master_dev¡¢jilin_dev¡¢taishan_dev ·ÖÖ§ÒÀÀµ¡£ÔÚÕâÑùµÄÇé¿öÏ£¬ÈκÎÒ»¸ö×ÓÄ£¿éÈç¹û²»×¢ÒâÌύǰ×Բ⣬¶¼ÓпÉÄܵ¼Ö¶à¸ö·ÖÖ§µÄÕû¸ö¹¤³Ì±àÒëʧ°Ü£¬×èÈû¶à¸ö·ÖÖ§µÄ¿ª·¢½ø¶È¡£±ÈÕâ¸üÀ§ÄѵÄÊÇ£¬¶Ôij¸öÄ£¿éµÄÐÞ¸ÄÒ²Ðí¿ÉÒÔ±£Ö¤ÔÚµ±Ç°Ö÷¹¤³Ì·ÖÖ§ÉϱàÒëͨ¹ý£¬µ«È´ÒâÍâµ¼ÖÂÁËÁíÍâÒ»¸öÒÀÀµ¸Ã×ÓÄ£¿éµÄÖ÷¹¤³Ì·ÖÖ§µÄ±àÒëʧ°Ü¡£

Òò´Ë£¬ÎÒÃdzýÁËÒª¶ÔÖ÷¹¤³Ì½øÐгÖÐø¼¯³É²âÊÔÖ®Í⣬Ҳ²»µÃ²»¶Ô×ÓÄ£¿é×ö³ÖÐø¼¯³É²âÊÔ£ºÈκÎÒ»¸ö×ÓÄ£¿éij¸ö·ÖÖ§Ò»µ©ÍÆËÍÁË´úÂ룬¾Í´¥·¢ËùÓÐÒÀÀµËüµÄÖ÷¹¤³ÌµÄ·ÖÖ§µÄ³ÖÐø¼¯³É²âÊÔ¡£ÎªÁËʵÏÖÕâ¸öÄ¿±ê£¬ÎÒÃdz¢ÊÔÁËÈýÖÖ·½°¸¡£

·½°¸Ò»£ºtrigger

µÚÒ»ÖÖ·½°¸ÊÇÀûÓà Gitlab-Ci µÄ trigger »úÖÆ¡£trigger ÌṩÁËÖ±½ÓÔڽű¾Öд¥·¢ÈκÎÒ»¸ö²Ö¿âµÄ³ÖÐø¼¯³ÉµÄ·½·¨¡£ÀûÓà trigger£¬ÎÒÃÇ¿ÉÒÔΪ×ÓÄ£¿éҲдһ·Ý³ÖÐø¼¯³É½Å±¾£¬¶øËü½ö½öÓÃÀ´´¥·¢ÒÀÀµËüµÄËùÓÐÖ÷¹¤³ÌµÄ·ÖÖ§µÄ³ÖÐø¼¯³É¡£ÀýÈ磬¼ÙÈçÖ÷¹¤³ÌµÄ master_dev ·ÖÖ§ºÍ jilin_dev ·ÖÖ§¶¼ÒÀÀµÁË framework ×ÓÄ£¿éµÄ master_dev ·ÖÖ§£¬ÄÇô¿ÉÒÔΪ framework µÄ master_dev ±àдһ¸ö³ÖÐø¼¯³É½Å±¾£º

build:
stage: deploy
script:
- "curl -X POST -F token=3ef8939a8e50c5e98f459789
b966a4 -F ref=refs/heads/master_dev http://yourcompany.com/api/v3/projects/10/
trigger/builds"
- "curl -X POST -F token=3ef8939a8e50c5e98f459789
b966a4 -F ref=refs/heads/jilin_dev http://yourcompany.com/api/v3/projects
/10/trigger/builds"

ÆäÖУ¬ref ²ÎÊýÖ¸¶¨ÁËÒª´¥·¢³ÖÐø¼¯³É²âÊÔµÄÏîÄ¿µÄ·ÖÖ§¡£ÕâÑù£¬µ±ÖÐÑë²Ö¿âÉÏ framework Ä£¿éµÄ master_dev ·ÖÖ§ÓÐеĴúÂëÍÆËÍʱ£¬Ö÷¹¤³ÌµÄ master_dev ·ÖÖ§ºÍ jilin_dev ·ÖÖ§¾Í»á´¥·¢¹¹½¨£º

ʹÓà trigger ËäÈ»ÄÜÓÐЧ´¥·¢ËùÒÀÀµµÄÖ÷¹¤³ÌµÄ·ÖÖ§£¬µ«ËüÓкܶ಻×ãÖ®´¦£º

1¡¢Î¬»¤³É±¾¸ß¡£Ã¿¸ö×ÓÄ£¿é¶¼ÐèÒª±àд³ÖÐø¼¯³É½Å±¾£¬ÇÒÓÉÓÚÖ÷¹¤³Ì¾­³£ÐèÒªÐÂÔöÐÂÒµÎñ·ÖÖ§£¬ÐèҪƵ·±Î¬»¤Ã¿¸ö×ÓÄ£¿éµÄ³ÖÐø¼¯³É½Å±¾£¬Ìí¼ÓÒÀÀµËüµÄ·ÖÖ§¡£ 2¡¢ÎÞ·¨¸ú×Ù¡£×ÓÄ£¿éµÄ³ÖÐø¼¯³É½Å±¾µÄ×÷Óýö½öÖ»ÊÇ´¥·¢ÁËÖ÷¹¤³ÌµÄ³ÖÐø¼¯³É£¬¶øµ±´Î´¥·¢µÄ½á¹û²¢²»»á·µ»Ø¸ø×ÓÄ£¿é×÷Ϊ×ÓÄ£¿é³ÖÐø¼¯³ÉµÄ½á¹û£º

gitlab-ci-multi-runner 1.0.4 (014aa8c)
Using Shell executor...
Running on appdevdeiMac.local...
Fetching changes...
HEAD is now at 826d126 Merge branch 'master_dev' of http://yourcompany.com/yourgroup/framework_android
into master_dev
From http://yourcompany.com/FFProject/appframework_android
826d126..13ba8f3 master_dev -> origin/master_dev
Checking out 13ba8f33 as master_dev...
Previous HEAD position was 826d126... Merge branch 'master_dev' of http://yourcompany.com/yourgroup/framework into master_dev
HEAD is now at 13ba8f3... [master_dev][bank][c:panweizhou][r:chendingyi]update
ci script.
$ curl -X POST -F token=2587402741a9ef3a09d0dd64f83b90 -F ref=$CI_BUILD_REF_NAME http://yourcompany.com/api/v3/projects
/11/trigger/builds
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0100
298 100 26 100 272 220 2304 --:--:-- --:--:--
--:--:-- 2324
{"id":48,"variables":null}
Build succeeded.

ËùÒÔ×ÓÄ£¿éµÄ³ÖÐø¼¯³ÉÒ»Ö±Êdzɹ¦µÄ£º

¶øÊµ¼ÊÈ´¿ÉÄÜÔçÒѵ¼ÖÂÖ÷¹¤³Ì±àÒëʧ°Ü£º

3¡¢ÎÞ·¨¶¨Î»´¥·¢Ô´¡£Ö÷¹¤³ÌµÄ¹¹½¨ÈÕÖ¾Ò³½ö¼Ç¼´¥·¢±¾´Î¹¹½¨µÄ trigger µÄ Token ¡£µ«Õâ¸ö trigger ÊÇÖ÷¹¤³Ì×Ô¼ºµÄ --bb ¡£

»»¾ä»°Ëµ£¬³ý·ÇΪÿһ¸ö×ÓÄ£¿éÌṩһ¸öµ¥¶ÀµÄ Token £¬·ñÔòÎÒÃǸù±¾ÎÞ·¨ÅжϾ¿¾¹ÊÇ×ÓÄ£¿é´¥·¢ÁËÕâ¸ö trigger ¡£µÚÒ»ÖÖ·½°¸Ðª²Ë¡£

·½°¸¶þ£º×ÓÄ£¿é²âÊÔ¹¤³Ì

µÚ¶þÖÖ·½°¸ÊÇΪËùÓÐÐèÒª×ö¼¯³É²âÊÔµÄ×ÓÄ£¿é¶¼µ¥¶À±àдһ¸ö²âÊÔ¹¤³Ì¡£µ±×ÓÄ£¿éÓÐÍÆËÍ´úÂëʱ£¬²»ÔÙ´¥·¢Ö÷¹¤³ÌµÄ³ÖÐø¼¯³É£¬¶øÊÇ´¥·¢²âÊÔ¹¤³ÌµÄ³ÖÐø¼¯³É¡£

ÓÉÓÚÿ¸ö×ÓÄ£¿éÓëÆä²âÊÔ¹¤³ÌÊÇÒ»¶ÔÒ»µÄ¹ØÏµ£¬Ò»µ©²âÊÔ¹¤³Ì±àÒëʧ°Ü£¬ÄÇÆä¶ÔÓ¦µÄ×ÓÄ£¿é¾ÍºÜÓпÉÄÜ´æÔÚÎÊÌ⡣Ȼ¶øÕâ¸ö·½°¸Ò²ÓкܴóµÄ¾ÖÏÞÐÔ¡£

ÐèҪΪÿ¸öºËÐÄ×ÓÄ£¿é¶¼Î¬»¤Ò»¸ö²âÊÔ¹¤³Ì£¬ÇÒ²âÊÔ¹¤³ÌµÄ¿ª·¢½ø¶ÈÐèÒªÒ»Ö±ÓëÖ÷¹¤³Ìͬ²½¡£µ±²âÊÔ¹¤³ÌµÄά»¤½ø¶ÈÂäºóÓÚÖ÷¹¤³Ì£¬¾ÍÓпÉÄܳöÏÖ×ÓÄ£¿éÄܱ£Ö¤Ö÷¹¤³Ì±àÒëͨ¹ý£¬È´µ¼Ö²âÊÔ¹¤³Ì±àÒë²»¹ý¡£

µ±×ÓÄ£¿éÓжà¸ö·Ö֧ʱ£¬Ã¿¸öÖØÒª·ÖÖ§¶¼ÐèÒªÏàÓ¦½¨Á¢²âÊÔ¹¤³ÌµÄ·ÖÖ§£¬ÕâʹµÃ²âÊÔ¹¤³ÌµÄά»¤³É±¾Í¬±ÈÔö¼Ó¡£

×îÖÂÃüµÄÎÊÌâÊÇ£º×ÓÄ£¿éµÄ²âÊÔ¹¤³Ì½ö½öÖ»Äܸ²¸Ç×ÓÄ£¿é£¬¶øÕû¸öÖ÷¹¤³ÌÓɶà¸ö×ÓÄ£¿é×éºÏ¶ø³ÉµÄ£¬Ä£¿éÓëÄ£¿éÖ®¼äÒ²ÓÐÏ໥ÒÀÀµ¹ØÏµ£¬Ä£¿é¼¶±ðµÄ¸²¸Ç¶È²¢²»×ãÒÔ±£Ö¤Õû¸ö¹¤³ÌµÄ¿É±àÒë¡£

×ÛÉÏËùÊö£¬ÓÃ×ÓÄ£¿é²âÊÔ¹¤³ÌÀ´¶Ô×ÓÄ£¿é½øÐгÖÐø¼¯³É²¢²»ÀíÏë¡£·½°¸¶þҲʧ°ÜÁË¡£¿´À´ trigger ²¢²»ÊʺÏÓÃÀ´½â¾öÎÒÃǵÄÎÊÌ⣬ÓÚÊÇÎÒ¶Ô trigger µÄ³¢ÊÔÒ²µ½´ËΪֹ¡£

·½°¸Èý£º×Ô¶¯¸üÐÂ×ÓÄ£¿é commit id

Ç°ÃæÁ½ÖÖ·½°¸×ß²»Í¨£¬ÎÒ¿ªÊ¼Ë¼¿¼£ºGit ÄѵÀ¾ÍûÓйØÓÚ×ÓÄ£¿é³ÖÐø¼¯³ÉµÄ best practice Âð£¿Ö±µ½ÎÒ¿´µ½ÁËһƪÎÄÕ £¬ÀïÍ·Ìá³öÓà commit id µÄ¸Ä¶¯À´´¥·¢¹¤³Ì¸üУ¬¶Ùʱ»ÐÈ»´óÎò£ºGit ±¾Éí½¨Òéͨ¹ýÔÚÖ÷¹¤³Ì¼Ç¼×ÓÄ£¿éµÄ commit id À´¿ØÖÆ×ÓÄ£¿éµÄ°æ±¾¡£³ýÁË¿ØÖư汾£¬commit id Æäʵ»¹ÓÐÁíÒ»¸öºÃ´¦£¬ÄǾÍÊdzÖÐø¼¯³É£¡×ÓÄ£¿é·¢ÉúÐ޸ĺó£¬ÎªÁËÈÃÖ÷¹¤³Ìͬ²½¸Ã×ÓÄ£¿éµÄ¸üУ¬ÄãÐèÒª²»¶ÏÍùÉÏÌá½»ÉϲãÄ£¿éµÄ commit id £¬Õâ¾Í»á˳´ø´¥·¢Ö÷¹¤³ÌµÄ³ÖÐø¼¯³É¡£

È»¶ø£¬ÉÏһƪÎÄÕÂÖÐÌáµ½£¬ÎªÁ˱ÜÃâÖ»Ìá commit id ûÌá´úÂëµÄÇé¿ö·¢Éú£¬ÎÒÃÇÖ±½Ó½ûÖ¹ÁË commit id µÄÌá½»¡£Ã¬¶ÜÀ´ÁË¡£

ÐÒÔ˵ÄÊÇÎÒÃÇÓÐÕÛÖеİ취¡£Èç¹û×ÓÄ£¿é´úÂëÒÑÍÆËͳɹ¦£¬ÄÇô´Ëʱ¸ÃÄ£¿éÔÚ¸¸¹¤³ÌÖÐµÄ commit id Ò»¶¨¿ÉÒÔ¸üС£¶øÕâ¸ö¸üÐÂΪʲô²»ÄÜÈüÆËã»ú°ïæ×Ô¶¯Íê³É£¿ÎÒÖ»ÐèÒªÔÚ×ÓÄ£¿éµÄÖÐÑë²Ö¿âÖмÓÈë post-receive ¹³×Ó£¬µ±×ÓÄ£¿é´úÂëÍÆËÍÍê³Éʱ£¬post-receive ¹³×ÓÀïµÄ½Å±¾¾Í»á×Ô¶¯±»´¥·¢£¬°ïÖúÎÒÃǵ½ÉϲãÌá½»¸Ã×ÓÄ£¿éµÄ commit id ¡£¶ÔÓÚǶÌ××ÓÄ£¿é£¬Õâ¸ö¹ý³Ì»áÒ»Ö±µÝ¹éµØ×ö£¬Ö±µ½¸¸¹¤³Ì¾ÍÊÇÖ÷¹¤³ÌΪֹ£¬¶øÕâ×îÖվͻᴥ·¢Ö÷¹¤³ÌµÄ³ÖÐø¼¯³É£¡

·½·¨ÌýÆðÀ´¿ÉÐУ¬µ«Êµ¼Ê×öÆðÀ´ÎÒÒÀÈ»Óöµ½Á˲»ÉÙÀ§ÄÑ¡£

Ê×ÏÈ£¬·þÎñÆ÷ÉϵIJֿⶼÊÇ bare repository £¬²»ÄÜÌá½»´úÂ룬ҲûÓÐÏ໥ÒÀÀµ¹ØÏµ£¬Ö÷¹¤³ÌºÍËùÓÐ×ÓÄ£¿éµÄ²Ö¿â¶¼ÊÇÆ½¼¶µÄ´æ·ÅÔÚͬ¸öĿ¼Ïµġ£ÕâÒâζ×ÅÄãÎÞ·¨ÀûÓà post-receive ¹³×ÓÔ­µØµØÐÞ¸Ä×ÔÉí²Ö¿âºÍÒÀÀµËüµÄÆäËû²Ö¿â¡£

Æä´Î£¬ÒÀÀµÃ¿¸ö×ÓÄ£¿éµÄ¸¸¹¤³Ì¼°·ÖÖ§¸÷²»Ïàͬ¡£µ±Ò»¸ö×ÓÄ£¿éµÄij¸ö·ÖÖ§ÓиüÐÂʱ£¬ÄãÐèҪΪ¸¸¹¤³ÌÖÐΪËùÓÐÒÀÀµ¸Ã×ÓÄ£¿éÄǸö·ÖÖ§µÄÈ«²¿·ÖÖ§¶¼Ìá½»Ò»±éÐ嵀 commit id ¡£

×îºó£¬Ã¿Ò»¸ö×ÓÄ£¿éÒ²¶¼ÐèÒª°²×°Ò»¸öÕâÑùµÄ post-receive ¹³×Ó£¬ÇÒ×ÓÄ£¿é¾­³£ÐèÒªÐÂÔö£¬ÒÀÀµ¹ØÏµÒ²¾­³£±ä¶¯£¬Î¬»¤³É±¾¸ß¡£

½â¾öµÚÒ»¸öÎÊÌâµÄ·½·¨¾ÍÊÇÔÚ·þÎñÆ÷Ò²Ïñ±¾µØÄÇÑù clone ³öÒ»·ÝÕû¸ö¹¤³ÌµÄ working repository £¬Õâ¸ö¹¤³ÌºÍÎÒÃDZ¾µØ¿ª·¢µÄ²Ö¿âÃ»Ê²Ã´Çø±ð£¬½»¸ø·þÎñÆ÷À´×Ô¶¯Î¬»¤¡£Î¨Ò»µÄÄѵãÔÚÓÚÔõô½«Ã¿¸ö bare repository Óë¸Ã working repository ÀïµÄÿ¸ö×ÓÄ£¿éÏà¹ØÁª¡£ÓÚÊÇ£¬Ö»ÐèҪд¸ö¹¤¾ß£¬±éÀúÒ»±éËùÓÐÖ÷¹¤³Ì·ÖÖ§£¬²¢Éú³Éÿ¸ö·ÖÖ§ËùÒÀÀµµÄÿ¸ö×ÓÄ£¿éµÄ²Ö¿âµØÖ·Óë±¾µØÂ·¾¶ÐÅÏ¢¡£ÄÚÈÝÀàËÆÕâÑù£º

{
"master": {
"app": {"branch": "master"},
"common": {"branch": "master"},
...
"react_native/node_modules": {"branch": "master"}
},
"master_dev": {
"app": {"branch": "master_dev"},
"common": {"branch": "master_dev"},
...
"react_native/node_modules": {"branch": "master"}
},
"jilin": {
"app": {"branch": "master"},
"common": {"branch": "master"},
...
"react_native/node_modules": {"branch": "jilin"}
},
"jilin_dev": {
"app": {"branch": "master"},
"common": {"branch": "master"},
...
"react_native/node_modules": {"branch": "jilin_dev"}
}
}

½â¾öµÚ¶þ¸öÎÊÌâµÄ·½·¨¾ÍÊÇÀûÓÃÿ¸öÖ÷¹¤³Ì·ÖÖ§µÄ modules.json ¡£ÎÒÃÇÔÚÖ÷¹¤³ÌµÄÿ¸ö·ÖÖ§É϶¼±àдÁËÒ»·Ý modules.json £¬Õâ¸öÎļþ¼Ç¼ÁËËùÓÐ×ÓÄ£¿éµÄÒÀÀµ¹ØÏµ¡£Ö»Òª¶ÔËùÓзÖÖ§µÄ modules.json ½øÐй鲢£¬¾Í¿ÉÒԵõ½Ò»·ÝÍêÕûµÄ¼Ç¼ËùÓÐÄ£¿éËùÓзÖÖ§µÄÒÀÀµ¹ØÏµ¡£ÄÚÈÝÀàËÆÕâÑù£º

app:
repo: http://yourcampany.com/yourgroup/app_android.git
path: /home/git/app_android
common:
repo: http://yourcampany.com/yourgroup/core_lib_android.git
path: /home/git/app_android/common
...
node_modules:
repo: http://yourcampany.com/yourgroup/node_modules.git
path: /home/git/app_android/react_native/node_modules

ÓÐÁËÕâÁ½¸öÎļþ£¬post-receive ¹³×ÓÒ²¾Í¿ÉÒÔдµÃͨÓû¯£ºÏÈ»ñÈ¡¸Ã×ÓÄ£¿éµÄ²Ö¿âÃû£¬È»ºó¸ù¾ÝÕâ¸öÎļþÕÒµ½ÔÚ working repository ϶ÔÓ¦µÄĿ¼£¬È»ºóÓà fmanager Çе½ÒÀÀµ¸Ã×ÓÄ£¿é¸Ã·ÖÖ§µÄÖ÷¹¤³Ì¡£¸üиÃ×ÓÄ£¿éµÄ working tree £¬×îºó cd µ½Éϼ¶Ä¿Â¼Ìá½»¸Ã×ÓÄ£¿éµÄ commit id ¡£

#!/usr/bin/env python
#author:panweizhou
'''
After push, automatically update commit id of current submodule.
'''
import sys
sys.path.append('/usr/lib/python2.6/site-packages')
sys.path.append('/usr/lib64/python2.6/site-packages')
import fileinput
import json
import subprocess
import os
import yaml
from filelock import FileLock
module_file = "/home/git/modules/modules_android.json"
module_path_file = "/home/git/modules/modules_android.yml"
project_root = "/home/git/app_android"
env_path = "/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:
/usr/bin:/root/bin:/usr/local/libexec/git-core/:/home/git/bin"
lock_file_name = "/tmp/" + os.path.basename(os.getcwd())
with FileLock(lock_file_name):
print ("Updating commit id")
# read global module config
global_module_config = {}
try:
with open(module_file) as f:
global_module_config = json.load(f)
except ValueError:
print("Global modules.json parsed Error!")
exit(1)
# Read in each ref that the user is trying to update
for line in fileinput.input():
line = line.strip()
(from_commit, to_commit, ref) = line.split(' ')
# Get branch name
pos = ref.rfind('/')
if pos >= 0:
branch = ref[pos+1:]
else:
branch = ref
if branch == 'master' or branch.lower().endswith('bank') or branch.endswith('_dev'):
# if branch == 'WeiZhouBank_dev':
# Get repo name
output = subprocess.Popen(['git summary | egrep "^ project"'], env={"PATH": env_path}, stdout=subprocess.PIPE, shell=True)
oc = output.communicate()[0]
repo = oc.split(':')[1].strip()
# Get the corresponding working path
module_path_info = {}
with open (module_path_file) as f:
module_path_info = yaml.load(f)
module_path = ""
module_name = ""
for module_name, module_info in module_path_info.items():
if module_info.has_key('repo'):
module_repo = module_info["repo"]
if module_repo.endswith(repo):
has_such_module = True
module_path = module_info["path"]
break

# Get all the main projects branch that use this module
main_branch_set = set()
for branch_name, config_list in global_module_config.items():
if config_list.has_key(module_name):
mconfig = config_list[module_name]
if (mconfig.has_key('branch')):
mbranch = mconfig['branch']
if branch == mbranch:
main_branch_set.add(branch_name)
# Do the following stuff for each branch of main project
# that use this module of this branch
for main_branch in main_branch_set:
os.chdir(project_root)
output = subprocess.Popen(["./fmanager checkout -f %s" % main_branch], env={"PATH": env_path}, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
res = output.wait()
if res == 0:
os.chdir(module_path)
# update current submodule
output = subprocess.Popen(['/home/git/bin/update_root', branch], cwd=module_path, env={"PATH": env_path})
res = output.wait()
if res == 0:
# Get commit log
output = subprocess.Popen(['git log -n 1'], env={"PATH": env_path}, cwd=module_path, stdout=subprocess.PIPE, shell=True)
commit_log = output.communicate()[0]
commit_log = "Bump Version for submodule %s:\n\n%s" % (module_name, commit_log)
# Go to father module
os.chdir('..')
father_path = os.getcwd()
# Get branch of father module
output = subprocess.Popen(['git', 'symbolic-ref', '--short', 'HEAD'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, env={"PATH": env_path})
oc = output.communicate()
father_branch = oc[0].strip()
if (father_branch.strip() != ""):
print("Bumping version of branch %s of father project..." % father_branch)
output = subprocess.Popen(['/home/git/bin/update_root', father_branch], cwd=father_path, env={"PATH": env_path})
res = output.wait()
if res == 0:
output = subprocess.Popen(['git diff | wc -l'], cwd=father_path, env={"PATH": env_path}, stdout=subprocess.PIPE, shell=True)
diff_num = output.communicate()[0]
if diff_num > 1:
subprocess.call(['git', 'add', module_name], env={"PATH": env_path})
output.wait()
output = subprocess.Popen(['git', 'commit', '-m', commit_log, '--no-verify'], env={"PATH": env_path})
res = output.wait()
if res == 0:
output = subprocess.Popen(['git', 'push', 'origin', 'HEAD', '--no-verify'], env={"PATH": env_path})
output.wait()
if res == 0:
print "Successfully bumped version branch %s of father project" % father_branch
else:
print "Error bumping version for branch %s of father project" % father_branch
else:
print "Error bumping version for branch %s of father project" % father_branch
else:
print "Error bumping version for branch %s of father project" % father_branch
else:
print("Father project is a tag. Stop bumping verison.")
else:
print "Error updating the remote working tree."

Ö®ºóÖ»Ð轫¹³×Ó°²×°µ½Ã¿¸ö×ÓÄ£¿éµÄ bare repository ÀïµÄ custom_hooks Ŀ¼Ï¡£Í¬Ñù¿ÉÒÔÀûÓýű¾À´Ò»´ÎÐÔÍê³É¡£

#!/bin/bash
#author: panweizhou
for module in `ls -d *_android.git`
do
if test $module != "App_Android.git" # Don't install to root project
then
module_dir=${module}
if test ! -d ${module_dir}/custom_hooks
then
mkdir ${module_dir}/custom_hooks
fi
for hook in `ls submodule_hooks_android`
do
cp submodule_hooks_android/${hook} ${module_dir}/custom_hooks/
sudo chmod -R 755 ${module_dir}/custom_hooks
sudo chmod +x ${module_dir}/custom_hooks/${hook}
done
fi
done

¹³×Ó×°ºÃºó£¬ÊÔ×ÅΪ framework ×ÓÄ£¿éÍÆËÍһϴúÂ룬ÖÕ¶ËÖлῴµ½ Bump Version for submodule framework µÄ×ÖÑÛ£¬±íʾ framework µÄ commit id Òѱ»³É¹¦¸üе½Ö÷¹¤³Ì£º

C02PGTP8FVH5:PAFFHouse hahack$ git push -u origin jilin_dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote:
remote: ==============================================
remote:
remote: faq: http://yourcampany.com/yourgroup/FFWiki/wikis/git-faq
remote:
remote: ==============================================
remote: [jilin_dev 941f8c5] Bump Version for submodule framework:
remote: 1 file changed, 1 insertion(+), 1 deletion(-)
remote: Updating commit id
remote: Bumping version of branch jilin_dev of main project...
remote: Bumping version of branch jilin_dev of father project...
remote: Successfully bumped version branch jilin_dev of father project
remote: remote:
remote: remote: ======================================
remote: remote:
remote: remote: faq: http://yourcampany.com/yourgroup/FFWiki/wikis/git-faq
remote: remote:
remote: remote: ======================================
remote: To http://yourcampany.com/yourgroup/App_Android.git
remote: aa13394..69e6c467 HEAD -> jilin_dev
To http://yourcampany.com/yourgroup/framework_android.git
e41b275..35141bf jilin_dev -> jilin_dev
Branch jilin_dev set up to track remote branch jilin_dev from origin.

ÉÏÃæµÄ²½ÖèÖ´ÐÐÁËÁ½´Î push ²Ù×÷£º

push framework ×ÓÄ£¿éµÄ´úÂ룻

push Ö÷¹¤³ÌµÄ´úÂ룬¸üРframework µÄ commit id ¡£Õâ¸ö push ²Ù×÷ÊÇÓÉ framework µÄ post-receive ¹³×Ó×Ô¶¯Íê³ÉµÄ¡£

µÈºòÒ»¶Îʱ¼äºó£¬´ò¿ªÖ÷¹¤³ÌµÄ³ÖÐø¼¯³ÉÒ³Ãæ£¬¿ÉÒÔÕÒµ½Õâ´Î×ÓÄ£¿é¸üд¥·¢µÄÌá½»ÒÔ¼°³ÖÐø¼¯³ÉµÄ½á¹û£º

¶ÔÓÚǶÌ××ÓÄ£¿é£¬¸¸Ä£¿éÌá½»Íê×ÓÄ£¿éµÄ commit id £¬Í¬Ñù»á´¥·¢¸¸Ä£¿éµÄ post-receive ¹³×Ó£¬ÓÚÊǻῴµ½ÕâÑùµÄÍÆËͽá¹û£º

C02PGTP8FVH5:HFCommon hahack$ git push -u origin master_dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 305 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote:
remote: =========================================
remote:
remote: faq: http://yourcampany.com/yourgroup/FFWiki/wikis/git-faq
remote:
remote: =========================================
remote: warning: unable to rmdir FinancialProduct: Directory not empty
remote: [taishan 941b017] Bump Version for submodule HFCommon:
remote: 1 file changed, 1 insertion(+), 1 deletion(-)
remote: Updating commit id
remote: Bumping version of branch taishan of main project...
remote: Bumping version of branch taishan of father project...
remote: Successfully bumped version branch taishan of father project
remote: Bumping version of branch taishan_dev of main project...
remote: remote:
remote: remote: ===============================
remote: remote:
remote: remote: faq: http://yourcampany.com/yourgroup/FFWiki/wikis/git-faq
remote: remote:
remote: remote: ==================================
remote: remote: [taishan f43ab33] Bump Version for submodule react_native:
remote: remote: 1 file changed, 1 insertion(+), 1 deletion(-)
remote: remote: Updating commit id
remote: remote: Bumping version of branch taishan of main project...
remote: remote: Bumping version of branch taishan of father project...
remote: remote: Successfully bumped version branch taishan of father project
remote: remote: remote:
remote: remote: remote: ============================
remote: remote: remote:
remote: remote: remote: faq: http://yourcampany.com/yourgroup/FFWiki/wikis/git-faq
remote: remote: remote:
remote: remote: remote: ==============================
remote: remote: To http://yourcampany.com/yourgroup/App_Android.git
remote: remote: 50b73a2..f43ab33 HEAD -> taishan
remote: To http://yourcampany.com/yourgroup/react_native.git
remote: 3552248..941b017 HEAD -> taishan
To http://yourcampany.com/yourgroup/HFCommon.git
4940def..7a59ff0 master_dev -> master_dev
Branch master_dev set up to track remote branch master_dev from origin.

ÔÚÖ÷¹¤³ÌµÄ³ÖÐø¼¯³ÉÒ³ÃæÖÐͬÑù¿ÉÒÔÕÒ³öǶÌ××ÓÄ£¿é´¥·¢µÄÌá½»ºÍ³ÖÐø¼¯³É½á¹û£º

ֻʣµÚÈý¸öÎÊÌâδ½â¾öÁË¡£ÓÉÓÚÄ£¿éºÍ·ÖÖ§²»¶ÏÔÚÐÂÔö£¬ÉÏÃæµÄÕâÁ½¸öÎļþ¿Ï¶¨ÊÇÐèÒª¾­³£¸üУ¬ÐÂÔöÄ£¿éÒ²ÐèÒª°²×°Õâ¸ö¹³×Ó¡£ÕâЩ¼ÈÈ»ÒѾ­¿ÉÒÔÓù¤¾ß×Ô¶¯Íê³É£¬Ö»ÐèÒª°Ñ¹¤¾ß¶¼¼Ó½øÁË crontab ¼Æ»®ÈÎÎñÀÉ趨ÿÌìÁ賿ÈýµãÖÓ¾Í×Ô¶¯Ö´ÐÐÒ»±é£¬ÎÊÌâÍêÃÀ½â¾ö£¡

ʹÓÃÕâ¸ö·½°¸ºó£¬ËùÓеÄ×ÓÄ£¿é·¢Éú¸üУ¬¶¼»á´¥·¢ÒÀÀµ¸Ã×ÓÄ£¿éµÄÖ÷¹¤³ÌµÄ³ÖÐø¼¯³É²âÊÔ¡£µ±·¢ÏÖÖ÷¹¤³ÌͻȻ²»ÄܱàÒëÁË£¬¿ÉÒÔ´ò¿ª Gitlab £¬Ñ¸ËÙ¶¨Î»µ½×îÔçµ¼Ö±àÒë²»¹ýµÄ×ÓÄ£¿é¼°Ìá½»£º

ÕâΪÎÒÃǶ¨Î»±àÒëÎÊÌâÌṩÁ˷dz£ÖØÒªµÄÏßË÷£¡

ºó»°

ÔÚ±¾ÆªÎÄÕÂÖУ¬ÎÒ×ÐϸÌÖÂÛÁ˶Ô×ÓÄ£¿é½øÐгÖÐø¼¯³ÉµÄÈýÖÖ·½°¸£¬²¢ÀûÓÃ×Ô¶¯»¯ÊÖ¶ÎʵÏÖÖð²ãÍùÉÏÌá½»×ÓÄ£¿é commit id ´Ó¶ø´¥·¢Ö÷¹¤³Ì¹¹½¨¡£ÕâЩ¹¹½¨½á¹û¶ÔÎÒÃÇ¿ìËÙ¶¨Î»¹¤³Ì±àÒë²»¹ýµÄÎÊÌâÌṩÁËÖØÒªµÄÏßË÷¡£

˵ÏÂÆäËûһЩֵµÃ×¢ÒâµÄµØ·½¡£ÓÐЩʱºòij¸öÄ£¿éµÄ´úÂëÍÆËÍÎÞ·¨±ÜÃâ»áµ¼ÖÂÔÝʱÐԵıàÒëʧ°Ü£¨±ÈÈçÉæ¼°¶à¸öÄ£¿éµÄ´úÂëÌá½»£©£¬ÓÖ²»Ïë±»ÎóÈÏΪÊǵ¼ÖºóÃæ±àÒë²»¹ýµÄ×ï¿ý»öÊ×£¬ÄǾͿÉÒÔͨ¹ýÔÚÕâЩÖмäÌá½»ÈÎÎñµÄ commit message ÖмÓÉÏ [ci skip] ×ֶΣ¬¸æËß Gitlab Ìø¹ý¶ÔÕâЩÌá½»µÄ¹¹½¨²âÊÔ£¬Ö»ÔÚ×îºóÒ»´ÎÌá½»ÖÐÈ¥³ý¸Ã×ֶΣ¬¼ì²é×îºóÒ»´ÎµÄÌá½»¼´¿É¡£

ÁíÍâÒ»¸öÎÊÌâÊÇ£¬×Ô´ÓÆôÓÃÁËÕâÖÖ·½°¸£¬ÎÒÃÇ·þÎñÆ÷ÉϵĹ¹½¨ÈÎÎñÒ»ÏÂ×Ó±¬Ôö¡£Ò»¸ö×ÓÄ£¿éµÄ´úÂëÍÆËÍ¿ÉÄܻᴥ·¢¶à¸ö¹¹½¨ÈÎÎñ£¬¶øÎÒÃÇĿǰ¸ºÔð³ÖÐø¼¯³ÉµÄ»úÆ÷»¹ºÜÉÙ¡£ÕâʹµÃÍÆËÍÍê´úÂëºó£¬ÍùÍùÐèÒªµÈÉϰëÌì²ÅÄÜ¿´µ½½á¹û£¬Õâ¿ÉÄÜ»áÓ°ÏìÎÊÌⶨλµÄ¼°Ê±ÐÔ¡£ÎÒÃÇÔÚºóÃæ×¼±¸½øÐÐÒ»¸öÓÐȤµÄ³¢ÊÔ£ºÃ¿¸ö¿Í»§¶Ë¿ª·¢ÕߵĻúÆ÷ÆäʵÒѾ߱¸Á˹¹½¨ÖÁÉÙÒ»¸öƽ̨µÄ¿Í»§¶ËµÄÌõ¼þ£¬ËùÒÔ¿ÉÒÔÀûÓÿª·¢»úµÄÊ£Óà×ÊÔ´À´°ïæ¹¹½¨¡£¾ßÌå·½·¨ÊÇ£ºÃ¿¸ö¿ª·¢Õß½«×Ô¼ºµÄ»úÆ÷×¢²áΪһ¸ö Runner £¬²¢×ÔÐдòÉÏ android »òÕß ios ±êÇ©£¬±êÃ÷»úÆ÷ÄܱàÒëÄĸöƽ̨µÄ¿Í»§¶Ë£º

$ gitlab-ci-multi-runner register -url http://yourcompany.com/ci -registration-token z_AvFaPcdF9aE3sseEvw --name "android-panweizhou" --limit 1 --executor shell --shell bash --tag-list "android"

µ±»úÆ÷ÔÝʱ¿ÕÓàʱ£¬¿ÉÒÔ¿ªÆôÕâ¸ö Runner £¬¼ÓÈë°ïæ¹¹½¨µÄ¶ÓÎé¡£Gitlab ½«¸ù¾Ý¸Ã Runner µÄ±êǩΪÆä°²ÅÅÏàӦƽ̨µÄ¹¹½¨ÈÎÎñ£º

$ gitlab-ci-multi-runner start

Äêµ×ÎÒÃǽ«Í³¼Æ³ö Gitlab ÉÏÕâЩ Runner µÄ¹¹½¨´ÎÊý£¬¶Ô´ÎÊý¶àµÄ Runner ½øÐбíÕá£ÕæÊÇÌÉמͰÑÇ®ÕõÁËÓÐľÓУ¡

 
   
2984 ´Îä¯ÀÀ       31
Ïà¹ØÎÄÕÂ

ÿÈÕ¹¹½¨½â¾ö·½°¸
ÈçºÎÖÆ¶¨ÓÐЧµÄÅäÖùÜÀíÁ÷³Ì
ÅäÖùÜÀíÖ÷Òª»î¶¯¼°ÊµÏÖ·½·¨
¹¹½¨¹ÜÀíÈëÃÅ
Ïà¹ØÎĵµ

ÅäÖùÜÀíÁ÷³Ì
ÅäÖùÜÀí°×ƤÊé
CM09_CÅäÖùÜÀí±ê×¼
ʹÓÃSVN½øÐа汾¿ØÖÆ
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀíʵ¼ù
ÅäÖùÜÀí·½·¨¡¢¹¤¾ßÓëÓ¦ÓÃ
¶à²ã´Î¼¯³ÉÅäÖùÜÀí
²úÆ··¢²¼¹ÜÀí