ãã®èšäºã§ã¯ã DevExtremeãªããžããªçšã«Amazon AWSãšã®ç¶ç¶çãªçµ±åãèšå®ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
æ°ãæéã GitHubã®ãªãŒãã³ãªããžããªã§ DevExtremeãéçºããŠããŸã ã æåããç§ãã¡ãšã®ç¶ç¶çãªçµ±åã¯ãCIãã©ãããã©ãŒã ïŒTravisãShippableãªã©ïŒã«äŸåããªãããã«Dockerã«åºã¥ããŠæ§ç¯ãããŸãããããªããžããªã®å ¬é以æ¥ãç®ç«ã£ããã®ã§ã¯ãªãã䜿ãæ £ããTravis CIã䜿çšããŠãã¹ããå®è¡ããŸããã GitHubã§èªåãã¹ãã®ãå®è¡ããè¡ãã®ã¯ããäžéšã§ãããããã°ãæåã®è¡ãšããã©ãŒã¯ããã³ãã«ãªã¯ãšã¹ããã¯ããã¯ã«å¯ŸããTravisã®æ©èœã§ååã§ããã
æéãçµã€ã«ã€ããŠãååã¯ãã«ãªã¯ãšã¹ãã®ãã¥ãŒã«ã€ããŠäžæºãèšãå§ããŸããïŒãããã圌ãã¯èŠãã¿ãŸããïŒã 10ææ«ã«TravisãDocker Hubãšã®æ¥ç¶ã倱ã£ã 10æã®çµããã«äœããããæãæ¥ããšããèãã¯ã DevExtreme 17.2ã®ããŒã¿ãªãªãŒã¹ã®æºåãããŠããŸããã
äŒæ¥ã®AWSã¢ã«ãŠã³ãã§å®éšããããã®ãŽãŒãµã€ã³ãåãåã£ãã®ã§ãç§ã¯Droneãããžã§ã¯ãã«2åç®ã®ãã£ã³ã¹ãäžããããšã«ããŸããã ãªã2çªç®ã§ããïŒ ãGitHubã®åºå£ã§å®è¡ãããããã»ã¹ã§ãã§ã«è©ŠããŠã¿ãããã§ãã ãã®åŸãç§ãã¡ã®ãªããžããªã¯ãã©ã€ããŒãã§ããããããŒã³ã¯ä»æ¥ãããããã«çã§ãããäžæçãªèåœãŠã€ã³ãã©ã¹ãã©ã¯ãã£ãããæ£ç¢ºã«ã¯ãžã§ããã¢ããã°ã¬ãŒãããåŸã«æ®ã£ãå€ãã¯ãŒã¯ã¹ããŒã·ã§ã³ã§ãããèµ·åããŸããïŒITéšéã¯ããããããã¯ã¢ããããããšãçŽæããŸããããæ¥ãã§ïŒ
ãã®çµæãçŸããã¢ãã¬ã¹https://devextreme-ci.devexpress.com/DevExpress/DevExtremeã§å©çšå¯èœãªã¹ãããã€ã³ã¹ã¿ã³ã¹ã®ãšã©ã¹ãã£ãã¯CIã€ã³ãã©ã¹ãã©ã¯ãã£ãäžããããšãã§ããŸããã
éçºå 容ãå ¬éããŸãããããã®éçšã§åŸãçµéšãå ±æããããšæããŸãã
ãããŒã³ã«ã€ããŠã®2ã€ã®èšè
ãããŒã³èªäœã¯Habréã§ãã説æãããŠããŸã ã ããã¯ãäžããã®Dockerãäžããã®Dockerãããã³Docker Dockerãé§åããGoã®ç¶ç¶çãªçµ±åã®ã·ã¹ãã ã§ãã Radio-Tã®ç¬¬570å·ã§ ãUmputoonïŒæåãªDockerã®æ奜家ïŒã¯ããããŒã³ã«ã€ããŠæ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
Droneã¢ãŒããã¯ãã£ã¯ãCIãã©ãããã©ãŒã ã«å žåçãªãã®ã§ãã
- ãµãŒããŒããããŸãã WebããŒã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããWebããã¯ããªãã¹ã³ããã¿ã¹ã¯ãã¥ãŒã管çããŸãã
- å®éã«çµ±åãè¡ããããµãŒããŒãèŠã€ãããšãŒãžã§ã³ããä»»æã®æ°å®è¡ã§ããŸãã
- Dockerã¯ã©ãã«ã§ããããŸãã ããã«ã¯é·æãšçæããããŸãã ããšãã°ããããŒã³ãšDockerã®ãžã£ã³ã¯ã·ã§ã³ã§çæãèžããš ã楜ãã嚯楜ãä¿èšŒãããŸãã
AWSå éš
ãã¹ãŠã¯ã ãããŒã³ãµãŒããŒãå®è¡ãããŠããå°ããªt2.microã€ã³ã¹ã¿ã³ã¹ã§å§ãŸããŸããã
ãŸãããšãŒãžã§ã³ãã®å Žåã èªåã¹ã±ãŒãªã³ã°ã°ã«ãŒãã確ç«ãããŸããïŒä»¥éã ASGãšåŒã³ãŸãïŒã ç§ã¯ã圌ãã®ããã«ä»äºããã£ããšãã ãããšãŒãžã§ã³ããç¶æãããã£ãã ããã¯ãæè¿EC2ã®1ç§ãããã®é¢çšçãé«ããšããäºå®ã«ç §ãããŠç¹ã«é åçã§ã ã
ã¹ã±ãŒã©ãŒ
ãASGãã£ãã·ãã£ã®ç®¡çæ¹æ³ããšãã質åãçãããšãã«ãèå³æ·±ãããšãå§ãŸããŸããã æšæºã®ãããã»ããµè² è·ã®å Žåã«è¿œå ãæ段ã¯é©åã§ã¯ãããŸããã Droneãã¥ãŒãç£èŠãããã¥ãŒã倧ãããªã£ãããšãŒãžã§ã³ããè¿œå ãããã¥ãŒã解決ããããšãŒãžã§ã³ããéãã«ãªãã«ããå¿ èŠããããŸãã
ãã®ããããŠãŒãã£ãªãã£ã®ã³ãŒãããŒã ã¯scalerã§ãã .NET Coreã§ïŒãã®ãããªæ©äŒãããå ŽåãCïŒã«æµæã§ããŸããïŒã
ã¹ã±ãŒã©ãŒã¯ã次ã®åçŽãªã«ãŒããå®è£ ããŸãã
- Drone REST APIãä»ããŠãã¥ãŒãèªã¿åããŸãã
- å®è¡äž+ä¿çäžã®åèšãå®è¡äžã®ãšãŒãžã§ã³ãæ°ã«å¯åºŠä¿æ°ããšãŒãžã§ã³ããããã®ãžã§ãããä¹ããå€ãè¶ ããå ŽåãAWS REST APIã䜿çšããŠå®¹éãå¢ãããŸãïŒç¹å®ã®å¶éãŸã§ïŒã
- ãã®éã®å Žåããœããçµäºã®ãªã¯ãšã¹ããæãå€ããšãŒãžã§ã³ãã«éä¿¡ããŸãã
äž»ãªãã¥ã¢ã³ã¹ã¯ã容éãååŸããŠåæžããããšã¯ã§ããªããšããããšã§ãã ãããè¡ããããšããšãŒãžã§ã³ãã€ã³ã¹ã¿ã³ã¹ã¯ãŸã ããžãŒç¶æ ã®éã«è¿æžãããå¯èœæ§ããããããã¯ãããããŸã³ããã«ãã®åœ¢æãŸã§åŠå®çãªçµæã«ã€ãªãããŸã ã
ãã®ç¹ã§ãASGã¯Scale Inã€ã³ã¹ã¿ã³ã¹ããã®ä¿è·ãèµ·åãã容éãæããã«æžå°ããããšã¯ãããŸããã ãšãŒãžã§ã³ããéè·ã®åè£ã«ãªããšããã«ãã¹ã±ãŒã©ãŒã¯åœŒãã°ã«ãŒãããé€å€ãïŒãã¿ããïŒã SSMãä»ããŠãã®ã³ãã³ãã·ãŒã±ã³ã¹ãéä¿¡ããŸã ã SIGINT
ã·ã°ãã«ã¯ãæ°ããã¿ã¹ã¯ãåŒãåããŠã¯ãªãããæ¢åã®ã¿ã¹ã¯ã®å®äºãåŸ
ã£ãŠããçµäºããããšããšãŒãžã§ã³ãã«ç解ãããŸãã ãããã£ãŠããšãŒãžã§ã³ãã¯èã«çœ®ããå¹³åçã«åœŒã®æ¥åãå®äºããé»æºãåããŸãã ã°ã«ãŒãã®äŸå€ã¯ã容éåæžãã©ã°ãèšå®ãããç¶æ
ã§è¡ãããŸããããã«ããããã¥ãŒããã£ã±ãã«ãªãå§ãããšãASGã¯ããã«æ°ãããšãŒãžã§ã³ããè¿œå ããæºåãã§ããŸãã
ASGã®å®¹éã管çããããšã«å ããŠãã¹ã±ãŒã©ãŒã¯è¿œå ã®ãã§ãã¯ãšæŸèæã§ãã³ã°ã¢ããããŸãã
- Stoppedç¶æ ã®ãšãŒãžã§ã³ãã«Terminateãéä¿¡ããŸã ã
- ããã¯äœããã®çç±ã§çãããé·çããããšãŒãžã§ã³ããæ¶ããŸãã
- ããã¯é·ãéå°éå¯èœæ§ãã§ãã¯ã«éããŠããªããšãŒãžã§ã³ããæ¶ããŸãã
- ãããŒã³åŽã®ãŸã³ãã®åœ¢æãç£èŠãããããã殺ããŸã ïŒæã楜ããå Žæã§ãïŒïŒ
- ãšãŒãžã§ã³ããå°ãªããšãæ°åéäœæ¥ã§ããããã«ããŸãã ããã¯ã察å¿ããã¹ããããªã¯ãšã¹ããããã«ãã£ã«ããç¶æ ã«ç§»è¡ããããã«å¿ èŠã§ãã äŸµå ¥ã®çµæãASGã¯ã€ã³ã¹ã¿ã³ã¹ãæ¢ã«å®è¡ãããŠããã¹ããããªã¯ãšã¹ãããã£ã³ã»ã«ããããšããããšããããŸãããã¹ããŒã¿ã¹ã¯ãŸã æŽæ°ãããŠããŸããã
ã€ã³ã¹ã¿ã³ã¹ïŒãªã³ããã³ãvs. ã¹ããã
æåã¯ããšãŒãžã§ã³ãã¯ãªã³ããã³ãã®c4.xlargeã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠããŸããã ããããã«æ倧4ã€ã®ãšãŒãžã§ã³ãããããŸãïŒ1ã³ã¢ããã1ãšãŒãžã§ã³ãã®å²åïŒã
ã·ã¹ãã ãå€ããå°ãªããåãå§ãããšããã«ããã¹ãããã€ã³ã¹ã¿ã³ã¹ã®ãªã¯ãšã¹ãããã§ãã¯ããã¯ã¹ããªã³ã«ããŠèšå®ãè©ŠããŸããã ããã¯ããŸãããããšãå€æããã ã¹ãããã€ã³ã¹ã¿ã³ã¹ã¯åžžã«ååšããããã€ã¯ã¢ãŠã§ã€ããããã€ã³ã¹ã¿ã³ã¹ãèŠãããšã¯ãããŸããïŒã¹ãããäŸ¡æ Œ=ãªã³ããã³ãäŸ¡æ ŒïŒã
ãããã®åäœã¯åŒãç¶ã芳å¯ããå¿ èŠããããå Žåã«ãã£ãŠã¯ãã¹ãããã§ã®ASGãšãªã³ããã³ãã§ã®ASGã®èªååãæ¿ãã«ãã蟌ãŸããŸãã
ãã£ãã·ã¥
ç¶ç¶çãªçµ±åã§ã¯ãåãDockerã€ã¡ãŒãžãšNPM / NuGetããã±ãŒãžãç¹°ãè¿ãããŠã³ããŒãããŸãã å€éšãã©ãã£ãã¯ãæžãããã€ã¡ãŒãžããã³ããã±ãŒãžã¬ãžã¹ããªã«ã¢ã¯ã»ã¹ã§ããªãæéã軜æžããããã«ãS3ã§ãã£ãã·ã³ã°ãå®è£ ããŸããã
Droneçšã®æ¢è£œã®ãããŒã³-s3-cacheãã©ã°ã€ã³ããããŸãããååãªèšå®ããªãã£ããããç§ã¯ããã䜿çšããŸããã§ããã ãã£ã¬ã¯ããªnode_modulesããã³dotnet_packagesãããŠã³ããŒã/埩å ããã«ã¯ãåçŽãªdrone-cache.shã¹ã¯ãªããã䜿çšããŸãã
S3ãã±ãããdevextreme-ci-cacheãã¯ãVPCå ããå¿åã§æžã蟌ãããšãã§ããããã«æ§æãããŠããŸãã ããã¯ãç§å¯éµã«ç ©ããããå¿ èŠããªããã䟿å©ã§ãã ãã ãããã®æ§æã§ã¯ãã¢ãŒã«ã€ããå¿åã§èªãããšãã§ããŸãã ããã±ãŒãžãã£ãã·ã¥ã«ã€ããŠã¯ãããã¯æãããããšã§ã¯ãããŸããããVPCã«ãã£ãŠèªã¿åããå¶éãããããã«ããªã·ãŒãæ§æããããšã¯ã§ããŸããã§ããããåæã«èš±å¯ããããŠãŒã¶ãŒããæš©å©ã奪ããŸããã åæ§ã®ç¶æ³ã«ã€ããŠã¯ãStackOverflowã§ãããšããã§èª¬æããŸã ã ãã®ã»ããã¢ããã«é¢ããã¢ã€ãã¢ãçµéšãããå Žåã¯ãã³ã¡ã³ãã§ãç¥ãããã ããïŒ
ãã£ãã·ã¥å ã®ã¢ãŒã«ã€ãã¯ããã©ãŒã¯ãã©ã³ãã«ãã£ãŠåºå¥ãããŸãã èšå®ãããæå¹æéã©ã€ããµã€ã¯ã«ã«ãŒã«ã®ãããã§ãæéåãã®ãªããžã§ã¯ãã¯S3ããèªåçã«åé€ãããŸãã
Dockerã€ã¡ãŒãžããã£ãã·ã¥ããããã«ã ã¬ãžã¹ããªã¯DroneãµãŒããŒã®æšªã«ãããã«ã¹ã«ãŒãã£ãã·ã¥ã¢ãŒãã§åäœããS3ã«BLOBãæ ŒçŽããŸãïŒ æ§æ ïŒã ã¬ãžã¹ããªã¯ãšãŒãžã§ã³ãã®ã»ãã¥ãªãã£ã°ã«ãŒãå ã§ã®ã¿äœ¿çšã§ãããšãŒãžã§ã³ãèªäœã¯ãã®ãã©ãŒã䜿çšããããã«æ§æãããŠããŸã ã éã¢ã¯ãã£ããªç»å/ã¬ã€ã€ãŒã¯ã7æ¥åŸã«èªåçã«ãã£ãã·ã¥ããåé€ãããŸãã
Https
ã·ã¹ãã ãå®è¡å¯èœã§ããããšãæããã«ãªã£ããšãããããŒã³ãµãŒããŒã¯nginxã®åŸãã«é ããŠããŸãã ã ãŠã§ããµã€ãããŒã ã¯ãElastic IP DroneãµãŒããŒãã¢ã¿ãããããµããã¡ã€ã³ãdevextreme-ci.devexpress.comãã芪åã«æäŸããŠãããŸããã ãµããã¡ã€ã³ã®å Žåã èªåæŽæ°ã䜿çšããŠLet's Encryptã䜿çšããŠHTTPSãæ§æããŸããã
å°èš
Droneã¯ãGitHubã®DevExtremeãªããžããªã®AWSã¯ã©ãŠãã«4é±éãããŸãã ããŒã ã¯å¹žãã§ãã ããããŒã³ã¯ã©ãã§ããïŒããšãã質åã«å¯Ÿã㊠åºæ¬çã«ã圌ãã¯ãç«äºïŒéããå£ã²ããçãããã®ã§ã¯ãªãããšèšããŸãïŒããããå£ã²ã=ãã©ãã¹ïŒã ãã¡ãããAWSã®ãªãœãŒã¹ã¯Travis CIãšã¯ç°ãªããç¡æã§ã¯ãããŸãããæ°ããCIã®ã³ã¹ãã¯ãŸã ããããŸãããã[ TODOã¯ãã®ã¢ãã¥ãŒãºã¡ã³ããæ£åœåããããã«äœãæžãããèããŠããŸã ]ã
çå£ã«ãçå®ã¯äžç·ã«åãã®ããã楜ãããªããŸããã æ¥ãã§ãã«ãªã¯ãšã¹ããæµããŠãããšããCIãã¥ãŒãåŸ æ©ããŠããéãç§ãã¡ã¯ãã座ã£ãŠããŸããïŒä¿¡ããããŸããïŒã åæã«ãAWSãªãœãŒã¹ã®ã³ã¹ãã¯äœ¿çšã®åŒ·åºŠã«çŽæ¥äŸåããŸãã éã¢ã¯ãã£ããªæéïŒããšãã°ã幎æ«å¹Žå§ãªã©ïŒã«ã¯ã1ã€ã®t2.microã€ã³ã¹ã¿ã³ã¹ã®ã¿ãå®è¡ããããšãŒãžã§ã³ãããªãã«ãªãããã£ãã·ã¥ãã¯ãªã¢ãããŸãã äžèšã§èšãã°ãç§ãã¡ã¯èªåãã¡ã®å©çã®ããã«ã¯ã©ãŠãæè¡ã䜿çšããŠãããšä¿¡ãããã§ãã
ãããŒã³ãè©ŠããŸãããïŒ ããªãã®å°è±¡ã¯ïŒ ã¯ã©ãŠãã«ç¶ç¶çã«çµ±åããããã«ããããŸãã¯ä»ã®ãã©ãããã©ãŒã ãå±éããŸãããïŒ ã³ã¡ã³ãã§æããŠãã ããïŒ