
äžã®å³ã¯ãã°ããŒãã«é£ç¶ããŒã¿è»¢éãã©ãããã©ãŒã ã§ããSpinnakerã玹ä»ãã以åã®æçš¿ãžã®åç §ã§ãã ãã ããSpinnakerã®ã³ãŒãè¡ã«å ¥ãåã«ãããã€ãã®æé ãå®è¡ããå¿ èŠããããŸãã
- ã³ãŒãã¯ã Nebulaãã©ã°ã€ã³ã«ãã£ãŠããŒã«ã«ã§äœæããã³ãã¹ãããå¿ èŠããããŸãã
- å€æŽã¯äžå€®ã®gitãªããžããªã«ããã·ã¥ãããŸãã
- Jenkinsã¯ãã¯ã©ãŠãçšã®ã¢ããªã±ãŒã·ã§ã³ãäœæããã¹ããããã³æºåããNebulaãèµ·åããŸãã
- ãã«ãã¯Amazon Machine Imageã§ãçŒãä»ãããããŸãã
- Spinnakerã¯ãå€æŽãããã³ãŒãã®ããã¯è§£é€ãšã¢ã¯ãã£ãåã«åœ¹ç«ã¡ãŸãã
ãã®æçš¿ã®æ®ãã®éšåã§ã¯ããããã®å段éã§äœ¿çšãããããŒã«ãšæ¹æ³ã«ã€ããŠèª¬æããéäžã§ééãã課é¡ã«ã€ããŠèª¬æããŸãã
çµç¹æåãã¯ã©ãŠããããã³ãã€ã¯ããµãŒãã¹
Netflixã®ã³ãŒãäœæããã»ã¹ãæãäžããåã«ãçµç¹ã®æåãã¯ã©ãŠãããã€ã¯ããµãŒãã¹ãªã©ãææ決å®ã«åœ±é¿ãäžããéèŠãªèŠçŽ ãç¹å®ããå¿ èŠããããŸãã
Netflixã®æåã¯ãã¿ã¹ã¯ã®è§£æ±ºã«é©ããããŒã«ã䜿çšãããšããç¹ã§ããšã³ãžãã¢ã®èœåãæ¡åŒµããŸãã ç§ãã¡ã®çµéšã§ã¯ããœãªã¥ãŒã·ã§ã³ãåºãèªèãããããã«ã¯ãã»ãšãã©ã®Netflixãšã³ãžãã¢ã®æšè«ãæçšæ§ãèªç¥è² è·ã軜æžããå¿ èŠããããŸãã ããŒã ã¯åé¡ã解決ããæ¹æ³ãèªç±ã«éžæã§ããŸããããããã®æ±ºå®ããµããŒãããããã«è¿œå ã®è²¬ä»»ãè² ããŸãã äžå€®ã®NetflixããŒã ããã®ãªãã¡ãŒã¯ããèè£ éè·¯ãã®äžéšãšèŠãªããå§ããŠããŸãã ä»ãç§ãã¡ã®æ³šç®ã®çã§ãããç§ãã¡ã®å°é家ã«ãã£ãŠãµããŒããããŠããã®ã¯åœŒå¥³ã§ãã
ããã«ã2008幎ã«ãNetflixã¯ããŒã¿ã¹ããªãŒãã³ã°ã®AWSãžã®ç§»è¡ãšãã¢ããªã·ãã¯JavaããŒã¹ã®ããŒã¿ã»ã³ã¿ãŒã®ã¯ã©ãŠãããŒã¹ã®Javaãã€ã¯ããµãŒãã¹ãžã®ç§»è¡ãéå§ããŸãã ã Netflixã®ã¢ãŒããã¯ãã£ã«ãããNetflixããŒã ã¯äºãã«åŒ·ãçµã³ä»ããããªããããã客æ§ã«ãšã£ãŠéœåã®è¯ãããŒã¹ã§åé¡ã®è§£æ±ºçãäœæããã³æšé²ã§ããŸãã
éçº
ãµãŒãã¹ãã¢ããªã±ãŒã·ã§ã³ãå±éããåã«ãæåã«éçºããªããã°ãªããªãããšã¯èª°ãé©ããªããšæããŸãã éçºäžã®äž»ãªåé¡ã«å¯ŸåŠããããã«ã Gradleçšã®ãã«ãã·ã¹ãã ãã©ã°ã€ã³ã®ã»ããã§ããNebulaãäœæããŸããã Gradleã¯ãã³ãŒãã®åºæ¬çãªããŒãºãã«ããŒãããã ãJavaã¢ããªã±ãŒã·ã§ã³ãéçºããã¹ããããã³ãããã€ããããã®ãã¡ãŒã¹ãã¯ã©ã¹ã®ããŒã«ã§ãã çµæã®ãã¡ã€ã«ãæžãããªããããã¹ãå¯èœãªãã©ã°ã€ã³ãç°¡åã«äœæã§ããããããã®ããŒã«ãéžæãããŸããã ãããã£ãŠãNebulaã¯ãGradleã®å©ããåããŠãé¢ä¿ããªãªãŒã¹ãå±éãããã³ä»ã®å€ãã®ããŒã«ã管çããããã®äœ¿çšå¯èœãªãã©ã°ã€ã³ã®ã»ããã䜿çšããŠãä¿¡é Œæ§ã®é«ãèªååæ©èœãæäŸããŸãã

ã·ã³ãã«ãªJavaã¢ããªã±ãŒã·ã§ã³ã Build.gradleãã¡ã€ã«
äžèšã®build.gradleãã¡ã€ã«ã¯ãNetflixã§éåžžã®Javaã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäŸã§ãã ãã®ãããžã§ã¯ãã®æ¬æã«ã¯ãJavaã³ãã³ããš4ã€ã®Gradleãã©ã°ã€ã³ãããããã®ãã¡3ã€ã¯Nebulaã®äžéšã§ãããããã©ã°ã€ã³ã«é¢é£ä»ããããå éšèšå®ã§ãã 'nebula'ãã©ã°ã€ã³ã¯Gradleã®äžéšã§ãããã€ã³ãã©ã¹ãã©ã¯ãã£ãšã®çµ±åã«å¿ èŠãªæ¥ç¶ãšèšå®ãæäŸããŸãã ãã©ã°ã€ã³ãnebula.dependency-lockãã䜿çšãããšããããžã§ã¯ãã¯å€æ°ã®äŸåé¢ä¿ãæ§ç¯ããa.lockãã¡ã€ã«ãäœæããŠãç¹°ãè¿ãå®è¡ããããšãã§ããŸãã ãã©ã°ã€ã³ãnetflix.ospackage-tomcatããšospackageãããã¯ã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
Nebulaã䜿çšããŠãåã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã«ã®ãã³ãã¬ãŒãé床ãäœäžãããããšãç®çã«ãåå©çšå¯èœã§äºææ§ã®ãããã«ãæ©èœãæäŸããããšããŠããŸãã 次ã®æçš¿ã§ã¯ãNebulaãšãã®ããŸããŸãªæ©èœã«ã€ããŠè©³ãã説æããŸããã³ãŒãã¯å ¬éãããŠããŸãã ãããŸã§ã®éã Nebulaã®Webãµã€ãã«ã¢ã¯ã»ã¹ã§ããŸãã
çµ±å
Nebulaã䜿çšããŠã³ãŒããããŒã«ã«ã§ãã¹ãããåŸãçµ±åãšå±éã«é²ãããšãã§ããŸãã æåã«ãå¿ èŠã«å¿ããŠããŒã ãèªç±ã«ã¯ãŒã¯ãããŒãèŠã€ããããšãã§ããããã«ãGitãªããžããªã§æŽæ°ããããœãŒã¹ã³ãŒããå®è¡ããå¿ èŠããããŸãã
å€æŽã確èªãããšãJenkinsé¢æ°ãããªã¬ãŒãããŸãã Jenkinsã䜿çšããç¶ç¶çãªçµ±åã¯ãé·å¹Žã«ããã£ãŠé²åããŠããŸããã ããŒã¿ã»ã³ã¿ãŒã§ã¯ã1ã€ã®å·šå€§ãªãã¹ã¿ãŒJenkinsããå§ããŸãããããã®çµæãAWSã§25人ã®ãã¹ã¿ãŒJenkinsã䜿çšãããŸããã Netflixã§ã¯ãåçŽãªç¶ç¶ççµ±åãããè€éãªå€æ°ã®èªååã¿ã¹ã¯ã«äœ¿çšãããŸãã
Jenkinsã®ã¿ã¹ã¯ã¯ãNebulaãåŒã³åºããŠã¢ããªã±ãŒã·ã§ã³ã³ãŒããäœæããã¹ããããã³æºåããããšã§ãã ãªããžããªãã©ã€ãã©ãªã«ãªããšãNebulaã¯* .jarããªããžããªã«å ¬éããŸãã ãªããžããªãã¢ããªã±ãŒã·ã§ã³ã®å ŽåãNebulaã¯ospackageãã©ã°ã€ã³ãèµ·åããŸãã ospackageïŒããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã±ãŒãžãïŒãã©ã°ã€ã³ã¯ãäœæãããã¢ããªã±ãŒã·ã§ã³ã®ã¢ãŒãã£ãã¡ã¯ããDebianãŸãã¯RPMããã±ãŒãžãšããŠæ瀺ãããã®å 容ã¯åçŽãªGradleããŒã¹ã®DSLã䜿çšããŠæ±ºå®ãããŸãã ãã®åŸãNebulaã¯Debianãã¡ã€ã«ãããã±ãŒãžãªããžããªã«å ¬éãã次ã®ã¹ãããã§ããããŒãã³ã°ã«å©çšã§ããããã«ããŸãã
ãããŒãã³ã°ã
泚ïŒãããŒãã³ã°ãããã³ãããŒã«ãªãŒããšã¯ãã¬ã·ããã·ãŒã±ã³ã¹ãå¿ èŠãªæ¡ä»¶ã®éµå®ãªã©ãå®éã®ããŒãã³ã°ããã»ã¹ãšã®é¡äŒŒæ§ãæå³ããŸãã åäœè ã¯ãã®é©åœãæ¬åœã«æ°ã«å ¥ã£ãŠãããä»åŸãé »ç¹ã«äœ¿çšããŸãã æ®å¿µãªããããããã®èšèã«èŸŒããããæå³ãããã·ã¢èªã®é¡äŒŒèªãèŠã€ããããŸããã§ããã
ç§ãã¡ã®å±éæŠç¥ã¯ãµãŒããŒãã¿ãŒã³ã®äžå€æ§ã«çŠç¹ãåãããŸã ã æ§æã®ããªããã®å¯èœæ§ãæžãããå±éã®ç¹°ãè¿ããåããœãŒã¹ããè¡ãããããã«ããããã«ããã¡ã€ã«ãæåã§å€æŽããªãããšã匷ããå§ãããŸãã Netflixã§ã®åãããã€ã¡ã³ãã¯ãæ°ããAMIïŒ Amazon Machine Image ïŒã®äœæããå§ãŸããŸãã ãœãŒã¹ããçŽæ¥AMIãã¡ã€ã«ãäœæããããã«ããBakeryããäœæããŸãã
Bakeryã¯ãAMIã®äœæãéåžžã«ç°¡åã«ããAPIãäœæããŸãã 次ã«ãBakery APIã¯ãAnimatorã䜿çšããŠç»åãäœæããäœæ¥ããŒãã®ã¿ã¹ã¯ããã¹ã±ãžã¥ãŒã«ãããŸãã ããã€ã¯ãæ©èœãåŒã³åºãã«ã¯ããŠãŒã¶ãŒã¯ç®çã®ããã±ãŒãžã®ã€ã³ã¹ããŒã«ãšããã®ããã±ãŒãžãã€ã³ã¹ããŒã«ãããããŒã¹ã€ã¡ãŒãžãã¢ããŠã³ã¹ããå¿ èŠããããŸãã ããïŒåºæ¬AMIïŒã¯ãNetflixãšã³ã·ã¹ãã ã®å€§éšåãšã®å®å šãªçµ±åã«å¿ èŠãªäžè¬çãªå¯ŸæµããµãŒãã¹ãããã³ããŒã«ã§æ§æãããLinuxç°å¢ãæäŸããŸãã
Jenkinsãä»äºã®äžéšãæ£åžžã«å®äºãããšã圌ã¯éåžžã Spinnakerãã€ãã©ã€ã³ ããåŒã³åºããŸãã ãããã¯ãJenkinsã¢ã¯ã·ã§ã³ãŸãã¯Gitã®ã³ãããã«ãã£ãŠããªã¬ãŒã§ããŸãã Spinnakerã¯Nebulaã«ãã£ãŠçæããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã±ãŒãžãèªã¿åããããŒã«ãªãŒAPIã䜿çšããŠéå§ããŸãã
ç³èŸŒã¿
ãããŒãã³ã°ãã®å®äºåŸãSpinnakerã¯ãäœæãããAMIãæ°åãæ°çŸãããã«ã¯æ°åã®ã³ããŒã«å±éã§ããŸãã åãAMIã¯è€æ°ã®ç°å¢ã§äœ¿çšã§ããŸãããåæã«Spinnakerã¯ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã®ã©ã³ã¿ã€ã ãèå¥ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã¯ã©ã³ã¿ã€ã ãã«ã¹ã¿ãã€ãºã§ããŸãã ããŒãã³ã°ãæåãããšãSpinnakerãã€ãã©ã€ã³ã®æ¬¡ã®ãã§ãŒãºã§ãããã¹ãç°å¢ã§ã®ããŒã«ã¢ãŠããéå§ãããŸãã
ããã§ãããŒã ã¯èªååãããçµ±åãã¹ãã®ãããããªãŒãå šäœã䜿çšããŠå±éãéå§ããŸãã ãã®æç¹ããããã€ãã©ã€ã³ã®ç¹ç°æ§ã«ãããå±éããã»ã¹ã¯åŸ®èª¿æŽã®å¯èœæ§ããã人ã ã«äŸåããããã«ãªããŸãã ããŒã ã¯Spinnakerã䜿çšããŠãè€æ°ã®å±éé åãèµ€/é»ã®å±éãªã©ã管çããŸãã Spinnakerãã€ãã©ã€ã³ã¯ãããŒã ã«ã³ãŒãéçºãå¶åŸ¡ããããã®æè»ãªããŒã«ãæäŸãããšèšãã ãã§ååã§ãã
ä»åŸã®ãã¹
äžè¬ã«ããããã®ããŒã«ã¯é«ã¬ãã«ã®çç£æ§ãšèªååãæäŸããŸãã ããšãã°ãã¯ã©ãŠãã®åŸ©å åãšã¡ã³ããã³ã¹ãµãŒãã¹ã§ããJanitor Monkeyãç»é²ãŠã£ã³ããŠããè€æ°å°åã®ã¹ãã£ã³ã«ç§»è¡ããã®ã«16åããããããŸããã

Spinnakerã¯ãJenkinsã«ãã£ãŠåŒã³åºããããã€ãã©ã€ã³ãçŒããŠå±éããŸãã
ããã¯ãéçºè ã®çµéšãå¢ãããåžžã«èªåèªèº«ã«ææŠããæ¹æ³ã暡玢ããŠããããšã瀺åããŠããŸããããè¯ããããéããããç°¡åã«ã
Netflixã§ãã€ããªäŸåé¢ä¿ãã©ã®ããã«æ±ããã«ã€ããŠããèãããŸãã Nebulaã¯ãJavaäŸåé¢ä¿ç·©åããŒã«ãæäŸããŸãã ããšãã°ãäŸåé¢ä¿ããã¯ãã©ã°ã€ã³ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ããã€ããªäŸåé¢ä¿ã®ã°ã©ãã£ãã¯å šäœãèšç®ããå€æ°a.lockãã¡ã€ã«ãäœæã§ããŸãã Nebulaã®ã 解決èŠå ããã©ã°ã€ã³ã䜿çšãããšããããžã§ã¯ãã®ãã¹ãŠã®éšåã«åœ±é¿ããäŸåé¢ä¿èŠåãäœæã§ããŸãã ãããã®ããŒã«ã¯ããã€ããªã®äŸåé¢ä¿ã®ç®¡çã容æã«ããŸãããããã§ãããã©ãŒãã³ã¹ã蚱容ã¬ãã«ãŸã§äœäžãããããšã¯ã§ããŸããã
ãŸããããŒãã³ã°æéã®ççž®ã«ãåãçµãã§ããŸãã å°ãåãŸã§ã16åéã®å±éã¯å€¢ã®ããã«æããŸããããã·ã¹ãã ã®ä»ã®éšåã®é床ãåäžããããããã®å€¢ã¯æœåšçãªé害ã«ãªããŸããã äŸãšããŠãSimian Armyã®å±éãèããŠã¿ãŸãããããã€ã¯åŠçã«ã¯7åããããŸãããããã¯ããã€ã¯åŠçããã³å±éããã»ã¹å šäœã®44ïŒ ã§ãã ãã€ãã³ã°ããã»ã¹ã®ïŒæéå ã®ïŒãªãŒãã¯ãããã±ãŒãžã®ã€ã³ã¹ããŒã«ïŒäŸåé¢ä¿ã®è§£æ±ºãå«ãïŒãšAWSã³ããŒããã»ã¹èªäœã§ããããšãããããŸããã
Netflixãæé·ããæé·ããã«ã€ããŠãä»®æ³ãã·ã³ãªãã§JavaScript / Node.jsãPythonãRubyãGoã®ãã¡ãŒã¹ãã¯ã©ã¹ã®ãµããŒããæäŸããå¿ èŠããããããã¢ã»ã³ããªããã³éçºããŒã«ã®éèŠãå¢å€§ããŸãã çŸåšããããã®èšèªã«å¯ŸããŠãNebula ospackageãã©ã°ã€ã³ããå§ãããŸããããã«ããããã®åŸã®ãçŒãä»ããã®ããã«Debianããã±ãŒãžãååŸãã䜿çšãããã©ãããã©ãŒã ã®ãšã³ãžãã¢ãšããŒã«ã«ã¢ã»ã³ããªãšãã¹ããä»»ããããšãã§ããŸãã ãããŸã§ã®ãšããããã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ãã¡ã«é©ããŠããŸãããç¹å®ã®èšèªãžã®äŸåãæžããããã«ããŒã«ãæ¡åŒµããããšããŠããŸãã
ã³ã³ããã¯ãæåŸã®2ã€ã®åé¡ã解決ããèå³æ·±ãæ©äŒã§ãã çŸåšãã³ã³ãããã¢ã»ã³ããªãããŒãã³ã°ãå±éããã»ã¹ã®æ¹åã«ã©ã®ããã«åœ¹ç«ã€ãã調æ»ããŠããŸãã ã¯ã©ãŠãç°å¢ãæ£ç¢ºã«æš¡å£ããããŒã«ã«ã³ã³ããç°å¢ãäœæã§ããã°ãéçºããã³ãã¹ããµã€ã¯ã«ã«å¿ èŠãªãããŒãã³ã°ãæéãççž®ã§ãããããéçºè ã®çç£æ§ãåäžãã補åéçºããã»ã¹å šäœãã¹ããŒãã¢ããããŸãã ãç®±ããåºããŠããã«ãããŒã«ã«ã«å±éã§ããã³ã³ããã¯ãèªèè² è·ã軜æžããç°å¢ã®éãã«ããééãããªããã©ããã確èªããã®ã§ã¯ãªãããšã³ãžãã¢ãåé¡ãã€ãããŒã·ã§ã³ã®è§£æ±ºã«éäžã§ããããã«ããŸãã