ããã«ã¡ã¯ãéçºæ¬éšã® 宿ž ã§ãã ã¡ãã¬ãŒã§ã¯å®æçã«ãããŒãã«æ²¿ã£ãŠçµç¹ã®æè¡çãªåºäžããè¡ãããã®æ©äŒïŒ ã¿ã¹ã¯ãã©ãŒã¹ ãšåŒãã§ããŸãïŒãè¡ã£ãŠããŸãããã®ã¿ã¹ã¯ãã©ãŒã¹ã®ïŒã€ãšããŠå
æ¥ãããã³ããšã³ãéçºåã®ããŒã¹ã¢ãããç®çãšããã¿ã¹ã¯ãã©ãŒã¹ãè¡ããŸãããæ¬èšäºã§ã¯ããã®åçµã¿ã«ã€ããŠã玹ä»ããããšæããŸãã èæ¯ ã¡ãã¬ãŒã«ã¯çŸåš 20 人匱ã®ãšã³ãžãã¢ãåšç±ããŠããããã®çŽåæ°ããµãŒããŒãµã€ãåºèº«è
ã§ãããŸãæ®æ®µã®éçºã«ãããŠã¯ãäžã€ã®æ©èœãããã³ããããµãŒããŒãµã€ããŸã§äžè²«ããŠäžäººãæ
åœããã±ãŒã¹ãå€ããããŸãããµãŒããŒãµã€ãåºèº«è
ã®ããã³ããšã³ãéçºã®ã¹ãã«ã»ããã«ã¯å€å°ã°ãã€ãã¯ãããã®ã®ãæ®æ®µã®éçºæ¥åã§ã¯ã¬ãã¥ãŒçã§ãããããµããŒããã€ã€éçºãè¡ã£ãŠããŸãã ããããããã³ããšã³ãã®åºç€çãªéšåãææ°ã®æµããŸã§èããããšäžå®ãªã¡ã³ããŒãå°ãªããããŸãããããã³ããšã³ãåºèº«ã®ã¡ã³ããŒãäž»å°ããæ¹ããŠåºç€ãææ°æ
å ±ã«é¢ããŠæŽçã»ãã©ããŒãè¡ãããšã§ãçµç¹å
šäœã®ããã³ããšã³ãã®éçºåãé«ããŠãããããšèããŸããã ã¿ã¹ã¯ãã©ãŒã¹ã®ç®ç ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯ãããã³ããšã³ãã®åºæ¬ãæè¿ã®ãã¬ã³ãã«é¢ããŠåŠã¶ãããšã§ãïŒããã³ããšã³ãéçºã«ãããïŒæè¡éžå®ãèšèšãå®è£
ãã§ããåºç€ã身ã«ã€ãããããããŠããããããšã«ãæ°èŠã®ãããžã§ã¯ãã§èšè𿮵éããèªèµ°ã§ããããã«ãªããããšãç®çãšããŸããã ãã®äžã§ãç¹ã«ããæ°å¹Žãå€åã®æµããæ©ãã£ã JavaScript ãäžå¿ã«ãããã¯ãéžå®ããŸããã åå è
ã¯ããããŸã§ãµãŒããŒãµã€ãéçºãäžå¿ã«è¡ã£ãŠããã¡ã³ããŒæ°åã§ããèæ¯ã§ãè§Šãããšãããæ¥åçµéšã¯ããããããåæã§ã®ã¹ã¿ãŒãã§ãã£ããããåºç€ãã¿ã£ã¡ããšããããã¯ãåºç€çãªè©±ããæè¿ã®è©±é¡ãŸã§ãäžéã確èªããªãããåèªã®æã£ãŠããç¥èã®æŽçãšåå°ãåºããããšã§ãä»åŸã®èšèšãæè¡éžå®ãè¡ãéã®æéãåŸãããšãç®çãšããŸããã é²ãæ¹ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯æéã 3 ã¶æãšå®ããæ¯é± 1 æéçšåºŠéãŸã£ãŠè¡ããŸããã æ¯é±ãäºåã«è¬åž«é£ãéžãã è³æãèªãã§ãããåœæ¥ã¯è¬åž«é£ãåå è
ã®äžæç¹ãçåç¹ã«å¯ŸããŠãã©ããŒã¢ãããããšãã圢åŒã§é²ããŸããããã®ä»ã«ã¯ã瀟å
ã®ãããã¯ãã§ã®å©çšäºäŸãªã©ã亀ããªããããŒãã«é¢ãã質åäŒã®ãããªåœ¢ã§é²ãããšãå€ãã£ãã§ãã ãŸãæ¯åã®ã¿ã¹ã¯ãã©ãŒã¹ã®æéã®ããšã«ãåå è
ããã®æ¥ã®å
容ããŸãšããè°äºé²åœ¢åŒã®è³æãäœæããåå è
å
šå¡ãšå
±æããããšã§ããã®æ¥ã«è©±ãããå
容ããããããã®ç解床ãå床確èªããããã«ããŸããã å
容 ãããã®æµãã¯äžèšã®éãã§ãããçŽ 3 ã¶æã§ã©ã®ãããªããŒãã«è§ŠããŠããã®ããäžéšãã玹ä»ããŸãã ããã³ããšã³ãã®åºç€ åºç€ã¯ãã¡ãã®è³æãå©çšãããŠããã ããªããé²ããŸããã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é Asg Boot Camp ã HTML/CSS An Introduction to JavaScript ãã©ãŠã¶ã®ä»çµã¿ãHTML/CSS ã®åºæ¬çãªè©±ã®ãããããJavaScript ã®è©±ã«é¢é£ããŠããããŸã§ã«åºãŠãã AltJS ã«ã€ããŠãããã€ãç¹åŸŽãäœæ
æµè¡ã£ãã®ããªã©ã«ã€ããŠèªã¿èŸŒã¿ãŸããã ãã®äžã§ãã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é ã§ DOM ã®è§£æãã¬ã³ããªã³ã°ãã¬ã€ã¢ãŠããšãã£ããã©ãŠã¶å
éšã§å
·äœçã«äœãè¡ãããŠããã®ããšãã£ã話ã¯ããã§ç¢ºèªã§ããŠããã£ããšãã声ãå€ããããŸããã JavaScriptïŒåºç€ãES2015 以éïŒ JavaScript ã®è©±é¡ãžã®å°å
¥ç·šãšããŠãã¡ããè³æãšããŠèªã¿èŸŒã¿ãŸããã You Donât Know JS: Up & Going JavaScript Garden ãã®ããŒãã§ã¯ JavaScript ã®åºç€ã¯ããã㊠ES3ã5 ãããŒã¹ã«ããããšã§ JavaScript ãšä»èšèªãšã®éãã»ç¹åŸŽãå確èªããŠãããŸãããäžèšã®å
容ãèžãŸããä»ã§ã¯äœ¿ããªãæžãæ¹ãªã©ã«ã€ããŠã¯ãã®çç±ã確èªããªããé²ããŠãããŸããã ãã®åŸã¯ Learn ES2015 · Babel ãåç
§ããªãããPromise, Class ãªã©ã¯æ®æ®µã®éçºã§ãåœããåã®ããã«å©çšããŠãããã®ã®ãES2015 以éã§ã®æžãæ¹ã¯ ES5 ã ãšã©ã®ããã«ãªã£ãŠããããããã§åæã«åŠç¿ããŠãããŸãããïŒ Playground ã» TypeScript ã§ããã®é°å²æ°ãèŠãããšãåºæ¥ãŸãïŒ ã¢ãã³ JavaScript ãããŸã§ã®ç¥èãèžãŸããã¢ãã³ãª JavaScript ã®å©çš(å®è£
)äŸãšããŠã jser.github.io ãš preact-www ã®ãœãŒã¹ãèªãã§ãããŸããã ãããŸã§ã® JavaScript ã®èšèªèªäœã«é¢ããå
容ãããã©ã€ãã©ãªãå©çšããã³ã³ããŒãã³ãéã§ã®ããŒã¿ãããŒããã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã«é¢ããéšåãŸã§ç¢ºèªããŠãããŸããããŸãåèŠã®ãããžã§ã¯ãã§ããã°ã©ã®ãããããç®ãéããŠãããããªã©ã³ãŒãå
šäœã®èªã¿æ¹ã«ã€ããŠãè¬åž«é£ããã¢ããã€ã¹ããããŸããããŸãææåºãŠãã DOM API ã«ããªãã ã£ãããã»ã»ã»ïŒããªã©ãšãªãã€ã€ãã³ãŒããçŽè§£ããŠããããšã§æ¹ããŠããã³ããšã³ã JavaScript ã®ç¹åŸŽçãªéšåãå£éèŠãããšãã§ããããã«æããŸãã ãŸãæåŸã«ãçŸåšéçºã«å©çšãããŠããããŒã«çŸ€ã«ã€ããŠã Qiita:JavaScript ãã¬ãŒã ã¯ãŒã¯éžå®ã®è°è« ãåèã«ç¢ºèªããŸãããããããã®ããŒã«ãã©ã®ãããªèæ¯ã§äœ¿ãããŠããïŒãããã¯ããªãïŒã®ããªã©ãåãããŠç¢ºèªãããŸããã ãããŸã§ã®ããŒããæ¯ãè¿ãã€ã€ãJavaScript ãèšèªãšããŠã©ã®ããã«å€åããŠããããèããæãwebpack ã TypeScript ããªã䜿ãããã®ããããããè
¹ã«èœã¡ãããã«æããŸãããŸãäžèšè³æããã©ã®ãããªã±ãŒã¹ã§äœãéžæããã®ãããã¢ããªã±ãŒã·ã§ã³ã®å¯¿åœãšã©ã€ãã©ãªãããŒã«ã®å¯¿åœãšãã£ãéçšãã§ãŒãºã§çè§£ããŠããå¿
èŠã®ããäºé
ã«ãè§ŠããããŠãããéåžžã«åèã«ãªããŸããã å®éã«ãã£ãŠã¿ãŠ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§ã¯ã3 ã¶æãšããæéã®äžã§ã1 ã¶æåã®æç¹ãšãå
šäœçµäºåŸã«æ¯ãè¿ãã宿œããŸããã ãã®äžã§ãåå ã¡ã³ããŒãã㯠æ¥åã«ãããŠã¯å¿
èŠãªéšåã«çµã£ã調æ»ã§çµãã£ãŠããŸã£ãããåšãã®ã³ãŒããåèã«ãããããããšã§ãªããšãªãã§ããæ°ã«ãªã£ãŠããŸã£ãŠããããä»åæ¹ããŠåºç€çãªç¥èãåŠç¿ããã埩ç¿ããæéãšããŠã§ããŠããã£ãã æççã§ãŸã°ããªç¥èããæã£ãŠããªãã£ãéšåãè³æãèªã¿èŸŒãããšã§çè§£ãæ·±ãŸã£ã æ°å¹Žåã«ããºã£ãŠããšã§èªãŸãªããããšã§èªãããã¯ãèšäºããã¡ããšèªããŠããã£ã ããã³ããšã³ãçµéšã®é·ãè¬åž«é£ã®çããç¥èŠïŒãã©ããªã©ãå«ããŠïŒãèãããšãã§ããã®ã¯ãããããã£ã ãªã©ã®ææ³ãåºãŸããã ç§èªèº«ãåå ããŠããŸããããå人çã«ã¯åºç€éšåãæ¹ããŠåºããããšãã§ããæ©äŒã ã£ãããã«æããŠããŸãã ãŸããæ®æ®µã¯æ°ããããŒã«ãªã©ã®æ
å ±ã®ãã£ããã¢ãããžã®æèãåããã¡ã§ãããä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§èšèªã»ããŒã«ã®å€é·ãäžåºŠéããŠèŠãããšãã§ããããšã§ãæ°ããçŸããæè¡ãã©ããã£ã課é¡ã解決ãããã®ãªã®ãããããŸã§ã«äŒŒãããŒã«ããã£ãã®ãã©ãããªã©ã調ã¹ãæéãåŸãããããšã¯ããã£ãã®ããªãšæã£ãŠããŸãã äžæ¹ã§ãä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã®äžã§ã¯ãã³ãŒããæžããæéã¯äœããŸããã§ãããããã«ã€ããŠã¯æ¯ãè¿ãã®äžã§ã話é¡ãšãªããŸããããããã«ã€ããŠã¯ TodoMVC ãªã©ãåèã«ãèªåã§æãåãããŠã¿ãããšãå¿
èŠã ãããšä»åŸã®èª²é¡ãšããŠæããããŸããããã®ãããã¯å®å以å€ã§ã®åã
ã®é 匵ããå¿
èŠã«ãªã£ãŠããéšåããšæããŸãã ãŸãšã ããµãŒããŒãµã€ããšã³ãžãã¢ã®ããã³ããšã³ãéçºåã®åºäžãããããŒããšããã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããããããã£ã圢ã§ãåããããªã¹ãã«ã»ããã®ã¡ã³ããŒãéãŸãããäºãã«ããããªãéšåã«ã€ããŠè©±ãããããçµéšè±å¯ãªã¡ã³ããŒãããå人ã®çµéšãå«ããŠè©±ãèããšããã®ã¯ãæ¹ããŠéåžžã«è²Žéãªæ©äŒã ã£ãããã«æããŸãã ãããã£ãåãçµã¿ãç¹°ãè¿ããŠããããšã§ãåã
ã§å°ã£ãéšåã¯ãã¡ãã䌞ã°ãã€ã€ãå
šäœã®åºäžããè¡ããªããããããããããã¯ãéçºã«ç¹ããããã°ãšèããŠããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® 宿ž ã§ãã ã¡ãã¬ãŒã§ã¯å®æçã«ãããŒãã«æ²¿ã£ãŠçµç¹ã®æè¡çãªåºäžããè¡ãããã®æ©äŒïŒ ã¿ã¹ã¯ãã©ãŒã¹ ãšåŒãã§ããŸãïŒãè¡ã£ãŠããŸãããã®ã¿ã¹ã¯ãã©ãŒã¹ã®ïŒã€ãšããŠå
æ¥ãããã³ããšã³ãéçºåã®ããŒã¹ã¢ãããç®çãšããã¿ã¹ã¯ãã©ãŒã¹ãè¡ããŸãããæ¬èšäºã§ã¯ããã®åçµã¿ã«ã€ããŠã玹ä»ããããšæããŸãã èæ¯ ã¡ãã¬ãŒã«ã¯çŸåš 20 人匱ã®ãšã³ãžãã¢ãåšç±ããŠããããã®çŽåæ°ããµãŒããŒãµã€ãåºèº«è
ã§ãããŸãæ®æ®µã®éçºã«ãããŠã¯ãäžã€ã®æ©èœãããã³ããããµãŒããŒãµã€ããŸã§äžè²«ããŠäžäººãæ
åœããã±ãŒã¹ãå€ããããŸãããµãŒããŒãµã€ãåºèº«è
ã®ããã³ããšã³ãéçºã®ã¹ãã«ã»ããã«ã¯å€å°ã°ãã€ãã¯ãããã®ã®ãæ®æ®µã®éçºæ¥åã§ã¯ã¬ãã¥ãŒçã§ãããããµããŒããã€ã€éçºãè¡ã£ãŠããŸãã ããããããã³ããšã³ãã®åºç€çãªéšåãææ°ã®æµããŸã§èããããšäžå®ãªã¡ã³ããŒãå°ãªããããŸãããããã³ããšã³ãåºèº«ã®ã¡ã³ããŒãäž»å°ããæ¹ããŠåºç€ãææ°æ
å ±ã«é¢ããŠæŽçã»ãã©ããŒãè¡ãããšã§ãçµç¹å
šäœã®ããã³ããšã³ãã®éçºåãé«ããŠãããããšèããŸããã ã¿ã¹ã¯ãã©ãŒã¹ã®ç®ç ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯ãããã³ããšã³ãã®åºæ¬ãæè¿ã®ãã¬ã³ãã«é¢ããŠåŠã¶ãããšã§ãïŒããã³ããšã³ãéçºã«ãããïŒæè¡éžå®ãèšèšãå®è£
ãã§ããåºç€ã身ã«ã€ãããããããŠããããããšã«ãæ°èŠã®ãããžã§ã¯ãã§èšè𿮵éããèªèµ°ã§ããããã«ãªããããšãç®çãšããŸããã ãã®äžã§ãç¹ã«ããæ°å¹Žãå€åã®æµããæ©ãã£ã JavaScript ãäžå¿ã«ãããã¯ãéžå®ããŸããã åå è
ã¯ããããŸã§ãµãŒããŒãµã€ãéçºãäžå¿ã«è¡ã£ãŠããã¡ã³ããŒæ°åã§ããèæ¯ã§ãè§Šãããšãããæ¥åçµéšã¯ããããããåæã§ã®ã¹ã¿ãŒãã§ãã£ããããåºç€ãã¿ã£ã¡ããšããããã¯ãåºç€çãªè©±ããæè¿ã®è©±é¡ãŸã§ãäžéã確èªããªãããåèªã®æã£ãŠããç¥èã®æŽçãšåå°ãåºããããšã§ãä»åŸã®èšèšãæè¡éžå®ãè¡ãéã®æéãåŸãããšãç®çãšããŸããã é²ãæ¹ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯æéã 3 ã¶æãšå®ããæ¯é± 1 æéçšåºŠéãŸã£ãŠè¡ããŸããã æ¯é±ãäºåã«è¬åž«é£ãéžãã è³æãèªãã§ãããåœæ¥ã¯è¬åž«é£ãåå è
ã®äžæç¹ãçåç¹ã«å¯ŸããŠãã©ããŒã¢ãããããšãã圢åŒã§é²ããŸããããã®ä»ã«ã¯ã瀟å
ã®ãããã¯ãã§ã®å©çšäºäŸãªã©ã亀ããªããããŒãã«é¢ãã質åäŒã®ãããªåœ¢ã§é²ãããšãå€ãã£ãã§ãã ãŸãæ¯åã®ã¿ã¹ã¯ãã©ãŒã¹ã®æéã®ããšã«ãåå è
ããã®æ¥ã®å
容ããŸãšããè°äºé²åœ¢åŒã®è³æãäœæããåå è
å
šå¡ãšå
±æããããšã§ããã®æ¥ã«è©±ãããå
容ããããããã®ç解床ãå床確èªããããã«ããŸããã å
容 ãããã®æµãã¯äžèšã®éãã§ãããçŽ 3 ã¶æã§ã©ã®ãããªããŒãã«è§ŠããŠããã®ããäžéšãã玹ä»ããŸãã ããã³ããšã³ãã®åºç€ åºç€ã¯ãã¡ãã®è³æãå©çšãããŠããã ããªããé²ããŸããã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é Asg Boot Camp ã HTML/CSS An Introduction to JavaScript ãã©ãŠã¶ã®ä»çµã¿ãHTML/CSS ã®åºæ¬çãªè©±ã®ãããããJavaScript ã®è©±ã«é¢é£ããŠããããŸã§ã«åºãŠãã AltJS ã«ã€ããŠãããã€ãç¹åŸŽãäœæ
æµè¡ã£ãã®ããªã©ã«ã€ããŠèªã¿èŸŒã¿ãŸããã ãã®äžã§ãã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é ã§ DOM ã®è§£æãã¬ã³ããªã³ã°ãã¬ã€ã¢ãŠããšãã£ããã©ãŠã¶å
éšã§å
·äœçã«äœãè¡ãããŠããã®ããšãã£ã話ã¯ããã§ç¢ºèªã§ããŠããã£ããšãã声ãå€ããããŸããã JavaScriptïŒåºç€ãES2015 以éïŒ JavaScript ã®è©±é¡ãžã®å°å
¥ç·šãšããŠãã¡ããè³æãšããŠèªã¿èŸŒã¿ãŸããã You Donât Know JS: Up & Going JavaScript Garden ãã®ããŒãã§ã¯ JavaScript ã®åºç€ã¯ããã㊠ES3ã5 ãããŒã¹ã«ããããšã§ JavaScript ãšä»èšèªãšã®éãã»ç¹åŸŽãå確èªããŠãããŸãããäžèšã®å
容ãèžãŸããä»ã§ã¯äœ¿ããªãæžãæ¹ãªã©ã«ã€ããŠã¯ãã®çç±ã確èªããªããé²ããŠãããŸããã ãã®åŸã¯ Learn ES2015 · Babel ãåç
§ããªãããPromise, Class ãªã©ã¯æ®æ®µã®éçºã§ãåœããåã®ããã«å©çšããŠãããã®ã®ãES2015 以éã§ã®æžãæ¹ã¯ ES5 ã ãšã©ã®ããã«ãªã£ãŠããããããã§åæã«åŠç¿ããŠãããŸãããïŒ Playground ã» TypeScript ã§ããã®é°å²æ°ãèŠãããšãåºæ¥ãŸãïŒ ã¢ãã³ JavaScript ãããŸã§ã®ç¥èãèžãŸããã¢ãã³ãª JavaScript ã®å©çš(å®è£
)äŸãšããŠã jser.github.io ãš preact-www ã®ãœãŒã¹ãèªãã§ãããŸããã ãããŸã§ã® JavaScript ã®èšèªèªäœã«é¢ããå
容ãããã©ã€ãã©ãªãå©çšããã³ã³ããŒãã³ãéã§ã®ããŒã¿ãããŒããã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã«é¢ããéšåãŸã§ç¢ºèªããŠãããŸããããŸãåèŠã®ãããžã§ã¯ãã§ããã°ã©ã®ãããããç®ãéããŠãããããªã©ã³ãŒãå
šäœã®èªã¿æ¹ã«ã€ããŠãè¬åž«é£ããã¢ããã€ã¹ããããŸããããŸãææåºãŠãã DOM API ã«ããªãã ã£ãããã»ã»ã»ïŒããªã©ãšãªãã€ã€ãã³ãŒããçŽè§£ããŠããããšã§æ¹ããŠããã³ããšã³ã JavaScript ã®ç¹åŸŽçãªéšåãå£éèŠãããšãã§ããããã«æããŸãã ãŸãæåŸã«ãçŸåšéçºã«å©çšãããŠããããŒã«çŸ€ã«ã€ããŠã Qiita:JavaScript ãã¬ãŒã ã¯ãŒã¯éžå®ã®è°è« ãåèã«ç¢ºèªããŸãããããããã®ããŒã«ãã©ã®ãããªèæ¯ã§äœ¿ãããŠããïŒãããã¯ããªãïŒã®ããªã©ãåãããŠç¢ºèªãããŸããã ãããŸã§ã®ããŒããæ¯ãè¿ãã€ã€ãJavaScript ãèšèªãšããŠã©ã®ããã«å€åããŠããããèããæãwebpack ã TypeScript ããªã䜿ãããã®ããããããè
¹ã«èœã¡ãããã«æããŸãããŸãäžèšè³æããã©ã®ãããªã±ãŒã¹ã§äœãéžæããã®ãããã¢ããªã±ãŒã·ã§ã³ã®å¯¿åœãšã©ã€ãã©ãªãããŒã«ã®å¯¿åœãšãã£ãéçšãã§ãŒãºã§çè§£ããŠããå¿
èŠã®ããäºé
ã«ãè§ŠããããŠãããéåžžã«åèã«ãªããŸããã å®éã«ãã£ãŠã¿ãŠ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§ã¯ã3 ã¶æãšããæéã®äžã§ã1 ã¶æåã®æç¹ãšãå
šäœçµäºåŸã«æ¯ãè¿ãã宿œããŸããã ãã®äžã§ãåå ã¡ã³ããŒãã㯠æ¥åã«ãããŠã¯å¿
èŠãªéšåã«çµã£ã調æ»ã§çµãã£ãŠããŸã£ãããåšãã®ã³ãŒããåèã«ãããããããšã§ãªããšãªãã§ããæ°ã«ãªã£ãŠããŸã£ãŠããããä»åæ¹ããŠåºç€çãªç¥èãåŠç¿ããã埩ç¿ããæéãšããŠã§ããŠããã£ãã æççã§ãŸã°ããªç¥èããæã£ãŠããªãã£ãéšåãè³æãèªã¿èŸŒãããšã§çè§£ãæ·±ãŸã£ã æ°å¹Žåã«ããºã£ãŠããšã§èªãŸãªããããšã§èªãããã¯ãèšäºããã¡ããšèªããŠããã£ã ããã³ããšã³ãçµéšã®é·ãè¬åž«é£ã®çããç¥èŠïŒãã©ããªã©ãå«ããŠïŒãèãããšãã§ããã®ã¯ãããããã£ã ãªã©ã®ææ³ãåºãŸããã ç§èªèº«ãåå ããŠããŸããããå人çã«ã¯åºç€éšåãæ¹ããŠåºããããšãã§ããæ©äŒã ã£ãããã«æããŠããŸãã ãŸããæ®æ®µã¯æ°ããããŒã«ãªã©ã®æ
å ±ã®ãã£ããã¢ãããžã®æèãåããã¡ã§ãããä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§èšèªã»ããŒã«ã®å€é·ãäžåºŠéããŠèŠãããšãã§ããããšã§ãæ°ããçŸããæè¡ãã©ããã£ã課é¡ã解決ãããã®ãªã®ãããããŸã§ã«äŒŒãããŒã«ããã£ãã®ãã©ãããªã©ã調ã¹ãæéãåŸãããããšã¯ããã£ãã®ããªãšæã£ãŠããŸãã äžæ¹ã§ãä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã®äžã§ã¯ãã³ãŒããæžããæéã¯äœããŸããã§ãããããã«ã€ããŠã¯æ¯ãè¿ãã®äžã§ã話é¡ãšãªããŸããããããã«ã€ããŠã¯ TodoMVC ãªã©ãåèã«ãèªåã§æãåãããŠã¿ãããšãå¿
èŠã ãããšä»åŸã®èª²é¡ãšããŠæããããŸããããã®ãããã¯å®å以å€ã§ã®åã
ã®é 匵ããå¿
èŠã«ãªã£ãŠããéšåããšæããŸãã ãŸãšã ããµãŒããŒãµã€ããšã³ãžãã¢ã®ããã³ããšã³ãéçºåã®åºäžãããããŒããšããã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããããããã£ã圢ã§ãåããããªã¹ãã«ã»ããã®ã¡ã³ããŒãéãŸãããäºãã«ããããªãéšåã«ã€ããŠè©±ãããããçµéšè±å¯ãªã¡ã³ããŒãããå人ã®çµéšãå«ããŠè©±ãèããšããã®ã¯ãæ¹ããŠéåžžã«è²Žéãªæ©äŒã ã£ãããã«æããŸãã ãããã£ãåãçµã¿ãç¹°ãè¿ããŠããããšã§ãåã
ã§å°ã£ãéšåã¯ãã¡ãã䌞ã°ãã€ã€ãå
šäœã®åºäžããè¡ããªããããããããããã¯ãéçºã«ç¹ããããã°ãšèããŠããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® 宿ž ã§ãã ã¡ãã¬ãŒã§ã¯å®æçã«ãããŒãã«æ²¿ã£ãŠçµç¹ã®æè¡çãªåºäžããè¡ãããã®æ©äŒïŒ ã¿ã¹ã¯ãã©ãŒã¹ ãšåŒãã§ããŸãïŒãè¡ã£ãŠããŸãããã®ã¿ã¹ã¯ãã©ãŒã¹ã®ïŒã€ãšããŠå
æ¥ãããã³ããšã³ãéçºåã®ããŒã¹ã¢ãããç®çãšããã¿ã¹ã¯ãã©ãŒã¹ãè¡ããŸãããæ¬èšäºã§ã¯ããã®åçµã¿ã«ã€ããŠã玹ä»ããããšæããŸãã èæ¯ ã¡ãã¬ãŒã«ã¯çŸåš 20 人匱ã®ãšã³ãžãã¢ãåšç±ããŠããããã®çŽåæ°ããµãŒããŒãµã€ãåºèº«è
ã§ãããŸãæ®æ®µã®éçºã«ãããŠã¯ãäžã€ã®æ©èœãããã³ããããµãŒããŒãµã€ããŸã§äžè²«ããŠäžäººãæ
åœããã±ãŒã¹ãå€ããããŸãããµãŒããŒãµã€ãåºèº«è
ã®ããã³ããšã³ãéçºã®ã¹ãã«ã»ããã«ã¯å€å°ã°ãã€ãã¯ãããã®ã®ãæ®æ®µã®éçºæ¥åã§ã¯ã¬ãã¥ãŒçã§ãããããµããŒããã€ã€éçºãè¡ã£ãŠããŸãã ããããããã³ããšã³ãã®åºç€çãªéšåãææ°ã®æµããŸã§èããããšäžå®ãªã¡ã³ããŒãå°ãªããããŸãããããã³ããšã³ãåºèº«ã®ã¡ã³ããŒãäž»å°ããæ¹ããŠåºç€ãææ°æ
å ±ã«é¢ããŠæŽçã»ãã©ããŒãè¡ãããšã§ãçµç¹å
šäœã®ããã³ããšã³ãã®éçºåãé«ããŠãããããšèããŸããã ã¿ã¹ã¯ãã©ãŒã¹ã®ç®ç ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯ãããã³ããšã³ãã®åºæ¬ãæè¿ã®ãã¬ã³ãã«é¢ããŠåŠã¶ãããšã§ãïŒããã³ããšã³ãéçºã«ãããïŒæè¡éžå®ãèšèšãå®è£
ãã§ããåºç€ã身ã«ã€ãããããããŠããããããšã«ãæ°èŠã®ãããžã§ã¯ãã§èšè𿮵éããèªèµ°ã§ããããã«ãªããããšãç®çãšããŸããã ãã®äžã§ãç¹ã«ããæ°å¹Žãå€åã®æµããæ©ãã£ã JavaScript ãäžå¿ã«ãããã¯ãéžå®ããŸããã åå è
ã¯ããããŸã§ãµãŒããŒãµã€ãéçºãäžå¿ã«è¡ã£ãŠããã¡ã³ããŒæ°åã§ããèæ¯ã§ãè§Šãããšãããæ¥åçµéšã¯ããããããåæã§ã®ã¹ã¿ãŒãã§ãã£ããããåºç€ãã¿ã£ã¡ããšããããã¯ãåºç€çãªè©±ããæè¿ã®è©±é¡ãŸã§ãäžéã確èªããªãããåèªã®æã£ãŠããç¥èã®æŽçãšåå°ãåºããããšã§ãä»åŸã®èšèšãæè¡éžå®ãè¡ãéã®æéãåŸãããšãç®çãšããŸããã é²ãæ¹ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯æéã 3 ã¶æãšå®ããæ¯é± 1 æéçšåºŠéãŸã£ãŠè¡ããŸããã æ¯é±ãäºåã«è¬åž«é£ãéžãã è³æãèªãã§ãããåœæ¥ã¯è¬åž«é£ãåå è
ã®äžæç¹ãçåç¹ã«å¯ŸããŠãã©ããŒã¢ãããããšãã圢åŒã§é²ããŸããããã®ä»ã«ã¯ã瀟å
ã®ãããã¯ãã§ã®å©çšäºäŸãªã©ã亀ããªããããŒãã«é¢ãã質åäŒã®ãããªåœ¢ã§é²ãããšãå€ãã£ãã§ãã ãŸãæ¯åã®ã¿ã¹ã¯ãã©ãŒã¹ã®æéã®ããšã«ãåå è
ããã®æ¥ã®å
容ããŸãšããè°äºé²åœ¢åŒã®è³æãäœæããåå è
å
šå¡ãšå
±æããããšã§ããã®æ¥ã«è©±ãããå
容ããããããã®ç解床ãå床確èªããããã«ããŸããã å
容 ãããã®æµãã¯äžèšã®éãã§ãããçŽ 3 ã¶æã§ã©ã®ãããªããŒãã«è§ŠããŠããã®ããäžéšãã玹ä»ããŸãã ããã³ããšã³ãã®åºç€ åºç€ã¯ãã¡ãã®è³æãå©çšãããŠããã ããªããé²ããŸããã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é Asg Boot Camp ã HTML/CSS An Introduction to JavaScript ãã©ãŠã¶ã®ä»çµã¿ãHTML/CSS ã®åºæ¬çãªè©±ã®ãããããJavaScript ã®è©±ã«é¢é£ããŠããããŸã§ã«åºãŠãã AltJS ã«ã€ããŠãããã€ãç¹åŸŽãäœæ
æµè¡ã£ãã®ããªã©ã«ã€ããŠèªã¿èŸŒã¿ãŸããã ãã®äžã§ãã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é ã§ DOM ã®è§£æãã¬ã³ããªã³ã°ãã¬ã€ã¢ãŠããšãã£ããã©ãŠã¶å
éšã§å
·äœçã«äœãè¡ãããŠããã®ããšãã£ã話ã¯ããã§ç¢ºèªã§ããŠããã£ããšãã声ãå€ããããŸããã JavaScriptïŒåºç€ãES2015 以éïŒ JavaScript ã®è©±é¡ãžã®å°å
¥ç·šãšããŠãã¡ããè³æãšããŠèªã¿èŸŒã¿ãŸããã You Donât Know JS: Up & Going JavaScript Garden ãã®ããŒãã§ã¯ JavaScript ã®åºç€ã¯ããã㊠ES3ã5 ãããŒã¹ã«ããããšã§ JavaScript ãšä»èšèªãšã®éãã»ç¹åŸŽãå確èªããŠãããŸãããäžèšã®å
容ãèžãŸããä»ã§ã¯äœ¿ããªãæžãæ¹ãªã©ã«ã€ããŠã¯ãã®çç±ã確èªããªããé²ããŠãããŸããã ãã®åŸã¯ Learn ES2015 · Babel ãåç
§ããªãããPromise, Class ãªã©ã¯æ®æ®µã®éçºã§ãåœããåã®ããã«å©çšããŠãããã®ã®ãES2015 以éã§ã®æžãæ¹ã¯ ES5 ã ãšã©ã®ããã«ãªã£ãŠããããããã§åæã«åŠç¿ããŠãããŸãããïŒ Playground ã» TypeScript ã§ããã®é°å²æ°ãèŠãããšãåºæ¥ãŸãïŒ ã¢ãã³ JavaScript ãããŸã§ã®ç¥èãèžãŸããã¢ãã³ãª JavaScript ã®å©çš(å®è£
)äŸãšããŠã jser.github.io ãš preact-www ã®ãœãŒã¹ãèªãã§ãããŸããã ãããŸã§ã® JavaScript ã®èšèªèªäœã«é¢ããå
容ãããã©ã€ãã©ãªãå©çšããã³ã³ããŒãã³ãéã§ã®ããŒã¿ãããŒããã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã«é¢ããéšåãŸã§ç¢ºèªããŠãããŸããããŸãåèŠã®ãããžã§ã¯ãã§ããã°ã©ã®ãããããç®ãéããŠãããããªã©ã³ãŒãå
šäœã®èªã¿æ¹ã«ã€ããŠãè¬åž«é£ããã¢ããã€ã¹ããããŸããããŸãææåºãŠãã DOM API ã«ããªãã ã£ãããã»ã»ã»ïŒããªã©ãšãªãã€ã€ãã³ãŒããçŽè§£ããŠããããšã§æ¹ããŠããã³ããšã³ã JavaScript ã®ç¹åŸŽçãªéšåãå£éèŠãããšãã§ããããã«æããŸãã ãŸãæåŸã«ãçŸåšéçºã«å©çšãããŠããããŒã«çŸ€ã«ã€ããŠã Qiita:JavaScript ãã¬ãŒã ã¯ãŒã¯éžå®ã®è°è« ãåèã«ç¢ºèªããŸãããããããã®ããŒã«ãã©ã®ãããªèæ¯ã§äœ¿ãããŠããïŒãããã¯ããªãïŒã®ããªã©ãåãããŠç¢ºèªãããŸããã ãããŸã§ã®ããŒããæ¯ãè¿ãã€ã€ãJavaScript ãèšèªãšããŠã©ã®ããã«å€åããŠããããèããæãwebpack ã TypeScript ããªã䜿ãããã®ããããããè
¹ã«èœã¡ãããã«æããŸãããŸãäžèšè³æããã©ã®ãããªã±ãŒã¹ã§äœãéžæããã®ãããã¢ããªã±ãŒã·ã§ã³ã®å¯¿åœãšã©ã€ãã©ãªãããŒã«ã®å¯¿åœãšãã£ãéçšãã§ãŒãºã§çè§£ããŠããå¿
èŠã®ããäºé
ã«ãè§ŠããããŠãããéåžžã«åèã«ãªããŸããã å®éã«ãã£ãŠã¿ãŠ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§ã¯ã3 ã¶æãšããæéã®äžã§ã1 ã¶æåã®æç¹ãšãå
šäœçµäºåŸã«æ¯ãè¿ãã宿œããŸããã ãã®äžã§ãåå ã¡ã³ããŒãã㯠æ¥åã«ãããŠã¯å¿
èŠãªéšåã«çµã£ã調æ»ã§çµãã£ãŠããŸã£ãããåšãã®ã³ãŒããåèã«ãããããããšã§ãªããšãªãã§ããæ°ã«ãªã£ãŠããŸã£ãŠããããä»åæ¹ããŠåºç€çãªç¥èãåŠç¿ããã埩ç¿ããæéãšããŠã§ããŠããã£ãã æççã§ãŸã°ããªç¥èããæã£ãŠããªãã£ãéšåãè³æãèªã¿èŸŒãããšã§çè§£ãæ·±ãŸã£ã æ°å¹Žåã«ããºã£ãŠããšã§èªãŸãªããããšã§èªãããã¯ãèšäºããã¡ããšèªããŠããã£ã ããã³ããšã³ãçµéšã®é·ãè¬åž«é£ã®çããç¥èŠïŒãã©ããªã©ãå«ããŠïŒãèãããšãã§ããã®ã¯ãããããã£ã ãªã©ã®ææ³ãåºãŸããã ç§èªèº«ãåå ããŠããŸããããå人çã«ã¯åºç€éšåãæ¹ããŠåºããããšãã§ããæ©äŒã ã£ãããã«æããŠããŸãã ãŸããæ®æ®µã¯æ°ããããŒã«ãªã©ã®æ
å ±ã®ãã£ããã¢ãããžã®æèãåããã¡ã§ãããä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§èšèªã»ããŒã«ã®å€é·ãäžåºŠéããŠèŠãããšãã§ããããšã§ãæ°ããçŸããæè¡ãã©ããã£ã課é¡ã解決ãããã®ãªã®ãããããŸã§ã«äŒŒãããŒã«ããã£ãã®ãã©ãããªã©ã調ã¹ãæéãåŸãããããšã¯ããã£ãã®ããªãšæã£ãŠããŸãã äžæ¹ã§ãä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã®äžã§ã¯ãã³ãŒããæžããæéã¯äœããŸããã§ãããããã«ã€ããŠã¯æ¯ãè¿ãã®äžã§ã話é¡ãšãªããŸããããããã«ã€ããŠã¯ TodoMVC ãªã©ãåèã«ãèªåã§æãåãããŠã¿ãããšãå¿
èŠã ãããšä»åŸã®èª²é¡ãšããŠæããããŸããããã®ãããã¯å®å以å€ã§ã®åã
ã®é 匵ããå¿
èŠã«ãªã£ãŠããéšåããšæããŸãã ãŸãšã ããµãŒããŒãµã€ããšã³ãžãã¢ã®ããã³ããšã³ãéçºåã®åºäžãããããŒããšããã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããããããã£ã圢ã§ãåããããªã¹ãã«ã»ããã®ã¡ã³ããŒãéãŸãããäºãã«ããããªãéšåã«ã€ããŠè©±ãããããçµéšè±å¯ãªã¡ã³ããŒãããå人ã®çµéšãå«ããŠè©±ãèããšããã®ã¯ãæ¹ããŠéåžžã«è²Žéãªæ©äŒã ã£ãããã«æããŸãã ãããã£ãåãçµã¿ãç¹°ãè¿ããŠããããšã§ãåã
ã§å°ã£ãéšåã¯ãã¡ãã䌞ã°ãã€ã€ãå
šäœã®åºäžããè¡ããªããããããããããã¯ãéçºã«ç¹ããããã°ãšèããŠããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® 宿ž ã§ãã ã¡ãã¬ãŒã§ã¯å®æçã«ãããŒãã«æ²¿ã£ãŠçµç¹ã®æè¡çãªåºäžããè¡ãããã®æ©äŒïŒ ã¿ã¹ã¯ãã©ãŒã¹ ãšåŒãã§ããŸãïŒãè¡ã£ãŠããŸãããã®ã¿ã¹ã¯ãã©ãŒã¹ã®ïŒã€ãšããŠå
æ¥ãããã³ããšã³ãéçºåã®ããŒã¹ã¢ãããç®çãšããã¿ã¹ã¯ãã©ãŒã¹ãè¡ããŸãããæ¬èšäºã§ã¯ããã®åçµã¿ã«ã€ããŠã玹ä»ããããšæããŸãã èæ¯ ã¡ãã¬ãŒã«ã¯çŸåš 20 人匱ã®ãšã³ãžãã¢ãåšç±ããŠããããã®çŽåæ°ããµãŒããŒãµã€ãåºèº«è
ã§ãããŸãæ®æ®µã®éçºã«ãããŠã¯ãäžã€ã®æ©èœãããã³ããããµãŒããŒãµã€ããŸã§äžè²«ããŠäžäººãæ
åœããã±ãŒã¹ãå€ããããŸãããµãŒããŒãµã€ãåºèº«è
ã®ããã³ããšã³ãéçºã®ã¹ãã«ã»ããã«ã¯å€å°ã°ãã€ãã¯ãããã®ã®ãæ®æ®µã®éçºæ¥åã§ã¯ã¬ãã¥ãŒçã§ãããããµããŒããã€ã€éçºãè¡ã£ãŠããŸãã ããããããã³ããšã³ãã®åºç€çãªéšåãææ°ã®æµããŸã§èããããšäžå®ãªã¡ã³ããŒãå°ãªããããŸãããããã³ããšã³ãåºèº«ã®ã¡ã³ããŒãäž»å°ããæ¹ããŠåºç€ãææ°æ
å ±ã«é¢ããŠæŽçã»ãã©ããŒãè¡ãããšã§ãçµç¹å
šäœã®ããã³ããšã³ãã®éçºåãé«ããŠãããããšèããŸããã ã¿ã¹ã¯ãã©ãŒã¹ã®ç®ç ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯ãããã³ããšã³ãã®åºæ¬ãæè¿ã®ãã¬ã³ãã«é¢ããŠåŠã¶ãããšã§ãïŒããã³ããšã³ãéçºã«ãããïŒæè¡éžå®ãèšèšãå®è£
ãã§ããåºç€ã身ã«ã€ãããããããŠããããããšã«ãæ°èŠã®ãããžã§ã¯ãã§èšè𿮵éããèªèµ°ã§ããããã«ãªããããšãç®çãšããŸããã ãã®äžã§ãç¹ã«ããæ°å¹Žãå€åã®æµããæ©ãã£ã JavaScript ãäžå¿ã«ãããã¯ãéžå®ããŸããã åå è
ã¯ããããŸã§ãµãŒããŒãµã€ãéçºãäžå¿ã«è¡ã£ãŠããã¡ã³ããŒæ°åã§ããèæ¯ã§ãè§Šãããšãããæ¥åçµéšã¯ããããããåæã§ã®ã¹ã¿ãŒãã§ãã£ããããåºç€ãã¿ã£ã¡ããšããããã¯ãåºç€çãªè©±ããæè¿ã®è©±é¡ãŸã§ãäžéã確èªããªãããåèªã®æã£ãŠããç¥èã®æŽçãšåå°ãåºããããšã§ãä»åŸã®èšèšãæè¡éžå®ãè¡ãéã®æéãåŸãããšãç®çãšããŸããã é²ãæ¹ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯æéã 3 ã¶æãšå®ããæ¯é± 1 æéçšåºŠéãŸã£ãŠè¡ããŸããã æ¯é±ãäºåã«è¬åž«é£ãéžãã è³æãèªãã§ãããåœæ¥ã¯è¬åž«é£ãåå è
ã®äžæç¹ãçåç¹ã«å¯ŸããŠãã©ããŒã¢ãããããšãã圢åŒã§é²ããŸããããã®ä»ã«ã¯ã瀟å
ã®ãããã¯ãã§ã®å©çšäºäŸãªã©ã亀ããªããããŒãã«é¢ãã質åäŒã®ãããªåœ¢ã§é²ãããšãå€ãã£ãã§ãã ãŸãæ¯åã®ã¿ã¹ã¯ãã©ãŒã¹ã®æéã®ããšã«ãåå è
ããã®æ¥ã®å
容ããŸãšããè°äºé²åœ¢åŒã®è³æãäœæããåå è
å
šå¡ãšå
±æããããšã§ããã®æ¥ã«è©±ãããå
容ããããããã®ç解床ãå床確èªããããã«ããŸããã å
容 ãããã®æµãã¯äžèšã®éãã§ãããçŽ 3 ã¶æã§ã©ã®ãããªããŒãã«è§ŠããŠããã®ããäžéšãã玹ä»ããŸãã ããã³ããšã³ãã®åºç€ åºç€ã¯ãã¡ãã®è³æãå©çšãããŠããã ããªããé²ããŸããã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é Asg Boot Camp ã HTML/CSS An Introduction to JavaScript ãã©ãŠã¶ã®ä»çµã¿ãHTML/CSS ã®åºæ¬çãªè©±ã®ãããããJavaScript ã®è©±ã«é¢é£ããŠããããŸã§ã«åºãŠãã AltJS ã«ã€ããŠãããã€ãç¹åŸŽãäœæ
æµè¡ã£ãã®ããªã©ã«ã€ããŠèªã¿èŸŒã¿ãŸããã ãã®äžã§ãã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é ã§ DOM ã®è§£æãã¬ã³ããªã³ã°ãã¬ã€ã¢ãŠããšãã£ããã©ãŠã¶å
éšã§å
·äœçã«äœãè¡ãããŠããã®ããšãã£ã話ã¯ããã§ç¢ºèªã§ããŠããã£ããšãã声ãå€ããããŸããã JavaScriptïŒåºç€ãES2015 以éïŒ JavaScript ã®è©±é¡ãžã®å°å
¥ç·šãšããŠãã¡ããè³æãšããŠèªã¿èŸŒã¿ãŸããã You Donât Know JS: Up & Going JavaScript Garden ãã®ããŒãã§ã¯ JavaScript ã®åºç€ã¯ããã㊠ES3ã5 ãããŒã¹ã«ããããšã§ JavaScript ãšä»èšèªãšã®éãã»ç¹åŸŽãå確èªããŠãããŸãããäžèšã®å
容ãèžãŸããä»ã§ã¯äœ¿ããªãæžãæ¹ãªã©ã«ã€ããŠã¯ãã®çç±ã確èªããªããé²ããŠãããŸããã ãã®åŸã¯ Learn ES2015 · Babel ãåç
§ããªãããPromise, Class ãªã©ã¯æ®æ®µã®éçºã§ãåœããåã®ããã«å©çšããŠãããã®ã®ãES2015 以éã§ã®æžãæ¹ã¯ ES5 ã ãšã©ã®ããã«ãªã£ãŠããããããã§åæã«åŠç¿ããŠãããŸãããïŒ Playground ã» TypeScript ã§ããã®é°å²æ°ãèŠãããšãåºæ¥ãŸãïŒ ã¢ãã³ JavaScript ãããŸã§ã®ç¥èãèžãŸããã¢ãã³ãª JavaScript ã®å©çš(å®è£
)äŸãšããŠã jser.github.io ãš preact-www ã®ãœãŒã¹ãèªãã§ãããŸããã ãããŸã§ã® JavaScript ã®èšèªèªäœã«é¢ããå
容ãããã©ã€ãã©ãªãå©çšããã³ã³ããŒãã³ãéã§ã®ããŒã¿ãããŒããã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã«é¢ããéšåãŸã§ç¢ºèªããŠãããŸããããŸãåèŠã®ãããžã§ã¯ãã§ããã°ã©ã®ãããããç®ãéããŠãããããªã©ã³ãŒãå
šäœã®èªã¿æ¹ã«ã€ããŠãè¬åž«é£ããã¢ããã€ã¹ããããŸããããŸãææåºãŠãã DOM API ã«ããªãã ã£ãããã»ã»ã»ïŒããªã©ãšãªãã€ã€ãã³ãŒããçŽè§£ããŠããããšã§æ¹ããŠããã³ããšã³ã JavaScript ã®ç¹åŸŽçãªéšåãå£éèŠãããšãã§ããããã«æããŸãã ãŸãæåŸã«ãçŸåšéçºã«å©çšãããŠããããŒã«çŸ€ã«ã€ããŠã Qiita:JavaScript ãã¬ãŒã ã¯ãŒã¯éžå®ã®è°è« ãåèã«ç¢ºèªããŸãããããããã®ããŒã«ãã©ã®ãããªèæ¯ã§äœ¿ãããŠããïŒãããã¯ããªãïŒã®ããªã©ãåãããŠç¢ºèªãããŸããã ãããŸã§ã®ããŒããæ¯ãè¿ãã€ã€ãJavaScript ãèšèªãšããŠã©ã®ããã«å€åããŠããããèããæãwebpack ã TypeScript ããªã䜿ãããã®ããããããè
¹ã«èœã¡ãããã«æããŸãããŸãäžèšè³æããã©ã®ãããªã±ãŒã¹ã§äœãéžæããã®ãããã¢ããªã±ãŒã·ã§ã³ã®å¯¿åœãšã©ã€ãã©ãªãããŒã«ã®å¯¿åœãšãã£ãéçšãã§ãŒãºã§çè§£ããŠããå¿
èŠã®ããäºé
ã«ãè§ŠããããŠãããéåžžã«åèã«ãªããŸããã å®éã«ãã£ãŠã¿ãŠ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§ã¯ã3 ã¶æãšããæéã®äžã§ã1 ã¶æåã®æç¹ãšãå
šäœçµäºåŸã«æ¯ãè¿ãã宿œããŸããã ãã®äžã§ãåå ã¡ã³ããŒãã㯠æ¥åã«ãããŠã¯å¿
èŠãªéšåã«çµã£ã調æ»ã§çµãã£ãŠããŸã£ãããåšãã®ã³ãŒããåèã«ãããããããšã§ãªããšãªãã§ããæ°ã«ãªã£ãŠããŸã£ãŠããããä»åæ¹ããŠåºç€çãªç¥èãåŠç¿ããã埩ç¿ããæéãšããŠã§ããŠããã£ãã æççã§ãŸã°ããªç¥èããæã£ãŠããªãã£ãéšåãè³æãèªã¿èŸŒãããšã§çè§£ãæ·±ãŸã£ã æ°å¹Žåã«ããºã£ãŠããšã§èªãŸãªããããšã§èªãããã¯ãèšäºããã¡ããšèªããŠããã£ã ããã³ããšã³ãçµéšã®é·ãè¬åž«é£ã®çããç¥èŠïŒãã©ããªã©ãå«ããŠïŒãèãããšãã§ããã®ã¯ãããããã£ã ãªã©ã®ææ³ãåºãŸããã ç§èªèº«ãåå ããŠããŸããããå人çã«ã¯åºç€éšåãæ¹ããŠåºããããšãã§ããæ©äŒã ã£ãããã«æããŠããŸãã ãŸããæ®æ®µã¯æ°ããããŒã«ãªã©ã®æ
å ±ã®ãã£ããã¢ãããžã®æèãåããã¡ã§ãããä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§èšèªã»ããŒã«ã®å€é·ãäžåºŠéããŠèŠãããšãã§ããããšã§ãæ°ããçŸããæè¡ãã©ããã£ã課é¡ã解決ãããã®ãªã®ãããããŸã§ã«äŒŒãããŒã«ããã£ãã®ãã©ãããªã©ã調ã¹ãæéãåŸãããããšã¯ããã£ãã®ããªãšæã£ãŠããŸãã äžæ¹ã§ãä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã®äžã§ã¯ãã³ãŒããæžããæéã¯äœããŸããã§ãããããã«ã€ããŠã¯æ¯ãè¿ãã®äžã§ã話é¡ãšãªããŸããããããã«ã€ããŠã¯ TodoMVC ãªã©ãåèã«ãèªåã§æãåãããŠã¿ãããšãå¿
èŠã ãããšä»åŸã®èª²é¡ãšããŠæããããŸããããã®ãããã¯å®å以å€ã§ã®åã
ã®é 匵ããå¿
èŠã«ãªã£ãŠããéšåããšæããŸãã ãŸãšã ããµãŒããŒãµã€ããšã³ãžãã¢ã®ããã³ããšã³ãéçºåã®åºäžãããããŒããšããã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããããããã£ã圢ã§ãåããããªã¹ãã«ã»ããã®ã¡ã³ããŒãéãŸãããäºãã«ããããªãéšåã«ã€ããŠè©±ãããããçµéšè±å¯ãªã¡ã³ããŒãããå人ã®çµéšãå«ããŠè©±ãèããšããã®ã¯ãæ¹ããŠéåžžã«è²Žéãªæ©äŒã ã£ãããã«æããŸãã ãããã£ãåãçµã¿ãç¹°ãè¿ããŠããããšã§ãåã
ã§å°ã£ãéšåã¯ãã¡ãã䌞ã°ãã€ã€ãå
šäœã®åºäžããè¡ããªããããããããããã¯ãéçºã«ç¹ããããã°ãšèããŠããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® 宿ž ã§ãã ã¡ãã¬ãŒã§ã¯å®æçã«ãããŒãã«æ²¿ã£ãŠçµç¹ã®æè¡çãªåºäžããè¡ãããã®æ©äŒïŒ ã¿ã¹ã¯ãã©ãŒã¹ ãšåŒãã§ããŸãïŒãè¡ã£ãŠããŸãããã®ã¿ã¹ã¯ãã©ãŒã¹ã®ïŒã€ãšããŠå
æ¥ãããã³ããšã³ãéçºåã®ããŒã¹ã¢ãããç®çãšããã¿ã¹ã¯ãã©ãŒã¹ãè¡ããŸãããæ¬èšäºã§ã¯ããã®åçµã¿ã«ã€ããŠã玹ä»ããããšæããŸãã èæ¯ ã¡ãã¬ãŒã«ã¯çŸåš 20 人匱ã®ãšã³ãžãã¢ãåšç±ããŠããããã®çŽåæ°ããµãŒããŒãµã€ãåºèº«è
ã§ãããŸãæ®æ®µã®éçºã«ãããŠã¯ãäžã€ã®æ©èœãããã³ããããµãŒããŒãµã€ããŸã§äžè²«ããŠäžäººãæ
åœããã±ãŒã¹ãå€ããããŸãããµãŒããŒãµã€ãåºèº«è
ã®ããã³ããšã³ãéçºã®ã¹ãã«ã»ããã«ã¯å€å°ã°ãã€ãã¯ãããã®ã®ãæ®æ®µã®éçºæ¥åã§ã¯ã¬ãã¥ãŒçã§ãããããµããŒããã€ã€éçºãè¡ã£ãŠããŸãã ããããããã³ããšã³ãã®åºç€çãªéšåãææ°ã®æµããŸã§èããããšäžå®ãªã¡ã³ããŒãå°ãªããããŸãããããã³ããšã³ãåºèº«ã®ã¡ã³ããŒãäž»å°ããæ¹ããŠåºç€ãææ°æ
å ±ã«é¢ããŠæŽçã»ãã©ããŒãè¡ãããšã§ãçµç¹å
šäœã®ããã³ããšã³ãã®éçºåãé«ããŠãããããšèããŸããã ã¿ã¹ã¯ãã©ãŒã¹ã®ç®ç ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯ãããã³ããšã³ãã®åºæ¬ãæè¿ã®ãã¬ã³ãã«é¢ããŠåŠã¶ãããšã§ãïŒããã³ããšã³ãéçºã«ãããïŒæè¡éžå®ãèšèšãå®è£
ãã§ããåºç€ã身ã«ã€ãããããããŠããããããšã«ãæ°èŠã®ãããžã§ã¯ãã§èšè𿮵éããèªèµ°ã§ããããã«ãªããããšãç®çãšããŸããã ãã®äžã§ãç¹ã«ããæ°å¹Žãå€åã®æµããæ©ãã£ã JavaScript ãäžå¿ã«ãããã¯ãéžå®ããŸããã åå è
ã¯ããããŸã§ãµãŒããŒãµã€ãéçºãäžå¿ã«è¡ã£ãŠããã¡ã³ããŒæ°åã§ããèæ¯ã§ãè§Šãããšãããæ¥åçµéšã¯ããããããåæã§ã®ã¹ã¿ãŒãã§ãã£ããããåºç€ãã¿ã£ã¡ããšããããã¯ãåºç€çãªè©±ããæè¿ã®è©±é¡ãŸã§ãäžéã確èªããªãããåèªã®æã£ãŠããç¥èã®æŽçãšåå°ãåºããããšã§ãä»åŸã®èšèšãæè¡éžå®ãè¡ãéã®æéãåŸãããšãç®çãšããŸããã é²ãæ¹ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯æéã 3 ã¶æãšå®ããæ¯é± 1 æéçšåºŠéãŸã£ãŠè¡ããŸããã æ¯é±ãäºåã«è¬åž«é£ãéžãã è³æãèªãã§ãããåœæ¥ã¯è¬åž«é£ãåå è
ã®äžæç¹ãçåç¹ã«å¯ŸããŠãã©ããŒã¢ãããããšãã圢åŒã§é²ããŸããããã®ä»ã«ã¯ã瀟å
ã®ãããã¯ãã§ã®å©çšäºäŸãªã©ã亀ããªããããŒãã«é¢ãã質åäŒã®ãããªåœ¢ã§é²ãããšãå€ãã£ãã§ãã ãŸãæ¯åã®ã¿ã¹ã¯ãã©ãŒã¹ã®æéã®ããšã«ãåå è
ããã®æ¥ã®å
容ããŸãšããè°äºé²åœ¢åŒã®è³æãäœæããåå è
å
šå¡ãšå
±æããããšã§ããã®æ¥ã«è©±ãããå
容ããããããã®ç解床ãå床確èªããããã«ããŸããã å
容 ãããã®æµãã¯äžèšã®éãã§ãããçŽ 3 ã¶æã§ã©ã®ãããªããŒãã«è§ŠããŠããã®ããäžéšãã玹ä»ããŸãã ããã³ããšã³ãã®åºç€ åºç€ã¯ãã¡ãã®è³æãå©çšãããŠããã ããªããé²ããŸããã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é Asg Boot Camp ã HTML/CSS An Introduction to JavaScript ãã©ãŠã¶ã®ä»çµã¿ãHTML/CSS ã®åºæ¬çãªè©±ã®ãããããJavaScript ã®è©±ã«é¢é£ããŠããããŸã§ã«åºãŠãã AltJS ã«ã€ããŠãããã€ãç¹åŸŽãäœæ
æµè¡ã£ãã®ããªã©ã«ã€ããŠèªã¿èŸŒã¿ãŸããã ãã®äžã§ãã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é ã§ DOM ã®è§£æãã¬ã³ããªã³ã°ãã¬ã€ã¢ãŠããšãã£ããã©ãŠã¶å
éšã§å
·äœçã«äœãè¡ãããŠããã®ããšãã£ã話ã¯ããã§ç¢ºèªã§ããŠããã£ããšãã声ãå€ããããŸããã JavaScriptïŒåºç€ãES2015 以éïŒ JavaScript ã®è©±é¡ãžã®å°å
¥ç·šãšããŠãã¡ããè³æãšããŠèªã¿èŸŒã¿ãŸããã You Donât Know JS: Up & Going JavaScript Garden ãã®ããŒãã§ã¯ JavaScript ã®åºç€ã¯ããã㊠ES3ã5 ãããŒã¹ã«ããããšã§ JavaScript ãšä»èšèªãšã®éãã»ç¹åŸŽãå確èªããŠãããŸãããäžèšã®å
容ãèžãŸããä»ã§ã¯äœ¿ããªãæžãæ¹ãªã©ã«ã€ããŠã¯ãã®çç±ã確èªããªããé²ããŠãããŸããã ãã®åŸã¯ Learn ES2015 · Babel ãåç
§ããªãããPromise, Class ãªã©ã¯æ®æ®µã®éçºã§ãåœããåã®ããã«å©çšããŠãããã®ã®ãES2015 以éã§ã®æžãæ¹ã¯ ES5 ã ãšã©ã®ããã«ãªã£ãŠããããããã§åæã«åŠç¿ããŠãããŸãããïŒ Playground ã» TypeScript ã§ããã®é°å²æ°ãèŠãããšãåºæ¥ãŸãïŒ ã¢ãã³ JavaScript ãããŸã§ã®ç¥èãèžãŸããã¢ãã³ãª JavaScript ã®å©çš(å®è£
)äŸãšããŠã jser.github.io ãš preact-www ã®ãœãŒã¹ãèªãã§ãããŸããã ãããŸã§ã® JavaScript ã®èšèªèªäœã«é¢ããå
容ãããã©ã€ãã©ãªãå©çšããã³ã³ããŒãã³ãéã§ã®ããŒã¿ãããŒããã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã«é¢ããéšåãŸã§ç¢ºèªããŠãããŸããããŸãåèŠã®ãããžã§ã¯ãã§ããã°ã©ã®ãããããç®ãéããŠãããããªã©ã³ãŒãå
šäœã®èªã¿æ¹ã«ã€ããŠãè¬åž«é£ããã¢ããã€ã¹ããããŸããããŸãææåºãŠãã DOM API ã«ããªãã ã£ãããã»ã»ã»ïŒããªã©ãšãªãã€ã€ãã³ãŒããçŽè§£ããŠããããšã§æ¹ããŠããã³ããšã³ã JavaScript ã®ç¹åŸŽçãªéšåãå£éèŠãããšãã§ããããã«æããŸãã ãŸãæåŸã«ãçŸåšéçºã«å©çšãããŠããããŒã«çŸ€ã«ã€ããŠã Qiita:JavaScript ãã¬ãŒã ã¯ãŒã¯éžå®ã®è°è« ãåèã«ç¢ºèªããŸãããããããã®ããŒã«ãã©ã®ãããªèæ¯ã§äœ¿ãããŠããïŒãããã¯ããªãïŒã®ããªã©ãåãããŠç¢ºèªãããŸããã ãããŸã§ã®ããŒããæ¯ãè¿ãã€ã€ãJavaScript ãèšèªãšããŠã©ã®ããã«å€åããŠããããèããæãwebpack ã TypeScript ããªã䜿ãããã®ããããããè
¹ã«èœã¡ãããã«æããŸãããŸãäžèšè³æããã©ã®ãããªã±ãŒã¹ã§äœãéžæããã®ãããã¢ããªã±ãŒã·ã§ã³ã®å¯¿åœãšã©ã€ãã©ãªãããŒã«ã®å¯¿åœãšãã£ãéçšãã§ãŒãºã§çè§£ããŠããå¿
èŠã®ããäºé
ã«ãè§ŠããããŠãããéåžžã«åèã«ãªããŸããã å®éã«ãã£ãŠã¿ãŠ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§ã¯ã3 ã¶æãšããæéã®äžã§ã1 ã¶æåã®æç¹ãšãå
šäœçµäºåŸã«æ¯ãè¿ãã宿œããŸããã ãã®äžã§ãåå ã¡ã³ããŒãã㯠æ¥åã«ãããŠã¯å¿
èŠãªéšåã«çµã£ã調æ»ã§çµãã£ãŠããŸã£ãããåšãã®ã³ãŒããåèã«ãããããããšã§ãªããšãªãã§ããæ°ã«ãªã£ãŠããŸã£ãŠããããä»åæ¹ããŠåºç€çãªç¥èãåŠç¿ããã埩ç¿ããæéãšããŠã§ããŠããã£ãã æççã§ãŸã°ããªç¥èããæã£ãŠããªãã£ãéšåãè³æãèªã¿èŸŒãããšã§çè§£ãæ·±ãŸã£ã æ°å¹Žåã«ããºã£ãŠããšã§èªãŸãªããããšã§èªãããã¯ãèšäºããã¡ããšèªããŠããã£ã ããã³ããšã³ãçµéšã®é·ãè¬åž«é£ã®çããç¥èŠïŒãã©ããªã©ãå«ããŠïŒãèãããšãã§ããã®ã¯ãããããã£ã ãªã©ã®ææ³ãåºãŸããã ç§èªèº«ãåå ããŠããŸããããå人çã«ã¯åºç€éšåãæ¹ããŠåºããããšãã§ããæ©äŒã ã£ãããã«æããŠããŸãã ãŸããæ®æ®µã¯æ°ããããŒã«ãªã©ã®æ
å ±ã®ãã£ããã¢ãããžã®æèãåããã¡ã§ãããä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§èšèªã»ããŒã«ã®å€é·ãäžåºŠéããŠèŠãããšãã§ããããšã§ãæ°ããçŸããæè¡ãã©ããã£ã課é¡ã解決ãããã®ãªã®ãããããŸã§ã«äŒŒãããŒã«ããã£ãã®ãã©ãããªã©ã調ã¹ãæéãåŸãããããšã¯ããã£ãã®ããªãšæã£ãŠããŸãã äžæ¹ã§ãä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã®äžã§ã¯ãã³ãŒããæžããæéã¯äœããŸããã§ãããããã«ã€ããŠã¯æ¯ãè¿ãã®äžã§ã話é¡ãšãªããŸããããããã«ã€ããŠã¯ TodoMVC ãªã©ãåèã«ãèªåã§æãåãããŠã¿ãããšãå¿
èŠã ãããšä»åŸã®èª²é¡ãšããŠæããããŸããããã®ãããã¯å®å以å€ã§ã®åã
ã®é 匵ããå¿
èŠã«ãªã£ãŠããéšåããšæããŸãã ãŸãšã ããµãŒããŒãµã€ããšã³ãžãã¢ã®ããã³ããšã³ãéçºåã®åºäžãããããŒããšããã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããããããã£ã圢ã§ãåããããªã¹ãã«ã»ããã®ã¡ã³ããŒãéãŸãããäºãã«ããããªãéšåã«ã€ããŠè©±ãããããçµéšè±å¯ãªã¡ã³ããŒãããå人ã®çµéšãå«ããŠè©±ãèããšããã®ã¯ãæ¹ããŠéåžžã«è²Žéãªæ©äŒã ã£ãããã«æããŸãã ãããã£ãåãçµã¿ãç¹°ãè¿ããŠããããšã§ãåã
ã§å°ã£ãéšåã¯ãã¡ãã䌞ã°ãã€ã€ãå
šäœã®åºäžããè¡ããªããããããããããã¯ãéçºã«ç¹ããããã°ãšèããŠããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® 宿ž ã§ãã ã¡ãã¬ãŒã§ã¯å®æçã«ãããŒãã«æ²¿ã£ãŠçµç¹ã®æè¡çãªåºäžããè¡ãããã®æ©äŒïŒ ã¿ã¹ã¯ãã©ãŒã¹ ãšåŒãã§ããŸãïŒãè¡ã£ãŠããŸãããã®ã¿ã¹ã¯ãã©ãŒã¹ã®ïŒã€ãšããŠå
æ¥ãããã³ããšã³ãéçºåã®ããŒã¹ã¢ãããç®çãšããã¿ã¹ã¯ãã©ãŒã¹ãè¡ããŸãããæ¬èšäºã§ã¯ããã®åçµã¿ã«ã€ããŠã玹ä»ããããšæããŸãã èæ¯ ã¡ãã¬ãŒã«ã¯çŸåš 20 人匱ã®ãšã³ãžãã¢ãåšç±ããŠããããã®çŽåæ°ããµãŒããŒãµã€ãåºèº«è
ã§ãããŸãæ®æ®µã®éçºã«ãããŠã¯ãäžã€ã®æ©èœãããã³ããããµãŒããŒãµã€ããŸã§äžè²«ããŠäžäººãæ
åœããã±ãŒã¹ãå€ããããŸãããµãŒããŒãµã€ãåºèº«è
ã®ããã³ããšã³ãéçºã®ã¹ãã«ã»ããã«ã¯å€å°ã°ãã€ãã¯ãããã®ã®ãæ®æ®µã®éçºæ¥åã§ã¯ã¬ãã¥ãŒçã§ãããããµããŒããã€ã€éçºãè¡ã£ãŠããŸãã ããããããã³ããšã³ãã®åºç€çãªéšåãææ°ã®æµããŸã§èããããšäžå®ãªã¡ã³ããŒãå°ãªããããŸãããããã³ããšã³ãåºèº«ã®ã¡ã³ããŒãäž»å°ããæ¹ããŠåºç€ãææ°æ
å ±ã«é¢ããŠæŽçã»ãã©ããŒãè¡ãããšã§ãçµç¹å
šäœã®ããã³ããšã³ãã®éçºåãé«ããŠãããããšèããŸããã ã¿ã¹ã¯ãã©ãŒã¹ã®ç®ç ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯ãããã³ããšã³ãã®åºæ¬ãæè¿ã®ãã¬ã³ãã«é¢ããŠåŠã¶ãããšã§ãïŒããã³ããšã³ãéçºã«ãããïŒæè¡éžå®ãèšèšãå®è£
ãã§ããåºç€ã身ã«ã€ãããããããŠããããããšã«ãæ°èŠã®ãããžã§ã¯ãã§èšè𿮵éããèªèµ°ã§ããããã«ãªããããšãç®çãšããŸããã ãã®äžã§ãç¹ã«ããæ°å¹Žãå€åã®æµããæ©ãã£ã JavaScript ãäžå¿ã«ãããã¯ãéžå®ããŸããã åå è
ã¯ããããŸã§ãµãŒããŒãµã€ãéçºãäžå¿ã«è¡ã£ãŠããã¡ã³ããŒæ°åã§ããèæ¯ã§ãè§Šãããšãããæ¥åçµéšã¯ããããããåæã§ã®ã¹ã¿ãŒãã§ãã£ããããåºç€ãã¿ã£ã¡ããšããããã¯ãåºç€çãªè©±ããæè¿ã®è©±é¡ãŸã§ãäžéã確èªããªãããåèªã®æã£ãŠããç¥èã®æŽçãšåå°ãåºããããšã§ãä»åŸã®èšèšãæè¡éžå®ãè¡ãéã®æéãåŸãããšãç®çãšããŸããã é²ãæ¹ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã¯æéã 3 ã¶æãšå®ããæ¯é± 1 æéçšåºŠéãŸã£ãŠè¡ããŸããã æ¯é±ãäºåã«è¬åž«é£ãéžãã è³æãèªãã§ãããåœæ¥ã¯è¬åž«é£ãåå è
ã®äžæç¹ãçåç¹ã«å¯ŸããŠãã©ããŒã¢ãããããšãã圢åŒã§é²ããŸããããã®ä»ã«ã¯ã瀟å
ã®ãããã¯ãã§ã®å©çšäºäŸãªã©ã亀ããªããããŒãã«é¢ãã質åäŒã®ãããªåœ¢ã§é²ãããšãå€ãã£ãã§ãã ãŸãæ¯åã®ã¿ã¹ã¯ãã©ãŒã¹ã®æéã®ããšã«ãåå è
ããã®æ¥ã®å
容ããŸãšããè°äºé²åœ¢åŒã®è³æãäœæããåå è
å
šå¡ãšå
±æããããšã§ããã®æ¥ã«è©±ãããå
容ããããããã®ç解床ãå床確èªããããã«ããŸããã å
容 ãããã®æµãã¯äžèšã®éãã§ãããçŽ 3 ã¶æã§ã©ã®ãããªããŒãã«è§ŠããŠããã®ããäžéšãã玹ä»ããŸãã ããã³ããšã³ãã®åºç€ åºç€ã¯ãã¡ãã®è³æãå©çšãããŠããã ããªããé²ããŸããã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é Asg Boot Camp ã HTML/CSS An Introduction to JavaScript ãã©ãŠã¶ã®ä»çµã¿ãHTML/CSS ã®åºæ¬çãªè©±ã®ãããããJavaScript ã®è©±ã«é¢é£ããŠããããŸã§ã«åºãŠãã AltJS ã«ã€ããŠãããã€ãç¹åŸŽãäœæ
æµè¡ã£ãã®ããªã©ã«ã€ããŠèªã¿èŸŒã¿ãŸããã ãã®äžã§ãã ãã©ãŠã¶ã®ä»çµã¿: ææ°ãŠã§ããã©ãŠã¶ã®å
éšæ§é ã§ DOM ã®è§£æãã¬ã³ããªã³ã°ãã¬ã€ã¢ãŠããšãã£ããã©ãŠã¶å
éšã§å
·äœçã«äœãè¡ãããŠããã®ããšãã£ã話ã¯ããã§ç¢ºèªã§ããŠããã£ããšãã声ãå€ããããŸããã JavaScriptïŒåºç€ãES2015 以éïŒ JavaScript ã®è©±é¡ãžã®å°å
¥ç·šãšããŠãã¡ããè³æãšããŠèªã¿èŸŒã¿ãŸããã You Donât Know JS: Up & Going JavaScript Garden ãã®ããŒãã§ã¯ JavaScript ã®åºç€ã¯ããã㊠ES3ã5 ãããŒã¹ã«ããããšã§ JavaScript ãšä»èšèªãšã®éãã»ç¹åŸŽãå確èªããŠãããŸãããäžèšã®å
容ãèžãŸããä»ã§ã¯äœ¿ããªãæžãæ¹ãªã©ã«ã€ããŠã¯ãã®çç±ã確èªããªããé²ããŠãããŸããã ãã®åŸã¯ Learn ES2015 · Babel ãåç
§ããªãããPromise, Class ãªã©ã¯æ®æ®µã®éçºã§ãåœããåã®ããã«å©çšããŠãããã®ã®ãES2015 以éã§ã®æžãæ¹ã¯ ES5 ã ãšã©ã®ããã«ãªã£ãŠããããããã§åæã«åŠç¿ããŠãããŸãããïŒ Playground ã» TypeScript ã§ããã®é°å²æ°ãèŠãããšãåºæ¥ãŸãïŒ ã¢ãã³ JavaScript ãããŸã§ã®ç¥èãèžãŸããã¢ãã³ãª JavaScript ã®å©çš(å®è£
)äŸãšããŠã jser.github.io ãš preact-www ã®ãœãŒã¹ãèªãã§ãããŸããã ãããŸã§ã® JavaScript ã®èšèªèªäœã«é¢ããå
容ãããã©ã€ãã©ãªãå©çšããã³ã³ããŒãã³ãéã§ã®ããŒã¿ãããŒããã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã«é¢ããéšåãŸã§ç¢ºèªããŠãããŸããããŸãåèŠã®ãããžã§ã¯ãã§ããã°ã©ã®ãããããç®ãéããŠãããããªã©ã³ãŒãå
šäœã®èªã¿æ¹ã«ã€ããŠãè¬åž«é£ããã¢ããã€ã¹ããããŸããããŸãææåºãŠãã DOM API ã«ããªãã ã£ãããã»ã»ã»ïŒããªã©ãšãªãã€ã€ãã³ãŒããçŽè§£ããŠããããšã§æ¹ããŠããã³ããšã³ã JavaScript ã®ç¹åŸŽçãªéšåãå£éèŠãããšãã§ããããã«æããŸãã ãŸãæåŸã«ãçŸåšéçºã«å©çšãããŠããããŒã«çŸ€ã«ã€ããŠã Qiita:JavaScript ãã¬ãŒã ã¯ãŒã¯éžå®ã®è°è« ãåèã«ç¢ºèªããŸãããããããã®ããŒã«ãã©ã®ãããªèæ¯ã§äœ¿ãããŠããïŒãããã¯ããªãïŒã®ããªã©ãåãããŠç¢ºèªãããŸããã ãããŸã§ã®ããŒããæ¯ãè¿ãã€ã€ãJavaScript ãèšèªãšããŠã©ã®ããã«å€åããŠããããèããæãwebpack ã TypeScript ããªã䜿ãããã®ããããããè
¹ã«èœã¡ãããã«æããŸãããŸãäžèšè³æããã©ã®ãããªã±ãŒã¹ã§äœãéžæããã®ãããã¢ããªã±ãŒã·ã§ã³ã®å¯¿åœãšã©ã€ãã©ãªãããŒã«ã®å¯¿åœãšãã£ãéçšãã§ãŒãºã§çè§£ããŠããå¿
èŠã®ããäºé
ã«ãè§ŠããããŠãããéåžžã«åèã«ãªããŸããã å®éã«ãã£ãŠã¿ãŠ ä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§ã¯ã3 ã¶æãšããæéã®äžã§ã1 ã¶æåã®æç¹ãšãå
šäœçµäºåŸã«æ¯ãè¿ãã宿œããŸããã ãã®äžã§ãåå ã¡ã³ããŒãã㯠æ¥åã«ãããŠã¯å¿
èŠãªéšåã«çµã£ã調æ»ã§çµãã£ãŠããŸã£ãããåšãã®ã³ãŒããåèã«ãããããããšã§ãªããšãªãã§ããæ°ã«ãªã£ãŠããŸã£ãŠããããä»åæ¹ããŠåºç€çãªç¥èãåŠç¿ããã埩ç¿ããæéãšããŠã§ããŠããã£ãã æççã§ãŸã°ããªç¥èããæã£ãŠããªãã£ãéšåãè³æãèªã¿èŸŒãããšã§çè§£ãæ·±ãŸã£ã æ°å¹Žåã«ããºã£ãŠããšã§èªãŸãªããããšã§èªãããã¯ãèšäºããã¡ããšèªããŠããã£ã ããã³ããšã³ãçµéšã®é·ãè¬åž«é£ã®çããç¥èŠïŒãã©ããªã©ãå«ããŠïŒãèãããšãã§ããã®ã¯ãããããã£ã ãªã©ã®ææ³ãåºãŸããã ç§èªèº«ãåå ããŠããŸããããå人çã«ã¯åºç€éšåãæ¹ããŠåºããããšãã§ããæ©äŒã ã£ãããã«æããŠããŸãã ãŸããæ®æ®µã¯æ°ããããŒã«ãªã©ã®æ
å ±ã®ãã£ããã¢ãããžã®æèãåããã¡ã§ãããä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã§èšèªã»ããŒã«ã®å€é·ãäžåºŠéããŠèŠãããšãã§ããããšã§ãæ°ããçŸããæè¡ãã©ããã£ã課é¡ã解決ãããã®ãªã®ãããããŸã§ã«äŒŒãããŒã«ããã£ãã®ãã©ãããªã©ã調ã¹ãæéãåŸãããããšã¯ããã£ãã®ããªãšæã£ãŠããŸãã äžæ¹ã§ãä»åã®ã¿ã¹ã¯ãã©ãŒã¹ã®äžã§ã¯ãã³ãŒããæžããæéã¯äœããŸããã§ãããããã«ã€ããŠã¯æ¯ãè¿ãã®äžã§ã話é¡ãšãªããŸããããããã«ã€ããŠã¯ TodoMVC ãªã©ãåèã«ãèªåã§æãåãããŠã¿ãããšãå¿
èŠã ãããšä»åŸã®èª²é¡ãšããŠæããããŸããããã®ãããã¯å®å以å€ã§ã®åã
ã®é 匵ããå¿
èŠã«ãªã£ãŠããéšåããšæããŸãã ãŸãšã ããµãŒããŒãµã€ããšã³ãžãã¢ã®ããã³ããšã³ãéçºåã®åºäžãããããŒããšããã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããããããã£ã圢ã§ãåããããªã¹ãã«ã»ããã®ã¡ã³ããŒãéãŸãããäºãã«ããããªãéšåã«ã€ããŠè©±ãããããçµéšè±å¯ãªã¡ã³ããŒãããå人ã®çµéšãå«ããŠè©±ãèããšããã®ã¯ãæ¹ããŠéåžžã«è²Žéãªæ©äŒã ã£ãããã«æããŸãã ãããã£ãåãçµã¿ãç¹°ãè¿ããŠããããšã§ãåã
ã§å°ã£ãéšåã¯ãã¡ãã䌞ã°ãã€ã€ãå
šäœã®åºäžããè¡ããªããããããããããã¯ãéçºã«ç¹ããããã°ãšèããŠããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® çš²æ¬ ã§ããå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ãã®éçºãæ
åœããŠãããšã³ãžãã¢ã§ãã æè¿ãžã§ãã¡ãã¬ãŒã§ã¯ CircleCI2.0 ãžã®ç§»è¡ãè¡ããŸãããç§»è¡ã®æ¹æ³ã¯ãã¡ããããã®éã«èª¿ã¹ãããšãCircleCI ã®æ°æ©èœãå©çšããŠã©ãã ã£ãããªã©ãæžããŠãããããšæããŸãã èª²é¡æ åŒç€Ÿã§ã¯ãå
šãããã¯ã( CLINICS ã MEDLEY ã ä»è·ã®ã»ãã ã ãžã§ãã¡ãã¬ãŒ )ã§ CircleCI ãå©çšããŠããŸãã ãžã§ãã¡ãã¬ãŒã§ã¯ CI ã«ãããã¹ãå®è¡ã« 37 åååŸæãã£ãŠããŸãã(ã³ã³ããã 2 ã€å©çšããå®è¡æéã§ã)ã ããã«ãéçºã¡ã³ããŒãå¢ããŠæ¥ãããšããããCI ã®ãªãœãŒã¹ãè¶³ããªããªãéçºå¹çãèœã¡ãããªãç¶æ³ã§ããã ãŸããããã話ã§ãããã ã³ã³ãããå¢ãããšããã®ã解決çã®äžã€ãšããŠã¯ããã®ã§ãããéåºŠã®æ¹åã«æåŸ
ãåºæ¥ããšè©å€ãè¯ãã£ãã®ã§ CirclecCI2.0 ãžç§»è¡ããŸããã CircleCI2.0 ãžã®ç§»è¡ã¡ãªãã åºæ¬çã«ã¯éåºŠã®æ¹åã«æåŸ
ãåºæ¥ãããšããã®ã倧ããªã¡ãªããã§ã¯ãããŸãããå
¬åŒã§ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãã æç²ã§ãã倧ããªç¹åŸŽãšããŠã¯ä»¥äžã®ç¹ã§ããããã First-class Docker Support: Docker ã®ãã€ãã£ããµããŒããš Docker ã¬ã€ã€ãŒãã£ãã·ã¥ã®å°å
¥ Workflows: ãã«ãããã¹ãããããã€ããžã§ããšããŠæè»ã«ç®¡çã§ããããã«ãªã£ã Advanced Caching: ãã£ãã·ã¥ã®ä¿åãšãªã¹ãã¢ãã€ã¡ãŒãžããœãŒã¹ã³ãŒããäŸåé¢ä¿ã«å¯ŸããŠè¡ãããšãã§ããããã«ãªã£ãã ãã®èŸºãã®æ©èœã掻çšã CI ã®é床æ¹åãžç¹ããŠã¿ãããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æ ç§»è¡ã®åæãšããŠããžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æã«ã€ããŠèšèŒããŸãã ããã³ããšã³ãã®ãã«ãã yarn+webpack ã§è¡ããçæããã¢ã»ããã public/assets ãžåãåºããmanifest ãã¡ã€ã«ã®ãã¹ã rails ã® helper çµç±ã§ååŸãèªã¿èŸŒãã§ããŸããïŒRails4.2.xïŒ ãã®ãããªæ§æã®ã¢ããªã±ãŒã·ã§ã³ã CirlceCI2.0 ã§ãã«ãããã¹ãããããã€åºæ¥ãããã«ããŠãããŸãã config.yml ã®å
šäœå ä»åãäœæãã config.yml ã¯ãã®ãããªåœ¢ã«ãªããŸããã ãã£ãã㯠build: bundle install, yarn install code_analyze: rubocop, brakeman, scss-lint rspec deploy: capistrano ãè¡ã£ãŠããããã©ã³ãã«ãã£ãŠã©ã®ãžã§ããå®è¡ããã®ãã workflows ãå©çšããŠäœ¿ãåããŠããŸãã 詳ãã解説ã¯ä»¥éãèšèŒããŠãããŸãã defaults : & defaults working_directory : ~/job-medley docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo version : 2 jobs : build : << : * defaults steps : - checkout - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle - restore_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} - run : name : Yarn install command : | echo "Node $(node -v)" echo "Yarn v$(yarn --version)" yarn config set cache-folder ./yarn_cache echo "Yarn v$(yarn cache dir)" yarn install - save_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} paths : - node_modules - yarn_cache - persist_to_workspace : root : ~/job-medley paths : - ./* code_analyze : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run rubocop command : bundle exec rubocop - run : name : run brakeman command : bundle exec brakeman -qz - run : name : run scss-lint command : bundle exec scss-lint rspec : parallelism : 2 << : * defaults steps : - attach_workspace : at : ~/job-medley - restore_cache : key : job-medley-elasticsearch # rspec ã§ es ã®ã³ãã³ããäžéšå®è¡ããŠãããããprimary container åŽãž install - run : name : Elasticsearch install command : | wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-x.x.x.tar.gz && \ tar -xvf elasticsearch-x.x.x.tar.gz && \ if [ -z "`elasticsearch-x.x.x/bin/plugin -l | grep analysis-kuromoji`" ]; then \ elasticsearch-x.x.x/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/x.x.x; fi - save_cache : key : job-medley-elasticsearch paths : - ./elasticsearch-x.x.x - run : name : database create command : bundle exec rake db:create environment : RAILS_ENV : test - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | sh scripts/init_deploy.sh BRANCH="${CIRCLE_BRANCH}" bundle exec cap develop deploy deploy:restart deploy_only : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | BRANCH="${CIRCLE_BRANCH}" bundle exec cap production deploy deploy:restart workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ DockerImage ã®éžå® å
ã
ãDocker ã䜿ããã« CI ãåããŠããŸããããCircleCI2.0 ãžç§»è¡ããã«èŸºã Docker ãžã®å©çšã«åãæ¿ããŸããã â» Specifying Container Images DockerImage 㯠DockerHub ãžç»é²ãããŠãã CircleCI å
¬åŒã®ã ã® ãå©çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ React ã䜿çšããŠãããããã³ãã®ãã«ã㯠yarn+webpack ãå©çšããŠããŸãããã®çºã以äžã® image ãéžæããŸããã circleci/ruby:2.4.2-node-browsers node ã®ã€ã³ã¹ããŒã«ãšãE2E ã®ãã¹ãã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããŸãã â»è©³çŽ°ã¯ ãã¡ãã®èšäº ãåèã«ãããŠããã ããŸããã ãã®ä»ãçŸåšå©çšããŠãã MySQL ã®ããŒãžã§ã³ãElasticCacheRedis ã®ããŒãžã§ã³ãšåããã image ãéžæããŸããã æ³šæç¹ãšããŠã¯ãè€æ°ã® DockerImage ãå©çšããå Žåãäžã€ç®ã«æå®ãã image ã primary ãšããŠæ±ãããŸãã 以äžã®äŸã§ããšãRuby ã® image ãæåã«æå®ããMySQLãRedis ã® image ãæå®ããŠããŸãããMySQL ã³ãã³ãèªäœã¯ Ruby ã® image ã«å«ãŸããŠããªããããRuby ã³ãã³ããå®è¡ã§ããŠã MySQL ã³ãã³ããå®è¡ããããšã¯åºæ¥ãŸããã â»è©³çŽ°ã¯ ãã¡ã ã«èšèŒãããŠããŸãã docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo ãŸããçšæãããŠãã image ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ãDocker ã§ã«ã¹ã¿ã image ãäœããpublic ã§è¯ããã° Docker Hub ãžç»é²ãprivate ãè¯ããã° Amazon EC2 Container Registry ãžç»é²ããŠããããšã§åŒã³åºãããšãå¯èœã«ãªã£ãŠããŸãã â»Using Custom-Built Docker Images https://circleci.com/docs/ja/2.0/custom-images/ â»Using Private Images https://circleci.com/docs/ja/2.0/private-images/ build ã®èšå®ãš cache CI ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã® build ã«é¢ããŠã§ãã checkout ã§ github ããã³ãŒãã checkout ãããã®åŸã®å®çŸ©ã§ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ããã£ãã·ã¥ä¿åããã£ãã·ã¥ã®å±éãè¡ã£ãŠããŸãã steps : - checkout # Rails application setup - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle save_cache: key ã« Gemfile.lock ãæå®ããããšã§ãã£ãã·ã¥ããŒãšããŠæ±ããpaths ã«èšå®ãããã¹ããã£ãã·ã¥ããããã«ããŠããŸãã restore_cache: key ãšäžèŽãããã£ãã·ã¥ãããã°ãsave_cache æã«æå®ãããã¹ãå±éãçŽããŠããŸãã run: ãã¡ã㯠rails ã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ããŒã«ããŠããã ãã§ãã CircleCI1.0 ããããã£ãã·ã¥ç®¡çãæè»ã«è¡ããããšãããããŸãã circleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ rspec ã«ãããã¹ãã®å®è¡ã«é¢ããŠã§ãã circleci ã³ãã³ã ãå©çšããããšã§ãã¹ãã®äžŠåå®è¡ãå¹ççã«è¡ãããšãåºæ¥ããŸãã ä»å㯠--split-by=timings --timings-type=filename ã®ãªãã·ã§ã³ãæå®ãããã¡ã€ã«åããŒã¹ã§ã®åå²ã§ãã¹ããå®è¡ããŸãã - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ store_artifacts: 以åãããããæ©èœã§ããããã¹ãçµæã®ææç©ãä¿åãããã¹ã«ãªããŸãã store_test_results: ãã¡ãã¯ãã¹ãã®å®è¡çµæãä¿åããŠããããšã§ãã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããworkflows ãå©çšãããšãµããŒããããªãããã§ãã â»åèïŒ https://circleci.com/docs/ja/2.0/configuration-reference/#store_test_results ãã®ãããªåœ¢ã§ Artifacts ãä¿åãããŠããŸãã ãŸããartifacts ã«ã¯ coverage ãš capybara ã® screenshot ãªã©ãä¿åããŠããŸã - simple_cov if ENV['CI'] SimpleCov.coverage_dir File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'coverage') SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ] SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end end capybara Capybara.save_and_open_page_path = File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'capybara') if ENV['CI'] â»CircleCI2.0 ãã CI ã®ç°å¢å€æ°ãå€ãã£ãŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯ãžèšèŒãããŠããŸãã Introduction to environment variables - CircleCI Introduction to environment variables in CircleCI circleci.com Workflows ã®èšå® CircleCI2.0 ãã Workflows ã®å©çšãå¯èœã«ãªããŸããã Workflow orchestration - CircleCI Learn about using CircleCI workflows to orchestrate jobs circleci.com ã³ã³ããæ¯ã«åå²ããžã§ããå®è¡ããããšã§æŽãªã䞊åå®è¡ã®å¹çåãåã³ããžã§ãéã®äŸåé¢ä¿ãŸã§èšå®ã§ããããã§ãã ãžã§ãã¡ãã¬ãŒã§ã¯ã³ãŒãã®éçè§£æã«å°ãå®è¡æéãæãã£ãŠããããšãããå€å°ã®æ¹åãå³ãããšèã åçŽã«äœ¿ã£ãŠã¿ããã£ã ãã¡ãã®æ©èœãå©çšããŠã¿ãŸããã workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ build: åãžã§ãã§å®è¡åã«è¡ã£ãŠããåŠçãå®çŸ© code_analyze: rubocopãbrakemanãscss-lint ãªã©ã®éçè§£æåŠçãå®çŸ© rspec: ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®çŸ© deploy: ãããã€ã«é¢ããåŠçãå®çŸ© ãžã§ãã¡ãã¬ãŒã§ã¯ããã©ã³ã管çã« Git-flow ãæ¡çšããŠããŸããããããšã¯å¥ã« sandbox ãšãããã¹ãç°å¢ãçšæãéçšããŠããŸãã develop ãã©ã³ãã§ã³ãŒãè§£æããã¹ããã¯ãªã¢ããã³ãŒãã ããmaster ãžåæ ããmaster ã§ã¯ãã¹ããã§ãŒãºãªãã« deploy ããæ§æãåã£ãŠããŸãã æ¥µåãCI ã®ãªãœãŒã¹ãç¯çŽããããã«åãã©ã³ãããšã§å®è¡ããåŠçãåããŠããŸãã åãã©ã³ãã®éçšã¯ä»¥äžã®éãã§ãã feature: ã³ãŒãè§£æããã¹ãå®è¡ sandbox: ãããã€ã®ã¿å®è¡(äžæã¬ãã¥ãŒçšãã©ã³ã) develop: ã³ãŒãè§£æããã¹ãå®è¡ããããã€å®è¡ master: ãããã€ã®ã¿å®è¡ äžèšã®äŸã§ã¯ã code_analyze: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã rspec: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_qa: develop ãã©ã³ãã§ã®ã¿å®è¡ requires ã§äŸåé¢ä¿ãæå®ããcode_analyzeãrspec ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_only: sandboxãmasterãstaging ãã©ã³ãã®ã¿å©çšãããžã§ã requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã ã©ã®ãã㪠workflow ãåºæ¥ãããã®ãã以äžã«äŸã瀺ããŸãã feature ãã©ã³ãã®äŸ: develop ãã©ã³ãã®äŸ: masterãsandbox ãã©ã³ãã®äŸ: ä»åã®äŸã ãšãã©ã³ãæ¯ã« workflow ãå€ããŠãããããignoreãonly ã®æžãæ¹ã§æå³ããæ¯ãåããããªãããã«èæ
®ã¯å¿
èŠã§ãããæè»ã« workflow ãäœããããšãããããšæããŸãã(ããéãããšèªã¿è§£ãã®ã倧å€ã«ãªãããã§ãã) Workflows ã«é¢ããŠã¯ ãã¡ã ã«è²ã
ãªãã¿ãŒã³ã®çµã¿æ¹ãèšèŒãããŠããã®ã§ããã¡ããèªããšããçè§£ãæ·±ãŸããšæããŸãã ãžã§ãéã§ã®ããŒã¿å
±æ ãžã§ããåããŠãã«ããã=äœåãã¢ããªã±ãŒã·ã§ã³ã®åæåãå¿
èŠãªããããªããïŒ ãšåœç¶çåã«æãç¹ã§ã¯ãããŸãããããã«å¯Ÿãã解決çãçšæãããŠããŸãã build : steps : ===çç¥=== - persist_to_workspace : root : ~/job-medley paths : - ./* deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley persist_to_workspace: æå®ãããã¹ã«ããããŒã¿ãäžæçã«ä¿ç®¡ããŠãããŸã attach_workspace: ä¿ç®¡æžã¿ã®ããŒã¿ãå±éããŠãããŸã ãã®æ©èœã«ããããã«ãããã»ã¹ã§çæãããã®ãåãžã§ãã§å®è¡ããã³ã³ãããžæž¡ãããšãåºæ¥ãŸãã ãã ãããããããã«ãããã»ã¹ã§ãã£ãã·ã¥ãå
¥ããŠããããšããããããèªäœã®å¹æã¯æ®ã©ãããŸããã§ããã ã³ã³ãã€ã«æžã¿ã®ããŒã¿ãåãæž¡ãéã«ã¯å¹æãçºæ®ãããã§ããã( å
¬åŒã§ã ãã®ãããªå©çšãæ³å®ããŠãããã§ã) æ¹åçµæ èå¿ã®é床æ¹åçµæã§ããçµæã¯ä»¥äžã®éãã«ãªããŸããã æ¹åå: CircleCI1.0 rspec ã®å®è¡æé: 26:59 以äžã¯ãCircleCI2.0 ãžç§»è¡ããã ãã®çµæã§ãããã®ã±ãŒã¹ã§ã¯ workflows ãå©çšããŠããŸããã æ¹ååŸ: CircleCI2.0 rspec ã®å®è¡æé: 19:40 CircleCI1.0 ãã CircleCI2.0 ãžç§»è¡ããããšã«ããã çŽ 12 åçš ãã¹ãã®å®è¡æéãççž®ããããšãåºæ¥ãŸããã Workflows ãªã©ç¹ã«å©çšããŠããªãããã€ããã«ããã§ãŒãºã®å®è¡æéãé¢ä¿ããªããããCircleCI2.0 ãå©çšããã ãã§åçŽã«ãã¹ãå®è¡é床ã®åäžãèŠèŸŒããããšãããããšæããŸãã ç¶ã㊠Workflows ãå©çšããçµæã§ãã æ¹ååŸ: CircleCI2.0 with Workflows rspec ã®å®è¡æé: 21:14 çµæã¯ãWorkflows ãå©çšããªãã±ãŒã¹ãšãå©çšããã±ãŒã¹ã§ã¯ãWorkflows ãå©çšããã»ãã rspec ã®å®è¡æéã¯é·ããªã£ãŠããŸããŸããããbuild-code-analyze-rspec ã®å®è¡ã«æãã£ãããŒã¿ã«ã®æéã«å·®ã¯èŠãããŸããã§ããã ããã¯ããcircleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ãã®ã»ã¯ã·ã§ã³ãžãèšèŒããéããstore_test_results ããµããŒããšãããªãããšã«ãããã³ã³ããéã§ã®åæ£ãæé©åãããŠããªãçºã§ãã ã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããWorkflows ãå©çšãããšãµããŒããããªãããã§ãã å®è¡æéã«ã°ãã€ããåºãŠããŸããcode_analyze ã®ãžã§ãã忣ããããšã§èŠèŸŒãã§ããæ¹åæé(çŽ 3 å)ãšã°ãã€ãã«ããçºçãããã¹ãå®è¡æéã®ãã¹( (20:01 - 14:57) / 2 = 2:32 )ã倧äœåãã§ãããããããŒã¿ã«ã§ã®å®è¡æéã«å·®ãåºãªãçµæãšãªããŸããã ã°ãã€ããåºããªãæ¹æ³ãããžã§ãã®åãæ¹ã«ã€ããŠã¯ä»åŸã工倫ããŠã¿ãããšæããŸãã ãŸããããã³ããšã³ãã®ãã¹ããããå°ãåãããŠãããããšèããŠããã®ã§ãããã³ããšã³ãã®ãã¹ãããµãŒããµã€ãã®ãã¹ãã Workflows ãäžæã䜿ããªãã忣ããŠãããã°è¯ãã®ããªãšãæã£ãŠããŸãã ãããã« ç§»è¡ã«éããŠã CircleCI2.0 ã®ç§»è¡ã¬ã€ã ãèªã¿ãªããé²ããŠããŸããããåºæ¬çãªèšæ³ã®å€æŽãtimezoneãenvironment ã®å®çŸ©æ¹æ³ã®å€æŽãvariable ã®å€æŽãªã©ãå€ã
æããããã¥ã¡ã³ããçµæ§èªã¿èŸŒãŸãªããšã©ãã«äœãå®çŸ©ã§ããã®ãææ¡ã§ããŸããã§ããã ãŸããWorkflows ã®çµã¿ç«ãŠãªã© å
¬åŒã«è¯ããµã³ãã« ã¯æ²¢å±±ããã®ã§ãããäŸåé¢ä¿ã®å®çŸ©ãè²ã
詊ãã®ã«èŠåŽããæ°ãããŸãã â»çŽ çŽã«å°èŠæš¡ãªã¢ããªãçšæããŠã ããŒã«ã«ã§ circleci ãå®è¡ ããŠã¿ãæ¹ãå¹çè¯ãé²ãããããããããŸããã â»ãã ã å
¬åŒã®ããã¥ã¡ã³ã ã CommunityForum ããã£ããèªãã°äœãããšãªãæ
å ±ã¯åã£ãã®ã§éåžžã«å©ãããŸããã CircleCI2.0 ã§ã©ã®ãããªäºãåºæ¥ãã®ããããã¯ã©ã®ããã«è¡ããã®ãã ãã®èšäºããã®æŠèгãã€ããå©ãã«ãªãã°è¯ããªãšæã£ãŠããŸãã åèãªã³ã¯ CircleCI2.0 ãžç§»è¡ããã«ãããã以äžã®èšäºãåèã«ãããŠããã ããŸãããããããšãããããŸãã circleci/ruby:2.4.1-node-browsersã£ãŠäœå
¥ã£ãŠãã®ãç¥ãããã£ã - Qiita 2018-11-19è¿œèš https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ruby/images/ ãã€ã®éã«ãå
¬éãããŠãŸãã åæ© circleciãæäŸããŠããdockerãã¡... qiita.com CircleCI2.0ã®Workflowsã詊ã âCircleCI2.0ã®Workflowsã詊ãâ is published by timakin. medium.com ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ããä»è·æœèšã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã ã¡ã³ããŒã®ã¹ããŒãªãŒ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ã³ããŒã®ã¹ããŒãªãŒ å®¶æãå人ãç
æ°ã«ãªã£ãæã«æãã®æãå·®ãã®ã¹ãå»çã®åã... www.medley.jp ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® çš²æ¬ ã§ããå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ãã®éçºãæ
åœããŠãããšã³ãžãã¢ã§ãã æè¿ãžã§ãã¡ãã¬ãŒã§ã¯ CircleCI2.0 ãžã®ç§»è¡ãè¡ããŸãããç§»è¡ã®æ¹æ³ã¯ãã¡ããããã®éã«èª¿ã¹ãããšãCircleCI ã®æ°æ©èœãå©çšããŠã©ãã ã£ãããªã©ãæžããŠãããããšæããŸãã èª²é¡æ åŒç€Ÿã§ã¯ãå
šãããã¯ã( CLINICS ã MEDLEY ã ä»è·ã®ã»ãã ã ãžã§ãã¡ãã¬ãŒ )ã§ CircleCI ãå©çšããŠããŸãã ãžã§ãã¡ãã¬ãŒã§ã¯ CI ã«ãããã¹ãå®è¡ã« 37 åååŸæãã£ãŠããŸãã(ã³ã³ããã 2 ã€å©çšããå®è¡æéã§ã)ã ããã«ãéçºã¡ã³ããŒãå¢ããŠæ¥ãããšããããCI ã®ãªãœãŒã¹ãè¶³ããªããªãéçºå¹çãèœã¡ãããªãç¶æ³ã§ããã ãŸããããã話ã§ãããã ã³ã³ãããå¢ãããšããã®ã解決çã®äžã€ãšããŠã¯ããã®ã§ãããéåºŠã®æ¹åã«æåŸ
ãåºæ¥ããšè©å€ãè¯ãã£ãã®ã§ CirclecCI2.0 ãžç§»è¡ããŸããã CircleCI2.0 ãžã®ç§»è¡ã¡ãªãã åºæ¬çã«ã¯éåºŠã®æ¹åã«æåŸ
ãåºæ¥ãããšããã®ã倧ããªã¡ãªããã§ã¯ãããŸãããå
¬åŒã§ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãã æç²ã§ãã倧ããªç¹åŸŽãšããŠã¯ä»¥äžã®ç¹ã§ããããã First-class Docker Support: Docker ã®ãã€ãã£ããµããŒããš Docker ã¬ã€ã€ãŒãã£ãã·ã¥ã®å°å
¥ Workflows: ãã«ãããã¹ãããããã€ããžã§ããšããŠæè»ã«ç®¡çã§ããããã«ãªã£ã Advanced Caching: ãã£ãã·ã¥ã®ä¿åãšãªã¹ãã¢ãã€ã¡ãŒãžããœãŒã¹ã³ãŒããäŸåé¢ä¿ã«å¯ŸããŠè¡ãããšãã§ããããã«ãªã£ãã ãã®èŸºãã®æ©èœã掻çšã CI ã®é床æ¹åãžç¹ããŠã¿ãããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æ ç§»è¡ã®åæãšããŠããžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æã«ã€ããŠèšèŒããŸãã ããã³ããšã³ãã®ãã«ãã yarn+webpack ã§è¡ããçæããã¢ã»ããã public/assets ãžåãåºããmanifest ãã¡ã€ã«ã®ãã¹ã rails ã® helper çµç±ã§ååŸãèªã¿èŸŒãã§ããŸããïŒRails4.2.xïŒ ãã®ãããªæ§æã®ã¢ããªã±ãŒã·ã§ã³ã CirlceCI2.0 ã§ãã«ãããã¹ãããããã€åºæ¥ãããã«ããŠãããŸãã config.yml ã®å
šäœå ä»åãäœæãã config.yml ã¯ãã®ãããªåœ¢ã«ãªããŸããã ãã£ãã㯠build: bundle install, yarn install code_analyze: rubocop, brakeman, scss-lint rspec deploy: capistrano ãè¡ã£ãŠããããã©ã³ãã«ãã£ãŠã©ã®ãžã§ããå®è¡ããã®ãã workflows ãå©çšããŠäœ¿ãåããŠããŸãã 詳ãã解説ã¯ä»¥éãèšèŒããŠãããŸãã defaults : & defaults working_directory : ~/job-medley docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo version : 2 jobs : build : << : * defaults steps : - checkout - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle - restore_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} - run : name : Yarn install command : | echo "Node $(node -v)" echo "Yarn v$(yarn --version)" yarn config set cache-folder ./yarn_cache echo "Yarn v$(yarn cache dir)" yarn install - save_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} paths : - node_modules - yarn_cache - persist_to_workspace : root : ~/job-medley paths : - ./* code_analyze : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run rubocop command : bundle exec rubocop - run : name : run brakeman command : bundle exec brakeman -qz - run : name : run scss-lint command : bundle exec scss-lint rspec : parallelism : 2 << : * defaults steps : - attach_workspace : at : ~/job-medley - restore_cache : key : job-medley-elasticsearch # rspec ã§ es ã®ã³ãã³ããäžéšå®è¡ããŠãããããprimary container åŽãž install - run : name : Elasticsearch install command : | wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-x.x.x.tar.gz && \ tar -xvf elasticsearch-x.x.x.tar.gz && \ if [ -z "`elasticsearch-x.x.x/bin/plugin -l | grep analysis-kuromoji`" ]; then \ elasticsearch-x.x.x/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/x.x.x; fi - save_cache : key : job-medley-elasticsearch paths : - ./elasticsearch-x.x.x - run : name : database create command : bundle exec rake db:create environment : RAILS_ENV : test - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | sh scripts/init_deploy.sh BRANCH="${CIRCLE_BRANCH}" bundle exec cap develop deploy deploy:restart deploy_only : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | BRANCH="${CIRCLE_BRANCH}" bundle exec cap production deploy deploy:restart workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ DockerImage ã®éžå® å
ã
ãDocker ã䜿ããã« CI ãåããŠããŸããããCircleCI2.0 ãžç§»è¡ããã«èŸºã Docker ãžã®å©çšã«åãæ¿ããŸããã â» Specifying Container Images DockerImage 㯠DockerHub ãžç»é²ãããŠãã CircleCI å
¬åŒã®ã ã® ãå©çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ React ã䜿çšããŠãããããã³ãã®ãã«ã㯠yarn+webpack ãå©çšããŠããŸãããã®çºã以äžã® image ãéžæããŸããã circleci/ruby:2.4.2-node-browsers node ã®ã€ã³ã¹ããŒã«ãšãE2E ã®ãã¹ãã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããŸãã â»è©³çŽ°ã¯ ãã¡ãã®èšäº ãåèã«ãããŠããã ããŸããã ãã®ä»ãçŸåšå©çšããŠãã MySQL ã®ããŒãžã§ã³ãElasticCacheRedis ã®ããŒãžã§ã³ãšåããã image ãéžæããŸããã æ³šæç¹ãšããŠã¯ãè€æ°ã® DockerImage ãå©çšããå Žåãäžã€ç®ã«æå®ãã image ã primary ãšããŠæ±ãããŸãã 以äžã®äŸã§ããšãRuby ã® image ãæåã«æå®ããMySQLãRedis ã® image ãæå®ããŠããŸãããMySQL ã³ãã³ãèªäœã¯ Ruby ã® image ã«å«ãŸããŠããªããããRuby ã³ãã³ããå®è¡ã§ããŠã MySQL ã³ãã³ããå®è¡ããããšã¯åºæ¥ãŸããã â»è©³çŽ°ã¯ ãã¡ã ã«èšèŒãããŠããŸãã docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo ãŸããçšæãããŠãã image ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ãDocker ã§ã«ã¹ã¿ã image ãäœããpublic ã§è¯ããã° Docker Hub ãžç»é²ãprivate ãè¯ããã° Amazon EC2 Container Registry ãžç»é²ããŠããããšã§åŒã³åºãããšãå¯èœã«ãªã£ãŠããŸãã â»Using Custom-Built Docker Images https://circleci.com/docs/ja/2.0/custom-images/ â»Using Private Images https://circleci.com/docs/ja/2.0/private-images/ build ã®èšå®ãš cache CI ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã® build ã«é¢ããŠã§ãã checkout ã§ github ããã³ãŒãã checkout ãããã®åŸã®å®çŸ©ã§ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ããã£ãã·ã¥ä¿åããã£ãã·ã¥ã®å±éãè¡ã£ãŠããŸãã steps : - checkout # Rails application setup - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle save_cache: key ã« Gemfile.lock ãæå®ããããšã§ãã£ãã·ã¥ããŒãšããŠæ±ããpaths ã«èšå®ãããã¹ããã£ãã·ã¥ããããã«ããŠããŸãã restore_cache: key ãšäžèŽãããã£ãã·ã¥ãããã°ãsave_cache æã«æå®ãããã¹ãå±éãçŽããŠããŸãã run: ãã¡ã㯠rails ã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ããŒã«ããŠããã ãã§ãã CircleCI1.0 ããããã£ãã·ã¥ç®¡çãæè»ã«è¡ããããšãããããŸãã circleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ rspec ã«ãããã¹ãã®å®è¡ã«é¢ããŠã§ãã circleci ã³ãã³ã ãå©çšããããšã§ãã¹ãã®äžŠåå®è¡ãå¹ççã«è¡ãããšãåºæ¥ããŸãã ä»å㯠--split-by=timings --timings-type=filename ã®ãªãã·ã§ã³ãæå®ãããã¡ã€ã«åããŒã¹ã§ã®åå²ã§ãã¹ããå®è¡ããŸãã - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ store_artifacts: 以åãããããæ©èœã§ããããã¹ãçµæã®ææç©ãä¿åãããã¹ã«ãªããŸãã store_test_results: ãã¡ãã¯ãã¹ãã®å®è¡çµæãä¿åããŠããããšã§ãã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããworkflows ãå©çšãããšãµããŒããããªãããã§ãã â»åèïŒ https://circleci.com/docs/ja/2.0/configuration-reference/#store_test_results ãã®ãããªåœ¢ã§ Artifacts ãä¿åãããŠããŸãã ãŸããartifacts ã«ã¯ coverage ãš capybara ã® screenshot ãªã©ãä¿åããŠããŸã - simple_cov if ENV['CI'] SimpleCov.coverage_dir File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'coverage') SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ] SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end end capybara Capybara.save_and_open_page_path = File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'capybara') if ENV['CI'] â»CircleCI2.0 ãã CI ã®ç°å¢å€æ°ãå€ãã£ãŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯ãžèšèŒãããŠããŸãã https://circleci.com/docs/ja/2.0/env-vars/#circleci-environment-variable-descriptions Workflows ã®èšå® CircleCI2.0 ãã Workflows ã®å©çšãå¯èœã«ãªããŸããã https://circleci.com/docs/ja/2.0/workflows/ ã³ã³ããæ¯ã«åå²ããžã§ããå®è¡ããããšã§æŽãªã䞊åå®è¡ã®å¹çåãåã³ããžã§ãéã®äŸåé¢ä¿ãŸã§èšå®ã§ããããã§ãã ãžã§ãã¡ãã¬ãŒã§ã¯ã³ãŒãã®éçè§£æã«å°ãå®è¡æéãæãã£ãŠããããšãããå€å°ã®æ¹åãå³ãããšèã åçŽã«äœ¿ã£ãŠã¿ããã£ã ãã¡ãã®æ©èœãå©çšããŠã¿ãŸããã workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ build: åãžã§ãã§å®è¡åã«è¡ã£ãŠããåŠçãå®çŸ© code_analyze: rubocopãbrakemanãscss-lint ãªã©ã®éçè§£æåŠçãå®çŸ© rspec: ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®çŸ© deploy: ãããã€ã«é¢ããåŠçãå®çŸ© ãžã§ãã¡ãã¬ãŒã§ã¯ããã©ã³ã管çã« Git-flow ãæ¡çšããŠããŸããããããšã¯å¥ã« sandbox ãšãããã¹ãç°å¢ãçšæãéçšããŠããŸãã develop ãã©ã³ãã§ã³ãŒãè§£æããã¹ããã¯ãªã¢ããã³ãŒãã ããmaster ãžåæ ããmaster ã§ã¯ãã¹ããã§ãŒãºãªãã« deploy ããæ§æãåã£ãŠããŸãã æ¥µåãCI ã®ãªãœãŒã¹ãç¯çŽããããã«åãã©ã³ãããšã§å®è¡ããåŠçãåããŠããŸãã åãã©ã³ãã®éçšã¯ä»¥äžã®éãã§ãã feature: ã³ãŒãè§£æããã¹ãå®è¡ sandbox: ãããã€ã®ã¿å®è¡(äžæã¬ãã¥ãŒçšãã©ã³ã) develop: ã³ãŒãè§£æããã¹ãå®è¡ããããã€å®è¡ master: ãããã€ã®ã¿å®è¡ äžèšã®äŸã§ã¯ã code_analyze: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã rspec: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_qa: develop ãã©ã³ãã§ã®ã¿å®è¡ requires ã§äŸåé¢ä¿ãæå®ããcode_analyzeãrspec ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_only: sandboxãmasterãstaging ãã©ã³ãã®ã¿å©çšãããžã§ã requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã ã©ã®ãã㪠workflow ãåºæ¥ãããã®ãã以äžã«äŸã瀺ããŸãã feature ãã©ã³ãã®äŸ: develop ãã©ã³ãã®äŸ: masterãsandbox ãã©ã³ãã®äŸ: ä»åã®äŸã ãšãã©ã³ãæ¯ã« workflow ãå€ããŠãããããignoreãonly ã®æžãæ¹ã§æå³ããæ¯ãåããããªãããã«èæ
®ã¯å¿
èŠã§ãããæè»ã« workflow ãäœããããšãããããšæããŸãã(ããéãããšèªã¿è§£ãã®ã倧å€ã«ãªãããã§ãã) Workflows ã«é¢ããŠã¯ ãã¡ã ã«è²ã
ãªãã¿ãŒã³ã®çµã¿æ¹ãèšèŒãããŠããã®ã§ããã¡ããèªããšããçè§£ãæ·±ãŸããšæããŸãã ãžã§ãéã§ã®ããŒã¿å
±æ ãžã§ããåããŠãã«ããã=äœåãã¢ããªã±ãŒã·ã§ã³ã®åæåãå¿
èŠãªããããªããïŒ ãšåœç¶çåã«æãç¹ã§ã¯ãããŸãããããã«å¯Ÿãã解決çãçšæãããŠããŸãã build : steps : ===çç¥=== - persist_to_workspace : root : ~/job-medley paths : - ./* deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley persist_to_workspace: æå®ãããã¹ã«ããããŒã¿ãäžæçã«ä¿ç®¡ããŠãããŸã attach_workspace: ä¿ç®¡æžã¿ã®ããŒã¿ãå±éããŠãããŸã ãã®æ©èœã«ããããã«ãããã»ã¹ã§çæãããã®ãåãžã§ãã§å®è¡ããã³ã³ãããžæž¡ãããšãåºæ¥ãŸãã ãã ãããããããã«ãããã»ã¹ã§ãã£ãã·ã¥ãå
¥ããŠããããšããããããèªäœã®å¹æã¯æ®ã©ãããŸããã§ããã ã³ã³ãã€ã«æžã¿ã®ããŒã¿ãåãæž¡ãéã«ã¯å¹æãçºæ®ãããã§ããã( å
¬åŒã§ã ãã®ãããªå©çšãæ³å®ããŠãããã§ã) æ¹åçµæ èå¿ã®é床æ¹åçµæã§ããçµæã¯ä»¥äžã®éãã«ãªããŸããã æ¹åå: CircleCI1.0 rspec ã®å®è¡æé: 26:59 以äžã¯ãCircleCI2.0 ãžç§»è¡ããã ãã®çµæã§ãããã®ã±ãŒã¹ã§ã¯ workflows ãå©çšããŠããŸããã æ¹ååŸ: CircleCI2.0 rspec ã®å®è¡æé: 19:40 CircleCI1.0 ãã CircleCI2.0 ãžç§»è¡ããããšã«ããã çŽ 12 åçš ãã¹ãã®å®è¡æéãççž®ããããšãåºæ¥ãŸããã Workflows ãªã©ç¹ã«å©çšããŠããªãããã€ããã«ããã§ãŒãºã®å®è¡æéãé¢ä¿ããªããããCircleCI2.0 ãå©çšããã ãã§åçŽã«ãã¹ãå®è¡é床ã®åäžãèŠèŸŒããããšãããããšæããŸãã ç¶ã㊠Workflows ãå©çšããçµæã§ãã æ¹ååŸ: CircleCI2.0 with Workflows rspec ã®å®è¡æé: 21:14 çµæã¯ãWorkflows ãå©çšããªãã±ãŒã¹ãšãå©çšããã±ãŒã¹ã§ã¯ãWorkflows ãå©çšããã»ãã rspec ã®å®è¡æéã¯é·ããªã£ãŠããŸããŸããããbuild-code-analyze-rspec ã®å®è¡ã«æãã£ãããŒã¿ã«ã®æéã«å·®ã¯èŠãããŸããã§ããã ããã¯ããcircleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ãã®ã»ã¯ã·ã§ã³ãžãèšèŒããéããstore_test_results ããµããŒããšãããªãããšã«ãããã³ã³ããéã§ã®åæ£ãæé©åãããŠããªãçºã§ãã ã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããWorkflows ãå©çšãããšãµããŒããããªãããã§ãã å®è¡æéã«ã°ãã€ããåºãŠããŸããcode_analyze ã®ãžã§ãã忣ããããšã§èŠèŸŒãã§ããæ¹åæé(çŽ 3 å)ãšã°ãã€ãã«ããçºçãããã¹ãå®è¡æéã®ãã¹( (20:01 - 14:57) / 2 = 2:32 )ã倧äœåãã§ãããããããŒã¿ã«ã§ã®å®è¡æéã«å·®ãåºãªãçµæãšãªããŸããã ã°ãã€ããåºããªãæ¹æ³ãããžã§ãã®åãæ¹ã«ã€ããŠã¯ä»åŸã工倫ããŠã¿ãããšæããŸãã ãŸããããã³ããšã³ãã®ãã¹ããããå°ãåãããŠãããããšèããŠããã®ã§ãããã³ããšã³ãã®ãã¹ãããµãŒããµã€ãã®ãã¹ãã Workflows ãäžæã䜿ããªãã忣ããŠãããã°è¯ãã®ããªãšãæã£ãŠããŸãã ãããã« ç§»è¡ã«éããŠã CircleCI2.0 ã®ç§»è¡ã¬ã€ã ãèªã¿ãªããé²ããŠããŸããããåºæ¬çãªèšæ³ã®å€æŽãtimezoneãenvironment ã®å®çŸ©æ¹æ³ã®å€æŽãvariable ã®å€æŽãªã©ãå€ã
æããããã¥ã¡ã³ããçµæ§èªã¿èŸŒãŸãªããšã©ãã«äœãå®çŸ©ã§ããã®ãææ¡ã§ããŸããã§ããã ãŸããWorkflows ã®çµã¿ç«ãŠãªã© å
¬åŒã«è¯ããµã³ãã« ã¯æ²¢å±±ããã®ã§ãããäŸåé¢ä¿ã®å®çŸ©ãè²ã
詊ãã®ã«èŠåŽããæ°ãããŸãã â»çŽ çŽã«å°èŠæš¡ãªã¢ããªãçšæããŠã ããŒã«ã«ã§ circleci ãå®è¡ ããŠã¿ãæ¹ãå¹çè¯ãé²ãããããããããŸããã â»ãã ã å
¬åŒã®ããã¥ã¡ã³ã ã CommunityForum ããã£ããèªãã°äœãããšãªãæ
å ±ã¯åã£ãã®ã§éåžžã«å©ãããŸããã CircleCI2.0 ã§ã©ã®ãããªäºãåºæ¥ãã®ããããã¯ã©ã®ããã«è¡ããã®ãã ãã®èšäºããã®æŠèгãã€ããå©ãã«ãªãã°è¯ããªãšæã£ãŠããŸãã åèãªã³ã¯ CircleCI2.0 ãžç§»è¡ããã«ãããã以äžã®èšäºãåèã«ãããŠããã ããŸãããããããšãããããŸãã https://qiita.com/inuscript/items/09d15ee52b1657872f80 https://medium.com/@timakin/circleci2-0%E3%81%AEworkflows%E3%82%92%E8%A9%A6%E3%81%99-1329042122fd ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ããä»è·æœèšã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã https://www.medley.jp/recruit/creative.html ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® çš²æ¬ ã§ããå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ãã®éçºãæ
åœããŠãããšã³ãžãã¢ã§ãã æè¿ãžã§ãã¡ãã¬ãŒã§ã¯ CircleCI2.0 ãžã®ç§»è¡ãè¡ããŸãããç§»è¡ã®æ¹æ³ã¯ãã¡ããããã®éã«èª¿ã¹ãããšãCircleCI ã®æ°æ©èœãå©çšããŠã©ãã ã£ãããªã©ãæžããŠãããããšæããŸãã èª²é¡æ åŒç€Ÿã§ã¯ãå
šãããã¯ã( CLINICS ã MEDLEY ã ä»è·ã®ã»ãã ã ãžã§ãã¡ãã¬ãŒ )ã§ CircleCI ãå©çšããŠããŸãã ãžã§ãã¡ãã¬ãŒã§ã¯ CI ã«ãããã¹ãå®è¡ã« 37 åååŸæãã£ãŠããŸãã(ã³ã³ããã 2 ã€å©çšããå®è¡æéã§ã)ã ããã«ãéçºã¡ã³ããŒãå¢ããŠæ¥ãããšããããCI ã®ãªãœãŒã¹ãè¶³ããªããªãéçºå¹çãèœã¡ãããªãç¶æ³ã§ããã ãŸããããã話ã§ãããã ã³ã³ãããå¢ãããšããã®ã解決çã®äžã€ãšããŠã¯ããã®ã§ãããéåºŠã®æ¹åã«æåŸ
ãåºæ¥ããšè©å€ãè¯ãã£ãã®ã§ CirclecCI2.0 ãžç§»è¡ããŸããã CircleCI2.0 ãžã®ç§»è¡ã¡ãªãã åºæ¬çã«ã¯éåºŠã®æ¹åã«æåŸ
ãåºæ¥ãããšããã®ã倧ããªã¡ãªããã§ã¯ãããŸãããå
¬åŒã§ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãã æç²ã§ãã倧ããªç¹åŸŽãšããŠã¯ä»¥äžã®ç¹ã§ããããã First-class Docker Support: Docker ã®ãã€ãã£ããµããŒããš Docker ã¬ã€ã€ãŒãã£ãã·ã¥ã®å°å
¥ Workflows: ãã«ãããã¹ãããããã€ããžã§ããšããŠæè»ã«ç®¡çã§ããããã«ãªã£ã Advanced Caching: ãã£ãã·ã¥ã®ä¿åãšãªã¹ãã¢ãã€ã¡ãŒãžããœãŒã¹ã³ãŒããäŸåé¢ä¿ã«å¯ŸããŠè¡ãããšãã§ããããã«ãªã£ãã ãã®èŸºãã®æ©èœã掻çšã CI ã®é床æ¹åãžç¹ããŠã¿ãããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æ ç§»è¡ã®åæãšããŠããžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æã«ã€ããŠèšèŒããŸãã ããã³ããšã³ãã®ãã«ãã yarn+webpack ã§è¡ããçæããã¢ã»ããã public/assets ãžåãåºããmanifest ãã¡ã€ã«ã®ãã¹ã rails ã® helper çµç±ã§ååŸãèªã¿èŸŒãã§ããŸããïŒRails4.2.xïŒ ãã®ãããªæ§æã®ã¢ããªã±ãŒã·ã§ã³ã CirlceCI2.0 ã§ãã«ãããã¹ãããããã€åºæ¥ãããã«ããŠãããŸãã config.yml ã®å
šäœå ä»åãäœæãã config.yml ã¯ãã®ãããªåœ¢ã«ãªããŸããã ãã£ãã㯠build: bundle install, yarn install code_analyze: rubocop, brakeman, scss-lint rspec deploy: capistrano ãè¡ã£ãŠããããã©ã³ãã«ãã£ãŠã©ã®ãžã§ããå®è¡ããã®ãã workflows ãå©çšããŠäœ¿ãåããŠããŸãã 詳ãã解説ã¯ä»¥éãèšèŒããŠãããŸãã defaults : & defaults working_directory : ~/job-medley docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo version : 2 jobs : build : << : * defaults steps : - checkout - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle - restore_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} - run : name : Yarn install command : | echo "Node $(node -v)" echo "Yarn v$(yarn --version)" yarn config set cache-folder ./yarn_cache echo "Yarn v$(yarn cache dir)" yarn install - save_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} paths : - node_modules - yarn_cache - persist_to_workspace : root : ~/job-medley paths : - ./* code_analyze : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run rubocop command : bundle exec rubocop - run : name : run brakeman command : bundle exec brakeman -qz - run : name : run scss-lint command : bundle exec scss-lint rspec : parallelism : 2 << : * defaults steps : - attach_workspace : at : ~/job-medley - restore_cache : key : job-medley-elasticsearch # rspec ã§ es ã®ã³ãã³ããäžéšå®è¡ããŠãããããprimary container åŽãž install - run : name : Elasticsearch install command : | wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-x.x.x.tar.gz && \ tar -xvf elasticsearch-x.x.x.tar.gz && \ if [ -z "`elasticsearch-x.x.x/bin/plugin -l | grep analysis-kuromoji`" ]; then \ elasticsearch-x.x.x/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/x.x.x; fi - save_cache : key : job-medley-elasticsearch paths : - ./elasticsearch-x.x.x - run : name : database create command : bundle exec rake db:create environment : RAILS_ENV : test - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | sh scripts/init_deploy.sh BRANCH="${CIRCLE_BRANCH}" bundle exec cap develop deploy deploy:restart deploy_only : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | BRANCH="${CIRCLE_BRANCH}" bundle exec cap production deploy deploy:restart workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ DockerImage ã®éžå® å
ã
ãDocker ã䜿ããã« CI ãåããŠããŸããããCircleCI2.0 ãžç§»è¡ããã«èŸºã Docker ãžã®å©çšã«åãæ¿ããŸããã â» Specifying Container Images DockerImage 㯠DockerHub ãžç»é²ãããŠãã CircleCI å
¬åŒã®ã ã® ãå©çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ React ã䜿çšããŠãããããã³ãã®ãã«ã㯠yarn+webpack ãå©çšããŠããŸãããã®çºã以äžã® image ãéžæããŸããã circleci/ruby:2.4.2-node-browsers node ã®ã€ã³ã¹ããŒã«ãšãE2E ã®ãã¹ãã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããŸãã â»è©³çŽ°ã¯ ãã¡ãã®èšäº ãåèã«ãããŠããã ããŸããã ãã®ä»ãçŸåšå©çšããŠãã MySQL ã®ããŒãžã§ã³ãElasticCacheRedis ã®ããŒãžã§ã³ãšåããã image ãéžæããŸããã æ³šæç¹ãšããŠã¯ãè€æ°ã® DockerImage ãå©çšããå Žåãäžã€ç®ã«æå®ãã image ã primary ãšããŠæ±ãããŸãã 以äžã®äŸã§ããšãRuby ã® image ãæåã«æå®ããMySQLãRedis ã® image ãæå®ããŠããŸãããMySQL ã³ãã³ãèªäœã¯ Ruby ã® image ã«å«ãŸããŠããªããããRuby ã³ãã³ããå®è¡ã§ããŠã MySQL ã³ãã³ããå®è¡ããããšã¯åºæ¥ãŸããã â»è©³çŽ°ã¯ ãã¡ã ã«èšèŒãããŠããŸãã docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo ãŸããçšæãããŠãã image ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ãDocker ã§ã«ã¹ã¿ã image ãäœããpublic ã§è¯ããã° Docker Hub ãžç»é²ãprivate ãè¯ããã° Amazon EC2 Container Registry ãžç»é²ããŠããããšã§åŒã³åºãããšãå¯èœã«ãªã£ãŠããŸãã â»Using Custom-Built Docker Images https://circleci.com/docs/ja/2.0/custom-images/ â»Using Private Images https://circleci.com/docs/ja/2.0/private-images/ build ã®èšå®ãš cache CI ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã® build ã«é¢ããŠã§ãã checkout ã§ github ããã³ãŒãã checkout ãããã®åŸã®å®çŸ©ã§ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ããã£ãã·ã¥ä¿åããã£ãã·ã¥ã®å±éãè¡ã£ãŠããŸãã steps : - checkout # Rails application setup - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle save_cache: key ã« Gemfile.lock ãæå®ããããšã§ãã£ãã·ã¥ããŒãšããŠæ±ããpaths ã«èšå®ãããã¹ããã£ãã·ã¥ããããã«ããŠããŸãã restore_cache: key ãšäžèŽãããã£ãã·ã¥ãããã°ãsave_cache æã«æå®ãããã¹ãå±éãçŽããŠããŸãã run: ãã¡ã㯠rails ã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ããŒã«ããŠããã ãã§ãã CircleCI1.0 ããããã£ãã·ã¥ç®¡çãæè»ã«è¡ããããšãããããŸãã circleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ rspec ã«ãããã¹ãã®å®è¡ã«é¢ããŠã§ãã circleci ã³ãã³ã ãå©çšããããšã§ãã¹ãã®äžŠåå®è¡ãå¹ççã«è¡ãããšãåºæ¥ããŸãã ä»å㯠--split-by=timings --timings-type=filename ã®ãªãã·ã§ã³ãæå®ãããã¡ã€ã«åããŒã¹ã§ã®åå²ã§ãã¹ããå®è¡ããŸãã - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ store_artifacts: 以åãããããæ©èœã§ããããã¹ãçµæã®ææç©ãä¿åãããã¹ã«ãªããŸãã store_test_results: ãã¡ãã¯ãã¹ãã®å®è¡çµæãä¿åããŠããããšã§ãã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããworkflows ãå©çšãããšãµããŒããããªãããã§ãã â»åèïŒ https://circleci.com/docs/ja/2.0/configuration-reference/#store_test_results ãã®ãããªåœ¢ã§ Artifacts ãä¿åãããŠããŸãã ãŸããartifacts ã«ã¯ coverage ãš capybara ã® screenshot ãªã©ãä¿åããŠããŸã - simple_cov if ENV['CI'] SimpleCov.coverage_dir File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'coverage') SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ] SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end end capybara Capybara.save_and_open_page_path = File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'capybara') if ENV['CI'] â»CircleCI2.0 ãã CI ã®ç°å¢å€æ°ãå€ãã£ãŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯ãžèšèŒãããŠããŸãã Introduction to environment variables - CircleCI Introduction to environment variables in CircleCI circleci.com Workflows ã®èšå® CircleCI2.0 ãã Workflows ã®å©çšãå¯èœã«ãªããŸããã Workflow orchestration - CircleCI Learn about using CircleCI workflows to orchestrate jobs circleci.com ã³ã³ããæ¯ã«åå²ããžã§ããå®è¡ããããšã§æŽãªã䞊åå®è¡ã®å¹çåãåã³ããžã§ãéã®äŸåé¢ä¿ãŸã§èšå®ã§ããããã§ãã ãžã§ãã¡ãã¬ãŒã§ã¯ã³ãŒãã®éçè§£æã«å°ãå®è¡æéãæãã£ãŠããããšãããå€å°ã®æ¹åãå³ãããšèã åçŽã«äœ¿ã£ãŠã¿ããã£ã ãã¡ãã®æ©èœãå©çšããŠã¿ãŸããã workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ build: åãžã§ãã§å®è¡åã«è¡ã£ãŠããåŠçãå®çŸ© code_analyze: rubocopãbrakemanãscss-lint ãªã©ã®éçè§£æåŠçãå®çŸ© rspec: ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®çŸ© deploy: ãããã€ã«é¢ããåŠçãå®çŸ© ãžã§ãã¡ãã¬ãŒã§ã¯ããã©ã³ã管çã« Git-flow ãæ¡çšããŠããŸããããããšã¯å¥ã« sandbox ãšãããã¹ãç°å¢ãçšæãéçšããŠããŸãã develop ãã©ã³ãã§ã³ãŒãè§£æããã¹ããã¯ãªã¢ããã³ãŒãã ããmaster ãžåæ ããmaster ã§ã¯ãã¹ããã§ãŒãºãªãã« deploy ããæ§æãåã£ãŠããŸãã æ¥µåãCI ã®ãªãœãŒã¹ãç¯çŽããããã«åãã©ã³ãããšã§å®è¡ããåŠçãåããŠããŸãã åãã©ã³ãã®éçšã¯ä»¥äžã®éãã§ãã feature: ã³ãŒãè§£æããã¹ãå®è¡ sandbox: ãããã€ã®ã¿å®è¡(äžæã¬ãã¥ãŒçšãã©ã³ã) develop: ã³ãŒãè§£æããã¹ãå®è¡ããããã€å®è¡ master: ãããã€ã®ã¿å®è¡ äžèšã®äŸã§ã¯ã code_analyze: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã rspec: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_qa: develop ãã©ã³ãã§ã®ã¿å®è¡ requires ã§äŸåé¢ä¿ãæå®ããcode_analyzeãrspec ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_only: sandboxãmasterãstaging ãã©ã³ãã®ã¿å©çšãããžã§ã requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã ã©ã®ãã㪠workflow ãåºæ¥ãããã®ãã以äžã«äŸã瀺ããŸãã feature ãã©ã³ãã®äŸ: develop ãã©ã³ãã®äŸ: masterãsandbox ãã©ã³ãã®äŸ: ä»åã®äŸã ãšãã©ã³ãæ¯ã« workflow ãå€ããŠãããããignoreãonly ã®æžãæ¹ã§æå³ããæ¯ãåããããªãããã«èæ
®ã¯å¿
èŠã§ãããæè»ã« workflow ãäœããããšãããããšæããŸãã(ããéãããšèªã¿è§£ãã®ã倧å€ã«ãªãããã§ãã) Workflows ã«é¢ããŠã¯ ãã¡ã ã«è²ã
ãªãã¿ãŒã³ã®çµã¿æ¹ãèšèŒãããŠããã®ã§ããã¡ããèªããšããçè§£ãæ·±ãŸããšæããŸãã ãžã§ãéã§ã®ããŒã¿å
±æ ãžã§ããåããŠãã«ããã=äœåãã¢ããªã±ãŒã·ã§ã³ã®åæåãå¿
èŠãªããããªããïŒ ãšåœç¶çåã«æãç¹ã§ã¯ãããŸãããããã«å¯Ÿãã解決çãçšæãããŠããŸãã build : steps : ===çç¥=== - persist_to_workspace : root : ~/job-medley paths : - ./* deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley persist_to_workspace: æå®ãããã¹ã«ããããŒã¿ãäžæçã«ä¿ç®¡ããŠãããŸã attach_workspace: ä¿ç®¡æžã¿ã®ããŒã¿ãå±éããŠãããŸã ãã®æ©èœã«ããããã«ãããã»ã¹ã§çæãããã®ãåãžã§ãã§å®è¡ããã³ã³ãããžæž¡ãããšãåºæ¥ãŸãã ãã ãããããããã«ãããã»ã¹ã§ãã£ãã·ã¥ãå
¥ããŠããããšããããããèªäœã®å¹æã¯æ®ã©ãããŸããã§ããã ã³ã³ãã€ã«æžã¿ã®ããŒã¿ãåãæž¡ãéã«ã¯å¹æãçºæ®ãããã§ããã( å
¬åŒã§ã ãã®ãããªå©çšãæ³å®ããŠãããã§ã) æ¹åçµæ èå¿ã®é床æ¹åçµæã§ããçµæã¯ä»¥äžã®éãã«ãªããŸããã æ¹åå: CircleCI1.0 rspec ã®å®è¡æé: 26:59 以äžã¯ãCircleCI2.0 ãžç§»è¡ããã ãã®çµæã§ãããã®ã±ãŒã¹ã§ã¯ workflows ãå©çšããŠããŸããã æ¹ååŸ: CircleCI2.0 rspec ã®å®è¡æé: 19:40 CircleCI1.0 ãã CircleCI2.0 ãžç§»è¡ããããšã«ããã çŽ 12 åçš ãã¹ãã®å®è¡æéãççž®ããããšãåºæ¥ãŸããã Workflows ãªã©ç¹ã«å©çšããŠããªãããã€ããã«ããã§ãŒãºã®å®è¡æéãé¢ä¿ããªããããCircleCI2.0 ãå©çšããã ãã§åçŽã«ãã¹ãå®è¡é床ã®åäžãèŠèŸŒããããšãããããšæããŸãã ç¶ã㊠Workflows ãå©çšããçµæã§ãã æ¹ååŸ: CircleCI2.0 with Workflows rspec ã®å®è¡æé: 21:14 çµæã¯ãWorkflows ãå©çšããªãã±ãŒã¹ãšãå©çšããã±ãŒã¹ã§ã¯ãWorkflows ãå©çšããã»ãã rspec ã®å®è¡æéã¯é·ããªã£ãŠããŸããŸããããbuild-code-analyze-rspec ã®å®è¡ã«æãã£ãããŒã¿ã«ã®æéã«å·®ã¯èŠãããŸããã§ããã ããã¯ããcircleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ãã®ã»ã¯ã·ã§ã³ãžãèšèŒããéããstore_test_results ããµããŒããšãããªãããšã«ãããã³ã³ããéã§ã®åæ£ãæé©åãããŠããªãçºã§ãã ã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããWorkflows ãå©çšãããšãµããŒããããªãããã§ãã å®è¡æéã«ã°ãã€ããåºãŠããŸããcode_analyze ã®ãžã§ãã忣ããããšã§èŠèŸŒãã§ããæ¹åæé(çŽ 3 å)ãšã°ãã€ãã«ããçºçãããã¹ãå®è¡æéã®ãã¹( (20:01 - 14:57) / 2 = 2:32 )ã倧äœåãã§ãããããããŒã¿ã«ã§ã®å®è¡æéã«å·®ãåºãªãçµæãšãªããŸããã ã°ãã€ããåºããªãæ¹æ³ãããžã§ãã®åãæ¹ã«ã€ããŠã¯ä»åŸã工倫ããŠã¿ãããšæããŸãã ãŸããããã³ããšã³ãã®ãã¹ããããå°ãåãããŠãããããšèããŠããã®ã§ãããã³ããšã³ãã®ãã¹ãããµãŒããµã€ãã®ãã¹ãã Workflows ãäžæã䜿ããªãã忣ããŠãããã°è¯ãã®ããªãšãæã£ãŠããŸãã ãããã« ç§»è¡ã«éããŠã CircleCI2.0 ã®ç§»è¡ã¬ã€ã ãèªã¿ãªããé²ããŠããŸããããåºæ¬çãªèšæ³ã®å€æŽãtimezoneãenvironment ã®å®çŸ©æ¹æ³ã®å€æŽãvariable ã®å€æŽãªã©ãå€ã
æããããã¥ã¡ã³ããçµæ§èªã¿èŸŒãŸãªããšã©ãã«äœãå®çŸ©ã§ããã®ãææ¡ã§ããŸããã§ããã ãŸããWorkflows ã®çµã¿ç«ãŠãªã© å
¬åŒã«è¯ããµã³ãã« ã¯æ²¢å±±ããã®ã§ãããäŸåé¢ä¿ã®å®çŸ©ãè²ã
詊ãã®ã«èŠåŽããæ°ãããŸãã â»çŽ çŽã«å°èŠæš¡ãªã¢ããªãçšæããŠã ããŒã«ã«ã§ circleci ãå®è¡ ããŠã¿ãæ¹ãå¹çè¯ãé²ãããããããããŸããã â»ãã ã å
¬åŒã®ããã¥ã¡ã³ã ã CommunityForum ããã£ããèªãã°äœãããšãªãæ
å ±ã¯åã£ãã®ã§éåžžã«å©ãããŸããã CircleCI2.0 ã§ã©ã®ãããªäºãåºæ¥ãã®ããããã¯ã©ã®ããã«è¡ããã®ãã ãã®èšäºããã®æŠèгãã€ããå©ãã«ãªãã°è¯ããªãšæã£ãŠããŸãã åèãªã³ã¯ CircleCI2.0 ãžç§»è¡ããã«ãããã以äžã®èšäºãåèã«ãããŠããã ããŸãããããããšãããããŸãã circleci/ruby:2.4.1-node-browsersã£ãŠäœå
¥ã£ãŠãã®ãç¥ãããã£ã - Qiita 2018-11-19远èšhttps://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ruby/images/ãã€ã®éã«âŠ qiita.com CircleCI2.0ã®Workflowsã詊ã âCircleCI2.0ã®Workflowsã詊ãâ is published by timakin. medium.com ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ããä»è·æœèšã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã ã¡ã³ããŒã®ã¹ããŒãªãŒ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ã³ããŒã®ã¹ããŒãªãŒ å®¶æãå人ãç
æ°ã«ãªã£ãæã«æãã®æãå·®ãã®ã¹ãå»çã®åã... www.medley.jp ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® çš²æ¬ ã§ããå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ãã®éçºãæ
åœããŠãããšã³ãžãã¢ã§ãã æè¿ãžã§ãã¡ãã¬ãŒã§ã¯ CircleCI2.0 ãžã®ç§»è¡ãè¡ããŸãããç§»è¡ã®æ¹æ³ã¯ãã¡ããããã®éã«èª¿ã¹ãããšãCircleCI ã®æ°æ©èœãå©çšããŠã©ãã ã£ãããªã©ãæžããŠãããããšæããŸãã èª²é¡æ åŒç€Ÿã§ã¯ãå
šãããã¯ã( CLINICS ã MEDLEY ã ä»è·ã®ã»ãã ã ãžã§ãã¡ãã¬ãŒ )ã§ CircleCI ãå©çšããŠããŸãã ãžã§ãã¡ãã¬ãŒã§ã¯ CI ã«ãããã¹ãå®è¡ã« 37 åååŸæãã£ãŠããŸãã(ã³ã³ããã 2 ã€å©çšããå®è¡æéã§ã)ã ããã«ãéçºã¡ã³ããŒãå¢ããŠæ¥ãããšããããCI ã®ãªãœãŒã¹ãè¶³ããªããªãéçºå¹çãèœã¡ãããªãç¶æ³ã§ããã ãŸããããã話ã§ãããã ã³ã³ãããå¢ãããšããã®ã解決çã®äžã€ãšããŠã¯ããã®ã§ãããéåºŠã®æ¹åã«æåŸ
ãåºæ¥ããšè©å€ãè¯ãã£ãã®ã§ CirclecCI2.0 ãžç§»è¡ããŸããã CircleCI2.0 ãžã®ç§»è¡ã¡ãªãã åºæ¬çã«ã¯éåºŠã®æ¹åã«æåŸ
ãåºæ¥ãããšããã®ã倧ããªã¡ãªããã§ã¯ãããŸãããå
¬åŒã§ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãã æç²ã§ãã倧ããªç¹åŸŽãšããŠã¯ä»¥äžã®ç¹ã§ããããã First-class Docker Support: Docker ã®ãã€ãã£ããµããŒããš Docker ã¬ã€ã€ãŒãã£ãã·ã¥ã®å°å
¥ Workflows: ãã«ãããã¹ãããããã€ããžã§ããšããŠæè»ã«ç®¡çã§ããããã«ãªã£ã Advanced Caching: ãã£ãã·ã¥ã®ä¿åãšãªã¹ãã¢ãã€ã¡ãŒãžããœãŒã¹ã³ãŒããäŸåé¢ä¿ã«å¯ŸããŠè¡ãããšãã§ããããã«ãªã£ãã ãã®èŸºãã®æ©èœã掻çšã CI ã®é床æ¹åãžç¹ããŠã¿ãããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æ ç§»è¡ã®åæãšããŠããžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æã«ã€ããŠèšèŒããŸãã ããã³ããšã³ãã®ãã«ãã yarn+webpack ã§è¡ããçæããã¢ã»ããã public/assets ãžåãåºããmanifest ãã¡ã€ã«ã®ãã¹ã rails ã® helper çµç±ã§ååŸãèªã¿èŸŒãã§ããŸããïŒRails4.2.xïŒ ãã®ãããªæ§æã®ã¢ããªã±ãŒã·ã§ã³ã CirlceCI2.0 ã§ãã«ãããã¹ãããããã€åºæ¥ãããã«ããŠãããŸãã config.yml ã®å
šäœå ä»åãäœæãã config.yml ã¯ãã®ãããªåœ¢ã«ãªããŸããã ãã£ãã㯠build: bundle install, yarn install code_analyze: rubocop, brakeman, scss-lint rspec deploy: capistrano ãè¡ã£ãŠããããã©ã³ãã«ãã£ãŠã©ã®ãžã§ããå®è¡ããã®ãã workflows ãå©çšããŠäœ¿ãåããŠããŸãã 詳ãã解説ã¯ä»¥éãèšèŒããŠãããŸãã defaults : & defaults working_directory : ~/job-medley docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo version : 2 jobs : build : << : * defaults steps : - checkout - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle - restore_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} - run : name : Yarn install command : | echo "Node $(node -v)" echo "Yarn v$(yarn --version)" yarn config set cache-folder ./yarn_cache echo "Yarn v$(yarn cache dir)" yarn install - save_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} paths : - node_modules - yarn_cache - persist_to_workspace : root : ~/job-medley paths : - ./* code_analyze : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run rubocop command : bundle exec rubocop - run : name : run brakeman command : bundle exec brakeman -qz - run : name : run scss-lint command : bundle exec scss-lint rspec : parallelism : 2 << : * defaults steps : - attach_workspace : at : ~/job-medley - restore_cache : key : job-medley-elasticsearch # rspec ã§ es ã®ã³ãã³ããäžéšå®è¡ããŠãããããprimary container åŽãž install - run : name : Elasticsearch install command : | wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-x.x.x.tar.gz && \ tar -xvf elasticsearch-x.x.x.tar.gz && \ if [ -z "`elasticsearch-x.x.x/bin/plugin -l | grep analysis-kuromoji`" ]; then \ elasticsearch-x.x.x/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/x.x.x; fi - save_cache : key : job-medley-elasticsearch paths : - ./elasticsearch-x.x.x - run : name : database create command : bundle exec rake db:create environment : RAILS_ENV : test - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | sh scripts/init_deploy.sh BRANCH="${CIRCLE_BRANCH}" bundle exec cap develop deploy deploy:restart deploy_only : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | BRANCH="${CIRCLE_BRANCH}" bundle exec cap production deploy deploy:restart workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ DockerImage ã®éžå® å
ã
ãDocker ã䜿ããã« CI ãåããŠããŸããããCircleCI2.0 ãžç§»è¡ããã«èŸºã Docker ãžã®å©çšã«åãæ¿ããŸããã â» Specifying Container Images DockerImage 㯠DockerHub ãžç»é²ãããŠãã CircleCI å
¬åŒã®ã ã® ãå©çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ React ã䜿çšããŠãããããã³ãã®ãã«ã㯠yarn+webpack ãå©çšããŠããŸãããã®çºã以äžã® image ãéžæããŸããã circleci/ruby:2.4.2-node-browsers node ã®ã€ã³ã¹ããŒã«ãšãE2E ã®ãã¹ãã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããŸãã â»è©³çŽ°ã¯ ãã¡ãã®èšäº ãåèã«ãããŠããã ããŸããã ãã®ä»ãçŸåšå©çšããŠãã MySQL ã®ããŒãžã§ã³ãElasticCacheRedis ã®ããŒãžã§ã³ãšåããã image ãéžæããŸããã æ³šæç¹ãšããŠã¯ãè€æ°ã® DockerImage ãå©çšããå Žåãäžã€ç®ã«æå®ãã image ã primary ãšããŠæ±ãããŸãã 以äžã®äŸã§ããšãRuby ã® image ãæåã«æå®ããMySQLãRedis ã® image ãæå®ããŠããŸãããMySQL ã³ãã³ãèªäœã¯ Ruby ã® image ã«å«ãŸããŠããªããããRuby ã³ãã³ããå®è¡ã§ããŠã MySQL ã³ãã³ããå®è¡ããããšã¯åºæ¥ãŸããã â»è©³çŽ°ã¯ ãã¡ã ã«èšèŒãããŠããŸãã docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo ãŸããçšæãããŠãã image ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ãDocker ã§ã«ã¹ã¿ã image ãäœããpublic ã§è¯ããã° Docker Hub ãžç»é²ãprivate ãè¯ããã° Amazon EC2 Container Registry ãžç»é²ããŠããããšã§åŒã³åºãããšãå¯èœã«ãªã£ãŠããŸãã â»Using Custom-Built Docker Images https://circleci.com/docs/ja/2.0/custom-images/ â»Using Private Images https://circleci.com/docs/ja/2.0/private-images/ build ã®èšå®ãš cache CI ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã® build ã«é¢ããŠã§ãã checkout ã§ github ããã³ãŒãã checkout ãããã®åŸã®å®çŸ©ã§ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ããã£ãã·ã¥ä¿åããã£ãã·ã¥ã®å±éãè¡ã£ãŠããŸãã steps : - checkout # Rails application setup - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle save_cache: key ã« Gemfile.lock ãæå®ããããšã§ãã£ãã·ã¥ããŒãšããŠæ±ããpaths ã«èšå®ãããã¹ããã£ãã·ã¥ããããã«ããŠããŸãã restore_cache: key ãšäžèŽãããã£ãã·ã¥ãããã°ãsave_cache æã«æå®ãããã¹ãå±éãçŽããŠããŸãã run: ãã¡ã㯠rails ã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ããŒã«ããŠããã ãã§ãã CircleCI1.0 ããããã£ãã·ã¥ç®¡çãæè»ã«è¡ããããšãããããŸãã circleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ rspec ã«ãããã¹ãã®å®è¡ã«é¢ããŠã§ãã circleci ã³ãã³ã ãå©çšããããšã§ãã¹ãã®äžŠåå®è¡ãå¹ççã«è¡ãããšãåºæ¥ããŸãã ä»å㯠--split-by=timings --timings-type=filename ã®ãªãã·ã§ã³ãæå®ãããã¡ã€ã«åããŒã¹ã§ã®åå²ã§ãã¹ããå®è¡ããŸãã - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ store_artifacts: 以åãããããæ©èœã§ããããã¹ãçµæã®ææç©ãä¿åãããã¹ã«ãªããŸãã store_test_results: ãã¡ãã¯ãã¹ãã®å®è¡çµæãä¿åããŠããããšã§ãã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããworkflows ãå©çšãããšãµããŒããããªãããã§ãã â»åèïŒ https://circleci.com/docs/ja/2.0/configuration-reference/#store_test_results ãã®ãããªåœ¢ã§ Artifacts ãä¿åãããŠããŸãã ãŸããartifacts ã«ã¯ coverage ãš capybara ã® screenshot ãªã©ãä¿åããŠããŸã - simple_cov if ENV['CI'] SimpleCov.coverage_dir File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'coverage') SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ] SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end end capybara Capybara.save_and_open_page_path = File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'capybara') if ENV['CI'] â»CircleCI2.0 ãã CI ã®ç°å¢å€æ°ãå€ãã£ãŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯ãžèšèŒãããŠããŸãã Introduction to environment variables - CircleCI Introduction to environment variables in CircleCI circleci.com Workflows ã®èšå® CircleCI2.0 ãã Workflows ã®å©çšãå¯èœã«ãªããŸããã Workflow orchestration - CircleCI Learn about using CircleCI workflows to orchestrate jobs circleci.com ã³ã³ããæ¯ã«åå²ããžã§ããå®è¡ããããšã§æŽãªã䞊åå®è¡ã®å¹çåãåã³ããžã§ãéã®äŸåé¢ä¿ãŸã§èšå®ã§ããããã§ãã ãžã§ãã¡ãã¬ãŒã§ã¯ã³ãŒãã®éçè§£æã«å°ãå®è¡æéãæãã£ãŠããããšãããå€å°ã®æ¹åãå³ãããšèã åçŽã«äœ¿ã£ãŠã¿ããã£ã ãã¡ãã®æ©èœãå©çšããŠã¿ãŸããã workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ build: åãžã§ãã§å®è¡åã«è¡ã£ãŠããåŠçãå®çŸ© code_analyze: rubocopãbrakemanãscss-lint ãªã©ã®éçè§£æåŠçãå®çŸ© rspec: ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®çŸ© deploy: ãããã€ã«é¢ããåŠçãå®çŸ© ãžã§ãã¡ãã¬ãŒã§ã¯ããã©ã³ã管çã« Git-flow ãæ¡çšããŠããŸããããããšã¯å¥ã« sandbox ãšãããã¹ãç°å¢ãçšæãéçšããŠããŸãã develop ãã©ã³ãã§ã³ãŒãè§£æããã¹ããã¯ãªã¢ããã³ãŒãã ããmaster ãžåæ ããmaster ã§ã¯ãã¹ããã§ãŒãºãªãã« deploy ããæ§æãåã£ãŠããŸãã æ¥µåãCI ã®ãªãœãŒã¹ãç¯çŽããããã«åãã©ã³ãããšã§å®è¡ããåŠçãåããŠããŸãã åãã©ã³ãã®éçšã¯ä»¥äžã®éãã§ãã feature: ã³ãŒãè§£æããã¹ãå®è¡ sandbox: ãããã€ã®ã¿å®è¡(äžæã¬ãã¥ãŒçšãã©ã³ã) develop: ã³ãŒãè§£æããã¹ãå®è¡ããããã€å®è¡ master: ãããã€ã®ã¿å®è¡ äžèšã®äŸã§ã¯ã code_analyze: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã rspec: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_qa: develop ãã©ã³ãã§ã®ã¿å®è¡ requires ã§äŸåé¢ä¿ãæå®ããcode_analyzeãrspec ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_only: sandboxãmasterãstaging ãã©ã³ãã®ã¿å©çšãããžã§ã requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã ã©ã®ãã㪠workflow ãåºæ¥ãããã®ãã以äžã«äŸã瀺ããŸãã feature ãã©ã³ãã®äŸ: develop ãã©ã³ãã®äŸ: masterãsandbox ãã©ã³ãã®äŸ: ä»åã®äŸã ãšãã©ã³ãæ¯ã« workflow ãå€ããŠãããããignoreãonly ã®æžãæ¹ã§æå³ããæ¯ãåããããªãããã«èæ
®ã¯å¿
èŠã§ãããæè»ã« workflow ãäœããããšãããããšæããŸãã(ããéãããšèªã¿è§£ãã®ã倧å€ã«ãªãããã§ãã) Workflows ã«é¢ããŠã¯ ãã¡ã ã«è²ã
ãªãã¿ãŒã³ã®çµã¿æ¹ãèšèŒãããŠããã®ã§ããã¡ããèªããšããçè§£ãæ·±ãŸããšæããŸãã ãžã§ãéã§ã®ããŒã¿å
±æ ãžã§ããåããŠãã«ããã=äœåãã¢ããªã±ãŒã·ã§ã³ã®åæåãå¿
èŠãªããããªããïŒ ãšåœç¶çåã«æãç¹ã§ã¯ãããŸãããããã«å¯Ÿãã解決çãçšæãããŠããŸãã build : steps : ===çç¥=== - persist_to_workspace : root : ~/job-medley paths : - ./* deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley persist_to_workspace: æå®ãããã¹ã«ããããŒã¿ãäžæçã«ä¿ç®¡ããŠãããŸã attach_workspace: ä¿ç®¡æžã¿ã®ããŒã¿ãå±éããŠãããŸã ãã®æ©èœã«ããããã«ãããã»ã¹ã§çæãããã®ãåãžã§ãã§å®è¡ããã³ã³ãããžæž¡ãããšãåºæ¥ãŸãã ãã ãããããããã«ãããã»ã¹ã§ãã£ãã·ã¥ãå
¥ããŠããããšããããããèªäœã®å¹æã¯æ®ã©ãããŸããã§ããã ã³ã³ãã€ã«æžã¿ã®ããŒã¿ãåãæž¡ãéã«ã¯å¹æãçºæ®ãããã§ããã( å
¬åŒã§ã ãã®ãããªå©çšãæ³å®ããŠãããã§ã) æ¹åçµæ èå¿ã®é床æ¹åçµæã§ããçµæã¯ä»¥äžã®éãã«ãªããŸããã æ¹åå: CircleCI1.0 rspec ã®å®è¡æé: 26:59 以äžã¯ãCircleCI2.0 ãžç§»è¡ããã ãã®çµæã§ãããã®ã±ãŒã¹ã§ã¯ workflows ãå©çšããŠããŸããã æ¹ååŸ: CircleCI2.0 rspec ã®å®è¡æé: 19:40 CircleCI1.0 ãã CircleCI2.0 ãžç§»è¡ããããšã«ããã çŽ 12 åçš ãã¹ãã®å®è¡æéãççž®ããããšãåºæ¥ãŸããã Workflows ãªã©ç¹ã«å©çšããŠããªãããã€ããã«ããã§ãŒãºã®å®è¡æéãé¢ä¿ããªããããCircleCI2.0 ãå©çšããã ãã§åçŽã«ãã¹ãå®è¡é床ã®åäžãèŠèŸŒããããšãããããšæããŸãã ç¶ã㊠Workflows ãå©çšããçµæã§ãã æ¹ååŸ: CircleCI2.0 with Workflows rspec ã®å®è¡æé: 21:14 çµæã¯ãWorkflows ãå©çšããªãã±ãŒã¹ãšãå©çšããã±ãŒã¹ã§ã¯ãWorkflows ãå©çšããã»ãã rspec ã®å®è¡æéã¯é·ããªã£ãŠããŸããŸããããbuild-code-analyze-rspec ã®å®è¡ã«æãã£ãããŒã¿ã«ã®æéã«å·®ã¯èŠãããŸããã§ããã ããã¯ããcircleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ãã®ã»ã¯ã·ã§ã³ãžãèšèŒããéããstore_test_results ããµããŒããšãããªãããšã«ãããã³ã³ããéã§ã®åæ£ãæé©åãããŠããªãçºã§ãã ã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããWorkflows ãå©çšãããšãµããŒããããªãããã§ãã å®è¡æéã«ã°ãã€ããåºãŠããŸããcode_analyze ã®ãžã§ãã忣ããããšã§èŠèŸŒãã§ããæ¹åæé(çŽ 3 å)ãšã°ãã€ãã«ããçºçãããã¹ãå®è¡æéã®ãã¹( (20:01 - 14:57) / 2 = 2:32 )ã倧äœåãã§ãããããããŒã¿ã«ã§ã®å®è¡æéã«å·®ãåºãªãçµæãšãªããŸããã ã°ãã€ããåºããªãæ¹æ³ãããžã§ãã®åãæ¹ã«ã€ããŠã¯ä»åŸã工倫ããŠã¿ãããšæããŸãã ãŸããããã³ããšã³ãã®ãã¹ããããå°ãåãããŠãããããšèããŠããã®ã§ãããã³ããšã³ãã®ãã¹ãããµãŒããµã€ãã®ãã¹ãã Workflows ãäžæã䜿ããªãã忣ããŠãããã°è¯ãã®ããªãšãæã£ãŠããŸãã ãããã« ç§»è¡ã«éããŠã CircleCI2.0 ã®ç§»è¡ã¬ã€ã ãèªã¿ãªããé²ããŠããŸããããåºæ¬çãªèšæ³ã®å€æŽãtimezoneãenvironment ã®å®çŸ©æ¹æ³ã®å€æŽãvariable ã®å€æŽãªã©ãå€ã
æããããã¥ã¡ã³ããçµæ§èªã¿èŸŒãŸãªããšã©ãã«äœãå®çŸ©ã§ããã®ãææ¡ã§ããŸããã§ããã ãŸããWorkflows ã®çµã¿ç«ãŠãªã© å
¬åŒã«è¯ããµã³ãã« ã¯æ²¢å±±ããã®ã§ãããäŸåé¢ä¿ã®å®çŸ©ãè²ã
詊ãã®ã«èŠåŽããæ°ãããŸãã â»çŽ çŽã«å°èŠæš¡ãªã¢ããªãçšæããŠã ããŒã«ã«ã§ circleci ãå®è¡ ããŠã¿ãæ¹ãå¹çè¯ãé²ãããããããããŸããã â»ãã ã å
¬åŒã®ããã¥ã¡ã³ã ã CommunityForum ããã£ããèªãã°äœãããšãªãæ
å ±ã¯åã£ãã®ã§éåžžã«å©ãããŸããã CircleCI2.0 ã§ã©ã®ãããªäºãåºæ¥ãã®ããããã¯ã©ã®ããã«è¡ããã®ãã ãã®èšäºããã®æŠèгãã€ããå©ãã«ãªãã°è¯ããªãšæã£ãŠããŸãã åèãªã³ã¯ CircleCI2.0 ãžç§»è¡ããã«ãããã以äžã®èšäºãåèã«ãããŠããã ããŸãããããããšãããããŸãã circleci/ruby:2.4.1-node-browsersã£ãŠäœå
¥ã£ãŠãã®ãç¥ãããã£ã - Qiita 2018-11-19远èšhttps://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ruby/images/ãã€ã®éã«âŠ qiita.com CircleCI2.0ã®Workflowsã詊ã âCircleCI2.0ã®Workflowsã詊ãâ is published by timakin. medium.com ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ããä»è·æœèšã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã ã¡ã³ããŒã®ã¹ããŒãªãŒ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ã³ããŒã®ã¹ããŒãªãŒ å®¶æãå人ãç
æ°ã«ãªã£ãæã«æãã®æãå·®ãã®ã¹ãå»çã®åã... www.medley.jp ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® çš²æ¬ ã§ããå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ãã®éçºãæ
åœããŠãããšã³ãžãã¢ã§ãã æè¿ãžã§ãã¡ãã¬ãŒã§ã¯ CircleCI2.0 ãžã®ç§»è¡ãè¡ããŸãããç§»è¡ã®æ¹æ³ã¯ãã¡ããããã®éã«èª¿ã¹ãããšãCircleCI ã®æ°æ©èœãå©çšããŠã©ãã ã£ãããªã©ãæžããŠãããããšæããŸãã èª²é¡æ åŒç€Ÿã§ã¯ãå
šãããã¯ã( CLINICS ã MEDLEY ã ä»è·ã®ã»ãã ã ãžã§ãã¡ãã¬ãŒ )ã§ CircleCI ãå©çšããŠããŸãã ãžã§ãã¡ãã¬ãŒã§ã¯ CI ã«ãããã¹ãå®è¡ã« 37 åååŸæãã£ãŠããŸãã(ã³ã³ããã 2 ã€å©çšããå®è¡æéã§ã)ã ããã«ãéçºã¡ã³ããŒãå¢ããŠæ¥ãããšããããCI ã®ãªãœãŒã¹ãè¶³ããªããªãéçºå¹çãèœã¡ãããªãç¶æ³ã§ããã ãŸããããã話ã§ãããã ã³ã³ãããå¢ãããšããã®ã解決çã®äžã€ãšããŠã¯ããã®ã§ãããéåºŠã®æ¹åã«æåŸ
ãåºæ¥ããšè©å€ãè¯ãã£ãã®ã§ CirclecCI2.0 ãžç§»è¡ããŸããã CircleCI2.0 ãžã®ç§»è¡ã¡ãªãã åºæ¬çã«ã¯éåºŠã®æ¹åã«æåŸ
ãåºæ¥ãããšããã®ã倧ããªã¡ãªããã§ã¯ãããŸãããå
¬åŒã§ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãã æç²ã§ãã倧ããªç¹åŸŽãšããŠã¯ä»¥äžã®ç¹ã§ããããã First-class Docker Support: Docker ã®ãã€ãã£ããµããŒããš Docker ã¬ã€ã€ãŒãã£ãã·ã¥ã®å°å
¥ Workflows: ãã«ãããã¹ãããããã€ããžã§ããšããŠæè»ã«ç®¡çã§ããããã«ãªã£ã Advanced Caching: ãã£ãã·ã¥ã®ä¿åãšãªã¹ãã¢ãã€ã¡ãŒãžããœãŒã¹ã³ãŒããäŸåé¢ä¿ã«å¯ŸããŠè¡ãããšãã§ããããã«ãªã£ãã ãã®èŸºãã®æ©èœã掻çšã CI ã®é床æ¹åãžç¹ããŠã¿ãããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æ ç§»è¡ã®åæãšããŠããžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æã«ã€ããŠèšèŒããŸãã ããã³ããšã³ãã®ãã«ãã yarn+webpack ã§è¡ããçæããã¢ã»ããã public/assets ãžåãåºããmanifest ãã¡ã€ã«ã®ãã¹ã rails ã® helper çµç±ã§ååŸãèªã¿èŸŒãã§ããŸããïŒRails4.2.xïŒ ãã®ãããªæ§æã®ã¢ããªã±ãŒã·ã§ã³ã CirlceCI2.0 ã§ãã«ãããã¹ãããããã€åºæ¥ãããã«ããŠãããŸãã config.yml ã®å
šäœå ä»åãäœæãã config.yml ã¯ãã®ãããªåœ¢ã«ãªããŸããã ãã£ãã㯠build: bundle install, yarn install code_analyze: rubocop, brakeman, scss-lint rspec deploy: capistrano ãè¡ã£ãŠããããã©ã³ãã«ãã£ãŠã©ã®ãžã§ããå®è¡ããã®ãã workflows ãå©çšããŠäœ¿ãåããŠããŸãã 詳ãã解説ã¯ä»¥éãèšèŒããŠãããŸãã defaults : & defaults working_directory : ~/job-medley docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo version : 2 jobs : build : << : * defaults steps : - checkout - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle - restore_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} - run : name : Yarn install command : | echo "Node $(node -v)" echo "Yarn v$(yarn --version)" yarn config set cache-folder ./yarn_cache echo "Yarn v$(yarn cache dir)" yarn install - save_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} paths : - node_modules - yarn_cache - persist_to_workspace : root : ~/job-medley paths : - ./* code_analyze : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run rubocop command : bundle exec rubocop - run : name : run brakeman command : bundle exec brakeman -qz - run : name : run scss-lint command : bundle exec scss-lint rspec : parallelism : 2 << : * defaults steps : - attach_workspace : at : ~/job-medley - restore_cache : key : job-medley-elasticsearch # rspec ã§ es ã®ã³ãã³ããäžéšå®è¡ããŠãããããprimary container åŽãž install - run : name : Elasticsearch install command : | wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-x.x.x.tar.gz && \ tar -xvf elasticsearch-x.x.x.tar.gz && \ if [ -z "`elasticsearch-x.x.x/bin/plugin -l | grep analysis-kuromoji`" ]; then \ elasticsearch-x.x.x/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/x.x.x; fi - save_cache : key : job-medley-elasticsearch paths : - ./elasticsearch-x.x.x - run : name : database create command : bundle exec rake db:create environment : RAILS_ENV : test - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | sh scripts/init_deploy.sh BRANCH="${CIRCLE_BRANCH}" bundle exec cap develop deploy deploy:restart deploy_only : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | BRANCH="${CIRCLE_BRANCH}" bundle exec cap production deploy deploy:restart workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ DockerImage ã®éžå® å
ã
ãDocker ã䜿ããã« CI ãåããŠããŸããããCircleCI2.0 ãžç§»è¡ããã«èŸºã Docker ãžã®å©çšã«åãæ¿ããŸããã â» Specifying Container Images DockerImage 㯠DockerHub ãžç»é²ãããŠãã CircleCI å
¬åŒã®ã ã® ãå©çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ React ã䜿çšããŠãããããã³ãã®ãã«ã㯠yarn+webpack ãå©çšããŠããŸãããã®çºã以äžã® image ãéžæããŸããã circleci/ruby:2.4.2-node-browsers node ã®ã€ã³ã¹ããŒã«ãšãE2E ã®ãã¹ãã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããŸãã â»è©³çŽ°ã¯ ãã¡ãã®èšäº ãåèã«ãããŠããã ããŸããã ãã®ä»ãçŸåšå©çšããŠãã MySQL ã®ããŒãžã§ã³ãElasticCacheRedis ã®ããŒãžã§ã³ãšåããã image ãéžæããŸããã æ³šæç¹ãšããŠã¯ãè€æ°ã® DockerImage ãå©çšããå Žåãäžã€ç®ã«æå®ãã image ã primary ãšããŠæ±ãããŸãã 以äžã®äŸã§ããšãRuby ã® image ãæåã«æå®ããMySQLãRedis ã® image ãæå®ããŠããŸãããMySQL ã³ãã³ãèªäœã¯ Ruby ã® image ã«å«ãŸããŠããªããããRuby ã³ãã³ããå®è¡ã§ããŠã MySQL ã³ãã³ããå®è¡ããããšã¯åºæ¥ãŸããã â»è©³çŽ°ã¯ ãã¡ã ã«èšèŒãããŠããŸãã docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo ãŸããçšæãããŠãã image ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ãDocker ã§ã«ã¹ã¿ã image ãäœããpublic ã§è¯ããã° Docker Hub ãžç»é²ãprivate ãè¯ããã° Amazon EC2 Container Registry ãžç»é²ããŠããããšã§åŒã³åºãããšãå¯èœã«ãªã£ãŠããŸãã â»Using Custom-Built Docker Images https://circleci.com/docs/ja/2.0/custom-images/ â»Using Private Images https://circleci.com/docs/ja/2.0/private-images/ build ã®èšå®ãš cache CI ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã® build ã«é¢ããŠã§ãã checkout ã§ github ããã³ãŒãã checkout ãããã®åŸã®å®çŸ©ã§ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ããã£ãã·ã¥ä¿åããã£ãã·ã¥ã®å±éãè¡ã£ãŠããŸãã steps : - checkout # Rails application setup - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle save_cache: key ã« Gemfile.lock ãæå®ããããšã§ãã£ãã·ã¥ããŒãšããŠæ±ããpaths ã«èšå®ãããã¹ããã£ãã·ã¥ããããã«ããŠããŸãã restore_cache: key ãšäžèŽãããã£ãã·ã¥ãããã°ãsave_cache æã«æå®ãããã¹ãå±éãçŽããŠããŸãã run: ãã¡ã㯠rails ã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ããŒã«ããŠããã ãã§ãã CircleCI1.0 ããããã£ãã·ã¥ç®¡çãæè»ã«è¡ããããšãããããŸãã circleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ rspec ã«ãããã¹ãã®å®è¡ã«é¢ããŠã§ãã circleci ã³ãã³ã ãå©çšããããšã§ãã¹ãã®äžŠåå®è¡ãå¹ççã«è¡ãããšãåºæ¥ããŸãã ä»å㯠--split-by=timings --timings-type=filename ã®ãªãã·ã§ã³ãæå®ãããã¡ã€ã«åããŒã¹ã§ã®åå²ã§ãã¹ããå®è¡ããŸãã - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ store_artifacts: 以åãããããæ©èœã§ããããã¹ãçµæã®ææç©ãä¿åãããã¹ã«ãªããŸãã store_test_results: ãã¡ãã¯ãã¹ãã®å®è¡çµæãä¿åããŠããããšã§ãã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããworkflows ãå©çšãããšãµããŒããããªãããã§ãã â»åèïŒ https://circleci.com/docs/ja/2.0/configuration-reference/#store_test_results ãã®ãããªåœ¢ã§ Artifacts ãä¿åãããŠããŸãã ãŸããartifacts ã«ã¯ coverage ãš capybara ã® screenshot ãªã©ãä¿åããŠããŸã - simple_cov if ENV['CI'] SimpleCov.coverage_dir File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'coverage') SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ] SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end end capybara Capybara.save_and_open_page_path = File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'capybara') if ENV['CI'] â»CircleCI2.0 ãã CI ã®ç°å¢å€æ°ãå€ãã£ãŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯ãžèšèŒãããŠããŸãã Introduction to environment variables - CircleCI Introduction to environment variables in CircleCI circleci.com Workflows ã®èšå® CircleCI2.0 ãã Workflows ã®å©çšãå¯èœã«ãªããŸããã Workflow orchestration - CircleCI Learn about using CircleCI workflows to orchestrate jobs circleci.com ã³ã³ããæ¯ã«åå²ããžã§ããå®è¡ããããšã§æŽãªã䞊åå®è¡ã®å¹çåãåã³ããžã§ãéã®äŸåé¢ä¿ãŸã§èšå®ã§ããããã§ãã ãžã§ãã¡ãã¬ãŒã§ã¯ã³ãŒãã®éçè§£æã«å°ãå®è¡æéãæãã£ãŠããããšãããå€å°ã®æ¹åãå³ãããšèã åçŽã«äœ¿ã£ãŠã¿ããã£ã ãã¡ãã®æ©èœãå©çšããŠã¿ãŸããã workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ build: åãžã§ãã§å®è¡åã«è¡ã£ãŠããåŠçãå®çŸ© code_analyze: rubocopãbrakemanãscss-lint ãªã©ã®éçè§£æåŠçãå®çŸ© rspec: ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®çŸ© deploy: ãããã€ã«é¢ããåŠçãå®çŸ© ãžã§ãã¡ãã¬ãŒã§ã¯ããã©ã³ã管çã« Git-flow ãæ¡çšããŠããŸããããããšã¯å¥ã« sandbox ãšãããã¹ãç°å¢ãçšæãéçšããŠããŸãã develop ãã©ã³ãã§ã³ãŒãè§£æããã¹ããã¯ãªã¢ããã³ãŒãã ããmaster ãžåæ ããmaster ã§ã¯ãã¹ããã§ãŒãºãªãã« deploy ããæ§æãåã£ãŠããŸãã æ¥µåãCI ã®ãªãœãŒã¹ãç¯çŽããããã«åãã©ã³ãããšã§å®è¡ããåŠçãåããŠããŸãã åãã©ã³ãã®éçšã¯ä»¥äžã®éãã§ãã feature: ã³ãŒãè§£æããã¹ãå®è¡ sandbox: ãããã€ã®ã¿å®è¡(äžæã¬ãã¥ãŒçšãã©ã³ã) develop: ã³ãŒãè§£æããã¹ãå®è¡ããããã€å®è¡ master: ãããã€ã®ã¿å®è¡ äžèšã®äŸã§ã¯ã code_analyze: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã rspec: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_qa: develop ãã©ã³ãã§ã®ã¿å®è¡ requires ã§äŸåé¢ä¿ãæå®ããcode_analyzeãrspec ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_only: sandboxãmasterãstaging ãã©ã³ãã®ã¿å©çšãããžã§ã requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã ã©ã®ãã㪠workflow ãåºæ¥ãããã®ãã以äžã«äŸã瀺ããŸãã feature ãã©ã³ãã®äŸ: develop ãã©ã³ãã®äŸ: masterãsandbox ãã©ã³ãã®äŸ: ä»åã®äŸã ãšãã©ã³ãæ¯ã« workflow ãå€ããŠãããããignoreãonly ã®æžãæ¹ã§æå³ããæ¯ãåããããªãããã«èæ
®ã¯å¿
èŠã§ãããæè»ã« workflow ãäœããããšãããããšæããŸãã(ããéãããšèªã¿è§£ãã®ã倧å€ã«ãªãããã§ãã) Workflows ã«é¢ããŠã¯ ãã¡ã ã«è²ã
ãªãã¿ãŒã³ã®çµã¿æ¹ãèšèŒãããŠããã®ã§ããã¡ããèªããšããçè§£ãæ·±ãŸããšæããŸãã ãžã§ãéã§ã®ããŒã¿å
±æ ãžã§ããåããŠãã«ããã=äœåãã¢ããªã±ãŒã·ã§ã³ã®åæåãå¿
èŠãªããããªããïŒ ãšåœç¶çåã«æãç¹ã§ã¯ãããŸãããããã«å¯Ÿãã解決çãçšæãããŠããŸãã build : steps : ===çç¥=== - persist_to_workspace : root : ~/job-medley paths : - ./* deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley persist_to_workspace: æå®ãããã¹ã«ããããŒã¿ãäžæçã«ä¿ç®¡ããŠãããŸã attach_workspace: ä¿ç®¡æžã¿ã®ããŒã¿ãå±éããŠãããŸã ãã®æ©èœã«ããããã«ãããã»ã¹ã§çæãããã®ãåãžã§ãã§å®è¡ããã³ã³ãããžæž¡ãããšãåºæ¥ãŸãã ãã ãããããããã«ãããã»ã¹ã§ãã£ãã·ã¥ãå
¥ããŠããããšããããããèªäœã®å¹æã¯æ®ã©ãããŸããã§ããã ã³ã³ãã€ã«æžã¿ã®ããŒã¿ãåãæž¡ãéã«ã¯å¹æãçºæ®ãããã§ããã( å
¬åŒã§ã ãã®ãããªå©çšãæ³å®ããŠãããã§ã) æ¹åçµæ èå¿ã®é床æ¹åçµæã§ããçµæã¯ä»¥äžã®éãã«ãªããŸããã æ¹åå: CircleCI1.0 rspec ã®å®è¡æé: 26:59 以äžã¯ãCircleCI2.0 ãžç§»è¡ããã ãã®çµæã§ãããã®ã±ãŒã¹ã§ã¯ workflows ãå©çšããŠããŸããã æ¹ååŸ: CircleCI2.0 rspec ã®å®è¡æé: 19:40 CircleCI1.0 ãã CircleCI2.0 ãžç§»è¡ããããšã«ããã çŽ 12 åçš ãã¹ãã®å®è¡æéãççž®ããããšãåºæ¥ãŸããã Workflows ãªã©ç¹ã«å©çšããŠããªãããã€ããã«ããã§ãŒãºã®å®è¡æéãé¢ä¿ããªããããCircleCI2.0 ãå©çšããã ãã§åçŽã«ãã¹ãå®è¡é床ã®åäžãèŠèŸŒããããšãããããšæããŸãã ç¶ã㊠Workflows ãå©çšããçµæã§ãã æ¹ååŸ: CircleCI2.0 with Workflows rspec ã®å®è¡æé: 21:14 çµæã¯ãWorkflows ãå©çšããªãã±ãŒã¹ãšãå©çšããã±ãŒã¹ã§ã¯ãWorkflows ãå©çšããã»ãã rspec ã®å®è¡æéã¯é·ããªã£ãŠããŸããŸããããbuild-code-analyze-rspec ã®å®è¡ã«æãã£ãããŒã¿ã«ã®æéã«å·®ã¯èŠãããŸããã§ããã ããã¯ããcircleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ãã®ã»ã¯ã·ã§ã³ãžãèšèŒããéããstore_test_results ããµããŒããšãããªãããšã«ãããã³ã³ããéã§ã®åæ£ãæé©åãããŠããªãçºã§ãã ã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããWorkflows ãå©çšãããšãµããŒããããªãããã§ãã å®è¡æéã«ã°ãã€ããåºãŠããŸããcode_analyze ã®ãžã§ãã忣ããããšã§èŠèŸŒãã§ããæ¹åæé(çŽ 3 å)ãšã°ãã€ãã«ããçºçãããã¹ãå®è¡æéã®ãã¹( (20:01 - 14:57) / 2 = 2:32 )ã倧äœåãã§ãããããããŒã¿ã«ã§ã®å®è¡æéã«å·®ãåºãªãçµæãšãªããŸããã ã°ãã€ããåºããªãæ¹æ³ãããžã§ãã®åãæ¹ã«ã€ããŠã¯ä»åŸã工倫ããŠã¿ãããšæããŸãã ãŸããããã³ããšã³ãã®ãã¹ããããå°ãåãããŠãããããšèããŠããã®ã§ãããã³ããšã³ãã®ãã¹ãããµãŒããµã€ãã®ãã¹ãã Workflows ãäžæã䜿ããªãã忣ããŠãããã°è¯ãã®ããªãšãæã£ãŠããŸãã ãããã« ç§»è¡ã«éããŠã CircleCI2.0 ã®ç§»è¡ã¬ã€ã ãèªã¿ãªããé²ããŠããŸããããåºæ¬çãªèšæ³ã®å€æŽãtimezoneãenvironment ã®å®çŸ©æ¹æ³ã®å€æŽãvariable ã®å€æŽãªã©ãå€ã
æããããã¥ã¡ã³ããçµæ§èªã¿èŸŒãŸãªããšã©ãã«äœãå®çŸ©ã§ããã®ãææ¡ã§ããŸããã§ããã ãŸããWorkflows ã®çµã¿ç«ãŠãªã© å
¬åŒã«è¯ããµã³ãã« ã¯æ²¢å±±ããã®ã§ãããäŸåé¢ä¿ã®å®çŸ©ãè²ã
詊ãã®ã«èŠåŽããæ°ãããŸãã â»çŽ çŽã«å°èŠæš¡ãªã¢ããªãçšæããŠã ããŒã«ã«ã§ circleci ãå®è¡ ããŠã¿ãæ¹ãå¹çè¯ãé²ãããããããããŸããã â»ãã ã å
¬åŒã®ããã¥ã¡ã³ã ã CommunityForum ããã£ããèªãã°äœãããšãªãæ
å ±ã¯åã£ãã®ã§éåžžã«å©ãããŸããã CircleCI2.0 ã§ã©ã®ãããªäºãåºæ¥ãã®ããããã¯ã©ã®ããã«è¡ããã®ãã ãã®èšäºããã®æŠèгãã€ããå©ãã«ãªãã°è¯ããªãšæã£ãŠããŸãã åèãªã³ã¯ CircleCI2.0 ãžç§»è¡ããã«ãããã以äžã®èšäºãåèã«ãããŠããã ããŸãããããããšãããããŸãã circleci/ruby:2.4.1-node-browsersã£ãŠäœå
¥ã£ãŠãã®ãç¥ãããã£ã - Qiita 2018-11-19è¿œèš https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ruby/images/ ãã€ã®éã«ãå
¬éãããŠãŸãã åæ© circleciãæäŸããŠããdockerãã¡... qiita.com CircleCI2.0ã®Workflowsã詊ã âCircleCI2.0ã®Workflowsã詊ãâ is published by timakin. medium.com ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ããä»è·æœèšã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã ã¡ã³ããŒã®ã¹ããŒãªãŒ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ã³ããŒã®ã¹ããŒãªãŒ å®¶æãå人ãç
æ°ã«ãªã£ãæã«æãã®æãå·®ãã®ã¹ãå»çã®åã... www.medley.jp ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® çš²æ¬ ã§ããå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ãã®éçºãæ
åœããŠãããšã³ãžãã¢ã§ãã æè¿ãžã§ãã¡ãã¬ãŒã§ã¯ CircleCI2.0 ãžã®ç§»è¡ãè¡ããŸãããç§»è¡ã®æ¹æ³ã¯ãã¡ããããã®éã«èª¿ã¹ãããšãCircleCI ã®æ°æ©èœãå©çšããŠã©ãã ã£ãããªã©ãæžããŠãããããšæããŸãã èª²é¡æ åŒç€Ÿã§ã¯ãå
šãããã¯ã( CLINICS ã MEDLEY ã ä»è·ã®ã»ãã ã ãžã§ãã¡ãã¬ãŒ )ã§ CircleCI ãå©çšããŠããŸãã ãžã§ãã¡ãã¬ãŒã§ã¯ CI ã«ãããã¹ãå®è¡ã« 37 åååŸæãã£ãŠããŸãã(ã³ã³ããã 2 ã€å©çšããå®è¡æéã§ã)ã ããã«ãéçºã¡ã³ããŒãå¢ããŠæ¥ãããšããããCI ã®ãªãœãŒã¹ãè¶³ããªããªãéçºå¹çãèœã¡ãããªãç¶æ³ã§ããã ãŸããããã話ã§ãããã ã³ã³ãããå¢ãããšããã®ã解決çã®äžã€ãšããŠã¯ããã®ã§ãããéåºŠã®æ¹åã«æåŸ
ãåºæ¥ããšè©å€ãè¯ãã£ãã®ã§ CirclecCI2.0 ãžç§»è¡ããŸããã CircleCI2.0 ãžã®ç§»è¡ã¡ãªãã åºæ¬çã«ã¯éåºŠã®æ¹åã«æåŸ
ãåºæ¥ãããšããã®ã倧ããªã¡ãªããã§ã¯ãããŸãããå
¬åŒã§ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãã æç²ã§ãã倧ããªç¹åŸŽãšããŠã¯ä»¥äžã®ç¹ã§ããããã First-class Docker Support: Docker ã®ãã€ãã£ããµããŒããš Docker ã¬ã€ã€ãŒãã£ãã·ã¥ã®å°å
¥ Workflows: ãã«ãããã¹ãããããã€ããžã§ããšããŠæè»ã«ç®¡çã§ããããã«ãªã£ã Advanced Caching: ãã£ãã·ã¥ã®ä¿åãšãªã¹ãã¢ãã€ã¡ãŒãžããœãŒã¹ã³ãŒããäŸåé¢ä¿ã«å¯ŸããŠè¡ãããšãã§ããããã«ãªã£ãã ãã®èŸºãã®æ©èœã掻çšã CI ã®é床æ¹åãžç¹ããŠã¿ãããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æ ç§»è¡ã®åæãšããŠããžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æã«ã€ããŠèšèŒããŸãã ããã³ããšã³ãã®ãã«ãã yarn+webpack ã§è¡ããçæããã¢ã»ããã public/assets ãžåãåºããmanifest ãã¡ã€ã«ã®ãã¹ã rails ã® helper çµç±ã§ååŸãèªã¿èŸŒãã§ããŸããïŒRails4.2.xïŒ ãã®ãããªæ§æã®ã¢ããªã±ãŒã·ã§ã³ã CirlceCI2.0 ã§ãã«ãããã¹ãããããã€åºæ¥ãããã«ããŠãããŸãã config.yml ã®å
šäœå ä»åãäœæãã config.yml ã¯ãã®ãããªåœ¢ã«ãªããŸããã ãã£ãã㯠build: bundle install, yarn install code_analyze: rubocop, brakeman, scss-lint rspec deploy: capistrano ãè¡ã£ãŠããããã©ã³ãã«ãã£ãŠã©ã®ãžã§ããå®è¡ããã®ãã workflows ãå©çšããŠäœ¿ãåããŠããŸãã 詳ãã解説ã¯ä»¥éãèšèŒããŠãããŸãã defaults : & defaults working_directory : ~/job-medley docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo version : 2 jobs : build : << : * defaults steps : - checkout - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle - restore_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} - run : name : Yarn install command : | echo "Node $(node -v)" echo "Yarn v$(yarn --version)" yarn config set cache-folder ./yarn_cache echo "Yarn v$(yarn cache dir)" yarn install - save_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} paths : - node_modules - yarn_cache - persist_to_workspace : root : ~/job-medley paths : - ./* code_analyze : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run rubocop command : bundle exec rubocop - run : name : run brakeman command : bundle exec brakeman -qz - run : name : run scss-lint command : bundle exec scss-lint rspec : parallelism : 2 << : * defaults steps : - attach_workspace : at : ~/job-medley - restore_cache : key : job-medley-elasticsearch # rspec ã§ es ã®ã³ãã³ããäžéšå®è¡ããŠãããããprimary container åŽãž install - run : name : Elasticsearch install command : | wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-x.x.x.tar.gz && \ tar -xvf elasticsearch-x.x.x.tar.gz && \ if [ -z "`elasticsearch-x.x.x/bin/plugin -l | grep analysis-kuromoji`" ]; then \ elasticsearch-x.x.x/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/x.x.x; fi - save_cache : key : job-medley-elasticsearch paths : - ./elasticsearch-x.x.x - run : name : database create command : bundle exec rake db:create environment : RAILS_ENV : test - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | sh scripts/init_deploy.sh BRANCH="${CIRCLE_BRANCH}" bundle exec cap develop deploy deploy:restart deploy_only : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | BRANCH="${CIRCLE_BRANCH}" bundle exec cap production deploy deploy:restart workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ DockerImage ã®éžå® å
ã
ãDocker ã䜿ããã« CI ãåããŠããŸããããCircleCI2.0 ãžç§»è¡ããã«èŸºã Docker ãžã®å©çšã«åãæ¿ããŸããã â» Specifying Container Images DockerImage 㯠DockerHub ãžç»é²ãããŠãã CircleCI å
¬åŒã®ã ã® ãå©çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ React ã䜿çšããŠãããããã³ãã®ãã«ã㯠yarn+webpack ãå©çšããŠããŸãããã®çºã以äžã® image ãéžæããŸããã circleci/ruby:2.4.2-node-browsers node ã®ã€ã³ã¹ããŒã«ãšãE2E ã®ãã¹ãã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããŸãã â»è©³çŽ°ã¯ ãã¡ãã®èšäº ãåèã«ãããŠããã ããŸããã ãã®ä»ãçŸåšå©çšããŠãã MySQL ã®ããŒãžã§ã³ãElasticCacheRedis ã®ããŒãžã§ã³ãšåããã image ãéžæããŸããã æ³šæç¹ãšããŠã¯ãè€æ°ã® DockerImage ãå©çšããå Žåãäžã€ç®ã«æå®ãã image ã primary ãšããŠæ±ãããŸãã 以äžã®äŸã§ããšãRuby ã® image ãæåã«æå®ããMySQLãRedis ã® image ãæå®ããŠããŸãããMySQL ã³ãã³ãèªäœã¯ Ruby ã® image ã«å«ãŸããŠããªããããRuby ã³ãã³ããå®è¡ã§ããŠã MySQL ã³ãã³ããå®è¡ããããšã¯åºæ¥ãŸããã â»è©³çŽ°ã¯ ãã¡ã ã«èšèŒãããŠããŸãã docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo ãŸããçšæãããŠãã image ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ãDocker ã§ã«ã¹ã¿ã image ãäœããpublic ã§è¯ããã° Docker Hub ãžç»é²ãprivate ãè¯ããã° Amazon EC2 Container Registry ãžç»é²ããŠããããšã§åŒã³åºãããšãå¯èœã«ãªã£ãŠããŸãã â»Using Custom-Built Docker Images https://circleci.com/docs/ja/2.0/custom-images/ â»Using Private Images https://circleci.com/docs/ja/2.0/private-images/ build ã®èšå®ãš cache CI ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã® build ã«é¢ããŠã§ãã checkout ã§ github ããã³ãŒãã checkout ãããã®åŸã®å®çŸ©ã§ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ããã£ãã·ã¥ä¿åããã£ãã·ã¥ã®å±éãè¡ã£ãŠããŸãã steps : - checkout # Rails application setup - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle save_cache: key ã« Gemfile.lock ãæå®ããããšã§ãã£ãã·ã¥ããŒãšããŠæ±ããpaths ã«èšå®ãããã¹ããã£ãã·ã¥ããããã«ããŠããŸãã restore_cache: key ãšäžèŽãããã£ãã·ã¥ãããã°ãsave_cache æã«æå®ãããã¹ãå±éãçŽããŠããŸãã run: ãã¡ã㯠rails ã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ããŒã«ããŠããã ãã§ãã CircleCI1.0 ããããã£ãã·ã¥ç®¡çãæè»ã«è¡ããããšãããããŸãã circleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ rspec ã«ãããã¹ãã®å®è¡ã«é¢ããŠã§ãã circleci ã³ãã³ã ãå©çšããããšã§ãã¹ãã®äžŠåå®è¡ãå¹ççã«è¡ãããšãåºæ¥ããŸãã ä»å㯠--split-by=timings --timings-type=filename ã®ãªãã·ã§ã³ãæå®ãããã¡ã€ã«åããŒã¹ã§ã®åå²ã§ãã¹ããå®è¡ããŸãã - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ store_artifacts: 以åãããããæ©èœã§ããããã¹ãçµæã®ææç©ãä¿åãããã¹ã«ãªããŸãã store_test_results: ãã¡ãã¯ãã¹ãã®å®è¡çµæãä¿åããŠããããšã§ãã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããworkflows ãå©çšãããšãµããŒããããªãããã§ãã â»åèïŒ https://circleci.com/docs/ja/2.0/configuration-reference/#store_test_results ãã®ãããªåœ¢ã§ Artifacts ãä¿åãããŠããŸãã ãŸããartifacts ã«ã¯ coverage ãš capybara ã® screenshot ãªã©ãä¿åããŠããŸã - simple_cov if ENV['CI'] SimpleCov.coverage_dir File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'coverage') SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ] SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end end capybara Capybara.save_and_open_page_path = File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'capybara') if ENV['CI'] â»CircleCI2.0 ãã CI ã®ç°å¢å€æ°ãå€ãã£ãŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯ãžèšèŒãããŠããŸãã Introduction to environment variables - CircleCI Introduction to environment variables in CircleCI circleci.com Workflows ã®èšå® CircleCI2.0 ãã Workflows ã®å©çšãå¯èœã«ãªããŸããã Workflow orchestration - CircleCI Learn about using CircleCI workflows to orchestrate jobs circleci.com ã³ã³ããæ¯ã«åå²ããžã§ããå®è¡ããããšã§æŽãªã䞊åå®è¡ã®å¹çåãåã³ããžã§ãéã®äŸåé¢ä¿ãŸã§èšå®ã§ããããã§ãã ãžã§ãã¡ãã¬ãŒã§ã¯ã³ãŒãã®éçè§£æã«å°ãå®è¡æéãæãã£ãŠããããšãããå€å°ã®æ¹åãå³ãããšèã åçŽã«äœ¿ã£ãŠã¿ããã£ã ãã¡ãã®æ©èœãå©çšããŠã¿ãŸããã workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ build: åãžã§ãã§å®è¡åã«è¡ã£ãŠããåŠçãå®çŸ© code_analyze: rubocopãbrakemanãscss-lint ãªã©ã®éçè§£æåŠçãå®çŸ© rspec: ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®çŸ© deploy: ãããã€ã«é¢ããåŠçãå®çŸ© ãžã§ãã¡ãã¬ãŒã§ã¯ããã©ã³ã管çã« Git-flow ãæ¡çšããŠããŸããããããšã¯å¥ã« sandbox ãšãããã¹ãç°å¢ãçšæãéçšããŠããŸãã develop ãã©ã³ãã§ã³ãŒãè§£æããã¹ããã¯ãªã¢ããã³ãŒãã ããmaster ãžåæ ããmaster ã§ã¯ãã¹ããã§ãŒãºãªãã« deploy ããæ§æãåã£ãŠããŸãã æ¥µåãCI ã®ãªãœãŒã¹ãç¯çŽããããã«åãã©ã³ãããšã§å®è¡ããåŠçãåããŠããŸãã åãã©ã³ãã®éçšã¯ä»¥äžã®éãã§ãã feature: ã³ãŒãè§£æããã¹ãå®è¡ sandbox: ãããã€ã®ã¿å®è¡(äžæã¬ãã¥ãŒçšãã©ã³ã) develop: ã³ãŒãè§£æããã¹ãå®è¡ããããã€å®è¡ master: ãããã€ã®ã¿å®è¡ äžèšã®äŸã§ã¯ã code_analyze: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã rspec: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_qa: develop ãã©ã³ãã§ã®ã¿å®è¡ requires ã§äŸåé¢ä¿ãæå®ããcode_analyzeãrspec ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_only: sandboxãmasterãstaging ãã©ã³ãã®ã¿å©çšãããžã§ã requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã ã©ã®ãã㪠workflow ãåºæ¥ãããã®ãã以äžã«äŸã瀺ããŸãã feature ãã©ã³ãã®äŸ: develop ãã©ã³ãã®äŸ: masterãsandbox ãã©ã³ãã®äŸ: ä»åã®äŸã ãšãã©ã³ãæ¯ã« workflow ãå€ããŠãããããignoreãonly ã®æžãæ¹ã§æå³ããæ¯ãåããããªãããã«èæ
®ã¯å¿
èŠã§ãããæè»ã« workflow ãäœããããšãããããšæããŸãã(ããéãããšèªã¿è§£ãã®ã倧å€ã«ãªãããã§ãã) Workflows ã«é¢ããŠã¯ ãã¡ã ã«è²ã
ãªãã¿ãŒã³ã®çµã¿æ¹ãèšèŒãããŠããã®ã§ããã¡ããèªããšããçè§£ãæ·±ãŸããšæããŸãã ãžã§ãéã§ã®ããŒã¿å
±æ ãžã§ããåããŠãã«ããã=äœåãã¢ããªã±ãŒã·ã§ã³ã®åæåãå¿
èŠãªããããªããïŒ ãšåœç¶çåã«æãç¹ã§ã¯ãããŸãããããã«å¯Ÿãã解決çãçšæãããŠããŸãã build : steps : ===çç¥=== - persist_to_workspace : root : ~/job-medley paths : - ./* deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley persist_to_workspace: æå®ãããã¹ã«ããããŒã¿ãäžæçã«ä¿ç®¡ããŠãããŸã attach_workspace: ä¿ç®¡æžã¿ã®ããŒã¿ãå±éããŠãããŸã ãã®æ©èœã«ããããã«ãããã»ã¹ã§çæãããã®ãåãžã§ãã§å®è¡ããã³ã³ãããžæž¡ãããšãåºæ¥ãŸãã ãã ãããããããã«ãããã»ã¹ã§ãã£ãã·ã¥ãå
¥ããŠããããšããããããèªäœã®å¹æã¯æ®ã©ãããŸããã§ããã ã³ã³ãã€ã«æžã¿ã®ããŒã¿ãåãæž¡ãéã«ã¯å¹æãçºæ®ãããã§ããã( å
¬åŒã§ã ãã®ãããªå©çšãæ³å®ããŠãããã§ã) æ¹åçµæ èå¿ã®é床æ¹åçµæã§ããçµæã¯ä»¥äžã®éãã«ãªããŸããã æ¹åå: CircleCI1.0 rspec ã®å®è¡æé: 26:59 以äžã¯ãCircleCI2.0 ãžç§»è¡ããã ãã®çµæã§ãããã®ã±ãŒã¹ã§ã¯ workflows ãå©çšããŠããŸããã æ¹ååŸ: CircleCI2.0 rspec ã®å®è¡æé: 19:40 CircleCI1.0 ãã CircleCI2.0 ãžç§»è¡ããããšã«ããã çŽ 12 åçš ãã¹ãã®å®è¡æéãççž®ããããšãåºæ¥ãŸããã Workflows ãªã©ç¹ã«å©çšããŠããªãããã€ããã«ããã§ãŒãºã®å®è¡æéãé¢ä¿ããªããããCircleCI2.0 ãå©çšããã ãã§åçŽã«ãã¹ãå®è¡é床ã®åäžãèŠèŸŒããããšãããããšæããŸãã ç¶ã㊠Workflows ãå©çšããçµæã§ãã æ¹ååŸ: CircleCI2.0 with Workflows rspec ã®å®è¡æé: 21:14 çµæã¯ãWorkflows ãå©çšããªãã±ãŒã¹ãšãå©çšããã±ãŒã¹ã§ã¯ãWorkflows ãå©çšããã»ãã rspec ã®å®è¡æéã¯é·ããªã£ãŠããŸããŸããããbuild-code-analyze-rspec ã®å®è¡ã«æãã£ãããŒã¿ã«ã®æéã«å·®ã¯èŠãããŸããã§ããã ããã¯ããcircleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ãã®ã»ã¯ã·ã§ã³ãžãèšèŒããéããstore_test_results ããµããŒããšãããªãããšã«ãããã³ã³ããéã§ã®åæ£ãæé©åãããŠããªãçºã§ãã ã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããWorkflows ãå©çšãããšãµããŒããããªãããã§ãã å®è¡æéã«ã°ãã€ããåºãŠããŸããcode_analyze ã®ãžã§ãã忣ããããšã§èŠèŸŒãã§ããæ¹åæé(çŽ 3 å)ãšã°ãã€ãã«ããçºçãããã¹ãå®è¡æéã®ãã¹( (20:01 - 14:57) / 2 = 2:32 )ã倧äœåãã§ãããããããŒã¿ã«ã§ã®å®è¡æéã«å·®ãåºãªãçµæãšãªããŸããã ã°ãã€ããåºããªãæ¹æ³ãããžã§ãã®åãæ¹ã«ã€ããŠã¯ä»åŸã工倫ããŠã¿ãããšæããŸãã ãŸããããã³ããšã³ãã®ãã¹ããããå°ãåãããŠãããããšèããŠããã®ã§ãããã³ããšã³ãã®ãã¹ãããµãŒããµã€ãã®ãã¹ãã Workflows ãäžæã䜿ããªãã忣ããŠãããã°è¯ãã®ããªãšãæã£ãŠããŸãã ãããã« ç§»è¡ã«éããŠã CircleCI2.0 ã®ç§»è¡ã¬ã€ã ãèªã¿ãªããé²ããŠããŸããããåºæ¬çãªèšæ³ã®å€æŽãtimezoneãenvironment ã®å®çŸ©æ¹æ³ã®å€æŽãvariable ã®å€æŽãªã©ãå€ã
æããããã¥ã¡ã³ããçµæ§èªã¿èŸŒãŸãªããšã©ãã«äœãå®çŸ©ã§ããã®ãææ¡ã§ããŸããã§ããã ãŸããWorkflows ã®çµã¿ç«ãŠãªã© å
¬åŒã«è¯ããµã³ãã« ã¯æ²¢å±±ããã®ã§ãããäŸåé¢ä¿ã®å®çŸ©ãè²ã
詊ãã®ã«èŠåŽããæ°ãããŸãã â»çŽ çŽã«å°èŠæš¡ãªã¢ããªãçšæããŠã ããŒã«ã«ã§ circleci ãå®è¡ ããŠã¿ãæ¹ãå¹çè¯ãé²ãããããããããŸããã â»ãã ã å
¬åŒã®ããã¥ã¡ã³ã ã CommunityForum ããã£ããèªãã°äœãããšãªãæ
å ±ã¯åã£ãã®ã§éåžžã«å©ãããŸããã CircleCI2.0 ã§ã©ã®ãããªäºãåºæ¥ãã®ããããã¯ã©ã®ããã«è¡ããã®ãã ãã®èšäºããã®æŠèгãã€ããå©ãã«ãªãã°è¯ããªãšæã£ãŠããŸãã åèãªã³ã¯ CircleCI2.0 ãžç§»è¡ããã«ãããã以äžã®èšäºãåèã«ãããŠããã ããŸãããããããšãããããŸãã circleci/ruby:2.4.1-node-browsersã£ãŠäœå
¥ã£ãŠãã®ãç¥ãããã£ã - Qiita 2018-11-19è¿œèš https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ruby/images/ ãã€ã®éã«ãå
¬éãããŠãŸãã åæ© circleciãæäŸããŠããdockerãã¡... qiita.com CircleCI2.0ã®Workflowsã詊ã âCircleCI2.0ã®Workflowsã詊ãâ is published by timakin. medium.com ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ããä»è·æœèšã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã ã¡ã³ããŒã®ã¹ããŒãªãŒ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ã³ããŒã®ã¹ããŒãªãŒ å®¶æãå人ãç
æ°ã«ãªã£ãæã«æãã®æãå·®ãã®ã¹ãå»çã®åã... www.medley.jp ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® çš²æ¬ ã§ããå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ãã®éçºãæ
åœããŠãããšã³ãžãã¢ã§ãã æè¿ãžã§ãã¡ãã¬ãŒã§ã¯ CircleCI2.0 ãžã®ç§»è¡ãè¡ããŸãããç§»è¡ã®æ¹æ³ã¯ãã¡ããããã®éã«èª¿ã¹ãããšãCircleCI ã®æ°æ©èœãå©çšããŠã©ãã ã£ãããªã©ãæžããŠãããããšæããŸãã èª²é¡æ åŒç€Ÿã§ã¯ãå
šãããã¯ã( CLINICS ã MEDLEY ã ä»è·ã®ã»ãã ã ãžã§ãã¡ãã¬ãŒ )ã§ CircleCI ãå©çšããŠããŸãã ãžã§ãã¡ãã¬ãŒã§ã¯ CI ã«ãããã¹ãå®è¡ã« 37 åååŸæãã£ãŠããŸãã(ã³ã³ããã 2 ã€å©çšããå®è¡æéã§ã)ã ããã«ãéçºã¡ã³ããŒãå¢ããŠæ¥ãããšããããCI ã®ãªãœãŒã¹ãè¶³ããªããªãéçºå¹çãèœã¡ãããªãç¶æ³ã§ããã ãŸããããã話ã§ãããã ã³ã³ãããå¢ãããšããã®ã解決çã®äžã€ãšããŠã¯ããã®ã§ãããéåºŠã®æ¹åã«æåŸ
ãåºæ¥ããšè©å€ãè¯ãã£ãã®ã§ CirclecCI2.0 ãžç§»è¡ããŸããã CircleCI2.0 ãžã®ç§»è¡ã¡ãªãã åºæ¬çã«ã¯éåºŠã®æ¹åã«æåŸ
ãåºæ¥ãããšããã®ã倧ããªã¡ãªããã§ã¯ãããŸãããå
¬åŒã§ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãã æç²ã§ãã倧ããªç¹åŸŽãšããŠã¯ä»¥äžã®ç¹ã§ããããã First-class Docker Support: Docker ã®ãã€ãã£ããµããŒããš Docker ã¬ã€ã€ãŒãã£ãã·ã¥ã®å°å
¥ Workflows: ãã«ãããã¹ãããããã€ããžã§ããšããŠæè»ã«ç®¡çã§ããããã«ãªã£ã Advanced Caching: ãã£ãã·ã¥ã®ä¿åãšãªã¹ãã¢ãã€ã¡ãŒãžããœãŒã¹ã³ãŒããäŸåé¢ä¿ã«å¯ŸããŠè¡ãããšãã§ããããã«ãªã£ãã ãã®èŸºãã®æ©èœã掻çšã CI ã®é床æ¹åãžç¹ããŠã¿ãããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æ ç§»è¡ã®åæãšããŠããžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æã«ã€ããŠèšèŒããŸãã ããã³ããšã³ãã®ãã«ãã yarn+webpack ã§è¡ããçæããã¢ã»ããã public/assets ãžåãåºããmanifest ãã¡ã€ã«ã®ãã¹ã rails ã® helper çµç±ã§ååŸãèªã¿èŸŒãã§ããŸããïŒRails4.2.xïŒ ãã®ãããªæ§æã®ã¢ããªã±ãŒã·ã§ã³ã CirlceCI2.0 ã§ãã«ãããã¹ãããããã€åºæ¥ãããã«ããŠãããŸãã config.yml ã®å
šäœå ä»åãäœæãã config.yml ã¯ãã®ãããªåœ¢ã«ãªããŸããã ãã£ãã㯠build: bundle install, yarn install code_analyze: rubocop, brakeman, scss-lint rspec deploy: capistrano ãè¡ã£ãŠããããã©ã³ãã«ãã£ãŠã©ã®ãžã§ããå®è¡ããã®ãã workflows ãå©çšããŠäœ¿ãåããŠããŸãã 詳ãã解説ã¯ä»¥éãèšèŒããŠãããŸãã defaults : & defaults working_directory : ~/job-medley docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo version : 2 jobs : build : << : * defaults steps : - checkout - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle - restore_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} - run : name : Yarn install command : | echo "Node $(node -v)" echo "Yarn v$(yarn --version)" yarn config set cache-folder ./yarn_cache echo "Yarn v$(yarn cache dir)" yarn install - save_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} paths : - node_modules - yarn_cache - persist_to_workspace : root : ~/job-medley paths : - ./* code_analyze : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run rubocop command : bundle exec rubocop - run : name : run brakeman command : bundle exec brakeman -qz - run : name : run scss-lint command : bundle exec scss-lint rspec : parallelism : 2 << : * defaults steps : - attach_workspace : at : ~/job-medley - restore_cache : key : job-medley-elasticsearch # rspec ã§ es ã®ã³ãã³ããäžéšå®è¡ããŠãããããprimary container åŽãž install - run : name : Elasticsearch install command : | wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-x.x.x.tar.gz && \ tar -xvf elasticsearch-x.x.x.tar.gz && \ if [ -z "`elasticsearch-x.x.x/bin/plugin -l | grep analysis-kuromoji`" ]; then \ elasticsearch-x.x.x/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/x.x.x; fi - save_cache : key : job-medley-elasticsearch paths : - ./elasticsearch-x.x.x - run : name : database create command : bundle exec rake db:create environment : RAILS_ENV : test - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | sh scripts/init_deploy.sh BRANCH="${CIRCLE_BRANCH}" bundle exec cap develop deploy deploy:restart deploy_only : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | BRANCH="${CIRCLE_BRANCH}" bundle exec cap production deploy deploy:restart workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ DockerImage ã®éžå® å
ã
ãDocker ã䜿ããã« CI ãåããŠããŸããããCircleCI2.0 ãžç§»è¡ããã«èŸºã Docker ãžã®å©çšã«åãæ¿ããŸããã â» Specifying Container Images DockerImage 㯠DockerHub ãžç»é²ãããŠãã CircleCI å
¬åŒã®ã ã® ãå©çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ React ã䜿çšããŠãããããã³ãã®ãã«ã㯠yarn+webpack ãå©çšããŠããŸãããã®çºã以äžã® image ãéžæããŸããã circleci/ruby:2.4.2-node-browsers node ã®ã€ã³ã¹ããŒã«ãšãE2E ã®ãã¹ãã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããŸãã â»è©³çŽ°ã¯ ãã¡ãã®èšäº ãåèã«ãããŠããã ããŸããã ãã®ä»ãçŸåšå©çšããŠãã MySQL ã®ããŒãžã§ã³ãElasticCacheRedis ã®ããŒãžã§ã³ãšåããã image ãéžæããŸããã æ³šæç¹ãšããŠã¯ãè€æ°ã® DockerImage ãå©çšããå Žåãäžã€ç®ã«æå®ãã image ã primary ãšããŠæ±ãããŸãã 以äžã®äŸã§ããšãRuby ã® image ãæåã«æå®ããMySQLãRedis ã® image ãæå®ããŠããŸãããMySQL ã³ãã³ãèªäœã¯ Ruby ã® image ã«å«ãŸããŠããªããããRuby ã³ãã³ããå®è¡ã§ããŠã MySQL ã³ãã³ããå®è¡ããããšã¯åºæ¥ãŸããã â»è©³çŽ°ã¯ ãã¡ã ã«èšèŒãããŠããŸãã docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo ãŸããçšæãããŠãã image ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ãDocker ã§ã«ã¹ã¿ã image ãäœããpublic ã§è¯ããã° Docker Hub ãžç»é²ãprivate ãè¯ããã° Amazon EC2 Container Registry ãžç»é²ããŠããããšã§åŒã³åºãããšãå¯èœã«ãªã£ãŠããŸãã â»Using Custom-Built Docker Images https://circleci.com/docs/ja/2.0/custom-images/ â»Using Private Images https://circleci.com/docs/ja/2.0/private-images/ build ã®èšå®ãš cache CI ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã® build ã«é¢ããŠã§ãã checkout ã§ github ããã³ãŒãã checkout ãããã®åŸã®å®çŸ©ã§ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ããã£ãã·ã¥ä¿åããã£ãã·ã¥ã®å±éãè¡ã£ãŠããŸãã steps : - checkout # Rails application setup - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle save_cache: key ã« Gemfile.lock ãæå®ããããšã§ãã£ãã·ã¥ããŒãšããŠæ±ããpaths ã«èšå®ãããã¹ããã£ãã·ã¥ããããã«ããŠããŸãã restore_cache: key ãšäžèŽãããã£ãã·ã¥ãããã°ãsave_cache æã«æå®ãããã¹ãå±éãçŽããŠããŸãã run: ãã¡ã㯠rails ã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ããŒã«ããŠããã ãã§ãã CircleCI1.0 ããããã£ãã·ã¥ç®¡çãæè»ã«è¡ããããšãããããŸãã circleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ rspec ã«ãããã¹ãã®å®è¡ã«é¢ããŠã§ãã circleci ã³ãã³ã ãå©çšããããšã§ãã¹ãã®äžŠåå®è¡ãå¹ççã«è¡ãããšãåºæ¥ããŸãã ä»å㯠--split-by=timings --timings-type=filename ã®ãªãã·ã§ã³ãæå®ãããã¡ã€ã«åããŒã¹ã§ã®åå²ã§ãã¹ããå®è¡ããŸãã - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ store_artifacts: 以åãããããæ©èœã§ããããã¹ãçµæã®ææç©ãä¿åãããã¹ã«ãªããŸãã store_test_results: ãã¡ãã¯ãã¹ãã®å®è¡çµæãä¿åããŠããããšã§ãã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããworkflows ãå©çšãããšãµããŒããããªãããã§ãã â»åèïŒ https://circleci.com/docs/ja/2.0/configuration-reference/#store_test_results ãã®ãããªåœ¢ã§ Artifacts ãä¿åãããŠããŸãã ãŸããartifacts ã«ã¯ coverage ãš capybara ã® screenshot ãªã©ãä¿åããŠããŸã - simple_cov if ENV['CI'] SimpleCov.coverage_dir File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'coverage') SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ] SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end end capybara Capybara.save_and_open_page_path = File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'capybara') if ENV['CI'] â»CircleCI2.0 ãã CI ã®ç°å¢å€æ°ãå€ãã£ãŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯ãžèšèŒãããŠããŸãã Introduction to environment variables - CircleCI Introduction to environment variables in CircleCI circleci.com Workflows ã®èšå® CircleCI2.0 ãã Workflows ã®å©çšãå¯èœã«ãªããŸããã Workflow orchestration - CircleCI Learn about using CircleCI workflows to orchestrate jobs circleci.com ã³ã³ããæ¯ã«åå²ããžã§ããå®è¡ããããšã§æŽãªã䞊åå®è¡ã®å¹çåãåã³ããžã§ãéã®äŸåé¢ä¿ãŸã§èšå®ã§ããããã§ãã ãžã§ãã¡ãã¬ãŒã§ã¯ã³ãŒãã®éçè§£æã«å°ãå®è¡æéãæãã£ãŠããããšãããå€å°ã®æ¹åãå³ãããšèã åçŽã«äœ¿ã£ãŠã¿ããã£ã ãã¡ãã®æ©èœãå©çšããŠã¿ãŸããã workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ build: åãžã§ãã§å®è¡åã«è¡ã£ãŠããåŠçãå®çŸ© code_analyze: rubocopãbrakemanãscss-lint ãªã©ã®éçè§£æåŠçãå®çŸ© rspec: ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®çŸ© deploy: ãããã€ã«é¢ããåŠçãå®çŸ© ãžã§ãã¡ãã¬ãŒã§ã¯ããã©ã³ã管çã« Git-flow ãæ¡çšããŠããŸããããããšã¯å¥ã« sandbox ãšãããã¹ãç°å¢ãçšæãéçšããŠããŸãã develop ãã©ã³ãã§ã³ãŒãè§£æããã¹ããã¯ãªã¢ããã³ãŒãã ããmaster ãžåæ ããmaster ã§ã¯ãã¹ããã§ãŒãºãªãã« deploy ããæ§æãåã£ãŠããŸãã æ¥µåãCI ã®ãªãœãŒã¹ãç¯çŽããããã«åãã©ã³ãããšã§å®è¡ããåŠçãåããŠããŸãã åãã©ã³ãã®éçšã¯ä»¥äžã®éãã§ãã feature: ã³ãŒãè§£æããã¹ãå®è¡ sandbox: ãããã€ã®ã¿å®è¡(äžæã¬ãã¥ãŒçšãã©ã³ã) develop: ã³ãŒãè§£æããã¹ãå®è¡ããããã€å®è¡ master: ãããã€ã®ã¿å®è¡ äžèšã®äŸã§ã¯ã code_analyze: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã rspec: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_qa: develop ãã©ã³ãã§ã®ã¿å®è¡ requires ã§äŸåé¢ä¿ãæå®ããcode_analyzeãrspec ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_only: sandboxãmasterãstaging ãã©ã³ãã®ã¿å©çšãããžã§ã requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã ã©ã®ãã㪠workflow ãåºæ¥ãããã®ãã以äžã«äŸã瀺ããŸãã feature ãã©ã³ãã®äŸ: develop ãã©ã³ãã®äŸ: masterãsandbox ãã©ã³ãã®äŸ: ä»åã®äŸã ãšãã©ã³ãæ¯ã« workflow ãå€ããŠãããããignoreãonly ã®æžãæ¹ã§æå³ããæ¯ãåããããªãããã«èæ
®ã¯å¿
èŠã§ãããæè»ã« workflow ãäœããããšãããããšæããŸãã(ããéãããšèªã¿è§£ãã®ã倧å€ã«ãªãããã§ãã) Workflows ã«é¢ããŠã¯ ãã¡ã ã«è²ã
ãªãã¿ãŒã³ã®çµã¿æ¹ãèšèŒãããŠããã®ã§ããã¡ããèªããšããçè§£ãæ·±ãŸããšæããŸãã ãžã§ãéã§ã®ããŒã¿å
±æ ãžã§ããåããŠãã«ããã=äœåãã¢ããªã±ãŒã·ã§ã³ã®åæåãå¿
èŠãªããããªããïŒ ãšåœç¶çåã«æãç¹ã§ã¯ãããŸãããããã«å¯Ÿãã解決çãçšæãããŠããŸãã build : steps : ===çç¥=== - persist_to_workspace : root : ~/job-medley paths : - ./* deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley persist_to_workspace: æå®ãããã¹ã«ããããŒã¿ãäžæçã«ä¿ç®¡ããŠãããŸã attach_workspace: ä¿ç®¡æžã¿ã®ããŒã¿ãå±éããŠãããŸã ãã®æ©èœã«ããããã«ãããã»ã¹ã§çæãããã®ãåãžã§ãã§å®è¡ããã³ã³ãããžæž¡ãããšãåºæ¥ãŸãã ãã ãããããããã«ãããã»ã¹ã§ãã£ãã·ã¥ãå
¥ããŠããããšããããããèªäœã®å¹æã¯æ®ã©ãããŸããã§ããã ã³ã³ãã€ã«æžã¿ã®ããŒã¿ãåãæž¡ãéã«ã¯å¹æãçºæ®ãããã§ããã( å
¬åŒã§ã ãã®ãããªå©çšãæ³å®ããŠãããã§ã) æ¹åçµæ èå¿ã®é床æ¹åçµæã§ããçµæã¯ä»¥äžã®éãã«ãªããŸããã æ¹åå: CircleCI1.0 rspec ã®å®è¡æé: 26:59 以äžã¯ãCircleCI2.0 ãžç§»è¡ããã ãã®çµæã§ãããã®ã±ãŒã¹ã§ã¯ workflows ãå©çšããŠããŸããã æ¹ååŸ: CircleCI2.0 rspec ã®å®è¡æé: 19:40 CircleCI1.0 ãã CircleCI2.0 ãžç§»è¡ããããšã«ããã çŽ 12 åçš ãã¹ãã®å®è¡æéãççž®ããããšãåºæ¥ãŸããã Workflows ãªã©ç¹ã«å©çšããŠããªãããã€ããã«ããã§ãŒãºã®å®è¡æéãé¢ä¿ããªããããCircleCI2.0 ãå©çšããã ãã§åçŽã«ãã¹ãå®è¡é床ã®åäžãèŠèŸŒããããšãããããšæããŸãã ç¶ã㊠Workflows ãå©çšããçµæã§ãã æ¹ååŸ: CircleCI2.0 with Workflows rspec ã®å®è¡æé: 21:14 çµæã¯ãWorkflows ãå©çšããªãã±ãŒã¹ãšãå©çšããã±ãŒã¹ã§ã¯ãWorkflows ãå©çšããã»ãã rspec ã®å®è¡æéã¯é·ããªã£ãŠããŸããŸããããbuild-code-analyze-rspec ã®å®è¡ã«æãã£ãããŒã¿ã«ã®æéã«å·®ã¯èŠãããŸããã§ããã ããã¯ããcircleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ãã®ã»ã¯ã·ã§ã³ãžãèšèŒããéããstore_test_results ããµããŒããšãããªãããšã«ãããã³ã³ããéã§ã®åæ£ãæé©åãããŠããªãçºã§ãã ã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããWorkflows ãå©çšãããšãµããŒããããªãããã§ãã å®è¡æéã«ã°ãã€ããåºãŠããŸããcode_analyze ã®ãžã§ãã忣ããããšã§èŠèŸŒãã§ããæ¹åæé(çŽ 3 å)ãšã°ãã€ãã«ããçºçãããã¹ãå®è¡æéã®ãã¹( (20:01 - 14:57) / 2 = 2:32 )ã倧äœåãã§ãããããããŒã¿ã«ã§ã®å®è¡æéã«å·®ãåºãªãçµæãšãªããŸããã ã°ãã€ããåºããªãæ¹æ³ãããžã§ãã®åãæ¹ã«ã€ããŠã¯ä»åŸã工倫ããŠã¿ãããšæããŸãã ãŸããããã³ããšã³ãã®ãã¹ããããå°ãåãããŠãããããšèããŠããã®ã§ãããã³ããšã³ãã®ãã¹ãããµãŒããµã€ãã®ãã¹ãã Workflows ãäžæã䜿ããªãã忣ããŠãããã°è¯ãã®ããªãšãæã£ãŠããŸãã ãããã« ç§»è¡ã«éããŠã CircleCI2.0 ã®ç§»è¡ã¬ã€ã ãèªã¿ãªããé²ããŠããŸããããåºæ¬çãªèšæ³ã®å€æŽãtimezoneãenvironment ã®å®çŸ©æ¹æ³ã®å€æŽãvariable ã®å€æŽãªã©ãå€ã
æããããã¥ã¡ã³ããçµæ§èªã¿èŸŒãŸãªããšã©ãã«äœãå®çŸ©ã§ããã®ãææ¡ã§ããŸããã§ããã ãŸããWorkflows ã®çµã¿ç«ãŠãªã© å
¬åŒã«è¯ããµã³ãã« ã¯æ²¢å±±ããã®ã§ãããäŸåé¢ä¿ã®å®çŸ©ãè²ã
詊ãã®ã«èŠåŽããæ°ãããŸãã â»çŽ çŽã«å°èŠæš¡ãªã¢ããªãçšæããŠã ããŒã«ã«ã§ circleci ãå®è¡ ããŠã¿ãæ¹ãå¹çè¯ãé²ãããããããããŸããã â»ãã ã å
¬åŒã®ããã¥ã¡ã³ã ã CommunityForum ããã£ããèªãã°äœãããšãªãæ
å ±ã¯åã£ãã®ã§éåžžã«å©ãããŸããã CircleCI2.0 ã§ã©ã®ãããªäºãåºæ¥ãã®ããããã¯ã©ã®ããã«è¡ããã®ãã ãã®èšäºããã®æŠèгãã€ããå©ãã«ãªãã°è¯ããªãšæã£ãŠããŸãã åèãªã³ã¯ CircleCI2.0 ãžç§»è¡ããã«ãããã以äžã®èšäºãåèã«ãããŠããã ããŸãããããããšãããããŸãã circleci/ruby:2.4.1-node-browsersã£ãŠäœå
¥ã£ãŠãã®ãç¥ãããã£ã - Qiita 2018-11-19è¿œèš https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ruby/images/ ãã€ã®éã«ãå
¬éãããŠãŸãã åæ© circleciãæäŸããŠããdockerãã¡... qiita.com CircleCI2.0ã®Workflowsã詊ã âCircleCI2.0ã®Workflowsã詊ãâ is published by timakin. medium.com ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ããä»è·æœèšã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã ã¡ã³ããŒã®ã¹ããŒãªãŒ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ã³ããŒã®ã¹ããŒãªãŒ å®¶æãå人ãç
æ°ã«ãªã£ãæã«æãã®æãå·®ãã®ã¹ãå»çã®åã... www.medley.jp ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãã
ããã«ã¡ã¯ãéçºæ¬éšã® çš²æ¬ ã§ããå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ãã®éçºãæ
åœããŠãããšã³ãžãã¢ã§ãã æè¿ãžã§ãã¡ãã¬ãŒã§ã¯ CircleCI2.0 ãžã®ç§»è¡ãè¡ããŸãããç§»è¡ã®æ¹æ³ã¯ãã¡ããããã®éã«èª¿ã¹ãããšãCircleCI ã®æ°æ©èœãå©çšããŠã©ãã ã£ãããªã©ãæžããŠãããããšæããŸãã èª²é¡æ åŒç€Ÿã§ã¯ãå
šãããã¯ã( CLINICS ã MEDLEY ã ä»è·ã®ã»ãã ã ãžã§ãã¡ãã¬ãŒ )ã§ CircleCI ãå©çšããŠããŸãã ãžã§ãã¡ãã¬ãŒã§ã¯ CI ã«ãããã¹ãå®è¡ã« 37 åååŸæãã£ãŠããŸãã(ã³ã³ããã 2 ã€å©çšããå®è¡æéã§ã)ã ããã«ãéçºã¡ã³ããŒãå¢ããŠæ¥ãããšããããCI ã®ãªãœãŒã¹ãè¶³ããªããªãéçºå¹çãèœã¡ãããªãç¶æ³ã§ããã ãŸããããã話ã§ãããã ã³ã³ãããå¢ãããšããã®ã解決çã®äžã€ãšããŠã¯ããã®ã§ãããéåºŠã®æ¹åã«æåŸ
ãåºæ¥ããšè©å€ãè¯ãã£ãã®ã§ CirclecCI2.0 ãžç§»è¡ããŸããã CircleCI2.0 ãžã®ç§»è¡ã¡ãªãã åºæ¬çã«ã¯éåºŠã®æ¹åã«æåŸ
ãåºæ¥ãããšããã®ã倧ããªã¡ãªããã§ã¯ãããŸãããå
¬åŒã§ã¯ä»¥äžã®ããã«èšèŒãããŠããŸãã æç²ã§ãã倧ããªç¹åŸŽãšããŠã¯ä»¥äžã®ç¹ã§ããããã First-class Docker Support: Docker ã®ãã€ãã£ããµããŒããš Docker ã¬ã€ã€ãŒãã£ãã·ã¥ã®å°å
¥ Workflows: ãã«ãããã¹ãããããã€ããžã§ããšããŠæè»ã«ç®¡çã§ããããã«ãªã£ã Advanced Caching: ãã£ãã·ã¥ã®ä¿åãšãªã¹ãã¢ãã€ã¡ãŒãžããœãŒã¹ã³ãŒããäŸåé¢ä¿ã«å¯ŸããŠè¡ãããšãã§ããããã«ãªã£ãã ãã®èŸºãã®æ©èœã掻çšã CI ã®é床æ¹åãžç¹ããŠã¿ãããšæããŸãã ãžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æ ç§»è¡ã®åæãšããŠããžã§ãã¡ãã¬ãŒã®ã¢ããªã±ãŒã·ã§ã³æ§æã«ã€ããŠèšèŒããŸãã ããã³ããšã³ãã®ãã«ãã yarn+webpack ã§è¡ããçæããã¢ã»ããã public/assets ãžåãåºããmanifest ãã¡ã€ã«ã®ãã¹ã rails ã® helper çµç±ã§ååŸãèªã¿èŸŒãã§ããŸããïŒRails4.2.xïŒ ãã®ãããªæ§æã®ã¢ããªã±ãŒã·ã§ã³ã CirlceCI2.0 ã§ãã«ãããã¹ãããããã€åºæ¥ãããã«ããŠãããŸãã config.yml ã®å
šäœå ä»åãäœæãã config.yml ã¯ãã®ãããªåœ¢ã«ãªããŸããã ãã£ãã㯠build: bundle install, yarn install code_analyze: rubocop, brakeman, scss-lint rspec deploy: capistrano ãè¡ã£ãŠããããã©ã³ãã«ãã£ãŠã©ã®ãžã§ããå®è¡ããã®ãã workflows ãå©çšããŠäœ¿ãåããŠããŸãã 詳ãã解説ã¯ä»¥éãèšèŒããŠãããŸãã defaults : & defaults working_directory : ~/job-medley docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo version : 2 jobs : build : << : * defaults steps : - checkout - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle - restore_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} - run : name : Yarn install command : | echo "Node $(node -v)" echo "Yarn v$(yarn --version)" yarn config set cache-folder ./yarn_cache echo "Yarn v$(yarn cache dir)" yarn install - save_cache : key : job-medley-yarn-{{ checksum "yarn.lock" }} paths : - node_modules - yarn_cache - persist_to_workspace : root : ~/job-medley paths : - ./* code_analyze : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run rubocop command : bundle exec rubocop - run : name : run brakeman command : bundle exec brakeman -qz - run : name : run scss-lint command : bundle exec scss-lint rspec : parallelism : 2 << : * defaults steps : - attach_workspace : at : ~/job-medley - restore_cache : key : job-medley-elasticsearch # rspec ã§ es ã®ã³ãã³ããäžéšå®è¡ããŠãããããprimary container åŽãž install - run : name : Elasticsearch install command : | wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-x.x.x.tar.gz && \ tar -xvf elasticsearch-x.x.x.tar.gz && \ if [ -z "`elasticsearch-x.x.x/bin/plugin -l | grep analysis-kuromoji`" ]; then \ elasticsearch-x.x.x/bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/x.x.x; fi - save_cache : key : job-medley-elasticsearch paths : - ./elasticsearch-x.x.x - run : name : database create command : bundle exec rake db:create environment : RAILS_ENV : test - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | sh scripts/init_deploy.sh BRANCH="${CIRCLE_BRANCH}" bundle exec cap develop deploy deploy:restart deploy_only : << : * defaults steps : - attach_workspace : at : ~/job-medley - run : name : run deploy command : | BRANCH="${CIRCLE_BRANCH}" bundle exec cap production deploy deploy:restart workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ DockerImage ã®éžå® å
ã
ãDocker ã䜿ããã« CI ãåããŠããŸããããCircleCI2.0 ãžç§»è¡ããã«èŸºã Docker ãžã®å©çšã«åãæ¿ããŸããã â» Specifying Container Images DockerImage 㯠DockerHub ãžç»é²ãããŠãã CircleCI å
¬åŒã®ã ã® ãå©çšããŸããã ã¢ããªã±ãŒã·ã§ã³ã®äžéšã§ React ã䜿çšããŠãããããã³ãã®ãã«ã㯠yarn+webpack ãå©çšããŠããŸãããã®çºã以äžã® image ãéžæããŸããã circleci/ruby:2.4.2-node-browsers node ã®ã€ã³ã¹ããŒã«ãšãE2E ã®ãã¹ãã«å¿
èŠãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ãããŠããŸãã â»è©³çŽ°ã¯ ãã¡ãã®èšäº ãåèã«ãããŠããã ããŸããã ãã®ä»ãçŸåšå©çšããŠãã MySQL ã®ããŒãžã§ã³ãElasticCacheRedis ã®ããŒãžã§ã³ãšåããã image ãéžæããŸããã æ³šæç¹ãšããŠã¯ãè€æ°ã® DockerImage ãå©çšããå Žåãäžã€ç®ã«æå®ãã image ã primary ãšããŠæ±ãããŸãã 以äžã®äŸã§ããšãRuby ã® image ãæåã«æå®ããMySQLãRedis ã® image ãæå®ããŠããŸãããMySQL ã³ãã³ãèªäœã¯ Ruby ã® image ã«å«ãŸããŠããªããããRuby ã³ãã³ããå®è¡ã§ããŠã MySQL ã³ãã³ããå®è¡ããããšã¯åºæ¥ãŸããã â»è©³çŽ°ã¯ ãã¡ã ã«èšèŒãããŠããŸãã docker : - image : circleci/ruby:2.4.2-node-browsers environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : circleci/mysql:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo - image : redis:x.x.x environment : TZ : /usr/share/zoneinfo/Asia/Tokyo ãŸããçšæãããŠãã image ãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ãDocker ã§ã«ã¹ã¿ã image ãäœããpublic ã§è¯ããã° Docker Hub ãžç»é²ãprivate ãè¯ããã° Amazon EC2 Container Registry ãžç»é²ããŠããããšã§åŒã³åºãããšãå¯èœã«ãªã£ãŠããŸãã â»Using Custom-Built Docker Images https://circleci.com/docs/ja/2.0/custom-images/ â»Using Private Images https://circleci.com/docs/ja/2.0/private-images/ build ã®èšå®ãš cache CI ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã® build ã«é¢ããŠã§ãã checkout ã§ github ããã³ãŒãã checkout ãããã®åŸã®å®çŸ©ã§ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ããã£ãã·ã¥ä¿åããã£ãã·ã¥ã®å±éãè¡ã£ãŠããŸãã steps : - checkout # Rails application setup - restore_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} - run : name : bundle install command : bundle install --jobs=4 --path=vendor/bundle - save_cache : key : job-medley-app-{{ checksum "Gemfile.lock" }} paths : - vendor/bundle save_cache: key ã« Gemfile.lock ãæå®ããããšã§ãã£ãã·ã¥ããŒãšããŠæ±ããpaths ã«èšå®ãããã¹ããã£ãã·ã¥ããããã«ããŠããŸãã restore_cache: key ãšäžèŽãããã£ãã·ã¥ãããã°ãsave_cache æã«æå®ãããã¹ãå±éãçŽããŠããŸãã run: ãã¡ã㯠rails ã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¹ããŒã«ããŠããã ãã§ãã CircleCI1.0 ããããã£ãã·ã¥ç®¡çãæè»ã«è¡ããããšãããããŸãã circleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ rspec ã«ãããã¹ãã®å®è¡ã«é¢ããŠã§ãã circleci ã³ãã³ã ãå©çšããããšã§ãã¹ãã®äžŠåå®è¡ãå¹ççã«è¡ãããšãåºæ¥ããŸãã ä»å㯠--split-by=timings --timings-type=filename ã®ãªãã·ã§ã³ãæå®ãããã¡ã€ã«åããŒã¹ã§ã®åå²ã§ãã¹ããå®è¡ããŸãã - run : name : run test command : | circleci tests glob 'spec/**/*_spec.*' \ | circleci tests split --split-by=timings --timings-type=filename \ | tee -a /dev/stderr \ | xargs bundle exec rspec \ --profile 100 \ --format RspecJunitFormatter \ --out rspec/rspec.xml \ --format progress environment : RAILS_ENV : test TEST_CLUSTER_COMMAND : elasticsearch-x.x.x/bin/elasticsearch - store_artifacts : path : artifacts/ - store_test_results : path : rspec/ store_artifacts: 以åãããããæ©èœã§ããããã¹ãçµæã®ææç©ãä¿åãããã¹ã«ãªããŸãã store_test_results: ãã¡ãã¯ãã¹ãã®å®è¡çµæãä¿åããŠããããšã§ãã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããworkflows ãå©çšãããšãµããŒããããªãããã§ãã â»åèïŒ https://circleci.com/docs/ja/2.0/configuration-reference/#store_test_results ãã®ãããªåœ¢ã§ Artifacts ãä¿åãããŠããŸãã ãŸããartifacts ã«ã¯ coverage ãš capybara ã® screenshot ãªã©ãä¿åããŠããŸã - simple_cov if ENV['CI'] SimpleCov.coverage_dir File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'coverage') SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter ] SimpleCov.start do add_filter '/vendor/' add_filter '/spec/' add_filter '/config/' add_filter '/db/' end end capybara Capybara.save_and_open_page_path = File.join(ENV['CIRCLE_WORKING_DIRECTORY'], 'artifacts', 'capybara') if ENV['CI'] â»CircleCI2.0 ãã CI ã®ç°å¢å€æ°ãå€ãã£ãŠããŸãã詳现ã¯ä»¥äžã®ãªã³ã¯ãžèšèŒãããŠããŸãã Introduction to environment variables - CircleCI Introduction to environment variables in CircleCI circleci.com Workflows ã®èšå® CircleCI2.0 ãã Workflows ã®å©çšãå¯èœã«ãªããŸããã Workflow orchestration - CircleCI Learn about using CircleCI workflows to orchestrate jobs circleci.com ã³ã³ããæ¯ã«åå²ããžã§ããå®è¡ããããšã§æŽãªã䞊åå®è¡ã®å¹çåãåã³ããžã§ãéã®äŸåé¢ä¿ãŸã§èšå®ã§ããããã§ãã ãžã§ãã¡ãã¬ãŒã§ã¯ã³ãŒãã®éçè§£æã«å°ãå®è¡æéãæãã£ãŠããããšãããå€å°ã®æ¹åãå³ãããšèã åçŽã«äœ¿ã£ãŠã¿ããã£ã ãã¡ãã®æ©èœãå©çšããŠã¿ãŸããã workflows : version : 2 workflows : jobs : - build - code_analyze : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - rspec : requires : - build filters : branches : ignore : /^sandbox.*|^master$|^staging$/ - deploy_qa : requires : - code_analyze - rspec filters : branches : only : develop - deploy_only : requires : - build filters : branches : only : /^sandbox.*|^master$|^staging$/ build: åãžã§ãã§å®è¡åã«è¡ã£ãŠããåŠçãå®çŸ© code_analyze: rubocopãbrakemanãscss-lint ãªã©ã®éçè§£æåŠçãå®çŸ© rspec: ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®çŸ© deploy: ãããã€ã«é¢ããåŠçãå®çŸ© ãžã§ãã¡ãã¬ãŒã§ã¯ããã©ã³ã管çã« Git-flow ãæ¡çšããŠããŸããããããšã¯å¥ã« sandbox ãšãããã¹ãç°å¢ãçšæãéçšããŠããŸãã develop ãã©ã³ãã§ã³ãŒãè§£æããã¹ããã¯ãªã¢ããã³ãŒãã ããmaster ãžåæ ããmaster ã§ã¯ãã¹ããã§ãŒãºãªãã« deploy ããæ§æãåã£ãŠããŸãã æ¥µåãCI ã®ãªãœãŒã¹ãç¯çŽããããã«åãã©ã³ãããšã§å®è¡ããåŠçãåããŠããŸãã åãã©ã³ãã®éçšã¯ä»¥äžã®éãã§ãã feature: ã³ãŒãè§£æããã¹ãå®è¡ sandbox: ãããã€ã®ã¿å®è¡(äžæã¬ãã¥ãŒçšãã©ã³ã) develop: ã³ãŒãè§£æããã¹ãå®è¡ããããã€å®è¡ master: ãããã€ã®ã¿å®è¡ äžèšã®äŸã§ã¯ã code_analyze: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã rspec: sandboxãmasterãstaging ãã©ã³ã以å€ã¯å®è¡ requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_qa: develop ãã©ã³ãã§ã®ã¿å®è¡ requires ã§äŸåé¢ä¿ãæå®ããcode_analyzeãrspec ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã deploy_only: sandboxãmasterãstaging ãã©ã³ãã®ã¿å©çšãããžã§ã requires ã§äŸåé¢ä¿ãæå®ããbuild ãæ£åžžã«çµäºããªããã°å®è¡ãããªãããã«ãªã£ãŠããŸãã ã©ã®ãã㪠workflow ãåºæ¥ãããã®ãã以äžã«äŸã瀺ããŸãã feature ãã©ã³ãã®äŸ: develop ãã©ã³ãã®äŸ: masterãsandbox ãã©ã³ãã®äŸ: ä»åã®äŸã ãšãã©ã³ãæ¯ã« workflow ãå€ããŠãããããignoreãonly ã®æžãæ¹ã§æå³ããæ¯ãåããããªãããã«èæ
®ã¯å¿
èŠã§ãããæè»ã« workflow ãäœããããšãããããšæããŸãã(ããéãããšèªã¿è§£ãã®ã倧å€ã«ãªãããã§ãã) Workflows ã«é¢ããŠã¯ ãã¡ã ã«è²ã
ãªãã¿ãŒã³ã®çµã¿æ¹ãèšèŒãããŠããã®ã§ããã¡ããèªããšããçè§£ãæ·±ãŸããšæããŸãã ãžã§ãéã§ã®ããŒã¿å
±æ ãžã§ããåããŠãã«ããã=äœåãã¢ããªã±ãŒã·ã§ã³ã®åæåãå¿
èŠãªããããªããïŒ ãšåœç¶çåã«æãç¹ã§ã¯ãããŸãããããã«å¯Ÿãã解決çãçšæãããŠããŸãã build : steps : ===çç¥=== - persist_to_workspace : root : ~/job-medley paths : - ./* deploy_qa : << : * defaults steps : - attach_workspace : at : ~/job-medley persist_to_workspace: æå®ãããã¹ã«ããããŒã¿ãäžæçã«ä¿ç®¡ããŠãããŸã attach_workspace: ä¿ç®¡æžã¿ã®ããŒã¿ãå±éããŠãããŸã ãã®æ©èœã«ããããã«ãããã»ã¹ã§çæãããã®ãåãžã§ãã§å®è¡ããã³ã³ãããžæž¡ãããšãåºæ¥ãŸãã ãã ãããããããã«ãããã»ã¹ã§ãã£ãã·ã¥ãå
¥ããŠããããšããããããèªäœã®å¹æã¯æ®ã©ãããŸããã§ããã ã³ã³ãã€ã«æžã¿ã®ããŒã¿ãåãæž¡ãéã«ã¯å¹æãçºæ®ãããã§ããã( å
¬åŒã§ã ãã®ãããªå©çšãæ³å®ããŠãããã§ã) æ¹åçµæ èå¿ã®é床æ¹åçµæã§ããçµæã¯ä»¥äžã®éãã«ãªããŸããã æ¹åå: CircleCI1.0 rspec ã®å®è¡æé: 26:59 以äžã¯ãCircleCI2.0 ãžç§»è¡ããã ãã®çµæã§ãããã®ã±ãŒã¹ã§ã¯ workflows ãå©çšããŠããŸããã æ¹ååŸ: CircleCI2.0 rspec ã®å®è¡æé: 19:40 CircleCI1.0 ãã CircleCI2.0 ãžç§»è¡ããããšã«ããã çŽ 12 åçš ãã¹ãã®å®è¡æéãççž®ããããšãåºæ¥ãŸããã Workflows ãªã©ç¹ã«å©çšããŠããªãããã€ããã«ããã§ãŒãºã®å®è¡æéãé¢ä¿ããªããããCircleCI2.0 ãå©çšããã ãã§åçŽã«ãã¹ãå®è¡é床ã®åäžãèŠèŸŒããããšãããããšæããŸãã ç¶ã㊠Workflows ãå©çšããçµæã§ãã æ¹ååŸ: CircleCI2.0 with Workflows rspec ã®å®è¡æé: 21:14 çµæã¯ãWorkflows ãå©çšããªãã±ãŒã¹ãšãå©çšããã±ãŒã¹ã§ã¯ãWorkflows ãå©çšããã»ãã rspec ã®å®è¡æéã¯é·ããªã£ãŠããŸããŸããããbuild-code-analyze-rspec ã®å®è¡ã«æãã£ãããŒã¿ã«ã®æéã«å·®ã¯èŠãããŸããã§ããã ããã¯ããcircleci ã³ãã³ãã«ãã Rspec ã®äžŠåå®è¡ãã®ã»ã¯ã·ã§ã³ãžãèšèŒããéããstore_test_results ããµããŒããšãããªãããšã«ãããã³ã³ããéã§ã®åæ£ãæé©åãããŠããªãçºã§ãã ã³ã³ããéã§ rspec ã®å®è¡æéã«ã°ãã€ããåºãªãããã察象ã®ãã¡ã€ã«ãæé©ã«æ¯ãåããŠããããããªã®ã§ãããWorkflows ãå©çšãããšãµããŒããããªãããã§ãã å®è¡æéã«ã°ãã€ããåºãŠããŸããcode_analyze ã®ãžã§ãã忣ããããšã§èŠèŸŒãã§ããæ¹åæé(çŽ 3 å)ãšã°ãã€ãã«ããçºçãããã¹ãå®è¡æéã®ãã¹( (20:01 - 14:57) / 2 = 2:32 )ã倧äœåãã§ãããããããŒã¿ã«ã§ã®å®è¡æéã«å·®ãåºãªãçµæãšãªããŸããã ã°ãã€ããåºããªãæ¹æ³ãããžã§ãã®åãæ¹ã«ã€ããŠã¯ä»åŸã工倫ããŠã¿ãããšæããŸãã ãŸããããã³ããšã³ãã®ãã¹ããããå°ãåãããŠãããããšèããŠããã®ã§ãããã³ããšã³ãã®ãã¹ãããµãŒããµã€ãã®ãã¹ãã Workflows ãäžæã䜿ããªãã忣ããŠãããã°è¯ãã®ããªãšãæã£ãŠããŸãã ãããã« ç§»è¡ã«éããŠã CircleCI2.0 ã®ç§»è¡ã¬ã€ã ãèªã¿ãªããé²ããŠããŸããããåºæ¬çãªèšæ³ã®å€æŽãtimezoneãenvironment ã®å®çŸ©æ¹æ³ã®å€æŽãvariable ã®å€æŽãªã©ãå€ã
æããããã¥ã¡ã³ããçµæ§èªã¿èŸŒãŸãªããšã©ãã«äœãå®çŸ©ã§ããã®ãææ¡ã§ããŸããã§ããã ãŸããWorkflows ã®çµã¿ç«ãŠãªã© å
¬åŒã«è¯ããµã³ãã« ã¯æ²¢å±±ããã®ã§ãããäŸåé¢ä¿ã®å®çŸ©ãè²ã
詊ãã®ã«èŠåŽããæ°ãããŸãã â»çŽ çŽã«å°èŠæš¡ãªã¢ããªãçšæããŠã ããŒã«ã«ã§ circleci ãå®è¡ ããŠã¿ãæ¹ãå¹çè¯ãé²ãããããããããŸããã â»ãã ã å
¬åŒã®ããã¥ã¡ã³ã ã CommunityForum ããã£ããèªãã°äœãããšãªãæ
å ±ã¯åã£ãã®ã§éåžžã«å©ãããŸããã CircleCI2.0 ã§ã©ã®ãããªäºãåºæ¥ãã®ããããã¯ã©ã®ããã«è¡ããã®ãã ãã®èšäºããã®æŠèгãã€ããå©ãã«ãªãã°è¯ããªãšæã£ãŠããŸãã åèãªã³ã¯ CircleCI2.0 ãžç§»è¡ããã«ãããã以äžã®èšäºãåèã«ãããŠããã ããŸãããããããšãããããŸãã circleci/ruby:2.4.1-node-browsersã£ãŠäœå
¥ã£ãŠãã®ãç¥ãããã£ã - Qiita 2018-11-19è¿œèš https://github.com/CircleCI-Public/circleci-dockerfiles/blob/master/ruby/images/ ãã€ã®éã«ãå
¬éãããŠãŸãã åæ© circleciãæäŸããŠããdockerãã¡... qiita.com CircleCI2.0ã®Workflowsã詊ã âCircleCI2.0ã®Workflowsã詊ãâ is published by timakin. medium.com ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ããä»è·æœèšã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã ã¡ã³ããŒã®ã¹ããŒãªãŒ | æ ªåŒäŒç€Ÿã¡ãã¬ãŒ ã¡ã³ããŒã®ã¹ããŒãªãŒ å®¶æãå人ãç
æ°ã«ãªã£ãæã«æãã®æãå·®ãã®ã¹ãå»çã®åã... www.medley.jp ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãã
ãžã§ãã¡ãã¬ãŒã®éçºéçšãæ
åœããŠãã æ°å±
ã§ãã ã¡ãã¬ãŒã§ã¯éçºæ¬éšã®ã¡ã³ããŒã®æè¡ååºäžãã課é¡è§£æ±ºãç®çãšããçæãããžã§ã¯ãïŒã¿ã¹ã¯ãã©ãŒã¹ãšåŒãã§ããŸãïŒã宿œããŠããŸãããã®åãçµã¿ã®äžç°ãšããŠã6ã8 æã¯ã»ãã¥ãªãã£ç¥èã®åºäžããç®æãããã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ãã宿œããŸãããä»åã¯ããã®åãçµã¿å
容ã玹ä»ããŸãã èæ¯ çŸåšãã¡ãã¬ãŒã®éçºæ¬éšã«ã¯çŽ 20 åã®ãšã³ãžãã¢ãåšç±ããŠãããããããå€çš®å€æ§ãªéçºçµéšãã¹ãã«ã»ãããæã£ããšã³ãžãã¢ãéãŸã£ãŠããŸãã ãããŠãåè·ã§ã¯ããã³ããšã³ãå°éã§ãã£ãŠãããšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºãè¡ã£ããããŸããã®éã®ã±ãŒã¹ããã£ãããšãåèªã®å°éé åã«ãšããããªãã¹ã¿ã€ã«ã§ã®éçºãè¡ãããšãå€ã
ãããŸãã èª²é¡ ãããã£ãèæ¯ã®äžããšã³ãžãã¢ãå¢ããŠããã«ã€ããšã³ãžãã¢éã®ã¹ãã«ã»ããã«å·®ãçãŸããã°ãã€ããèŠãããããã«ããªã£ãŠããŸããä»åŸãæŽã«çµç¹ãæ¡å€§ããŠããã®ã«äŒŽãããããããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ã倧ãããªã£ãŠããããšãæžå¿µãããŸãã ãŸããã¡ãã¬ãŒã¯å»çãã«ã¹ã±ã¢åéã«åããŠãµãŒãã¹æäŸãè¡ã£ãŠãããå€ãã®å人æ
å ±ãæ±ã£ãŠããããšã¯ãã¡ãããå»çã»ä»è·ãšããé åã®æ§è³ªäžãã»ãã¥ãªãã£ã«ã¯éåžžã«æ°ãã€ããå¿
èŠããããŸããããŒã¿ããŒã¹ã«å
¥ããŠä¿å®ã»éçšããŠããå人æ
å ±ãªã©ã®åãæ±ãããã·ã¹ãã æ¹åãæ°æ©èœéçºãªã©ãè¡ããšãã«ã¯å¿
ç¶çã«ã»ãã¥ãªãã£ã«ãé
æ
®ããŠéçºãé²ããå¿
èŠããããŸãã ãããŠèæ¯ã®ãšããã§ãè¿°ã¹ãããã«ãå
ã
ããã³ããšã³ãå°éã®ãšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºã«é¢ããã±ãŒã¹ãããããããµãŒããŒãµã€ãéçºã®çµéšãæµ
ããšã³ãžãã¢ãäžã«ã¯ããŠããµãŒããŒãµã€ãã®ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªãã£ãããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããããšãã課é¡ããããŸããïŒåœç¶ã§ããå®éã®éçºã§ã¯ PR ãªã©ã§ã¬ãã¥ãŒããŠåé¡ãèµ·ããªãããã«å¯Ÿå¿ããŠããŸãïŒã ããã§ããããã£ãã¡ã³ããŒã®ã»ãã¥ãªãã£ç¥èã®åºäžããè¡ãããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ãçž®ããŠããããšãå¿
èŠã§ãããšèããŸããã åãçµã¿ äžè¿°ããéãã ã¹ãã«ã»ããã«ã°ãã€ããå·®ãèŠããã å»çãã«ã¹ã±ã¢åéã¯ç¹ã«ã»ãã¥ãªãã£ã«æ°ã䜿ãå¿
èŠããã ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããã ãšãã£ãèª²é¡æããããŸãã¯ããã³ããšã³ãå°éã§ãã£ãŠããã¡ã³ããŒããµãŒããŒãµã€ãéçºã®çµéšãæµ
ãã¡ã³ããŒãã¡ã€ã³ã¿ãŒã²ãããšããŠãã»ãã¥ãªãã£ç¥èã®åºäžãããã£ãŠããããšã«ãã©ãŒã«ã¹ããŸããã ç®æšãšããŠã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³éçºã«ãããæäœéã®ã»ãã¥ãªãã£ç¥èãå¯Ÿçæ¹æ³ããã£ããåæŽçããããã«éçºã§äœ¿ã£ãŠãã Ruby on Rails äžã§ã©ã®ããã«å¯Ÿçããã¹ãããæŒããããšãããšãããç®æšã«ãããŸããã åœ¢åŒ åœ¢åŒãšããŠã¯ãåå è
ã«äºåã«ææã®å¯Ÿè±¡ç¯å²ãèªãã§ããŠããããéé±éå¬ã® TechLunchïŒç€Ÿå
å匷äŒïŒçµäºåŸã®çŽ 20 åãå©çšããŠãå
容ã®ç°¡åãªèª¬æãè£è¶³ã質çå¿çãè°è«ãªã©ãè¡ãå ŽïŒãã©ããŒäŒïŒãèšããŸããã ææ 以äžã䜿çšããŸããã ã¡ã€ã³ææïŒãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ã www.ipa.go.jp ãµãææïŒãRails ã»ãã¥ãªãã£ã¬ã€ãã railsguides.jp ã¡ã€ã³ææã®ãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ãã¯ãIPA ãå±åºãåããè匱æ§é¢é£æ
å ±ãåºã«ããŠäœãããŠãããã»ãã¥ãªãã£ãèæ
®ãããŠã§ããµã€ããäœãäžã§ã®æäœéã®ç¥èãæŽçã§ããã ãããšããããšã§æ¡çšããŸããã ãµãææã®ãRails ã»ãã¥ãªãã£ã¬ã€ããã¯ãRails ã§ã¯ã©ã®ããã«ã»ãã¥ãªãã£ã®åé¡ãåé¿ããŠããã®ããšãã£ãæ¹æ³ã解説ãããŠãããå®éã®éçºã®ãšãã«ã©ãããã°è¯ãã®ããšãã£ãããšãæŒãããããã ãããšããããšã§æ¡çšããŸããã å®éã®éå¬ã¹ã±ãžã¥ãŒã«ãšããã©ããŒäŒã®å¯Ÿè±¡ç¯å²ã¯ãã¡ãã åãçµã¿ãçµã㊠åãçµã¿ãçµããŠæããããšãšããŠã¯ä»¥äžã«ãªããŸãã æè¡çãªèŠ³ç¹ SQL ã€ã³ãžã§ã¯ã·ã§ã³ã XSSãCSRF ãªã©ã®ã¡ãžã£ãŒãªæ»æææ³ãåå è
éã§åæŽçã§ãã æè¡çã«äžå®ãªãšãããªã©ã¯ãããã¯ããã§ãããïŒããšããæãã§ç¢ºããåãããšãã§ãã åå è
ãåè·ã§ã®çµéšè«ãªã©ãã·ã§ã¢ããŠãããå Žé¢ããããç¥èŠã®å
±æãã§ãã ã»ãã¥ãªãã£ã«è©³ãããšã³ãžãã¢ã亀ããŠè©±ãããšã§ãéæã§å¹æçã«ããã³ããããã ããæ¿å¯ãªè°è«ãã§ãã ããã©ã³ãšã³ãžãã¢ããã¯ãææµè¡ã£ãæãµãŒãã¹ã®æã»ãã¥ãªãã£ç³»éå®³ã®æåäºäŸãªã©ãå
±æãããéå»ã®æŽå²ãç¥ãããšãã§ããå Žãšãªã£ã æè¡ä»¥å€ã®èŠ³ç¹ æ®æ®µã¯ããŒã æ¯ã«é»ã
ãšä»äºã«åãçµãã§ãããããŒã ãè·šãã§ããã²ãšã€ã®è©±é¡ïŒä»åã¯ã»ãã¥ãªãã£ïŒã«ã€ããŠã¿ããªãšäŒè©±ããæ©äŒã¯å°ãªãã®ã§ãç¥èã®åºäžãã¯ãã¡ããã®ããšãã³ãã¥ãã±ãŒã·ã§ã³ã®å ŽãšããŠãè¯ãã£ã ä»åã®ããã«è³ªçå¿çãè°è«ãã§ããå Žãèšããããšã«ãããä»ã®ã¡ã³ããŒã®çµéšãç¥èŠã广çã«å
±æããããšãã§ããææã®èªã¿åãããè¬çŸ©åœ¢åŒã§ã¯åŸãããªãç¥èãå
±æã§ããåãçµã¿ãšããŠã¯ããŸããã£ãããªããšæããŸãã ãŸãšã ãšããããšã§ãä»åã¯ã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããã ã»ãã¥ãªãã£ã®ç¥èã¯ã ããã²ãšããæŒãããŠããã°è¯ããšãããã®ã§ã¯ãªããéçºã«é¢ãããšã³ãžãã¢å
šå¡ãæäœéã¯æŒãããŠããå¿
èŠããããšæããŸãã çµç¹ã®æ¡å€§ãšå
±ã«ãæ¥ã
ã®ãããã¯ãã®éçšã»éçºã倧åã§ãããããããæ¯ãããšã³ãžãã¢ã®ç¥èã®åºäžããªã©ã®éçºä»¥å€ã®éšåããã倧åã«ãªã£ãŠããŸããããããã£ãåãçµã¿ãçµç¹åãé«ããŠããã®ã§ã¯ãªãããšæããŸãã ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ãã ä»è·æœèš ã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã www.medley.jp å»çãä»è·ãšã¯å
šãéãæ¥çã§çµéšãç©ãã§ãããšã³ãžãã¢ã»ãã¶ã€ããŒãå€ãã§ããããããã宿çãªå匷äŒãªã©ã§å¿
èŠç¥èãã€ã³ãããããªããéçºããŠããŸãã ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãïŒ
ãžã§ãã¡ãã¬ãŒã®éçºéçšãæ
åœããŠãã æ°å±
ã§ãã ã¡ãã¬ãŒã§ã¯éçºæ¬éšã®ã¡ã³ããŒã®æè¡ååºäžãã課é¡è§£æ±ºãç®çãšããçæãããžã§ã¯ãïŒã¿ã¹ã¯ãã©ãŒã¹ãšåŒãã§ããŸãïŒã宿œããŠããŸãããã®åãçµã¿ã®äžç°ãšããŠã6ã8 æã¯ã»ãã¥ãªãã£ç¥èã®åºäžããç®æãããã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ãã宿œããŸãããä»åã¯ããã®åãçµã¿å
容ã玹ä»ããŸãã èæ¯ çŸåšãã¡ãã¬ãŒã®éçºæ¬éšã«ã¯çŽ 20 åã®ãšã³ãžãã¢ãåšç±ããŠãããããããå€çš®å€æ§ãªéçºçµéšãã¹ãã«ã»ãããæã£ããšã³ãžãã¢ãéãŸã£ãŠããŸãã ãããŠãåè·ã§ã¯ããã³ããšã³ãå°éã§ãã£ãŠãããšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºãè¡ã£ããããŸããã®éã®ã±ãŒã¹ããã£ãããšãåèªã®å°éé åã«ãšããããªãã¹ã¿ã€ã«ã§ã®éçºãè¡ãããšãå€ã
ãããŸãã èª²é¡ ãããã£ãèæ¯ã®äžããšã³ãžãã¢ãå¢ããŠããã«ã€ããšã³ãžãã¢éã®ã¹ãã«ã»ããã«å·®ãçãŸããã°ãã€ããèŠãããããã«ããªã£ãŠããŸããä»åŸãæŽã«çµç¹ãæ¡å€§ããŠããã®ã«äŒŽãããããããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ã倧ãããªã£ãŠããããšãæžå¿µãããŸãã ãŸããã¡ãã¬ãŒã¯å»çãã«ã¹ã±ã¢åéã«åããŠãµãŒãã¹æäŸãè¡ã£ãŠãããå€ãã®å人æ
å ±ãæ±ã£ãŠããããšã¯ãã¡ãããå»çã»ä»è·ãšããé åã®æ§è³ªäžãã»ãã¥ãªãã£ã«ã¯éåžžã«æ°ãã€ããå¿
èŠããããŸããããŒã¿ããŒã¹ã«å
¥ããŠä¿å®ã»éçšããŠããå人æ
å ±ãªã©ã®åãæ±ãããã·ã¹ãã æ¹åãæ°æ©èœéçºãªã©ãè¡ããšãã«ã¯å¿
ç¶çã«ã»ãã¥ãªãã£ã«ãé
æ
®ããŠéçºãé²ããå¿
èŠããããŸãã ãããŠèæ¯ã®ãšããã§ãè¿°ã¹ãããã«ãå
ã
ããã³ããšã³ãå°éã®ãšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºã«é¢ããã±ãŒã¹ãããããããµãŒããŒãµã€ãéçºã®çµéšãæµ
ããšã³ãžãã¢ãäžã«ã¯ããŠããµãŒããŒãµã€ãã®ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªãã£ãããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããããšãã課é¡ããããŸããïŒåœç¶ã§ããå®éã®éçºã§ã¯ PR ãªã©ã§ã¬ãã¥ãŒããŠåé¡ãèµ·ããªãããã«å¯Ÿå¿ããŠããŸãïŒã ããã§ããããã£ãã¡ã³ããŒã®ã»ãã¥ãªãã£ç¥èã®åºäžããè¡ãããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ãçž®ããŠããããšãå¿
èŠã§ãããšèããŸããã åãçµã¿ äžè¿°ããéãã ã¹ãã«ã»ããã«ã°ãã€ããå·®ãèŠããã å»çãã«ã¹ã±ã¢åéã¯ç¹ã«ã»ãã¥ãªãã£ã«æ°ã䜿ãå¿
èŠããã ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããã ãšãã£ãèª²é¡æããããŸãã¯ããã³ããšã³ãå°éã§ãã£ãŠããã¡ã³ããŒããµãŒããŒãµã€ãéçºã®çµéšãæµ
ãã¡ã³ããŒãã¡ã€ã³ã¿ãŒã²ãããšããŠãã»ãã¥ãªãã£ç¥èã®åºäžãããã£ãŠããããšã«ãã©ãŒã«ã¹ããŸããã ç®æšãšããŠã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³éçºã«ãããæäœéã®ã»ãã¥ãªãã£ç¥èãå¯Ÿçæ¹æ³ããã£ããåæŽçããããã«éçºã§äœ¿ã£ãŠãã Ruby on Rails äžã§ã©ã®ããã«å¯Ÿçããã¹ãããæŒããããšãããšãããç®æšã«ãããŸããã åœ¢åŒ åœ¢åŒãšããŠã¯ãåå è
ã«äºåã«ææã®å¯Ÿè±¡ç¯å²ãèªãã§ããŠããããéé±éå¬ã® TechLunchïŒç€Ÿå
å匷äŒïŒçµäºåŸã®çŽ 20 åãå©çšããŠãå
容ã®ç°¡åãªèª¬æãè£è¶³ã質çå¿çãè°è«ãªã©ãè¡ãå ŽïŒãã©ããŒäŒïŒãèšããŸããã ææ 以äžã䜿çšããŸããã ã¡ã€ã³ææïŒãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ã www.ipa.go.jp ãµãææïŒãRails ã»ãã¥ãªãã£ã¬ã€ãã railsguides.jp ã¡ã€ã³ææã®ãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ãã¯ãIPA ãå±åºãåããè匱æ§é¢é£æ
å ±ãåºã«ããŠäœãããŠãããã»ãã¥ãªãã£ãèæ
®ãããŠã§ããµã€ããäœãäžã§ã®æäœéã®ç¥èãæŽçã§ããã ãããšããããšã§æ¡çšããŸããã ãµãææã®ãRails ã»ãã¥ãªãã£ã¬ã€ããã¯ãRails ã§ã¯ã©ã®ããã«ã»ãã¥ãªãã£ã®åé¡ãåé¿ããŠããã®ããšãã£ãæ¹æ³ã解説ãããŠãããå®éã®éçºã®ãšãã«ã©ãããã°è¯ãã®ããšãã£ãããšãæŒãããããã ãããšããããšã§æ¡çšããŸããã å®éã®éå¬ã¹ã±ãžã¥ãŒã«ãšããã©ããŒäŒã®å¯Ÿè±¡ç¯å²ã¯ãã¡ãã åãçµã¿ãçµã㊠åãçµã¿ãçµããŠæããããšãšããŠã¯ä»¥äžã«ãªããŸãã æè¡çãªèŠ³ç¹ SQL ã€ã³ãžã§ã¯ã·ã§ã³ã XSSãCSRF ãªã©ã®ã¡ãžã£ãŒãªæ»æææ³ãåå è
éã§åæŽçã§ãã æè¡çã«äžå®ãªãšãããªã©ã¯ãããã¯ããã§ãããïŒããšããæãã§ç¢ºããåãããšãã§ãã åå è
ãåè·ã§ã®çµéšè«ãªã©ãã·ã§ã¢ããŠãããå Žé¢ããããç¥èŠã®å
±æãã§ãã ã»ãã¥ãªãã£ã«è©³ãããšã³ãžãã¢ã亀ããŠè©±ãããšã§ãéæã§å¹æçã«ããã³ããããã ããæ¿å¯ãªè°è«ãã§ãã ããã©ã³ãšã³ãžãã¢ããã¯ãææµè¡ã£ãæãµãŒãã¹ã®æã»ãã¥ãªãã£ç³»éå®³ã®æåäºäŸãªã©ãå
±æãããéå»ã®æŽå²ãç¥ãããšãã§ããå Žãšãªã£ã æè¡ä»¥å€ã®èŠ³ç¹ æ®æ®µã¯ããŒã æ¯ã«é»ã
ãšä»äºã«åãçµãã§ãããããŒã ãè·šãã§ããã²ãšã€ã®è©±é¡ïŒä»åã¯ã»ãã¥ãªãã£ïŒã«ã€ããŠã¿ããªãšäŒè©±ããæ©äŒã¯å°ãªãã®ã§ãç¥èã®åºäžãã¯ãã¡ããã®ããšãã³ãã¥ãã±ãŒã·ã§ã³ã®å ŽãšããŠãè¯ãã£ã ä»åã®ããã«è³ªçå¿çãè°è«ãã§ããå Žãèšããããšã«ãããä»ã®ã¡ã³ããŒã®çµéšãç¥èŠã广çã«å
±æããããšãã§ããææã®èªã¿åãããè¬çŸ©åœ¢åŒã§ã¯åŸãããªãç¥èãå
±æã§ããåãçµã¿ãšããŠã¯ããŸããã£ãããªããšæããŸãã ãŸãšã ãšããããšã§ãä»åã¯ã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããã ã»ãã¥ãªãã£ã®ç¥èã¯ã ããã²ãšããæŒãããŠããã°è¯ããšãããã®ã§ã¯ãªããéçºã«é¢ãããšã³ãžãã¢å
šå¡ãæäœéã¯æŒãããŠããå¿
èŠããããšæããŸãã çµç¹ã®æ¡å€§ãšå
±ã«ãæ¥ã
ã®ãããã¯ãã®éçšã»éçºã倧åã§ãããããããæ¯ãããšã³ãžãã¢ã®ç¥èã®åºäžããªã©ã®éçºä»¥å€ã®éšåããã倧åã«ãªã£ãŠããŸããããããã£ãåãçµã¿ãçµç¹åãé«ããŠããã®ã§ã¯ãªãããšæããŸãã ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ãã ä»è·æœèš ã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã www.medley.jp å»çãä»è·ãšã¯å
šãéãæ¥çã§çµéšãç©ãã§ãããšã³ãžãã¢ã»ãã¶ã€ããŒãå€ãã§ããããããã宿çãªå匷äŒãªã©ã§å¿
èŠç¥èãã€ã³ãããããªããéçºããŠããŸãã ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãïŒ
ãžã§ãã¡ãã¬ãŒã®éçºéçšãæ
åœããŠãã æ°å±
ã§ãã ã¡ãã¬ãŒã§ã¯éçºæ¬éšã®ã¡ã³ããŒã®æè¡ååºäžãã課é¡è§£æ±ºãç®çãšããçæãããžã§ã¯ãïŒã¿ã¹ã¯ãã©ãŒã¹ãšåŒãã§ããŸãïŒã宿œããŠããŸãããã®åãçµã¿ã®äžç°ãšããŠã6ã8 æã¯ã»ãã¥ãªãã£ç¥èã®åºäžããç®æãããã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ãã宿œããŸãããä»åã¯ããã®åãçµã¿å
容ã玹ä»ããŸãã èæ¯ çŸåšãã¡ãã¬ãŒã®éçºæ¬éšã«ã¯çŽ 20 åã®ãšã³ãžãã¢ãåšç±ããŠãããããããå€çš®å€æ§ãªéçºçµéšãã¹ãã«ã»ãããæã£ããšã³ãžãã¢ãéãŸã£ãŠããŸãã ãããŠãåè·ã§ã¯ããã³ããšã³ãå°éã§ãã£ãŠãããšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºãè¡ã£ããããŸããã®éã®ã±ãŒã¹ããã£ãããšãåèªã®å°éé åã«ãšããããªãã¹ã¿ã€ã«ã§ã®éçºãè¡ãããšãå€ã
ãããŸãã èª²é¡ ãããã£ãèæ¯ã®äžããšã³ãžãã¢ãå¢ããŠããã«ã€ããšã³ãžãã¢éã®ã¹ãã«ã»ããã«å·®ãçãŸããã°ãã€ããèŠãããããã«ããªã£ãŠããŸããä»åŸãæŽã«çµç¹ãæ¡å€§ããŠããã®ã«äŒŽãããããããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ã倧ãããªã£ãŠããããšãæžå¿µãããŸãã ãŸããã¡ãã¬ãŒã¯å»çãã«ã¹ã±ã¢åéã«åããŠãµãŒãã¹æäŸãè¡ã£ãŠãããå€ãã®å人æ
å ±ãæ±ã£ãŠããããšã¯ãã¡ãããå»çã»ä»è·ãšããé åã®æ§è³ªäžãã»ãã¥ãªãã£ã«ã¯éåžžã«æ°ãã€ããå¿
èŠããããŸããããŒã¿ããŒã¹ã«å
¥ããŠä¿å®ã»éçšããŠããå人æ
å ±ãªã©ã®åãæ±ãããã·ã¹ãã æ¹åãæ°æ©èœéçºãªã©ãè¡ããšãã«ã¯å¿
ç¶çã«ã»ãã¥ãªãã£ã«ãé
æ
®ããŠéçºãé²ããå¿
èŠããããŸãã ãããŠèæ¯ã®ãšããã§ãè¿°ã¹ãããã«ãå
ã
ããã³ããšã³ãå°éã®ãšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºã«é¢ããã±ãŒã¹ãããããããµãŒããŒãµã€ãéçºã®çµéšãæµ
ããšã³ãžãã¢ãäžã«ã¯ããŠããµãŒããŒãµã€ãã®ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªãã£ãããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããããšãã課é¡ããããŸããïŒåœç¶ã§ããå®éã®éçºã§ã¯ PR ãªã©ã§ã¬ãã¥ãŒããŠåé¡ãèµ·ããªãããã«å¯Ÿå¿ããŠããŸãïŒã ããã§ããããã£ãã¡ã³ããŒã®ã»ãã¥ãªãã£ç¥èã®åºäžããè¡ãããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ãçž®ããŠããããšãå¿
èŠã§ãããšèããŸããã åãçµã¿ äžè¿°ããéãã ã¹ãã«ã»ããã«ã°ãã€ããå·®ãèŠããã å»çãã«ã¹ã±ã¢åéã¯ç¹ã«ã»ãã¥ãªãã£ã«æ°ã䜿ãå¿
èŠããã ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããã ãšãã£ãèª²é¡æããããŸãã¯ããã³ããšã³ãå°éã§ãã£ãŠããã¡ã³ããŒããµãŒããŒãµã€ãéçºã®çµéšãæµ
ãã¡ã³ããŒãã¡ã€ã³ã¿ãŒã²ãããšããŠãã»ãã¥ãªãã£ç¥èã®åºäžãããã£ãŠããããšã«ãã©ãŒã«ã¹ããŸããã ç®æšãšããŠã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³éçºã«ãããæäœéã®ã»ãã¥ãªãã£ç¥èãå¯Ÿçæ¹æ³ããã£ããåæŽçããããã«éçºã§äœ¿ã£ãŠãã Ruby on Rails äžã§ã©ã®ããã«å¯Ÿçããã¹ãããæŒããããšãããšãããç®æšã«ãããŸããã åœ¢åŒ åœ¢åŒãšããŠã¯ãåå è
ã«äºåã«ææã®å¯Ÿè±¡ç¯å²ãèªãã§ããŠããããéé±éå¬ã® TechLunchïŒç€Ÿå
å匷äŒïŒçµäºåŸã®çŽ 20 åãå©çšããŠãå
容ã®ç°¡åãªèª¬æãè£è¶³ã質çå¿çãè°è«ãªã©ãè¡ãå ŽïŒãã©ããŒäŒïŒãèšããŸããã ææ 以äžã䜿çšããŸããã ã¡ã€ã³ææïŒãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ã www.ipa.go.jp ãµãææïŒãRails ã»ãã¥ãªãã£ã¬ã€ãã railsguides.jp ã¡ã€ã³ææã®ãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ãã¯ãIPA ãå±åºãåããè匱æ§é¢é£æ
å ±ãåºã«ããŠäœãããŠãããã»ãã¥ãªãã£ãèæ
®ãããŠã§ããµã€ããäœãäžã§ã®æäœéã®ç¥èãæŽçã§ããã ãããšããããšã§æ¡çšããŸããã ãµãææã®ãRails ã»ãã¥ãªãã£ã¬ã€ããã¯ãRails ã§ã¯ã©ã®ããã«ã»ãã¥ãªãã£ã®åé¡ãåé¿ããŠããã®ããšãã£ãæ¹æ³ã解説ãããŠãããå®éã®éçºã®ãšãã«ã©ãããã°è¯ãã®ããšãã£ãããšãæŒãããããã ãããšããããšã§æ¡çšããŸããã å®éã®éå¬ã¹ã±ãžã¥ãŒã«ãšããã©ããŒäŒã®å¯Ÿè±¡ç¯å²ã¯ãã¡ãã åãçµã¿ãçµã㊠åãçµã¿ãçµããŠæããããšãšããŠã¯ä»¥äžã«ãªããŸãã æè¡çãªèŠ³ç¹ SQL ã€ã³ãžã§ã¯ã·ã§ã³ã XSSãCSRF ãªã©ã®ã¡ãžã£ãŒãªæ»æææ³ãåå è
éã§åæŽçã§ãã æè¡çã«äžå®ãªãšãããªã©ã¯ãããã¯ããã§ãããïŒããšããæãã§ç¢ºããåãããšãã§ãã åå è
ãåè·ã§ã®çµéšè«ãªã©ãã·ã§ã¢ããŠãããå Žé¢ããããç¥èŠã®å
±æãã§ãã ã»ãã¥ãªãã£ã«è©³ãããšã³ãžãã¢ã亀ããŠè©±ãããšã§ãéæã§å¹æçã«ããã³ããããã ããæ¿å¯ãªè°è«ãã§ãã ããã©ã³ãšã³ãžãã¢ããã¯ãææµè¡ã£ãæãµãŒãã¹ã®æã»ãã¥ãªãã£ç³»éå®³ã®æåäºäŸãªã©ãå
±æãããéå»ã®æŽå²ãç¥ãããšãã§ããå Žãšãªã£ã æè¡ä»¥å€ã®èŠ³ç¹ æ®æ®µã¯ããŒã æ¯ã«é»ã
ãšä»äºã«åãçµãã§ãããããŒã ãè·šãã§ããã²ãšã€ã®è©±é¡ïŒä»åã¯ã»ãã¥ãªãã£ïŒã«ã€ããŠã¿ããªãšäŒè©±ããæ©äŒã¯å°ãªãã®ã§ãç¥èã®åºäžãã¯ãã¡ããã®ããšãã³ãã¥ãã±ãŒã·ã§ã³ã®å ŽãšããŠãè¯ãã£ã ä»åã®ããã«è³ªçå¿çãè°è«ãã§ããå Žãèšããããšã«ãããä»ã®ã¡ã³ããŒã®çµéšãç¥èŠã广çã«å
±æããããšãã§ããææã®èªã¿åãããè¬çŸ©åœ¢åŒã§ã¯åŸãããªãç¥èãå
±æã§ããåãçµã¿ãšããŠã¯ããŸããã£ãããªããšæããŸãã ãŸãšã ãšããããšã§ãä»åã¯ã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããã ã»ãã¥ãªãã£ã®ç¥èã¯ã ããã²ãšããæŒãããŠããã°è¯ããšãããã®ã§ã¯ãªããéçºã«é¢ãããšã³ãžãã¢å
šå¡ãæäœéã¯æŒãããŠããå¿
èŠããããšæããŸãã çµç¹ã®æ¡å€§ãšå
±ã«ãæ¥ã
ã®ãããã¯ãã®éçšã»éçºã倧åã§ãããããããæ¯ãããšã³ãžãã¢ã®ç¥èã®åºäžããªã©ã®éçºä»¥å€ã®éšåããã倧åã«ãªã£ãŠããŸããããããã£ãåãçµã¿ãçµç¹åãé«ããŠããã®ã§ã¯ãªãããšæããŸãã ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ãã ä»è·æœèš ã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã www.medley.jp å»çãä»è·ãšã¯å
šãéãæ¥çã§çµéšãç©ãã§ãããšã³ãžãã¢ã»ãã¶ã€ããŒãå€ãã§ããããããã宿çãªå匷äŒãªã©ã§å¿
èŠç¥èãã€ã³ãããããªããéçºããŠããŸãã ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãïŒ
ãžã§ãã¡ãã¬ãŒã®éçºéçšãæ
åœããŠãã æ°å±
ã§ãã ã¡ãã¬ãŒã§ã¯éçºæ¬éšã®ã¡ã³ããŒã®æè¡ååºäžãã課é¡è§£æ±ºãç®çãšããçæãããžã§ã¯ãïŒã¿ã¹ã¯ãã©ãŒã¹ãšåŒãã§ããŸãïŒã宿œããŠããŸãããã®åãçµã¿ã®äžç°ãšããŠã6ã8 æã¯ã»ãã¥ãªãã£ç¥èã®åºäžããç®æãããã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ãã宿œããŸãããä»åã¯ããã®åãçµã¿å
容ã玹ä»ããŸãã èæ¯ çŸåšãã¡ãã¬ãŒã®éçºæ¬éšã«ã¯çŽ 20 åã®ãšã³ãžãã¢ãåšç±ããŠãããããããå€çš®å€æ§ãªéçºçµéšãã¹ãã«ã»ãããæã£ããšã³ãžãã¢ãéãŸã£ãŠããŸãã ãããŠãåè·ã§ã¯ããã³ããšã³ãå°éã§ãã£ãŠãããšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºãè¡ã£ããããŸããã®éã®ã±ãŒã¹ããã£ãããšãåèªã®å°éé åã«ãšããããªãã¹ã¿ã€ã«ã§ã®éçºãè¡ãããšãå€ã
ãããŸãã èª²é¡ ãããã£ãèæ¯ã®äžããšã³ãžãã¢ãå¢ããŠããã«ã€ããšã³ãžãã¢éã®ã¹ãã«ã»ããã«å·®ãçãŸããã°ãã€ããèŠãããããã«ããªã£ãŠããŸããä»åŸãæŽã«çµç¹ãæ¡å€§ããŠããã®ã«äŒŽãããããããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ã倧ãããªã£ãŠããããšãæžå¿µãããŸãã ãŸããã¡ãã¬ãŒã¯å»çãã«ã¹ã±ã¢åéã«åããŠãµãŒãã¹æäŸãè¡ã£ãŠãããå€ãã®å人æ
å ±ãæ±ã£ãŠããããšã¯ãã¡ãããå»çã»ä»è·ãšããé åã®æ§è³ªäžãã»ãã¥ãªãã£ã«ã¯éåžžã«æ°ãã€ããå¿
èŠããããŸããããŒã¿ããŒã¹ã«å
¥ããŠä¿å®ã»éçšããŠããå人æ
å ±ãªã©ã®åãæ±ãããã·ã¹ãã æ¹åãæ°æ©èœéçºãªã©ãè¡ããšãã«ã¯å¿
ç¶çã«ã»ãã¥ãªãã£ã«ãé
æ
®ããŠéçºãé²ããå¿
èŠããããŸãã ãããŠèæ¯ã®ãšããã§ãè¿°ã¹ãããã«ãå
ã
ããã³ããšã³ãå°éã®ãšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºã«é¢ããã±ãŒã¹ãããããããµãŒããŒãµã€ãéçºã®çµéšãæµ
ããšã³ãžãã¢ãäžã«ã¯ããŠããµãŒããŒãµã€ãã®ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªãã£ãããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããããšãã課é¡ããããŸããïŒåœç¶ã§ããå®éã®éçºã§ã¯ PR ãªã©ã§ã¬ãã¥ãŒããŠåé¡ãèµ·ããªãããã«å¯Ÿå¿ããŠããŸãïŒã ããã§ããããã£ãã¡ã³ããŒã®ã»ãã¥ãªãã£ç¥èã®åºäžããè¡ãããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ãçž®ããŠããããšãå¿
èŠã§ãããšèããŸããã åãçµã¿ äžè¿°ããéãã ã¹ãã«ã»ããã«ã°ãã€ããå·®ãèŠããã å»çãã«ã¹ã±ã¢åéã¯ç¹ã«ã»ãã¥ãªãã£ã«æ°ã䜿ãå¿
èŠããã ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããã ãšãã£ãèª²é¡æããããŸãã¯ããã³ããšã³ãå°éã§ãã£ãŠããã¡ã³ããŒããµãŒããŒãµã€ãéçºã®çµéšãæµ
ãã¡ã³ããŒãã¡ã€ã³ã¿ãŒã²ãããšããŠãã»ãã¥ãªãã£ç¥èã®åºäžãããã£ãŠããããšã«ãã©ãŒã«ã¹ããŸããã ç®æšãšããŠã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³éçºã«ãããæäœéã®ã»ãã¥ãªãã£ç¥èãå¯Ÿçæ¹æ³ããã£ããåæŽçããããã«éçºã§äœ¿ã£ãŠãã Ruby on Rails äžã§ã©ã®ããã«å¯Ÿçããã¹ãããæŒããããšãããšãããç®æšã«ãããŸããã åœ¢åŒ åœ¢åŒãšããŠã¯ãåå è
ã«äºåã«ææã®å¯Ÿè±¡ç¯å²ãèªãã§ããŠããããéé±éå¬ã® TechLunchïŒç€Ÿå
å匷äŒïŒçµäºåŸã®çŽ 20 åãå©çšããŠãå
容ã®ç°¡åãªèª¬æãè£è¶³ã質çå¿çãè°è«ãªã©ãè¡ãå ŽïŒãã©ããŒäŒïŒãèšããŸããã ææ 以äžã䜿çšããŸããã ã¡ã€ã³ææïŒãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ã www.ipa.go.jp ãµãææïŒãRails ã»ãã¥ãªãã£ã¬ã€ãã railsguides.jp ã¡ã€ã³ææã®ãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ãã¯ãIPA ãå±åºãåããè匱æ§é¢é£æ
å ±ãåºã«ããŠäœãããŠãããã»ãã¥ãªãã£ãèæ
®ãããŠã§ããµã€ããäœãäžã§ã®æäœéã®ç¥èãæŽçã§ããã ãããšããããšã§æ¡çšããŸããã ãµãææã®ãRails ã»ãã¥ãªãã£ã¬ã€ããã¯ãRails ã§ã¯ã©ã®ããã«ã»ãã¥ãªãã£ã®åé¡ãåé¿ããŠããã®ããšãã£ãæ¹æ³ã解説ãããŠãããå®éã®éçºã®ãšãã«ã©ãããã°è¯ãã®ããšãã£ãããšãæŒãããããã ãããšããããšã§æ¡çšããŸããã å®éã®éå¬ã¹ã±ãžã¥ãŒã«ãšããã©ããŒäŒã®å¯Ÿè±¡ç¯å²ã¯ãã¡ãã åãçµã¿ãçµã㊠åãçµã¿ãçµããŠæããããšãšããŠã¯ä»¥äžã«ãªããŸãã æè¡çãªèŠ³ç¹ SQL ã€ã³ãžã§ã¯ã·ã§ã³ã XSSãCSRF ãªã©ã®ã¡ãžã£ãŒãªæ»æææ³ãåå è
éã§åæŽçã§ãã æè¡çã«äžå®ãªãšãããªã©ã¯ãããã¯ããã§ãããïŒããšããæãã§ç¢ºããåãããšãã§ãã åå è
ãåè·ã§ã®çµéšè«ãªã©ãã·ã§ã¢ããŠãããå Žé¢ããããç¥èŠã®å
±æãã§ãã ã»ãã¥ãªãã£ã«è©³ãããšã³ãžãã¢ã亀ããŠè©±ãããšã§ãéæã§å¹æçã«ããã³ããããã ããæ¿å¯ãªè°è«ãã§ãã ããã©ã³ãšã³ãžãã¢ããã¯ãææµè¡ã£ãæãµãŒãã¹ã®æã»ãã¥ãªãã£ç³»éå®³ã®æåäºäŸãªã©ãå
±æãããéå»ã®æŽå²ãç¥ãããšãã§ããå Žãšãªã£ã æè¡ä»¥å€ã®èŠ³ç¹ æ®æ®µã¯ããŒã æ¯ã«é»ã
ãšä»äºã«åãçµãã§ãããããŒã ãè·šãã§ããã²ãšã€ã®è©±é¡ïŒä»åã¯ã»ãã¥ãªãã£ïŒã«ã€ããŠã¿ããªãšäŒè©±ããæ©äŒã¯å°ãªãã®ã§ãç¥èã®åºäžãã¯ãã¡ããã®ããšãã³ãã¥ãã±ãŒã·ã§ã³ã®å ŽãšããŠãè¯ãã£ã ä»åã®ããã«è³ªçå¿çãè°è«ãã§ããå Žãèšããããšã«ãããä»ã®ã¡ã³ããŒã®çµéšãç¥èŠã广çã«å
±æããããšãã§ããææã®èªã¿åãããè¬çŸ©åœ¢åŒã§ã¯åŸãããªãç¥èãå
±æã§ããåãçµã¿ãšããŠã¯ããŸããã£ãããªããšæããŸãã ãŸãšã ãšããããšã§ãä»åã¯ã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããã ã»ãã¥ãªãã£ã®ç¥èã¯ã ããã²ãšããæŒãããŠããã°è¯ããšãããã®ã§ã¯ãªããéçºã«é¢ãããšã³ãžãã¢å
šå¡ãæäœéã¯æŒãããŠããå¿
èŠããããšæããŸãã çµç¹ã®æ¡å€§ãšå
±ã«ãæ¥ã
ã®ãããã¯ãã®éçšã»éçºã倧åã§ãããããããæ¯ãããšã³ãžãã¢ã®ç¥èã®åºäžããªã©ã®éçºä»¥å€ã®éšåããã倧åã«ãªã£ãŠããŸããããããã£ãåãçµã¿ãçµç¹åãé«ããŠããã®ã§ã¯ãªãããšæããŸãã ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ãã ä»è·æœèš ã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã www.medley.jp å»çãä»è·ãšã¯å
šãéãæ¥çã§çµéšãç©ãã§ãããšã³ãžãã¢ã»ãã¶ã€ããŒãå€ãã§ããããããã宿çãªå匷äŒãªã©ã§å¿
èŠç¥èãã€ã³ãããããªããéçºããŠããŸãã ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãïŒ
ãžã§ãã¡ãã¬ãŒã®éçºéçšãæ
åœããŠãã æ°å±
ã§ãã ã¡ãã¬ãŒã§ã¯éçºæ¬éšã®ã¡ã³ããŒã®æè¡ååºäžãã課é¡è§£æ±ºãç®çãšããçæãããžã§ã¯ãïŒã¿ã¹ã¯ãã©ãŒã¹ãšåŒãã§ããŸãïŒã宿œããŠããŸãããã®åãçµã¿ã®äžç°ãšããŠã6ã8 æã¯ã»ãã¥ãªãã£ç¥èã®åºäžããç®æãããã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ãã宿œããŸãããä»åã¯ããã®åãçµã¿å
容ã玹ä»ããŸãã èæ¯ çŸåšãã¡ãã¬ãŒã®éçºæ¬éšã«ã¯çŽ 20 åã®ãšã³ãžãã¢ãåšç±ããŠãããããããå€çš®å€æ§ãªéçºçµéšãã¹ãã«ã»ãããæã£ããšã³ãžãã¢ãéãŸã£ãŠããŸãã ãããŠãåè·ã§ã¯ããã³ããšã³ãå°éã§ãã£ãŠãããšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºãè¡ã£ããããŸããã®éã®ã±ãŒã¹ããã£ãããšãåèªã®å°éé åã«ãšããããªãã¹ã¿ã€ã«ã§ã®éçºãè¡ãããšãå€ã
ãããŸãã èª²é¡ ãããã£ãèæ¯ã®äžããšã³ãžãã¢ãå¢ããŠããã«ã€ããšã³ãžãã¢éã®ã¹ãã«ã»ããã«å·®ãçãŸããã°ãã€ããèŠãããããã«ããªã£ãŠããŸããä»åŸãæŽã«çµç¹ãæ¡å€§ããŠããã®ã«äŒŽãããããããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ã倧ãããªã£ãŠããããšãæžå¿µãããŸãã ãŸããã¡ãã¬ãŒã¯å»çãã«ã¹ã±ã¢åéã«åããŠãµãŒãã¹æäŸãè¡ã£ãŠãããå€ãã®å人æ
å ±ãæ±ã£ãŠããããšã¯ãã¡ãããå»çã»ä»è·ãšããé åã®æ§è³ªäžãã»ãã¥ãªãã£ã«ã¯éåžžã«æ°ãã€ããå¿
èŠããããŸããããŒã¿ããŒã¹ã«å
¥ããŠä¿å®ã»éçšããŠããå人æ
å ±ãªã©ã®åãæ±ãããã·ã¹ãã æ¹åãæ°æ©èœéçºãªã©ãè¡ããšãã«ã¯å¿
ç¶çã«ã»ãã¥ãªãã£ã«ãé
æ
®ããŠéçºãé²ããå¿
èŠããããŸãã ãããŠèæ¯ã®ãšããã§ãè¿°ã¹ãããã«ãå
ã
ããã³ããšã³ãå°éã®ãšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºã«é¢ããã±ãŒã¹ãããããããµãŒããŒãµã€ãéçºã®çµéšãæµ
ããšã³ãžãã¢ãäžã«ã¯ããŠããµãŒããŒãµã€ãã®ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªãã£ãããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããããšãã課é¡ããããŸããïŒåœç¶ã§ããå®éã®éçºã§ã¯ PR ãªã©ã§ã¬ãã¥ãŒããŠåé¡ãèµ·ããªãããã«å¯Ÿå¿ããŠããŸãïŒã ããã§ããããã£ãã¡ã³ããŒã®ã»ãã¥ãªãã£ç¥èã®åºäžããè¡ãããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ãçž®ããŠããããšãå¿
èŠã§ãããšèããŸããã åãçµã¿ äžè¿°ããéãã ã¹ãã«ã»ããã«ã°ãã€ããå·®ãèŠããã å»çãã«ã¹ã±ã¢åéã¯ç¹ã«ã»ãã¥ãªãã£ã«æ°ã䜿ãå¿
èŠããã ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããã ãšãã£ãèª²é¡æããããŸãã¯ããã³ããšã³ãå°éã§ãã£ãŠããã¡ã³ããŒããµãŒããŒãµã€ãéçºã®çµéšãæµ
ãã¡ã³ããŒãã¡ã€ã³ã¿ãŒã²ãããšããŠãã»ãã¥ãªãã£ç¥èã®åºäžãããã£ãŠããããšã«ãã©ãŒã«ã¹ããŸããã ç®æšãšããŠã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³éçºã«ãããæäœéã®ã»ãã¥ãªãã£ç¥èãå¯Ÿçæ¹æ³ããã£ããåæŽçããããã«éçºã§äœ¿ã£ãŠãã Ruby on Rails äžã§ã©ã®ããã«å¯Ÿçããã¹ãããæŒããããšãããšãããç®æšã«ãããŸããã åœ¢åŒ åœ¢åŒãšããŠã¯ãåå è
ã«äºåã«ææã®å¯Ÿè±¡ç¯å²ãèªãã§ããŠããããéé±éå¬ã® TechLunchïŒç€Ÿå
å匷äŒïŒçµäºåŸã®çŽ 20 åãå©çšããŠãå
容ã®ç°¡åãªèª¬æãè£è¶³ã質çå¿çãè°è«ãªã©ãè¡ãå ŽïŒãã©ããŒäŒïŒãèšããŸããã ææ 以äžã䜿çšããŸããã ã¡ã€ã³ææïŒãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ã www.ipa.go.jp ãµãææïŒãRails ã»ãã¥ãªãã£ã¬ã€ãã railsguides.jp ã¡ã€ã³ææã®ãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ãã¯ãIPA ãå±åºãåããè匱æ§é¢é£æ
å ±ãåºã«ããŠäœãããŠãããã»ãã¥ãªãã£ãèæ
®ãããŠã§ããµã€ããäœãäžã§ã®æäœéã®ç¥èãæŽçã§ããã ãããšããããšã§æ¡çšããŸããã ãµãææã®ãRails ã»ãã¥ãªãã£ã¬ã€ããã¯ãRails ã§ã¯ã©ã®ããã«ã»ãã¥ãªãã£ã®åé¡ãåé¿ããŠããã®ããšãã£ãæ¹æ³ã解説ãããŠãããå®éã®éçºã®ãšãã«ã©ãããã°è¯ãã®ããšãã£ãããšãæŒãããããã ãããšããããšã§æ¡çšããŸããã å®éã®éå¬ã¹ã±ãžã¥ãŒã«ãšããã©ããŒäŒã®å¯Ÿè±¡ç¯å²ã¯ãã¡ãã åãçµã¿ãçµã㊠åãçµã¿ãçµããŠæããããšãšããŠã¯ä»¥äžã«ãªããŸãã æè¡çãªèŠ³ç¹ SQL ã€ã³ãžã§ã¯ã·ã§ã³ã XSSãCSRF ãªã©ã®ã¡ãžã£ãŒãªæ»æææ³ãåå è
éã§åæŽçã§ãã æè¡çã«äžå®ãªãšãããªã©ã¯ãããã¯ããã§ãããïŒããšããæãã§ç¢ºããåãããšãã§ãã åå è
ãåè·ã§ã®çµéšè«ãªã©ãã·ã§ã¢ããŠãããå Žé¢ããããç¥èŠã®å
±æãã§ãã ã»ãã¥ãªãã£ã«è©³ãããšã³ãžãã¢ã亀ããŠè©±ãããšã§ãéæã§å¹æçã«ããã³ããããã ããæ¿å¯ãªè°è«ãã§ãã ããã©ã³ãšã³ãžãã¢ããã¯ãææµè¡ã£ãæãµãŒãã¹ã®æã»ãã¥ãªãã£ç³»éå®³ã®æåäºäŸãªã©ãå
±æãããéå»ã®æŽå²ãç¥ãããšãã§ããå Žãšãªã£ã æè¡ä»¥å€ã®èŠ³ç¹ æ®æ®µã¯ããŒã æ¯ã«é»ã
ãšä»äºã«åãçµãã§ãããããŒã ãè·šãã§ããã²ãšã€ã®è©±é¡ïŒä»åã¯ã»ãã¥ãªãã£ïŒã«ã€ããŠã¿ããªãšäŒè©±ããæ©äŒã¯å°ãªãã®ã§ãç¥èã®åºäžãã¯ãã¡ããã®ããšãã³ãã¥ãã±ãŒã·ã§ã³ã®å ŽãšããŠãè¯ãã£ã ä»åã®ããã«è³ªçå¿çãè°è«ãã§ããå Žãèšããããšã«ãããä»ã®ã¡ã³ããŒã®çµéšãç¥èŠã广çã«å
±æããããšãã§ããææã®èªã¿åãããè¬çŸ©åœ¢åŒã§ã¯åŸãããªãç¥èãå
±æã§ããåãçµã¿ãšããŠã¯ããŸããã£ãããªããšæããŸãã ãŸãšã ãšããããšã§ãä»åã¯ã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããã ã»ãã¥ãªãã£ã®ç¥èã¯ã ããã²ãšããæŒãããŠããã°è¯ããšãããã®ã§ã¯ãªããéçºã«é¢ãããšã³ãžãã¢å
šå¡ãæäœéã¯æŒãããŠããå¿
èŠããããšæããŸãã çµç¹ã®æ¡å€§ãšå
±ã«ãæ¥ã
ã®ãããã¯ãã®éçšã»éçºã倧åã§ãããããããæ¯ãããšã³ãžãã¢ã®ç¥èã®åºäžããªã©ã®éçºä»¥å€ã®éšåããã倧åã«ãªã£ãŠããŸããããããã£ãåãçµã¿ãçµç¹åãé«ããŠããã®ã§ã¯ãªãããšæããŸãã ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ãã ä»è·æœèš ã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã www.medley.jp å»çãä»è·ãšã¯å
šãéãæ¥çã§çµéšãç©ãã§ãããšã³ãžãã¢ã»ãã¶ã€ããŒãå€ãã§ããããããã宿çãªå匷äŒãªã©ã§å¿
èŠç¥èãã€ã³ãããããªããéçºããŠããŸãã ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãïŒ
ãžã§ãã¡ãã¬ãŒã®éçºéçšãæ
åœããŠãã æ°å±
ã§ãã ã¡ãã¬ãŒã§ã¯éçºæ¬éšã®ã¡ã³ããŒã®æè¡ååºäžãã課é¡è§£æ±ºãç®çãšããçæãããžã§ã¯ãïŒã¿ã¹ã¯ãã©ãŒã¹ãšåŒãã§ããŸãïŒã宿œããŠããŸãããã®åãçµã¿ã®äžç°ãšããŠã6ã8 æã¯ã»ãã¥ãªãã£ç¥èã®åºäžããç®æãããã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ãã宿œããŸãããä»åã¯ããã®åãçµã¿å
容ã玹ä»ããŸãã èæ¯ çŸåšãã¡ãã¬ãŒã®éçºæ¬éšã«ã¯çŽ 20 åã®ãšã³ãžãã¢ãåšç±ããŠãããããããå€çš®å€æ§ãªéçºçµéšãã¹ãã«ã»ãããæã£ããšã³ãžãã¢ãéãŸã£ãŠããŸãã ãããŠãåè·ã§ã¯ããã³ããšã³ãå°éã§ãã£ãŠãããšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºãè¡ã£ããããŸããã®éã®ã±ãŒã¹ããã£ãããšãåèªã®å°éé åã«ãšããããªãã¹ã¿ã€ã«ã§ã®éçºãè¡ãããšãå€ã
ãããŸãã èª²é¡ ãããã£ãèæ¯ã®äžããšã³ãžãã¢ãå¢ããŠããã«ã€ããšã³ãžãã¢éã®ã¹ãã«ã»ããã«å·®ãçãŸããã°ãã€ããèŠãããããã«ããªã£ãŠããŸããä»åŸãæŽã«çµç¹ãæ¡å€§ããŠããã®ã«äŒŽãããããããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ã倧ãããªã£ãŠããããšãæžå¿µãããŸãã ãŸããã¡ãã¬ãŒã¯å»çãã«ã¹ã±ã¢åéã«åããŠãµãŒãã¹æäŸãè¡ã£ãŠãããå€ãã®å人æ
å ±ãæ±ã£ãŠããããšã¯ãã¡ãããå»çã»ä»è·ãšããé åã®æ§è³ªäžãã»ãã¥ãªãã£ã«ã¯éåžžã«æ°ãã€ããå¿
èŠããããŸããããŒã¿ããŒã¹ã«å
¥ããŠä¿å®ã»éçšããŠããå人æ
å ±ãªã©ã®åãæ±ãããã·ã¹ãã æ¹åãæ°æ©èœéçºãªã©ãè¡ããšãã«ã¯å¿
ç¶çã«ã»ãã¥ãªãã£ã«ãé
æ
®ããŠéçºãé²ããå¿
èŠããããŸãã ãããŠèæ¯ã®ãšããã§ãè¿°ã¹ãããã«ãå
ã
ããã³ããšã³ãå°éã®ãšã³ãžãã¢ããµãŒããŒãµã€ãã®éçºã«é¢ããã±ãŒã¹ãããããããµãŒããŒãµã€ãéçºã®çµéšãæµ
ããšã³ãžãã¢ãäžã«ã¯ããŠããµãŒããŒãµã€ãã®ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªãã£ãããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããããšãã課é¡ããããŸããïŒåœç¶ã§ããå®éã®éçºã§ã¯ PR ãªã©ã§ã¬ãã¥ãŒããŠåé¡ãèµ·ããªãããã«å¯Ÿå¿ããŠããŸãïŒã ããã§ããããã£ãã¡ã³ããŒã®ã»ãã¥ãªãã£ç¥èã®åºäžããè¡ãããšã³ãžãã¢éã®ã¹ãã«ã»ããã®å·®ãçž®ããŠããããšãå¿
èŠã§ãããšèããŸããã åãçµã¿ äžè¿°ããéãã ã¹ãã«ã»ããã«ã°ãã€ããå·®ãèŠããã å»çãã«ã¹ã±ã¢åéã¯ç¹ã«ã»ãã¥ãªãã£ã«æ°ã䜿ãå¿
èŠããã ã»ãã¥ãªãã£ã«é¢ããŠèªä¿¡ããªããå
·äœçãªå¯Ÿçæ¹æ³ãããã«åºãŠããªãããšããã ãšãã£ãèª²é¡æããããŸãã¯ããã³ããšã³ãå°éã§ãã£ãŠããã¡ã³ããŒããµãŒããŒãµã€ãéçºã®çµéšãæµ
ãã¡ã³ããŒãã¡ã€ã³ã¿ãŒã²ãããšããŠãã»ãã¥ãªãã£ç¥èã®åºäžãããã£ãŠããããšã«ãã©ãŒã«ã¹ããŸããã ç®æšãšããŠã¯ããŠã§ãã¢ããªã±ãŒã·ã§ã³éçºã«ãããæäœéã®ã»ãã¥ãªãã£ç¥èãå¯Ÿçæ¹æ³ããã£ããåæŽçããããã«éçºã§äœ¿ã£ãŠãã Ruby on Rails äžã§ã©ã®ããã«å¯Ÿçããã¹ãããæŒããããšãããšãããç®æšã«ãããŸããã åœ¢åŒ åœ¢åŒãšããŠã¯ãåå è
ã«äºåã«ææã®å¯Ÿè±¡ç¯å²ãèªãã§ããŠããããéé±éå¬ã® TechLunchïŒç€Ÿå
å匷äŒïŒçµäºåŸã®çŽ 20 åãå©çšããŠãå
容ã®ç°¡åãªèª¬æãè£è¶³ã質çå¿çãè°è«ãªã©ãè¡ãå ŽïŒãã©ããŒäŒïŒãèšããŸããã ææ 以äžã䜿çšããŸããã ã¡ã€ã³ææïŒãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ã www.ipa.go.jp ãµãææïŒãRails ã»ãã¥ãªãã£ã¬ã€ãã railsguides.jp ã¡ã€ã³ææã®ãIPA ã®å®å
šãªãŠã§ããµã€ãã®äœãæ¹ãã¯ãIPA ãå±åºãåããè匱æ§é¢é£æ
å ±ãåºã«ããŠäœãããŠãããã»ãã¥ãªãã£ãèæ
®ãããŠã§ããµã€ããäœãäžã§ã®æäœéã®ç¥èãæŽçã§ããã ãããšããããšã§æ¡çšããŸããã ãµãææã®ãRails ã»ãã¥ãªãã£ã¬ã€ããã¯ãRails ã§ã¯ã©ã®ããã«ã»ãã¥ãªãã£ã®åé¡ãåé¿ããŠããã®ããšãã£ãæ¹æ³ã解説ãããŠãããå®éã®éçºã®ãšãã«ã©ãããã°è¯ãã®ããšãã£ãããšãæŒãããããã ãããšããããšã§æ¡çšããŸããã å®éã®éå¬ã¹ã±ãžã¥ãŒã«ãšããã©ããŒäŒã®å¯Ÿè±¡ç¯å²ã¯ãã¡ãã åãçµã¿ãçµã㊠åãçµã¿ãçµããŠæããããšãšããŠã¯ä»¥äžã«ãªããŸãã æè¡çãªèŠ³ç¹ SQL ã€ã³ãžã§ã¯ã·ã§ã³ã XSSãCSRF ãªã©ã®ã¡ãžã£ãŒãªæ»æææ³ãåå è
éã§åæŽçã§ãã æè¡çã«äžå®ãªãšãããªã©ã¯ãããã¯ããã§ãããïŒããšããæãã§ç¢ºããåãããšãã§ãã åå è
ãåè·ã§ã®çµéšè«ãªã©ãã·ã§ã¢ããŠãããå Žé¢ããããç¥èŠã®å
±æãã§ãã ã»ãã¥ãªãã£ã«è©³ãããšã³ãžãã¢ã亀ããŠè©±ãããšã§ãéæã§å¹æçã«ããã³ããããã ããæ¿å¯ãªè°è«ãã§ãã ããã©ã³ãšã³ãžãã¢ããã¯ãææµè¡ã£ãæãµãŒãã¹ã®æã»ãã¥ãªãã£ç³»éå®³ã®æåäºäŸãªã©ãå
±æãããéå»ã®æŽå²ãç¥ãããšãã§ããå Žãšãªã£ã æè¡ä»¥å€ã®èŠ³ç¹ æ®æ®µã¯ããŒã æ¯ã«é»ã
ãšä»äºã«åãçµãã§ãããããŒã ãè·šãã§ããã²ãšã€ã®è©±é¡ïŒä»åã¯ã»ãã¥ãªãã£ïŒã«ã€ããŠã¿ããªãšäŒè©±ããæ©äŒã¯å°ãªãã®ã§ãç¥èã®åºäžãã¯ãã¡ããã®ããšãã³ãã¥ãã±ãŒã·ã§ã³ã®å ŽãšããŠãè¯ãã£ã ä»åã®ããã«è³ªçå¿çãè°è«ãã§ããå Žãèšããããšã«ãããä»ã®ã¡ã³ããŒã®çµéšãç¥èŠã广çã«å
±æããããšãã§ããææã®èªã¿åãããè¬çŸ©åœ¢åŒã§ã¯åŸãããªãç¥èãå
±æã§ããåãçµã¿ãšããŠã¯ããŸããã£ãããªããšæããŸãã ãŸãšã ãšããããšã§ãä»åã¯ã»ãã¥ãªãã£ã¿ã¹ã¯ãã©ãŒã¹ã«ã€ããŠã玹ä»ããŸããã ã»ãã¥ãªãã£ã®ç¥èã¯ã ããã²ãšããæŒãããŠããã°è¯ããšãããã®ã§ã¯ãªããéçºã«é¢ãããšã³ãžãã¢å
šå¡ãæäœéã¯æŒãããŠããå¿
èŠããããšæããŸãã çµç¹ã®æ¡å€§ãšå
±ã«ãæ¥ã
ã®ãããã¯ãã®éçšã»éçºã倧åã§ãããããããæ¯ãããšã³ãžãã¢ã®ç¥èã®åºäžããªã©ã®éçºä»¥å€ã®éšåããã倧åã«ãªã£ãŠããŸããããããã£ãåãçµã¿ãçµç¹åãé«ããŠããã®ã§ã¯ãªãããšæããŸãã ãç¥ãã ã¡ãã¬ãŒã§ã¯ãå»çä»è·ã®æ±äººãµã€ãã ãžã§ãã¡ãã¬ãŒ ããå»åž«ãã¡ãã€ãããªã³ã©ã€ã³å»çäºå
žã MEDLEY ããå£ã³ãã§æ¢ãã ä»è·æœèš ã®æ€çŽ¢ãµã€ãã ä»è·ã®ã»ãã ãããªã³ã©ã€ã³èšºçã¢ããªã CLINICS ããªã©ã®ãããã¯ããæäŸããŠããŸãããããã®ãµãŒãã¹ã®æ¡å€§ãåããŠããã®æé·ãæ¯ãããšã³ãžãã¢ã»ãã¶ã€ããŒãåéããŠããŸãã www.medley.jp å»çãä»è·ãšã¯å
šãéãæ¥çã§çµéšãç©ãã§ãããšã³ãžãã¢ã»ãã¶ã€ããŒãå€ãã§ããããããã宿çãªå匷äŒãªã©ã§å¿
èŠç¥èãã€ã³ãããããªããéçºããŠããŸãã ã¡ãã¬ãŒã§äžç·ã«å»çäœéšãå€ãããããã¯ãäœãã«é¢ããããæ¹ã®ãé£çµ¡ãåŸ
ã¡ããŠãããŸãïŒ