æ¬æ¥ãNode.jsãããžã§ã¯ãã®ãã¹ãå°çšã®è³æã®ç¿»èš³ã®ç¬¬2éšã§ã¯ããã¹ãã®æå¹æ§ã®è©äŸ¡ãšã³ãŒãã®å質ã®åæã«ã€ããŠèª¬æããŸãã
ã»ã¯ã·ã§ã³3.ãã¹ãã®æå¹æ§ã®è©äŸ¡
â19ã æ£ããåäœã®ä¿¡é Œæ§ãåŸãããã«ããã¹ãã§ååã«é«ãã¬ãã«ã®ã³ãŒãã«ãã¬ããžãéæããŸãã éåžžãçŽ80ïŒ ã®ã«ãã¬ããžã§è¯å¥œãªçµæãåŸãããŸãã
æšå¥šäºé
ãã¹ãã®ç®çã¯ãããã°ã©ããŒããããžã§ã¯ãã§çç£çã«äœæ¥ãç¶ããããããšã確èªãããã§ã«è¡ãããããšãæ£ããããšã確èªããããšã§ãã æããã«ããã¹ãããã³ãŒãã®ããªã¥ãŒã ã倧ããã»ã©ããã¹ãŠãæ£åžžã«æ©èœãããšãã確信ã匷ããªããŸãã ãã¹ãã«ããã³ãŒãã«ãã¬ããžã®ã€ã³ãžã±ãŒã¿ã¯ããã¹ãã«ãã£ãŠãã§ãã¯ãããè¡ïŒãã©ã³ããã³ãã³ãïŒã®æ°ã瀺ããŸãã ãã®ã€ã³ãžã±ãŒã¿ãŒã¯ã©ãããã¹ãã§ããïŒ ãããžã§ã¯ãããšã©ãŒãªãã§æ©èœãããšãã確信ãäžããã«ã¯ã10ã30ïŒ ãå°ãªãããããšã¯æããã§ãã äžæ¹ããã¹ãã§ã³ãŒãã100ïŒ ã«ããŒããããšãã欲æ±ã¯ãããŸãã«ãé«äŸ¡ã§ãããæãéèŠãªããã°ã©ã ãã©ã°ã¡ã³ãããéçºè ããããããšãã§ããæ¢åã®ãã¹ããå°éããªãå Žæãã³ãŒãå ã§æ¢ãããšãäœåãªããããŸãã ãã¹ãã§ã³ãŒããã©ã®ããã«ã«ããŒãã¹ãããšãã質åã«å¯ŸããŠããå®å šãªçããåºãã°ãåªåãã¹ãã€ã³ãžã±ãŒã¿ãŒã¯éçºäžã®ã¢ããªã±ãŒã·ã§ã³ã«äŸåããŠãããšèšããŸãã ããšãã°ã次äžä»£ã®Airbus A380çšã®ãœãããŠã§ã¢ãäœæããŠããå Žåã100ïŒ ã¯è°è«ãããŠããªãææšã§ãã ãããã䌌é¡çµµã®ã£ã©ãªãŒã衚瀺ãããWebãµã€ããäœæããå Žåããããã50ïŒ ããã§ã«å€ããããŸãã ãã¹ãã®å°é家ã¯ãç®æšãšãããã¹ãã®ã³ãŒãã«ãã¬ããžã¬ãã«ã¯ãããžã§ã¯ãã«ãã£ãŠç°ãªããšèšããŸãããå€ãã®äººã¯80ïŒ ã®æ°å€ã«èšåããŠãããããããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããŸãã ããšãã°ã ããã§ã¯80ã90ïŒ ã®é åã«ã€ããŠè©±ããŠããŸããããã®è³æã®èè ã«ãããšããã¹ãã§ã³ãŒãã100ïŒ ç¶²çŸ ãããšãããã°ã©ããŒããã¹ããæžãããã ãã«ãã¹ããäœæããããšã瀺ãããã圌ã¯çããããªããŸãã¬ããŒãã®çŸããæ°åã
ã³ãŒãã«ãã¬ããžãã¹ãã®ã€ã³ãžã±ãŒã¿ãŒã䜿çšããã«ã¯ãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒCIãç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ïŒçšã«ã·ã¹ãã ãé©åã«æ§æããå¿ èŠããããŸãã ããã«ããã察å¿ããã€ã³ãžã±ãŒã¿ãŒãç¹å®ã®ãããå€ã«éããªãå Žåããããžã§ã¯ãã®ã¢ã»ã³ããªãåæ¢ã§ããŸãã ãã¹ãã«ãã¬ããžæ å ±ãåéããããã«Jestãæ§æããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã ããã«ãã³ãŒãå šäœã§ã¯ãªããåã ã®ã³ã³ããŒãã³ãã«çŠç¹ãåœãŠãã«ãã¬ããžã®ãããå€ãèšå®ã§ããŸãã ããã«å ããŠããã¹ãã«ãã¬ããžã®äœäžãæ€åºããããšãæ€èšããŠãã ããã ããã¯ãããšãã°ããããžã§ã¯ãã«æ°ããã³ãŒããè¿œå ãããšãã«çºçããŸãã ãã®ã€ã³ãžã±ãŒã¿ãŒãå¶åŸ¡ããããšã«ãããéçºè ã¯ãã¹ãæžã¿ã³ãŒãã®ããªã¥ãŒã ãå¢ããããå°ãªããšããã®ã¬ãã«ãæ¢åã®ã¬ãã«ã«ç¶æããããšãã§ããŸãã äžèšãèæ ®ãããšããã¹ãã§ã®ã³ãŒãã®ã«ãã¬ããžã¯å®éåããã1ã€ã®ææšã«ãããããã¹ãã®ä¿¡é Œæ§ãå®å šã«è©äŸ¡ããã«ã¯äžååã§ãã ããã«ã以äžã«ç€ºãããã«ããã®é«ãã¬ãã«ã¯ãŸã ããã¹ãã§ã«ããŒããããã³ãŒããå®éã«ãã§ãã¯ãããããšãæå³ããŸããã
æšå¥šäºé ããã®éžè±ã®çµæ
ã³ãŒãã®é«å質ãšãã¹ãã«é¢é£ããé¢é£ã€ã³ãžã±ãŒã¿ãŒã«å¯Ÿããããã°ã©ããŒã®èªä¿¡ã¯å¯æ¥ã«é¢ä¿ããŠããŸãã ããã°ã©ããŒã¯ãèªåã®ãããžã§ã¯ãã®ã³ãŒãã®å€§éšåããã¹ãã§ã«ããŒãããŠããããšãç¥ããªãå Žåããšã©ãŒãæããã«ã¯ããããŸããã ãããã®æžå¿µã«ããããããžã§ã¯ããé ããªãå¯èœæ§ããããŸãã
äŸ
å žåçãªãã¹ãã«ãã¬ããžã¬ããŒãã¯æ¬¡ã®ããã«ãªããŸãã
ã€ã¹ã¿ã³ããŒã«ãçæãããã¹ãã«ãã¬ããžã¬ããŒã
æ£ããã¢ãããŒã
ã³ã³ããŒãã³ãã³ãŒãã®ãã¹ãã«ãã¬ããžã®æãŸããã¬ãã«ãšãJestã®ãã®ã€ã³ãžã±ãŒã¿ãŒã®äžè¬çãªã¬ãã«ãèšå®ããäŸã次ã«ç€ºããŸãã
ãããžã§ã¯ãå šäœããã³ç¹å®ã®ã³ã³ããŒãã³ãã®ãã¹ãã䜿çšããŠãå¿ èŠãªã¬ãã«ã®ã³ãŒãã«ãã¬ããžãèšå®ãã
â20ã ãã¹ãã«ãã¬ããžã¬ããŒãã調ã¹ãŠããã¹ããããŠããªãã³ãŒãã¹ããããããã®ä»ã®ç°åžžãç¹å®ããŸã
æšå¥šäºé
ããã€ãã®åé¡ã¯ãããŸããŸãªãšã©ãŒæ€åºã·ã¹ãã ãããæããåŸåããããŸãã ãã®ãããªããšã¯ãåŸæ¥ã®ããŒã«ã䜿çšããŠæ€åºããã®ãé£ããå ŽåããããŸãã ããããããã¯å®éã®ãšã©ãŒã«ã¯åœãŠã¯ãŸããŸããã ããããäºæ³å€ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœã«ã€ããŠè©±ããŠãããããå£æ» çãªçµæãæãå¯èœæ§ããããŸãã ããšãã°ãã³ãŒãã®äžéšã䜿çšãããªããããŸãã«ããåŒã³åºãããªãããšããããããŸãã ããšãã°ã
PricingCalculator
ã¯ã©ã¹ã®ã¡ã«ããºã
PricingCalculator
åžžã«è£œåã®äŸ¡æ Œãèšå®ããããã«äœ¿çšããããšèããŠããŸãããå®éã«ã¯ããã®ã¯ã©ã¹ã¯ãŸã£ãã䜿çšãããŠããããããŒã¿ããŒã¹ããã³ã·ã¹ãã ã䜿çšããããªã³ã©ã€ã³ã¹ãã¢ã«ã¯10,000åã®è£œåã®ã¬ã³ãŒãããããŸãå€ãã®å£²ãäžã...ãã¹ãã䌎ãã³ãŒãã«ãã¬ããžã«é¢ããã¬ããŒãã¯ãéçºè ããã¢ããªã±ãŒã·ã§ã³ãæ©èœãããã©ãããç解ããã®ã«åœ¹ç«ã¡ãŸãã ããã«ãã¬ããŒããããã©ã®ãããžã§ã¯ãã³ãŒãããã¹ããããŠããªããã確èªã§ããŸãã ãã¹ããã³ãŒãã®80ïŒ ãã«ããŒããããšã瀺ãäžè¬çãªææšã«çŠç¹ãåãããå Žåãã¢ããªã±ãŒã·ã§ã³ã®éèŠãªéšåããã¹ããããŠãããã©ããã¯ããããŸããã ãã®ãããªã¬ããŒããçæããã«ã¯ããã¹ãã®å®è¡ã«äœ¿çšããããŒã«ãé©åã«æ§æããã ãã§ååã§ãã éåžžããã®ãããªã¬ããŒãã¯éââåžžã«ãããã«èŠãããããããã»ã©æéããããªãåæã«ãããããããçš®é¡ã®é©ããæ€åºã§ããŸãã
æšå¥šäºé ããã®éžè±ã®çµæ
ã³ãŒãã®ã©ã®éšåããã¹ããããŠããªãã®ãããããªãå Žåãã©ãã§åé¡ãçºçãããã¯ããããŸããã
ééã£ãã¢ãããŒã
次ã®ã¬ããŒããèŠãŠããã®äžã§äœãç°åžžã«èŠããããèããŠãã ããã
ç°åžžãªã·ã¹ãã åäœã瀺ãã¬ããŒã
ãã®ã¬ããŒãã¯å®éã®ã¢ããªã±ãŒã·ã§ã³ã®äœ¿çšã·ããªãªã«åºã¥ããŠãããã·ã¹ãã ã«ãã°ã€ã³ãããŠãŒã¶ãŒã«é¢é£ããç°åžžãªããã°ã©ã ã®åäœã確èªã§ããŸãã ã€ãŸããã·ã¹ãã ã«å ¥ãããã®äºæãã¬å€æ°ã®å€±æããè©Šè¡ããæåããè©Šè¡ãšæ¯èŒããŠç®ãåŒããŸãã ãããžã§ã¯ããåæããçµæããã®çç±ã¯ããã³ããšã³ãã®ãšã©ãŒã§ããããšãå€æããŸããããã®ããããããžã§ã¯ãã®ã€ã³ã¿ãŒãã§ãŒã¹éšåã¯ãã·ã¹ãã ã«å ¥ãããã«ãµãŒããŒAPIã«å¯Ÿå¿ãããªã¯ãšã¹ããåžžã«éä¿¡ããŠããŸããã
â21ã ãã¥ãŒããŒã·ã§ã³ãã¹ãã䜿çšãããã¹ãã§è«çã³ãŒãã«ãã¬ããžã枬å®ãã
æšå¥šäºé
åŸæ¥ã®ãã³ãããŒã¯æž¬å®åºæºã¯ä¿¡é Œã§ããªãå ŽåããããŸãã ãã®ãããã¬ããŒãã«ã¯10ââ0ïŒ ã®æ°å€ãå«ãŸããå¯èœæ§ããããŸãããåæã«ããããžã§ã¯ãã®ãã¹ãŠã®é¢æ°ã¯èª€ã£ãå€ãè¿ããŸãã ããã説æããæ¹æ³ã¯ïŒ å®éããã¹ãã§ã®ã³ãŒãã«ãã¬ããžã®ã€ã³ãžã±ãŒã¿ãŒã¯ããã¹ãã·ã¹ãã ã®å¶åŸ¡äžã§å®è¡ãããã³ãŒãã®è¡ã®ã¿ã瀺ããŸãããäœããçã«æ€èšŒããããã©ãããã€ãŸããã¹ãã®ã¹ããŒãã¡ã³ããã³ãŒãã®çµæã®æ£ç¢ºãããã§ãã¯ããããšãç®çãšããŸããã ããã¯ãæµ·å€åºåŒµããæ»ã£ãŠããŠããã¹ããŒãã«ã¹ã¿ã³ããèŠããŠãã人ã«äŒŒãŠããŸãã åæã¯åœŒãã©ããã«è¡ã£ãããšã蚌æããŠããŸããã圌ã¯åœŒãåºåŒµã§è¡ã£ãããšããããã©ããã«ã€ããŠã¯äœãèšããŸããã
ããã§ãçªç¶å€ç°ãã¹ãã¯ç§ãã¡ã®å©ãã«ãªããŸããããã«ããããã¹ãã·ã¹ãã ã ãã§ãªããå®éã«ãã¹ããããã³ãŒãã®éãç¥ãããšãã§ããŸãã å€ç°ãã¹ãã§ã¯ã Stryker JSã©ã€ãã©ãªã䜿çšã§ããŸãã åäœåçã¯æ¬¡ã®ãšããã§ãã
- 圌女ã¯æå³çã«ã³ãŒããå€æŽãããšã©ãŒãäœæããŸããã ããšãã°ãã³ãŒã
newOrder.price===0
ã¯newOrder.price!=0
å€ããnewOrder.price!=0
ã ãããã®ãééããã¯çªç¶å€ç°ãšåŒã°ããŸãã - 圌女ã¯ãã¹ããå®è¡ããŸãã ããããåæ Œããå Žåããã¹ãã¯ãšã©ãŒãæ€åºããã¿ã¹ã¯ãæãããªããããåé¡ãçºçããŸãããå€ç°äœãã¯ããçãæ®ãããšèšãããŠããŸãã ãã¹ãã§ã³ãŒãå ã®ãšã©ãŒã瀺ãããå Žåããã¹ãŠãé çªã«äžŠãã§ããŸã-ããã¥ãŒã¿ã³ããããã€ãã
ãã¹ãŠã®ãçªç¶å€ç°äœããã殺ããããããšãå€æããå ŽåïŒãŸãã¯ãå°ãªããšããããã®ã»ãšãã©ãçãæ®ããŸããã§ããïŒãããã¯ãã³ãŒãããã¹ãã§ã«ããŒããããã®åŸæ¥ã®ã¡ããªãã¯ããããã³ãŒãããã³ããããã¹ããããã¹ãã®é«å質ã«å¯Ÿããä¿¡é ŒåºŠãé«ããŸãã åæã«ãçªç¶å€ç°ãã¹ãã®èšå®ãšå®æœã«å¿ èŠãªæéã¯ãåŸæ¥ã®ãã¹ãã䜿çšããå Žåã«å¿ èŠãªæéãšåçã§ãã
æšå¥šäºé ããã®éžè±ã®çµæ
ãã¹ãã«ããã³ãŒãã«ãã¬ããžã®åŸæ¥ã®ã€ã³ãžã±ãŒã¿ãŒããã³ãŒãã®85ïŒ ããã¹ãã§ã«ããŒãããŠããããšã瀺ããŠããå Žåãããã¯ããã¹ãããã®ã³ãŒãã®ãšã©ãŒãæ€åºã§ããããšãæå³ããŸããã
ééã£ãã¢ãããŒã
次ã«ããã¹ãã§ã³ãŒãã100ïŒ ã«ããŒããäŸã瀺ããŸããã³ãŒãã¯å®å šã«ãã¹ããããŠããŸããã
function addNewOrder(newOrder) { logger.log(`Adding new order ${newOrder}`); DB.save(newOrder); Mailer.sendMail(newOrder.assignee, `A new order was places ${newOrder}`); return {approved: true}; } it("Test addNewOrder, don't use such test names", () => { addNewOrder({asignee: "John@mailer.com",price: 120}); });// 100%, , ,
æ£ããã¢ãããŒã
以äžã¯ãStrykerã©ã€ãã©ãªãŒã«ãã£ãŠçæãããçªç¶å€ç°ãã¹ãã¬ããŒãã§ãã ããã«ããããã¹ããããŠããªãã³ãŒãã®éã確èªã§ããŸãïŒããã¯ããçãæ®ã£ãããå€ç°äœãã®æ°ã§ç€ºãããŸãïŒã
ã¹ãã©ã€ã«ãŒã¬ããŒã
ãã®ã¬ããŒãã®çµæã¯ããã¹ããæåŸ ã©ããã«æ©èœããããšã瀺ãããã¹ãã§ã®ã³ãŒãã«ãã¬ããžã®éåžžã®ã€ã³ãžã±ãŒã¿ãŒãããé«ãä¿¡é Œæ§ãåããŠããŸãã
- çªç¶å€ç°ã¯ããã¹ãã®æå¹æ§ããã¹ãããããã«Strykerã©ã€ãã©ãªã«ãã£ãŠæå³çã«å€æŽãããã³ãŒãã§ãã
- ãkilledããmutantsãïŒkilledïŒã®æ°ã¯ããã¹ãäžã«ç¹å®ãããæå³çã«äœæãããã³ãŒãé害ïŒãmutantãïŒã®æ°ã瀺ããŠããŸãã
- ãçãæ®ã£ãããå€ç°äœãïŒçãæ®ã£ãïŒã®æ°ã«ãããã³ãŒãã®æ¬ é¥ãã¹ãã§æ€åºãããªãã£ããã®ã®æ°ã調ã¹ãããšãã§ããŸãã
ã»ã¯ã·ã§ã³4.ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ããã®ä»ã®ã³ãŒãå質ã€ã³ãžã±ãŒã¿ãŒ
â22ã linterã®æ©èœã掻çšããå ±åããåé¡ãæ€åºãããšãã«ãããžã§ã¯ãã®æ§ç¯ããã»ã¹ãäžæãã
æšå¥šäºé
çŸåšããªã³ã¿ãŒã¯ãæ·±å»ãªã³ãŒãã®åé¡ãç¹å®ã§ãã匷åãªããŒã«ã§ãã ããã€ãã®åºæ¬çãªãªã³ãèŠåïŒ eslint-plugin-standardããã³eslint-config-airbnbãã©ã°ã€ã³ãå®è£ ããèŠåãªã©ïŒã«å ããŠãç¹æ®ãªèŠåã䜿çšããããšããå§ãããŸã ã ããšãã°ããããã¯eslint-plugin-chai-expectãã©ã°ã€ã³ã«ãã£ãŠãã¹ãã³ãŒãã®æ£åœæ§ãæ€èšŒããããã«å®è£ ãããã«ãŒã«ã§ãããããã¯ã promiseã®åäœãå¶åŸ¡ããeslint-plugin-promiseãã©ã°ã€ã³ããã®ã«ãŒã«ã§ãããããã¯ã eslint-plugin-securityããã®ååšããã§ãã¯ããã«ãŒã«ã§ãå±éºãªæ£èŠè¡šçŸãå«ãŸããŠããŸãã ããã§ã¯ã eslint-plugin-you-dont-need-lodash-underscoreãã©ã°ã€ã³ã«èšåããããšãã§ããŸããããã«ãããã³ãŒãå ã®çŽç²ãªJavaScriptã«é¡äŒŒããå€éšã©ã€ãã©ãªã®ã¡ãœããã䜿çšããã±ãŒã¹ãèŠã€ããããšãã§ããŸãã
æšå¥šäºé ããã®éžè±ã®çµæ
éšã®æ¥ãæ¥ãŸããããããžã§ã¯ãã¯æ¬çªç°å¢ã§çµ¶ãéãªã倱æãããã°ã«ã¯ãšã©ãŒã¹ã¿ãã¯ã«é¢ããæ å ±ã¯ãããŸããã ã©ããã å€æããããã«ãã³ãŒããäŸå€ãšããŠã¹ããŒãããã®ã¯ãå®éã«ã¯ãšã©ãŒã®ãªããžã§ã¯ãã§ã¯ãããŸããã ãã®çµæãã¹ã¿ãã¯ã«é¢ããæ å ±ã¯ãã°ã«èšé²ãããŸããã å®éããã®ãããªç¶æ³ã§ã¯ãããã°ã©ããŒã¯å£ã殺ãããã¯ããã«åªããŠãããããªã³ã¿ãŒã®ã»ããã¢ããã«5åéè²»ããããšãã§ããŸããããã«ãããåé¡ãç°¡åã«æ€åºããå°æ¥çºçããå¯èœæ§ã®ããåæ§ã®ãã©ãã«ãããããžã§ã¯ããä¿èšŒã§ããŸãã
ééã£ãã¢ãããŒã
誀ã£ãŠéåžžã®ãªããžã§ã¯ããäŸå€ãšããŠã¹ããŒããã³ãŒãã次ã«ç€ºããŸãããããã§ã¯
Error
ã¿ã€ãã®ãªããžã§ã¯ããå¿ èŠã§ãã ããããªããšãã¹ã¿ãã¯ã«é¢ããããŒã¿ããã°ã«èšé²ãããŸããã ESLintã¯ãçç£äžã®åé¡ãåŒãèµ·ããå¯èœæ§ããããã®ãèŠã€ãããããã®åé¡ã®åé¿ã«åœ¹ç«ã¡ãŸãã
ESLintã¯ãã³ãŒãã®ãã°ãèŠã€ããã®ã«åœ¹ç«ã¡ãŸã
â23ã ããŒã«ã«é£ç¶çµ±åã䜿çšããéçºè ãšã®è¿ éãªãã£ãŒãããã¯
æšå¥šäºé
ã³ãŒãã®å質管çããã¹ãããªã³ã¿ãŒã®äœ¿çšãè匱æ§ã®ãã§ãã¯ã«åœ¹ç«ã€ç¶ç¶ççµ±åã®éäžã·ã¹ãã ã䜿çšããŠããŸããïŒ ãã®å Žåãéçºè ããã®ã·ã¹ãã ãããŒã«ã«ã§å®è¡ã§ããããšã確èªããŠãã ããã ããã«ããã圌ãã¯å³åº§ã«ã³ãŒãããã§ãã¯ã§ããããã«ãªãã ãã£ãŒãããã¯ãé«éåãããããžã§ã¯ãéçºæéãççž®ããŸãã ããã¯ãªãã§ããïŒ å¹æçãªéçºããã³ãã¹ãããã»ã¹ã«ã¯ãå€ãã®åšæçã«ç¹°ãè¿ãããæäœãå«ãŸããŸãã ã³ãŒãããã¹ããããéçºè ãã¬ããŒããåãåããå¿ èŠã«å¿ããŠã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããããã®åŸãã¹ãŠãç¹°ãè¿ãããŸãã ãã£ãŒãããã¯ã«ãŒããé«éã«åäœããã»ã©ãéçºè ãã³ãŒããã¹ãã«é¢ããã¬ããŒããè¿ éã«åä¿¡ã§ããããã«ãªããå®è¡ã§ãããã®ã³ãŒãã®æ¹åã®å埩ãå¢ããŸãã ãã¹ãã¬ããŒãã®ååŸã«æéãããããšãã³ãŒãã®å質ãäœäžããå¯èœæ§ããããŸãã 誰ããã¢ãžã¥ãŒã«ã«åãçµãã§ããŠãå¥ã®ã¢ãžã¥ãŒã«ã«åãçµãã§ããŠããã®ã¢ãžã¥ãŒã«ã«é¢ããã¬ããŒããåãåã£ããšããŸãããããã®ã¬ããŒãã¯ãã¢ãžã¥ãŒã«ãæ¹åããå¿ èŠãããããšã瀺ããŠããŸãã ãã ããæ¢ã«å®å šã«ç°ãªãåé¡ã«å°å¿µããŠãããããéçºè ã¯åé¡ã¢ãžã¥ãŒã«ã«ååãªæ³šæãæãããšã¯ãããŸããã
äžéšã®CIãœãªã¥ãŒã·ã§ã³ãããã€ããŒïŒãããCircleCIã«é©çšãããšããŸãããïŒã§ã¯ãCIãã€ãã©ã€ã³ãããŒã«ã«ã§å®è¡ã§ããŸãã Wallaby.js ïŒèè ã¯åœŒããã®ãããžã§ã¯ãã«é¢ä¿ããŠããªãããšãèšããŠããïŒã®ãããªäžéšã®ææããŒã«ã¯ãã³ãŒãã®å質ã«é¢ãã貎éãªæ å ±ããã°ããååŸã§ããŸãã ããã«ãéçºè ã¯é©åãªnpmã¹ã¯ãªããã
package.json
ã«è¿œå ããã ãã§ãã³ãŒãå質ãã§ãã¯ïŒãã¹ãããªã³ã¿ãŒã«ããåæãè匱æ§ã®æ€çŽ¢ïŒãå®è¡ãã 䞊è¡ããã±ãŒãžã䜿çšããŠãã§ãã¯ãé«éåããããšãã§ããŸãã ããã§ãã³ãŒããå æ¬çã«ãã§ãã¯ããã«ã¯ã
npm run quality
ãããªåäžã®ã³ãã³ããå®è¡ããããã«ã¬ããŒããååŸããã ãã§ååã§ãã ããã«ãã³ãŒããã¹ãã§åé¡ãããããšã瀺ãããå Žåã¯ãgitããã¯ã䜿çšããŠã³ãããããã£ã³ã»ã«ã§ããŸãïŒ ãã¹ããŒã©ã€ãã©ãªã¯ãã®åé¡ã®è§£æ±ºã«åœ¹ç«ã¡ãŸãïŒã
æšå¥šäºé ããã®éžè±ã®çµæ
éçºè ããã®ã³ãŒããæžããŠãã1æ¥åŸã«ã³ãŒãã®å質ã«é¢ããã¬ããŒããåãåã£ãå Žåããã®ãããªã¬ããŒãã¯æ£åŒãªããã¥ã¡ã³ãã®ãããªãã®ã«ãªããã³ãŒããã¹ãã¯ä»äºããé¢ãããèªç¶ãªéšåã«ã¯ãªããŸããã
æ£ããã¢ãããŒã
ã³ãŒãå質ãã§ãã¯ãå®è¡ããnpmã¹ã¯ãªããã次ã«ç€ºããŸãã ãã§ãã¯ã®å®è¡ã¯äžŠååãããŸãã ãªããžããªã«æ°ããã³ãŒããéä¿¡ããããšãããšãã¹ã¯ãªãããå®è¡ãããŸãã ããã«ãéçºè ã¯èªåã®ã€ãã·ã¢ããã§ãããèµ·åã§ããŸãã
"scripts": { "inspect:sanity-testing": "mocha **/**--test.js --grep \"sanity\"", "inspect:lint": "eslint .", "inspect:vulnerabilities": "npm audit", "inspect:license": "license-checker --failOn GPLv2", "inspect:complexity": "plato .", "inspect:all": "concurrently -c \"bgBlue.bold,bgMagenta.bold,yellow\" \"npm:inspect:quick-testing\" \"npm:inspect:lint\" \"npm:inspect:vulnerabilities\" \"npm:inspect:license\"" }, "husky": { "hooks": { "precommit": "npm run inspect:all", "prepush": "npm run inspect:all" } }
â24ã çŸå®çãªæ¬çªç°å¢ã®ãã©ãŒã§ãšã³ãããŒãšã³ãã®ãã¹ããå®è¡ããŸã
æšå¥šäºé
åºå€§ãªKubernetesãšã³ã·ã¹ãã ã§ã¯ãããŒã«ã«ç°å¢ã®å±éã«é©ããããŒã«ã®äœ¿çšã«ã€ããŠã¯ãŸã åæããããŸãããããã®ãããªããŒã«ã¯é »ç¹ã«ç»å ŽããŸãã ããã§èããããã¢ãããŒãã®1ã€ã¯ã MinikubeãMicroK8sãªã©ã®ããŒã«ã䜿çšããŠãæå°åããããKubernetesãå®è¡ããå®éã®ç°å¢ã«äŒŒã軜éç°å¢ãäœæã§ããããã«ããããšã§ãã ãã1ã€ã®ã¢ãããŒãã¯ããªã¢ãŒãã®ãå®éã®ãKubernetesç°å¢ã§ãããžã§ã¯ãããã¹ãããããšã§ãã äžéšã®CIãããã€ããŒïŒ Codefreshãªã©ïŒã¯ãKubernetesã®çµã¿èŸŒã¿ç°å¢ãšã®å¯Ÿè©±ãå¯èœã«ããŸããããã«ãããå®éã®ãããžã§ã¯ãããã¹ãããéã®CIãã€ãã©ã€ã³ã®äœæ¥ãç°¡çŽ åãããŸãã ãã®ä»ã¯ããªã¢ãŒãKubernetesç°å¢ã§äœæ¥ã§ããããã«ããŸãã
æšå¥šäºé ããã®éžè±ã®çµæ
çç£ããã³ãã¹ãã§ããŸããŸãªãã¯ãããžãŒã䜿çšããã«ã¯ã2ã€ã®éçºã¢ãã«ã®ãµããŒããå¿ èŠã§ãããããã°ã©ããŒãšDevOpsã¹ãã·ã£ãªã¹ãã®ããŒã ã®åé¢ã«ã€ãªãããŸãã
æ£ããã¢ãããŒã
CIãã§ãŒã³ã®äŸã次ã«ç€ºããŸããããã¯ã圌ããèšãããã«ããªã³ã¶ãã©ã€ã§Kubernetesã¯ã©ã¹ã¿ãŒãäœæããŸãïŒããã¯ããããååŸãããŸã ïŒã
deploy: stage: deploy image: registry.gitlab.com/gitlab-examples/kubernetes-deploy script: - ./configureCluster.sh $KUBE_CA_PEM_FILE $KUBE_URL $KUBE_TOKEN - kubectl create ns $NAMESPACE - kubectl create secret -n $NAMESPACE docker-registry gitlab-registry --docker-server="$CI_REGISTRY" --docker-username="$CI_REGISTRY_USER" --docker-password="$CI_REGISTRY_PASSWORD" --docker-email="$GITLAB_USER_EMAIL" - mkdir .generated - echo "$CI_BUILD_REF_NAME-$CI_BUILD_REF" - sed -e "s/TAG/$CI_BUILD_REF_NAME-$CI_BUILD_REF/g" templates/deals.yaml | tee ".generated/deals.yaml" - kubectl apply --namespace $NAMESPACE -f .generated/deals.yaml - kubectl apply --namespace $NAMESPACE -f templates/my-sock-shop.yaml environment: name: test-for-ci
â25ã ãã¹ãå®è¡ã®äžŠååã«åªãã
æšå¥šäºé
ãã¹ãã·ã¹ãã ãé©åã«æ§æãããŠããã°ãã³ãŒãã®åé¡ãå ±åã§ãã24æéäœå¶ã®å¿ å®ãªå人ã«ãªããŸãã ãããè¡ãã«ã¯ããã¹ããéåžžã«è¿ éã«å®è¡ããå¿ èŠããããŸãã å®éã«ã¯ãããã»ããµãéäžçã«äœ¿çšããã·ã³ã°ã«ã¹ã¬ããã¢ãŒã500ãŠããããã¹ãã§ã®å®è¡ã«ã¯æéãããããããããšãããããŸããã ãããŠããã®ãããªãã¹ãã¯ããªãé »ç¹ã«å®è¡ããå¿ èŠããããŸãã 幞ããªããšã«ããã¹ãïŒ Jest ã AVA ã Mochaã®æ¡åŒµæ©èœ ïŒããã³CIãã©ãããã©ãŒã ãå®è¡ããããã®ææ°ã®ããŒã«ã¯ãããã€ãã®ããã»ã¹ã䜿çšããŠãã¹ãã䞊è¡ããŠå®è¡ã§ãããã¹ãã¬ããŒãã®åä¿¡é床ãå€§å¹ ã«åäžã§ããŸãã äžéšã®CIãã©ãããã©ãŒã ã¯ãã³ã³ããéã§ãã¹ãã䞊ååããæ¹æ³ããç¥ã£ãŠããããããã£ãŒãããã¯ã«ãŒããããã«æ¹åãããŸãã ãã¹ãã®å®è¡ãããŒã«ã«ãŸãã¯ãªã¢ãŒãã§æ£åžžã«äžŠååããã«ã¯ããã¹ããçžäºã«äŸåããªãããã«ããå¿ èŠããããŸãã ã¹ã¿ã³ãã¢ãã³ãã¹ãã¯ãããŸããŸãªããã»ã¹ã§åé¡ãªãå®è¡ã§ããŸãã
æšå¥šäºé ããã®éžè±ã®çµæ
æ°ãããããžã§ã¯ãæ©èœã®äœæ¥äžã«ã³ãŒãããªããžããªã«éä¿¡ããŠãã1æéåŸã«ãã¹ãçµæãååŸããããšã¯ããã¹ãçµæã®æçšæ§ãæžããåªããæ¹æ³ã§ãã
æ£ããã¢ãããŒã
ãã¹ãã®äžŠåå®è¡ã®ãããã§ã mocha-parallel-testã©ã€ãã©ãªãšJestãã¬ãŒã ã¯ãŒã¯ã¯ Mochaãç°¡åã«ãã€ãã¹ããŸãïŒ ããããã®æ å ±ã®ãœãŒã¹ã§ãïŒã
ãã¹ãããã©ãŒãã³ã¹ãã¹ãããŒã«
â26ã ã©ã€ã»ã³ã¹æ€èšŒãšçäœã³ãŒãæ€èšŒã䜿çšããŠãæ³çåé¡ãã身ãå®ã
æšå¥šäºé
ããããä»ãããªãã¯æ³åŸãšçäœã®åé¡ãç¹ã«å¿é ããŠããŸããã ããããåæ§ã®åé¡ã«ã€ããŠãããžã§ã¯ãããã§ãã¯ããŠã¿ãŸãããïŒ ãã®ãããªæ€æ»ãæŽçããããã«å©çšã§ããå€ãã®ããŒã«ããããŸãã ããšãã°ããããã¯ã©ã€ã»ã³ã¹ãã§ãã«ãŒãšçäœãã§ãã«ãŒã§ã ïŒããã¯åçšããã±ãŒãžã§ãããèªç±ã«äœ¿çšã§ããå¯èœæ§ããããŸãïŒã ãã®ãããªãã§ãã¯ãCIãã€ãã©ã€ã³ã«çµ±åããŠãããšãã°ãã©ã€ã»ã³ã¹ãéãããŠããäŸåé¢ä¿ããStackOverflowããã³ããŒãããã³ãŒããä»ã®èª°ãã®èäœæš©ã䟵害ããŠããå¯èœæ§ããªãããªã©ããããžã§ã¯ãããã§ãã¯ããã®ã¯ç°¡åã§ã
æšå¥šäºé ããã®éžè±ã®çµæ
éçºè ã¯ãäžæ³šæã§ãèªåã®ãããžã§ã¯ãã«é©ããªãã©ã€ã»ã³ã¹ã§ããã±ãŒãžã䜿çšããããåçšã³ãŒããã³ããŒãããã§ããŸããããã«ãããæ³çåé¡ãçºçããå¯èœæ§ããããŸãã
æ£ããã¢ãããŒã
ã©ã€ã»ã³ã¹ãã§ãã«ãŒããã±ãŒãžãããŒã«ã«ãŸãã¯CIç°å¢ã«ã€ã³ã¹ããŒã«ããŸãã
npm install -g license-checker
ç§ãã¡ã¯ããã§ã©ã€ã»ã³ã¹ããã§ãã¯ãã圌ãç§ãã¡ã«åããªãäœããèŠã€ããå Žåãç§ãã¡ã¯ãã§ãã¯ã倱æãããšèªèããŸãã CIã·ã¹ãã ã¯ãã©ã€ã»ã³ã¹ã®ãã§ãã¯äžã«åé¡ãçºçããããšãæ€åºãããšããããžã§ã¯ãã®ã¢ã»ã³ããªãåæ¢ããŸãã
license-checker --summary --failOn BSD
ã©ã€ã»ã³ã¹ãã§ãã¯
â27ã è匱ãªäŸåé¢ä¿ã«ã€ããŠãããžã§ã¯ããåžžã«ç¢ºèªãã
æšå¥šäºé
Expressãªã©ã®éåžžã«å°æ¬ãããä¿¡é Œã§ããããã±ãŒãžã§ãããè匱æ§ããããŸãã ãã®ãããªè匱æ§ãç¹å®ããããã«ã npmããã±ãŒãžãç£æ»ããæšæºããŒã«ãç¡æããŒãžã§ã³ã®åçšsnykãããžã§ã¯ããªã©ã®ç¹å¥ãªããŒã«ã䜿çšã§ããŸãã ãããã®ãã§ãã¯ã¯ãä»ã®ãã§ãã¯ãšãšãã«ãCIãã€ãã©ã€ã³ã®äžéšã«ããããšãã§ããŸãã
æšå¥šäºé ããã®éžè±ã®çµæ
ç¹å¥ãªããŒã«ã䜿çšããã«ãããžã§ã¯ããäŸåé¢ä¿ã®è匱æ§ããä¿è·ããã«ã¯ããã®ãããªè匱æ§ã«é¢ããåºçç©ãåžžã«ç£èŠããå¿ èŠããããŸãã ããã¯éåžžã«æéã®ãããã¿ã¹ã¯ã§ãã
æ£ããã¢ãããŒã
NPM Auditã䜿çšãããããžã§ã¯ãæ€èšŒã®çµæã¯æ¬¡ã®ãšããã§ãã
è匱æ§ãã§ãã¯ããã±ãŒãžã¬ããŒã
â28ã äŸåé¢ä¿ã®æŽæ°ãèªååãã
æšå¥šäºé
å°çãžã®éã¯åæã§èè£ ãããŠããŸãã ãã®èãæ¹ã¯
package-lock.json
ã«å®å šã«é©çš
package-lock.json
ãããã©ã«ãã§ã¯ããã±ãŒãžã®æŽæ°ããããã¯ããŸãã ããã¯ããããžã§ã¯ãã
npm install
ããã³
npm update
ã³ãã³ãã«ãã£ãŠå¥å šãªç¶æ ã«ãªã£ãå Žåã§ãçºçããŸãã ããã«ãããããããæ代é ãã®ããã±ãŒãžã䜿çšãããããææªã®å Žåããããžã§ã¯ãã«è匱ãªã³ãŒãã衚瀺ãããããšã«ãªããŸãã ãã®çµæãéçºããŒã ã¯ããããã«é©ããããã±ãŒãžã®ããŒãžã§ã³ã«é¢ããæ å ±ãæåã§æŽæ°ãããã ncuãªã©ã®ãŠãŒãã£ãªãã£ã䜿çšããŠæåã§èµ·åããŸãã äŸåé¢ä¿ãæŽæ°ããããã»ã¹ã¯ããããžã§ã¯ãã§äœ¿çšãããŠããããã±ãŒãžã®æãä¿¡é Œæ§ã®é«ãããŒãžã§ã³ã®äœ¿çšã«çŠç¹ãåœãŠãŠèªååãããŠããŸãã ãããå¯äžã®æ£ãããœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããããããã±ãŒãžã®æŽæ°ã®èªååã§ã¯ã泚ç®ã«å€ããããã€ãã®ã¢ãããŒããåºå¥ã§ããŸãã 1ã€ã¯ã npm- outdatedãŸãã¯npm-check-updates ïŒncuïŒã䜿çšããŠãã±ããããã§ãã¯ãããããªãã®ãCIãã€ãã©ã€ã³ã«æ³šå ¥ããããšã§ãã ããã«ãããå»æ¢ãããããã±ãŒãžãèå¥ããéçºè ã«ã¢ããã°ã¬ãŒããä¿ãããšãã§ããŸãã 2çªç®ã®ã¢ãããŒãã¯ãã³ãŒãããã§ãã¯ããäŸåé¢ä¿ã®æŽæ°ãç®çãšãããã«ãªã¯ãšã¹ããèªåçã«è¡ãåçšããŒã«ã䜿çšããããšã§ãã èªåäŸåé¢ä¿æŽæ°ã®åéã§ã¯ãæŽæ°ããªã·ãŒã«é¢ããå¥ã®èå³æ·±ã質åã«çŽé¢ããŠããŸãã æ°ãããããããšã«æŽæ°ããããšãã·ã¹ãã ã«é床ã®è² è·ããããå¯èœæ§ããããŸãã ããã±ãŒãžã®æ¬¡ã®ã¡ãžã£ãŒããŒãžã§ã³ã®ãªãªãŒã¹çŽåŸã«æŽæ°ãããšããããžã§ã¯ãã§äžå®å®ãªãœãªã¥ãŒã·ã§ã³ã䜿çšãããå¯èœæ§ããããŸãïŒå€ãã®ããã±ãŒãžã®è匱æ§ã¯ããªãªãŒã¹åŸã®æåã®æ°æ¥ã§æ£ç¢ºã«èŠã€ãããŸããeslint-scopeã§ã€ã³ã·ãã³ãã«ã€ããŠèªãã§ãã ãã ïŒã åªããããã±ãŒãžæŽæ°ããªã·ãŒã«ã¯ãããŒã«ã«ããŒãžã§ã³ã次ã®æ°ããããŒãžã§ã³ã®ãªãªãŒã¹åŸããã«å»æ¢ãšã¯èŠãªãããªãããå€å°ã®é 延ãããã移è¡æéããå«ãŸããå ŽåããããŸãã , 1.3.1, 1.3.2, 1.3.8.
, , , .
ncu , , , .
ncu
â29. , Node.js
æšå¥šäºé
, Node.js-, , Node.js .
- . â , , , Jenkins .
- , Docker.
- . , , . (, ), , , , .
- , , , . â , , , .
- , . , feature, â master, , ( ).
- . , .
- .
- (, Docker) .
- , , , . ,
node_modules
.
, , .
â30.
æšå¥šäºé
, . , , , Node.js , . CI-, , « ». , , , . , , mySQL, â Postgres. , Node.js, â 8, 9 10. , . CI-.
, , , . , , .
CI- Travis Node.js.
language: node_js node_js: - "7" - "6" - "5" - "4" install: - npm install script: - npm run test
ãŸãšã
, , . , , .
芪æãªãèªè ïŒ ?