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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÔÚPython WebÏîÄ¿ÖÐʹÓÃJenkins½øÐгÖÐø¼¯³É
 
À´Ô´£ºÍøÂç ·¢²¼ÓÚ 2017-5-2
  4215  次浏览      31
 

ÔÚÒ»¸öÏîÄ¿µÄ¿ª·¢¹ý³ÌÖУ¬ÍùÍù»áÓÐһЩÐèÒª·´¸´Ö´ÐеIJÙ×÷£¬±ÈÈç±àÒë¡¢²âÊÔ¡¢²¿Êð¡£¾ßÌåÓÚFlaskÏîÄ¿£¬ÎÒÒ»°ãʹÓÃnoseÖ´Ðе¥Ôª²âÊÔ¡¢fabric½øÐв¿Êð¡¢pylintÖ´ÐдúÂëÖÊÁ¿¼ì²âµÈ¡£ÕâЩƵ·±ÐèÒªÖ´ÐеIJ½Ö裬ÊǷdz£¿ÝÔïµÄ£¬ÄǺβ»½»¸ø»úÆ÷À´×Ô¶¯Ö´ÐÐÄØ£¿×î½ü£¬ÎÒ²ÎÓëµÄÒ»¸öУÄÚÍŶÓÒ²Óöµ½ÁËÀàËÆµÄÎÊÌ⣬ÓÚÊÇ´òËãµ÷ÑÐÒ»ÏÂÏà¹ØµÄ¹¤¾ß¡£

»¹ÊÇϰ¹ßÐԵزéÔÄÁËÏÂKenneth Reitz´óÉñµÄpython-guide£¬¹ûÈ»ÕÒµ½Á˹ØÓÚCIµÄÕ½ڡ£Ñ¡À´Ñ¡È¥£¬×îÖÕûÓÐÑ¡ÔñPython StackµÄBuildbot£¬¶øÊǸü¼Ó³ÉÊìµÄJenkins¡£Jenkins»ùÓÚJava¿ª·¢£¬ÊÇÒµ½çʹÓõÃ×î¶àµÄÒ»¿î³ÖÐø¼¯³Éϵͳ£¬Êг¡·Ý¶îÕ¼µ½ÁË70%¡£

¹ØÓÚJenkins£¬¹Ù·½µÄ½éÉÜÈçÏ£º

monitors executions of repeated jobs, such as building a software project or jobs run by cron¡£

ÎĵµÖÐҲ˵ĿǰJenkinsרעÓÚÒÔÏÂ2¸öµã£º

Building/testing software projects continuously

Monitoring executions of externally-run jobs

ÆäʵJenkinsÄܹ»×öµÄÔ¶²»Ö¹ÕâÁ½µã£¬Äã¿ÉÒÔ°ÑËüÀí½â³É¿ÉÒÔ×Ô¶¯Ö´ÐÐÈÎÎñ£¨ÀàËÆcron£©²¢ÊÕ¼¯±¨¸æµÄ»ù´¡¹¤¾ß¡£ÔÙ¼ÓÉÏËüÓÐ×ŷdz£·á¸»µÄ²å¼þ¿â£¬ËùÒÔʹÓÃÆðÀ´Ó¦¸ÃÊǺÜÁé»îµÄ¡£

ÏÂÃæ¼Ç¼һЩÔÚPython WebÏîÄ¿ÖÐÓ¦ÓÃJenkinsµÄ¾­Ñé¡£

°²×°

¼ûInstalling Jenkins¡£ËüÒ²Ö§³Öͨ¹ýDocker°²×°£¬ÕæµÄÊǽô¸ú³±Á÷£¡

ÐèÒªÌáµÄÒ»µãÊÇJenkins±È½ÏºÄÄڴ棬²»ÔËÐÐÈκι¹½¨ÈÎÎñµÄÇé¿öϾͳԵôÁË300¶àM£¬ÔÙ¼ÓÉϹ¹½¨ÈÎÎñʱ»áÕ¼Óøü¶à£¬ËùÒÔ½¨Òé·þÎñÆ÷µÄÄÚ´æÖÁÉÙÓÐ1G£¬512MµÄ»°ºÜ¿ÉÄÜÔÚÖ´Ðй¹½¨ÈÎÎñµÄʱºòÄÚ´æ²»¹»Óá£

·ÃÎÊ¿ØÖÆ

°²×°ºóĬÈÏËùÓÐÈ˶¼¿ÉÒÔ·ÃÎÊ£¬¹ÊÐèÒª¸ü¸Ä·ÃÎÊ¿ØÖƲßÂÔ£¬¾ßÌå¼ûStandard Security Setup¡£

²å¼þÇåµ¥

ÏÂÃæÊÇÎÒÓõ½µÄһЩ²å¼þ£º

Git Plugin£ºÊ¹ÓÃGit×÷ΪԴ´úÂë¹ÜÀí

SSH plugin£ºÔ¶³ÌsshµÇ¼serverÖ´ÐÐÃüÁî

Parameterized Trigger Plugin£º´¥·¢ÆäËûµÄjob

Cobertura Plugin£º´úÂë²âÊÔ¸²¸ÇÂʱ¨¸æ

Task Scanner Plugin£º¼ì²â´úÂëÖгöÏÖµÄÌØÊâ±ê¼Ç£¨ÈçTODOµÈ£©

Violations£º´úÂëÖÊÁ¿¼ì²â£¬Ö§³Öpylint¡¢jslintµÈ

ThinBackup£ºÓÃÓÚ±¸·ÝJenkins

SCM Sync configuration plugin£º½«JenkensµÄÅäÖñä¸üͬ²½µ½SCMÖÐ

ÕâÀïÖ»ÊǼ¯ÖеØÁоÙһϣ¬¾ßÌåµÄʹÓûáÔÚÏÂÃæ´©²å½éÉÜ¡£

²âÊÔ¡¢Staging²¿Êð¡¢Production²¿ÊðÁ÷³Ì

¸ù¾Ý±¾ÏîÄ¿µÄÐèÒª£¬ÔÚJenkinsÖн¨Á¢ÁË3¸öÈÎÎñ£º

tm_test£ºÓÃÓÚÖ´ÐвâÊÔ¡¢´úÂëÖÊÁ¿¼ì²âµÈ

tm_staging_deploy£ºÓÃÓÚÔÚstaging·þÎñÆ÷ÉÏdeploy´úÂë

tm_deploy£ºÓÃÓÚÔÚproduction·þÎñÆ÷ÉÏdeploy´úÂë

ÆäÖÐstaging·þÎñÆ÷ÓÃÓÚ½øÐÐÏßÉϲâÊÔ£¬staging·þÎñÆ÷ºÍproduction·þÎñÆ÷µÄ»·¾³±ØÐë±£³ÖÍêÈ«Ïàͬ£¨µ±È»£¬staging·þÎñÆ÷ÅäÖÿÉÒÔµÍһЩ£©¡£

¾ßÌåµÄ¿ª·¢¡¢²âÊÔ¡¢²¿ÊðÁ÷³ÌÊÇ£º

ÔÚ¿ª·¢Ð¹¦ÄÜ/ÐÞ¸´bugµÄʱºò£¬Ò»°ãÊÇ¿ªÐ·ÖÖ§£»µ«Èç¹ûÊÇÄÇÖÖºÜСµÄÐ޸ģ¬ÔòÖ±½ÓÔÚmasterÉϸģ¬ÕâÑù±È½Ïʡʶù

й¦ÄÜ¿ª·¢Íê³É/bugÐÞ¸´ºó£¬½øÐе¥Ôª²âÊÔ+È˹¤²âÊÔ£¬Èç¹ûͨ¹ý£¬ºÏ²¢µ½master

ÿ´ÎmasterÓб䶯ºó£¬´¥·¢tm_testÈÎÎñ£¬Ö´Ðм¯³ÉµÄµ¥Ôª²âÊԺʹúÂëÖÊÁ¿¼ì²â£¬Èç¹ûOK£¬Ôò×Ô¶¯´¥·¢tm_staging_deploy£¬²¿Êðµ½staging·þÎñÆ÷ÉÏ

Èôtm_staging_deploy³É¹¦£¬ÔòµÇ½µ½ÔËÐÐÔÚstaging·þÎñÆ÷µÄ²âÊÔÍøÕ¾ÉÏ£¬È˹¤²âÊÔй¦ÄÜÊÇ·ñOK/bugÊÇ·ñÒÑÐÞ¸´£»Èôtm_staging_deployʧ°Ü£¬¼ì²éʧ°ÜÔ­Òò£¬½øÐÐÐÞ¸´£¬Ö±ÖÁ³É¹¦

ÈôstagingÈ˹¤²âÊÔͨ¹ý£¬ÔòÊÖ¶¯´¥·¢tm_deploy£¬²¿Êðµ½Éú²ú·þÎñÆ÷ÉÏ

µÇ¼µ½Éú²ú·þÎñÆ÷ÉϽøÐÐÈ˹¤²âÊÔ£¬Èô³öÏÖÎÊÌ⣬½øÐÐÐÞ¸´£»Í¬Ê±ÃÜÇйØ×¢Sentry·¢Ë͵ĸ澯Óʼþ£¬ÕùÈ¡ÔÚµÚһʱ¼äÐÞ¸´´íÎó

±È½Ï¼òµ¥£¬Ã»ÓвÉÓÃGit-Flow/GitHub-Flow£¬µ¥Ôª²âÊÔдµÃºÜdz£¬Ò²Ã»ÓÐ×ö´úÂëÉó²é¡£²»¹ýÍŶӹæÄ£Ð¡£¬´ÓĿǰÀ´¿´£¬ÉÏÃæµÄÁ÷³ÌÊǹ»Óõġ£

ÏÂÃæ¶ÔÕâÈý¸öÈÎÎñ×ö½ÏΪÏêϸµÄ½éÉÜ¡£

tm_test

¸ÃÈÎÎñÓÃÓÚÖ´ÐвâÊÔ¡¢´úÂëÖÊÁ¿¼ì²âµÈ¡£

push´¥·¢¹¹½¨

ÿµ±ÏîÄ¿²Ö¿âµÄmaster·ÖÖ§Óб䶯ʱ£¬¼´»á´¥·¢tm_test¡£Òª×öÕâÒ»µã£¬ÐèÒªÈçϲ½Ö裺

ÉèÖÃtm_testµÄBuild TriggersΪPoll SCM£¬µ«²»ÌîSchedule

ΪÏîÄ¿²Ö¿âÌí¼ÓWeb Hook£¬URLÌîдhttp://<Jenkins URL>/git/notifyCommit?url=<URL of the Git repository>

²Î¿¼Stack Overflow¡£

ʹÓÃvirtualenvÅäÖòâÊÔ»·¾³

Ö´ÐвâÊÔ֮ǰ£¬ÐèҪȷ¶¨Python°æ±¾£¨Ò»°ãÊÇ2.7£©£¬È»ºó¸ù¾Ý´Ë°æ±¾³õʼ»¯virtualenv¡£

ÔÚ¹¹½¨ÖÐÌí¼ÓExecute shellÏ

if [ ! -d "venv" ]; then
virtualenv -p /usr/bin/python2.7 venv
fi

. venv/bin/activate
pip install -i http://pypi.douban.com/simple -r requirements.txt

²âÊÔÓ뱨¸æ

²âÊÔÖÐÐèÒª2¸ö¿â£ºnoseÓÃÓÚÖ´Ðе¥Ôª²âÊÔ£¬coverageÓÃÓÚͳ¼Æ²âÊÔ¸²¸ÇÂÊ¡£

ÐèÒªÔÚJenkinsÖа²×°Cobertura Plugin²å¼þ£¬ÓÃÓÚÉú³É´úÂë²âÊÔ¸²¸ÇÂʱ¨¸æ¡£

È»ºóÔÚ¹¹½¨ÖÐÌí¼ÓExecute shellÏÊäÈ룺

nosetests --with-xunit --with-coverage --cover-package=tm && coverage xml

ÆäÖÐ--with-xunit¸æËßnoseÊä³öJUnitÐÎʽµÄ²âÊÔ±¨¸æ£¬--with-coverage±íʾͬʱÔËÐÐcoverage£¨Õâ¸ö¹¦ÄÜÏ൱ÔÞ£©£¬--cover-package=tm±íʾ½ö¶ÔÖ¸¶¨µÄpackageÖ´ÐвâÊÔ¸²¸ÇÂʼì²â£¬ºóÃæµÄcoverage xml±íʾÊä³öxml¸ñʽµÄcoverage±¨¸æ¡£

È»ºóÔÚ¹¹½¨ºó²Ù×÷ÖУ¬Ìí¼ÓÈçÏÂ2Ï

Publish JUnit test result report£ºÌîдnosetests.xml

Publish Cobertura Coverage Report£ºÌîдcoverage.xml

ÕâÑùÒ»À´£¬¾Í¿ÉÒÔÖ´ÐвâÊÔ£¬²¢µÃµ½²âÊÔ±¨¸æºÍ²âÊÔ¸²¸ÇÂʱ¨¸æÀ²£º

ÉÏÃæµÄͼ±í¶¼Êǿɵã»÷µÄ£¬µã½øÈ¥ºóÓдúÂë¼¶µÄÏêϸ±¨¸æ£¬·Ç³£ÔÞ£º

ÂÌÉ«µÄ´úÂëÐбíʾÒѾ­¸²¸Çµ½£¬ºìÉ«ÔòûÓС£

´úÂëÖÊÁ¿¼ì²â

JenkinsÓÐÒ»¸öÂù²»´íµÄ´úÂëÖÊÁ¿±¨¸æ²å¼þ£ºViolations£¬Ö§³Ö·Ç³£¶àµÄ´úÂë²âÊÔ¹¤¾ß¡£Ä¿Ç°ÏîÄ¿ÖÐʹÓÃPylint×öPython´úÂëÖÊÁ¿¼ì²â£¬Ê¹ÓÃJSHint×öJavaScript´úÂëÖÊÁ¿¼ì²â¡£

ÔÚ°²×°ºÃPylintºó£¬ÔËÐÐpylint --generate-rcfile > pylintrcÉú³ÉÅäÖÃÎļþ£¬²¢½«ÆäÖеÄoutput-formatÏîµÄÖµ¸ÄΪparseable¡£

È»ºóÔÚ¹¹½¨ÖÐÌí¼Ó2ÏîExecute shellÏ

pylint£º

pylint tm2 > pylint.xml || exit 0

jshint£º

jshint --reporter=jslint $WORKSPACE/tm2/static/js/ > jslint.xml || exit 0

ÆäÖеÄexit 0ÊÇΪÁ˸æËßJenkins¸ÃÃüÁîÖ´Ðгɹ¦¡£¶ÔÓÚjshintÀ´Ëµ£¬reportÑ¡Ôñjslint£¬È»ºóÐèҪʹÓÃ$WORKSPACE×é³É¾ø¶Ô·¾¶£¬·ñÔòÎÞ·¨¿´µ½Ô´Âë¼¶µÄ·ÖÎö±¨¸æ£¨ÊDz»ÊÇÒ»¸öbug£¿£©¡£

È»ºóÔÚ¹¹½¨ºó²½ÖèÖÐÌí¼ÓViolations Report£¬ÔÚ¶ÔӦλÖÃÊäÈëjslint.xmlºÍpylint.xml¡£

×îÖÕµÄͼÐα¨¸æÈçÏ£¬¿ÉÒÔ¿´µ½Ç÷ÊÆ×ßÏò£º

Ô´Âë¼¶±ðµÄ·ÖÎöÒ²ÓУº

¼ì²â´úÂëÖеÄÌØÊâ±ê×¢£¨ÈçTODO£©

ÍŶÓÖÐÔ¼¶¨£¬ÔÚ´úÂëδÍê³ÉµÄµØ·½Ê¹ÓÃTODO½øÐбê¼Ç£¬ÒòΪPyCharmÓÐÒ»¸öºÜºÃµÄ¹¦ÄܾÍÊÇ¿ÉÒÔ¼ì²â³ö´úÂëÖеÄËùÓÐTODOÐÅÏ¢£º

JenkinsÖÐÒ²ÓÐÒ»¸ö·Ç³£°ôµÄ²å¼þTask Scanner PluginÓÃÓÚ¼ì²â´úÂëÖгöÏÖµÄÌØÊâ±ê¼Ç£¬µ±È»£¬ÕâÐ©ÌØÊâ±ê¼ÇÍêÈ«ÊÇ¿ÉÒÔ×Ô¶¨ÒåµÄ¡£

°²×°Íê¸Ã²å¼þºó£¬ÔÚ¹¹½¨ºó²Ù×÷ÖÐÌí¼ÓÒ»ÏîScan workspace for open tasks£¬¸ù¾ÝÐèÒªÌîдÅäÖãº

È»ºó±¨¸æ¾Í¿ÉÒÔ³öÀ´À²£º

Óʼþ¸æ¾¯

Èç¹û¹¹½¨ºó״̬ÊÇunstable»òfailed£¬Ôò¿ÉÒÔ·¢ËÍÓʼþ¸æ¾¯£¬¼°Ê±Í¨ÖªÏà¹Ø¸ºÔðÈ˽øÐд¦Àí¡£Jenkins×Ô´øSMTP¹¦ÄÜ£¬²»¹ýÐèÒªÄãÌṩSMTP·þÎñÆ÷¡£

ÎÒʹÓõÄÊÇqqÓÊÏäSMTP·þÎñÆ÷£¬Í¦ºÃÓõģ¬Ä¿Ç°Ã»Óз¢Ï־ܷ¢µÄÇé¿ö¡£ÓÐÒ»µãÐèҪעÒâµÄÊÇ£¬ÔÚÅäÖúÃSMTPµÄÕË»§ÐÅÏ¢ºó£¬»¹ÐèÌîдϵͳ¹ÜÀíÔ±ÓʼþµØÖ·£¬·ñÔò»á·¢ËÍʧ°Ü£¬ÕâÒ²ÊDZȽÏÈÝÒ׺öÂԵĵط½¡£

ÅäÖúÃSMTPºó£¬È»ºóÔÚ¹¹½¨ºó²Ù×÷ÖÐÌí¼ÓE-mail NotificationÏÌîд¸ºÔðÈ˵ÄÓÊÏä¼´¿É¡£

´¥·¢ÏÂÓÎÈÎÎñ

Èç¹ûtm_test¹¹½¨³É¹¦£¬ÔòÐèÒª×Ô¶¯´¥·¢tm_staging_deployÈÎÎñ£¬Õâ¸ö´¥·¢¹ý³ÌÊÇͨ¹ý²å¼þParameterized Trigger PluginÀ´Íê³ÉµÄ¡£

ÔÚ¹¹½¨ºó²Ù×÷ÖÐÌí¼ÓTrigger parameterized build on other projectsÏѡÔñ´¥·¢Ìõ¼þΪstable£¬È»ºóÌîд´ý³ö·¢µÄÈÎÎñÃû³Æ¼´¿É¡£

×îºóµÄtm_testÈÎÎñÃæ°åÈçÏ£º

½çÃæÊÇͦoutµÄ£¬²»¹ýºÜʵÓá£

tm_staging_deploy

ÕâÒ»¸öjobÓÃÓÚ½«×îдúÂ벿Êðµ½staging·þÎñÆ÷ÉÏ£¬ÎÒ²ÉÓõIJ¿Êð·½·¨ÊÇͨ¹ýsshÔ¶³ÌµÇ½·þÎñÆ÷Ö´ÐÐÃüÁîµÄ·½Ê½£¬ÐèÒªÒ»¸ö²å¼þSSH plugin¡£

È»ºóÔÚ¹¹½¨ÖÐÌí¼ÓShellÏ

cd /var/www/tm
export MODE=PRODUCTION
git reset --hard HEAD
git pull -f
source venv/bin/activate
pip install -r requirements.txt
python manage.py db upgrade
supervisorctl restart tm

´ËÈÎÎñºÍtm_staging_deploy»ù±¾²î²»¶à£¬²»Í¬µÄµØ·½ÓÐ2¸ö£º£¨1£©Ä¿±ê·þÎñÆ÷²»Í¬£¨2£©´¥·¢·½Ê½ÊÇÊÖ¶¯´¥·¢

±¸·Ý

ʹÓÃthinBackup½øÐб¸·Ý£¬¿ÉÉ趨±¸·ÝÖÜÆÚ¡£

ÅäÖñä¸üͬ²½

³ý´ËÖ®Í⣬ÎÒ»¹Óõ½ÁËÒ»¸öºÜÓÐÓõIJå¼þSCM Sync configuration plugin£¬¾ÍÊǰÑJenkinsµÄÅäÖã¨È«¾ÖÅäÖÃ+¸÷jobÅäÖã©Í¬²½µ½Ò»¸öGit²Ö¿âÖС£ÕâÑùµÄ»°£¬Ã¿´ÎÅäÖÃÓб䶯£¬¶¼»áÐγÉÒ»¸öcommitÍÆË͵½Git²Ö¿â¡£

ÕâÏ൱ÓÚ°ÑÅäÖõÄÀúÊ·±äǨ¶¼¼Ç¼ÏÂÀ´£¬Èç¹ûÄÄÌìJenkinsÈÎÎñ¹ÒÁË£¬¿ÉÒÔ¿´¿´ÅäÖñä¸ü½øÐÐÅÅ´í¡£

 

 

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

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

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

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
ÏîÄ¿¹ÜÀí:MavenÈÃÊÂÇé±äµÃ¼òµ¥
³ÖÐø¼¯³É¹¤¾ßhudson
³ÖÐø¼¯³É
MavenȨÍþÖ¸ÄÏ
³ÌÐò¼¯(UMLÖеİü)Ö®¼äÑ­»·


²úÆ··¢²¼¹ÜÀí
ÅäÖùÜÀí·½·¨¡¢Êµ¼ù¡¢¹¤¾ß
¶à²ã´Î¼¯³ÉÅäÖùÜÀí
ʹÓÃCCÓëCQ½øÐÐÏîĿʵ¼ù
CVSÓëÅäÖùÜÀí
Subversion¹ÜÀíÔ±


º£º½¹É·Ý ÖØ¹¹¼°³ÖÐø¼¯³É
µçÑлªÔ´ Éè¼ÆÔ­Àí¡¢½¨Ä£ÓëÖØ¹¹
Èí¼þÅäÖùÜÀíÈÕ¹¹½¨¼°³ÖÐø¼¯³É
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
ÖйúÈí¼þÑз¢ÖÐÐÄ µ¥Ôª²âÊÔÓëÖØ¹¹
µ¥Ôª²âÊÔ¡¢Öع¹ºÍ³ÖÐø¼¯³Éʵ¼ù
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ+ÖØ¹¹+Gtest