Goããã¯ãšã³ãã®CI/CDïŒãã«ãããã¹ãããã€ã°ã¬ãŒã·ã§ã³ããããã€
Goããã¯ãšã³ãåãCI/CDïŒãã«ãããã¹ãããã€ã°ã¬ãŒã·ã§ã³ãKubernetesãVMãžã®å®å šãªãããã€ã®ããã®å®è·µçãªãã€ãã©ã€ã³æé ïŒäºæž¬å¯èœãªç°å¢ãåæïŒã

Goããã¯ãšã³ãã«ãšã£ãŠCI/CDãéèŠãªçç±
æåã®ãããã€ã¯ãã€ãŸããªãç¹°ãè¿ããã¹ã§å€±æããŸãã誰ããããŒã«ã«ã§å¥ã®GoããŒãžã§ã³ã§ãã«ãããããç°å¢å€æ°ãå¿ãããããã€ã°ã¬ãŒã·ã§ã³ãé£ã°ããããééã£ããµãŒãã¹ãåèµ·åãããããŸãããªãªãŒã¹ã¯ãèªåã®ç°å¢ã§ã¯åããããã©æ¬çªã§ã¯åããããŠãŒã¶ãŒãæ°ã¥ããŠåããŠåé¡ãçºèŠããŸãã
çæãããã³ãŒãã ãããšãã£ãŠãªãªãŒã¹ã®èŠåŸãäžèŠã«ãªãããã§ã¯ãããŸãããèŠä»¶ãæŽæ°ããŠããã¯ãšã³ããåçæãããšãæ°ãããšã³ããã€ã³ããããŒã¿åœ¢ãäŸåé¢ä¿ãå°å ¥ãããããšããããæã§ã³ãŒããè§Šã£ãŠããªããŠãå·®åãåºãŸãããŸãã«ãããããšãã«ãã€ãã©ã€ã³ãå®å šæµã®ããã«åããŠã»ããã®ã§ãïŒãã¹ãŠã®å€æŽã¯æ¯ååããã§ãã¯ãéããŸãã
äºæž¬å¯èœãªç°å¢ãšã¯ããã«ããšãããã€ã®ã¹ããããååãã€ããŠåçŸã§ããæ¡ä»¶ã§åãããšã§ããããã€ãã®ã«ãŒã«ã§å€§éšåã¯ã«ããŒã§ããŸãïŒ
- ããŒãžã§ã³ãåºå®ããïŒGoããŒã«ãã§ãŒã³ãããŒã¹ã€ã¡ãŒãžãOSããã±ãŒãžïŒã
- äžåºŠãã«ãããŠãåãã¢ãŒãã£ãã¡ã¯ããã©ãã«ã§ããããã€ããã
- èšå®ã¯ãã€ããªã®å€ã«çœ®ãïŒç°å¢å€æ°ãç°å¢ããšã®èšå®ãã¡ã€ã«ïŒã
- ãã¹ãŠã®ç°å¢ã§åããã€ã°ã¬ãŒã·ã§ã³ããŒã«ãšããã»ã¹ã䜿ãã
- ããŒã«ããã¯ãçŸå®ã«ããïŒåã®ã¢ãŒãã£ãã¡ã¯ããä¿æããDBãã©ããªãããç¥ã£ãŠããã
Goããã¯ãšã³ãåãã®CI/CDã®ç®çã¯ãåãªãèªååã§ã¯ãªããåçŸå¯èœã§ã¹ãã¬ã¹ã®å°ãªããªãªãŒã¹ã§ãïŒåçæããŠãã€ãã©ã€ã³ãåããåºãŠãããã®ããããã€å¯èœã ãšä¿¡é Œã§ããããšã
AppMasterã®ãããªãžã§ãã¬ãŒã¿ïŒAppMasterãappmaster.ioïŒã䜿ã£ãŠGoããã¯ãšã³ããçæããå Žåããããããã«éèŠã«ãªããŸããåçæã¯äŸ¿å©ãªæ©èœã§ããã倿Žããæ¬çªãŸã§ã®éçãäžè²«ããŠãã¹ãããåçŸå¯èœã§ãããšãã«ã ãå®å šã«æããããŸãã
ã©ã³ã¿ã€ã ãéžã³ãâäºæž¬å¯èœâãäºåã«å®çŸ©ãã
âäºæž¬å¯èœâãšã¯ãåãå ¥åãã©ãã§å®è¡ããŠãåãçµæãçãããšãæå³ããŸããGoããã¯ãšã³ãã®CI/CDã§ã¯ããŸãéçºã»ã¹ããŒãžã³ã°ã»æ¬çªã§äœãåäžã«ä¿ã€ãåæãããšããããå§ããŸãã
éåžžã®é亀æžé ç®ã¯ãGoã®ããŒãžã§ã³ãããŒã¹OSã€ã¡ãŒãžããã«ããã©ã°ãèšå®ã®èªã¿èŸŒã¿æ¹æ³ã§ããã©ãããç°å¢ããšã«å€ãããšãTLSã®æåãéã£ãããã·ã¹ãã ããã±ãŒãžãè¶³ããªãã£ãããæ¬çªã§ããåºãªããã°ãçããŸãã
ç°å¢å·®åã¯å€§æµæ¬¡ã®å Žæã«çŸããŸãïŒ
- OSãšã·ã¹ãã ã©ã€ãã©ãªïŒãã£ã¹ããã®çéããCAèšŒææžã®æç¡ãã¿ã€ã ãŸãŒã³å·®ïŒ
- èšå®å€ïŒãã£ãŒãã£ãŒãã©ã°ãã¿ã€ã ã¢ãŠããèš±å¯ãªãªãžã³ãå€éšãµãŒãã¹ã®URLïŒ
- ããŒã¿ããŒã¹ã®åœ¢ãšèšå®ïŒãã€ã°ã¬ãŒã·ã§ã³ãæ¡åŒµãç §åé åºãæ¥ç¶äžéïŒ
- ã·ãŒã¯ã¬ããã®æ±ãïŒä¿ç®¡å ŽæãããŒããŒã·ã§ã³æ¹æ³ã誰ãèªãããïŒ
- ãããã¯ãŒã¯ã®åæïŒDNSããã¡ã€ã¢ãŠã©ãŒã«ããµãŒãã¹ãã£ã¹ã«ããªïŒ
KubernetesãšVMã®ã©ã¡ããéžã¶ãã¯ãã©ã¡ããæé©ããã§ã¯ãªããããŒã ãèœã¡çããŠéçšã§ããããéèŠã§ãã
Kubernetesã¯ãªãŒãã¹ã±ãŒãªã³ã°ãããŒãªã³ã°ã¢ããããŒãã倿°ã®ãµãŒãã¹ãæšæºåããŠå®è¡ãããå Žåã«é©ããŠããŸãããŸããPodãåãã€ã¡ãŒãžããåãããäžè²«æ§ãé«ããŸããVMã¯ãµãŒãã¹ãäžã€ãå°æ°ã§ããŒã ãå°ãããæ§æèŠçŽ ãæžããããå Žåã«æå¹ã§ãã
ã©ã³ã¿ã€ã ãç°ãªã£ãŠããã€ãã©ã€ã³ãåãã«ä¿ã€ããšã¯å¯èœã§ããã¢ãŒãã£ãã¡ã¯ããšãã®åšå²ã®å¥çŽãæšæºåããã°ããäŸãšããŠïŒCIã§åžžã«åãã³ã³ããã€ã¡ãŒãžããã«ãããåããã¹ããèµ°ãããåããã€ã°ã¬ãŒã·ã§ã³ãã³ãã«ãå ¬éããããããã€ã®å®è£ ã ãå€ããïŒKubernetesãªãã€ã¡ãŒãžã¿ã°ãåœãŠæ¿ããVMãªãã€ã¡ãŒãžããã«ããŠãµãŒãã¹ãåèµ·åããã
å®çšäŸïŒããŒã ãAppMasterã§Goããã¯ãšã³ããåçæããã¹ããŒãžã³ã°ã¯Kubernetesãæ¬çªã¯çŸæç¹ã§VMã䜿ããšããŸããäž¡æ¹ããŸã£ããåãã€ã¡ãŒãžãåŒããåãçš®é¡ã®ã·ãŒã¯ã¬ããã¹ãã¢ããèšå®ãèªã¿èŸŒããªããâç°ãªãã©ã³ã¿ã€ã âã¯ãããã€ã®è©³çްã«éããããã°ã®åå ã«ã¯ãªããŸãããAppMasterïŒappmaster.ioïŒã䜿ã£ãŠããå Žåããã®ã¢ãã«ã¯ç®¡çãããã¯ã©ãŠãã¿ãŒã²ããã«ãããã€ãããããœãŒã¹ããšã¯ã¹ããŒãããŠèªåã®ã€ã³ãã©ã§åããã€ãã©ã€ã³ãåããã©ã¡ãã«ãé©åããŸãã
誰ã«ã§ã説æã§ããã·ã³ãã«ãªãã€ãã©ã€ã³å³
äºæž¬å¯èœãªãã€ãã©ã€ã³ã¯èª¬æãç°¡åã§ãïŒã³ãŒãããã§ãã¯ããŠããã«ãããŠãåäœã蚌æãããã¹ãããã®ãšåããã®ãåºè·ããæ¯ååãæ¹æ³ã§ãããã€ãããããã¯ãšã³ããåçæããå ŽåïŒããšãã°AppMasterããïŒã倿Žã倿°ã®ãã¡ã€ã«ã«åã¶ããšããããè¿ éã§äžè²«ãããã£ãŒãããã¯ãããéèŠã«ãªããŸãã
ã·ã³ãã«ãªGoããã¯ãšã³ãåãCI/CDã®æµãã¯æ¬¡ã®éãã§ãïŒ
- Lintãšåºæ¬ãã§ãã¯
- ãã«ã
- ãŠããããã¹ã
- çµ±åãã§ãã¯
- ããã±ãŒãžåïŒäžå€ã®ã¢ãŒãã£ãã¡ã¯ãïŒ
- ãã€ã°ã¬ãŒã·ã§ã³ïŒå¶åŸ¡ãããã¹ãããïŒ
- ãããã€
倱æãæ©ãæ¢ãŸãããã«æ§æããŠãã ãããlintã§å€±æããããã以éã¯äœãèµ°ããªãã¹ãã§ãããã«ãã倱æããããçµ±åãã§ãã¯çšã«DBãèµ·åãããããªç¡é§ã¯é¿ããŸããããã§ã³ã¹ããäžãããã€ãã©ã€ã³ãéãæããããŸãã
ãã¹ãŠã®ã¹ãããããã¹ãŠã®ã³ãããã§èµ°ãããå¿ èŠã¯ãããŸãããäžè¬çãªåãæ¹ã¯ïŒ
- ãã¹ãŠã®ã³ããã/PRïŒlintããã«ãããŠããããã¹ã
- mainãã©ã³ãïŒçµ±åãã§ãã¯ãããã±ãŒãžå
- ãªãªãŒã¹ã¿ã°ïŒãã€ã°ã¬ãŒã·ã§ã³ããããã€
ã¢ãŒãã£ãã¡ã¯ããšããŠäœãä¿æãããæ±ºããŠãã ãããéåžžã¯ã³ã³ãã€ã«æžã¿ãã€ããªãã³ã³ããã€ã¡ãŒãžïŒãããã€å¯Ÿè±¡ïŒãšããã€ã°ã¬ãŒã·ã§ã³ãã°ããã¹ãã¬ããŒãã§ãããããæ®ããŠãããšããŒã«ããã¯ãç£æ»ãç°¡åã«ãªããŸããã©ã®ã¢ãŒãã£ãã¡ã¯ãããã¹ãããããã¢ãŒããããããæ£ç¢ºã«ç€ºããããã§ãã
ã¹ããã詳现ïŒå®å®ã§åçŸå¯èœãªãã«ã段é
ãã«ã段éã¯äžã€ã®åãã«çããã¹ãã§ãïŒä»æ¥ãææ¥ãå¥ã®ã©ã³ããŒã§ãåããã€ããªãäœãããããããã§ããªããšãåŸã®å šãŠã®ã¹ãããïŒãã¹ãããã€ã°ã¬ãŒã·ã§ã³ããããã€ïŒã¯ä¿¡é Œã§ããªããªããŸãã
ãŸãç°å¢ãåºå®ããŸããåºå®ã®GoããŒãžã§ã³ïŒäŸ: 1.22.xïŒãšåºå®ã®ã©ã³ããŒã€ã¡ãŒãžïŒLinuxãã£ã¹ãããšããã±ãŒãžã®çïŒã䜿ãããlatestãã¿ã°ã¯é¿ããŸããlibcãGitãGoããŒã«ãã§ãŒã³ã®å°ããªå·®åã§ãèªåã®ç°å¢ã§ã¯åããåé¡ãçãããããã°ãåä»ã«ãªããŸãã
ã¢ãžã¥ãŒã«ãã£ãã·ã¥ã¯é床åäžã«ãªããŸãããçå®ã®ãœãŒã¹ã§ã¯ãããŸãããGoãã«ããã£ãã·ã¥ãã¢ãžã¥ãŒã«ããŠã³ããŒããã£ãã·ã¥ã¯äœ¿ãã€ã€ããgo.sumã§ããŒãåãïŒäŸåãå€ãã£ããmainã§ã¯ãªã¢ããïŒãªã©ããŠãæ°ããäŸåã¯ã¯ãªãŒã³ã«ããŠã³ããŒããããããã«ããŸãã
ã³ã³ãã€ã«ã®åã«çæéã§æžãã²ãŒããå ¥ããŠãã ãããéçºè ãåé¿ããªãããã«çããŠçŽ æ©ããã§ãã¯ãæãŸãããå žåçã«ã¯ gofmtãã§ãã¯ãgo vetãå¯èœãªãstaticcheck ãå ¥ããŸããçææžã¿ãã¡ã€ã«ã®æ¬ èœãå€ããæ€åºããŠå€±æãããã®ãéèŠã§ããåçæãããã³ãŒãããŒã¹ã§ããããåé¡ã§ãã
åçŸå¯èœã«ã³ã³ãã€ã«ããããŒãžã§ã³æ å ±ãåã蟌ã¿ãŸãã-trimpath ã®ãããªãã©ã°ãã-ldflagsã§ã³ãããSHAããã«ãæå»ãæ³šå ¥ããæ¹æ³ããããŸãããµãŒãã¹ããšã«äžã€ã®ååä»ãã¢ãŒãã£ãã¡ã¯ããçæãããšãKubernetesãVMäžã§äœãåããŠããã远跡ãããããªããŸããåçæããå Žåã¯ç¹ã«æå¹ã§ãã
ã¹ããã詳现ïŒãããã€åã«åé¡ãèŠã€ãããã¹ã
ãã¹ãã¯æ¯ååãæ¹æ³ã§å®è¡ãããŠåããŠåœ¹ã«ç«ã¡ãŸãããŸãã¯éããã£ãŒãããã¯ãåªå ãããã®ããšã§äºæž¬å¯èœãªæéå ã«çµããæ·±ããã§ãã¯ã远å ããŸãã
ã³ãããããšã«ãŠããããã¹ããèµ°ãããããŒãã¿ã€ã ã¢ãŠããèšå®ããŠãã¹ãããã³ã°ããããã€ãã©ã€ã³å šäœãæ¢ããããšãã«ãã¬ããžã®ãååãããããŒã ã§æ±ºããŠãããšããã§ãããã«ãã¬ããžèªäœã¯ç®çã§ã¯ãªãæäœéã®åºæºã瀺ããã®ã§ãã
å®å®ãããã¹ã段éã®äŸïŒ
go test ./...ãããã±ãŒãžããšã®ã¿ã€ã ã¢ãŠããšã°ããŒãã«ãªãžã§ãã¿ã€ã ã¢ãŠãã§å®è¡- ã¿ã€ã ã¢ãŠãã«éãããã¹ãã¯å®éã®ãã°ãšããŠæ±ã
- éèŠããã±ãŒãžïŒauth, billing, permissionsïŒã ãã«ã«ãã¬ããžæåŸ å€ãèšå®
- åæå®è¡ãæ±ãã³ãŒãã«ã¯ã¬ãŒã¹ããã¯ã¿ã远å ïŒãã¥ãŒããã£ãã·ã¥ããã¡ã³ã¢ãŠãã¯ãŒã«ãŒãªã©ïŒ
ã¬ãŒã¹ããã¯ã¿ã¯æçšã§ãããã«ããå€§å¹ ã«é ãããŸããPRããã€ããªãŒãã«ãããããã¯éžæããããã±ãŒãžã ãã§èµ°ãããã®ãçŸå®çãªæè¡·æ¡ã§ãã
ãã¬ãŒã¯ãããã¹ãã¯ãã«ãã倱æãããã¹ãã§ããã©ãããŠãéé¢ããå¿ èŠããããªããå¥ãžã§ãã«ç§»ããŠå¯èŠåãããŸãŸã«ãããªãŒããŒãšä¿®æ£æéãå¿ é ã«ããŠãã ããã
ãããã°ã®ããã«ãã¹ãåºåãä¿åããŠãããŸããçãã°ãšç°¡æœãªã¬ããŒãïŒååŠãæèŠæéãé ããã¹ãäžäœïŒãæ®ããšãç¹ã«åçæã§å€ãã®ãã¡ã€ã«ã«è§Šãã倿Žã®ååž°ãèŠã€ãããããªããŸãã
çµ±åãã§ãã¯ïŒå®éã®äŸåé¢ä¿ã䜿ãã€ã€éããä¿ã€
ãŠããããã¹ãã¯ã³ãŒãåäœã§åãããšã確èªããŸããçµ±åãã§ãã¯ã¯ãµãŒãã¹å šäœãèµ·åããŠå®éã®ãµãŒãã¹ã«æ¥ç¶ããæ£ããæ¯ãèããã確èªããŸããããã¯ãã¹ãŠãç¹ãã£ããšãã«ããåºãªãåé¡ãæãŸããå®å šç¶²ã§ãã
å¿ èŠãªããšãã§ã¡ã©ã«ãªäŸåïŒäžæçãªPostgreSQLãRedisãªã©ïŒããžã§ãããšã«ç«ã¡äžããŸããæ¬çªã«è¿ãããŒãžã§ã³ã䜿ããŸããããã¹ãŠã®æ¬çªè©³çްãã³ããŒããå¿ èŠã¯ãããŸããã
è¯ãçµ±åæ®µéã¯æå³çã«å°ããããŸãïŒ
- æ¬çªã«è¿ãç°å¢å€æ°ã§ãµãŒãã¹ãèµ·åïŒãã¹ãçšã·ãŒã¯ã¬ããã䜿çšïŒ
- ãã«ã¹ãã§ãã¯ãæ€èšŒïŒäŸïŒ/healthã200ãè¿ãïŒ
- éèŠãªãšã³ããã€ã³ãã1ã2ä»¶åŒãã§ã¹ããŒã¿ã¹ã³ãŒããšã¬ã¹ãã³ã¹åœ¢ç¶ã確èª
- PostgreSQLïŒå¿ èŠãªãRedisïŒãžæ¥ç¶ã§ããããšã確èª
APIå¥çŽãã§ãã¯ã¯ãå£ãããšãã«æã圱é¿ã倧ãããšã³ããã€ã³ãã«éäžããŸãã400ã§å¿ é ãã£ãŒã«ããæåŠããããèªèšŒãå¿ èŠãªãšãã¯401ãè¿ããããããŒãã¹ã¯200ã§æåŸ ãããJSONããŒãå«ãããªã©ã®å°æ°ã®çå®ã§ååã§ãã
çµ±åãã¹ããé »ç¹ã«åããé床ã«ä¿ã€ã«ã¯ãã¹ã³ãŒããçµããæéãå¶åŸ¡ããŠãã ãããå°ããªããŒã¿ã»ããã䜿ã£ãäžã€ã®DBã§ãæ°ä»¶ã®ãªã¯ãšã¹ãã ãå®è¡ããèµ·åããã³ã°ãããç§åäœã§å€±æãããŸãã
AppMasterã§ããã¯ãšã³ããåçæããå Žåããããã®ãã§ãã¯ã¯ç¹ã«éèŠã§ããåçæããããµãŒãã¹ãåé¡ãªãèµ·åããããã³ããšã³ããæåŸ ããAPIãæäŸããŠããããšã確èªããŠãããŸãã
ããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ïŒé åºãã²ãŒããããŒã«ããã¯ã®çŸå®
ãŸããã€ã°ã¬ãŒã·ã§ã³ãã©ãã§å®è¡ãããæ±ºããŸããCIã§å®è¡ããŠæ©æã«ãšã©ãŒãæãŸããã®ã¯æå¹ã§ãããCIãæ¬çªã«è§Šããã¹ãã§ã¯ãªãããšãå€ãã§ããå€ãã®ããŒã ã¯ãããã€äžã«ãã€ã°ã¬ãŒã·ã§ã³ãå®è¡ãããããããã€åã«å®äºãããç¬ç«ãããmigrateããžã§ãã䜿ããŸãã
å®è·µçãªã«ãŒã«ã¯ïŒCIã§ãã«ããšãã¹ããè¡ãããã€ã°ã¬ãŒã·ã§ã³ã¯æ¬çªã«è¿ãç°å¢ãšè³æ Œæ å ±ã§å®è¡ãããKubernetesãªãã¯ã³ãªãã®JobãVMãªããªãªãŒã¹æé å ã®ã¹ã¯ãªãããäžè¬çã§ãã
é åºã¯äºæ³ä»¥äžã«éèŠã§ããã¿ã€ã ã¹ã¿ã³ãä»ããã¡ã€ã«ãé£çªã䜿ãããé çªã«äžåºŠã ãé©çšãã匷å¶ããŠãã ãããå¯èœãªããã€ã°ã¬ãŒã·ã§ã³ãåªçã«ããŠãå詊è¡ããŠãéè€ãéäžã¯ã©ãã·ã¥ãåŒãèµ·ãããªãããã«ããŸãã
ãã€ã°ã¬ãŒã·ã§ã³æŠç¥ã¯ã·ã³ãã«ã«ä¿ã¡ãŸãïŒ
- ãŸãã¯è¿œå çãªå€æŽãåªå ããïŒããŒãã«/ã«ã©ã ã®è¿œå ãNULL蚱容ã«ã©ã ãæ°ããã€ã³ããã¯ã¹ïŒ
- 次ã®ãªãªãŒã¹ã§ã¯æ°æ§ã¹ããŒãã®äž¡æ¹ã«èããããã³ãŒãããããã€ãã
- ãã®åŸã§å¶çŽã®åé€ãNOT NULLåãªã©ãè¡ã
- é·æéãããæäœã¯å®å šã«è¡ãïŒãµããŒããããã°ã€ã³ããã¯ã¹ã¯äžŠåäœæãªã©ïŒ
äœãå®è¡ããåã«ã»ãŒããã£ã²ãŒããå
¥ããŠãã ãããäŸãã°åäžå®è¡ã®ããŒã¿ããŒã¹ããã¯ãããç Žå£ç倿Žã¯æ¿èªãå¿
èŠããšãã£ãããªã·ãŒã§ãããã€ãã©ã€ã³ã DROP TABLE ã DROP COLUMN ãå«ããã€ã°ã¬ãŒã·ã§ã³ãæ€åºããããæ¬çªã§ã¯æåæ¿èªãå¿
èŠã«ãªãããã«ãããšããã§ãããã
ããŒã«ããã¯ã¯å³ããçŸå®ã§ãïŒå€ãã®ã¹ããŒã倿Žã¯å ã«æ»ããŸãããåãåé€ãããããŒã¿ã¯æ»ããŸãããããŠã³ãã€ã°ã¬ãŒã·ã§ã³ã¯æ¬åœã«å®å šãªå Žåã ãçšæããããã§ãªãå Žåã¯ããã¯ã¢ãããšååããªä¿®æ£ã«é Œãèšç»ãç«ãŠãŠãã ããã
åãã€ã°ã¬ãŒã·ã§ã³ã«ã¯åŸ©æ§èšç»ãä»ããŸãïŒéäžã§å€±æãããã©ãããããã¢ããªãããŒã«ããã¯ããå¿ èŠããããšãã«ã©ã察å¿ããããAppMasterã®ããã«Goããã¯ãšã³ããçæããŠããå Žåããã€ã°ã¬ãŒã·ã§ã³ã¯ãªãªãŒã¹å¥çŽã®äžéšãšããŠæ±ããçæãããã³ãŒããšã¹ããŒããåæããããã«ããŠãã ããã
ããã±ãŒãžåãšèšå®ïŒä¿¡é Œã§ããã¢ãŒãã£ãã¡ã¯ã
ãããã€ãããã®ãåžžã«ãã¹ããããã®ãšåãã§ãããšãã«ããã€ãã©ã€ã³ã¯äºæž¬å¯èœã«æããããŸããããã¯ããã±ãŒãžã³ã°ãšèšå®ã«ããã£ãŠããŸãããã«ãåºåãå°å°ãããã¢ãŒãã£ãã¡ã¯ããšã¿ãªããç°å¢å·®åã¯ãã¹ãŠå€ã«çœ®ããŸãã
ããã±ãŒãžåã®éçã¯äž»ã«2ã€ã§ããKubernetesã«ãããã€ãããªãã³ã³ããã€ã¡ãŒãžãããã©ã«ãã§ããOSã¬ã€ã€ãŒãåºå®ãããŒã«ã¢ãŠããäžè²«ãããŸããVMåããã³ãã«ã§ããã³ã³ãã€ã«æžã¿ãã€ããªãšã©ã³ã¿ã€ã ã«å¿ èŠãªæå°éã®ãã¡ã€ã«ïŒCAèšŒææžããã³ãã¬ãŒããéçè³ç£ãªã©ïŒãå«ããæ¯ååãæ¹æ³ã§ãããã€ããã°åçã«ä¿¡é Œã§ããŸãã
èšå®ã¯ãã€ããªã«çŒã蟌ãŸãå€éšã«çœ®ããŸãã倧éšåã®èšå®ã«ã¯ç°å¢å€æ°ã䜿ãïŒããŒããDBãã¹ãããã£ãŒãã£ãŒãã©ã°ïŒãé·ãæ§é åãããå€ã ãèšå®ãã¡ã€ã«ã«ããŸããèšå®ãµãŒãã¹ã䜿ããªãããããäŸåãšããŠæ±ããã¢ã¯ã»ã¹å¶åŸ¡ãšç£æ»ãã°ããã©ãŒã«ããã¯ãæç¢ºã«ããŸãã
ã·ãŒã¯ã¬ããã¯çµ¶å¯Ÿã«è¶ããŠã¯ãããªãç·ã§ãããªããžããªã«ãã€ã¡ãŒãžã«ãCIãã°ã«ã眮ããªãã§ãã ãããèµ·åæã«æ¥ç¶æååãåºåããªãããã«ããCIã®ã·ãŒã¯ã¬ããã¹ãã¢ã«ä¿åããŠãããã€æã«æ³šå ¥ããŸãã
ã¢ãŒãã£ãã¡ã¯ãã远跡å¯èœã«ããããããã¹ãŠã®ãã«ãã«è奿 å ±ãåããŸãïŒã³ãããSHAä»ãã§ã¿ã°ä»ããããã«ãã¡ã¿ããŒã¿ïŒããŒãžã§ã³ãã³ãããããã«ãæå»ïŒãinfoãšã³ããã€ã³ãã«å«ãããããã€ãã°ã«ã¢ãŒãã£ãã¡ã¯ãã¿ã°ãèšé²ãããããã§ãä»åããŠããã®ã¯äœãããäžã€ã®ã³ãã³ããããã·ã¥ããŒãã§çããããŸãã
AppMasterã§Goããã¯ãšã³ããçæããŠããå Žåããã®èŠåŸã¯ããã«éèŠã§ãïŒåçæãå®å šãªã®ã¯ãã¢ãŒãã£ãã¡ã¯ãåä»ããšèšå®ã«ãŒã«ãæ¯åã®ãªãªãŒã¹ãåçŸããããããŠãããšãã§ãã
KubernetesãVMãžã®ãããã€æã®ãµãã©ã€ãºãé¿ãã
å€ãã®ãããã€å€±æã¯ãæªãã³ãŒããã§ã¯ãªããç°å¢ã®äžäžèŽãåå ã§ãïŒèšå®ã®éããã·ãŒã¯ã¬ããã®æ¬ åŠãèµ·åã¯ãããå®éã«ã¯æºåãã§ããŠããªããµãŒãã¹ãªã©ãç®æšã¯ã·ã³ãã«ã§ãïŒåãã¢ãŒãã£ãã¡ã¯ãããã¹ãŠã®ç°å¢ã§ãããã€ããå€ããã®ã¯èšå®ã ãã«ããããšã
KubernetesïŒã³ã³ãããŒã«ãããããŒã«ã¢ãŠããšããŠæ±ã
Kubernetesã§ã¯ã³ã³ãããŒã«ãããããŒã«ã¢ãŠããç®æããŸããããŒãªã³ã°ã¢ããããŒãã䜿ã£ãŠåŸã ã«Podã眮ãæãããªãŒããã¹ãšã©ã€ããã¹ã®ãã§ãã¯ã远å ããŠãã©ãããã©ãŒã ããã©ãã£ãã¯éä¿¡ããã³ã°ããã³ã³ããã®åèµ·åã倿ã§ããããã«ããŸãããªãœãŒã¹ã®requestsãšlimitsãéèŠã§ããCIã®å€§ããªã©ã³ããŒã§éã£ãŠããå°ããªããŒãã§OOMãã«ãããããšããããŸãã
èšå®ãšã·ãŒã¯ã¬ããã¯ã€ã¡ãŒãžã®å€ã«çœ®ããŸããã³ãããããšã«äžã€ã®ã€ã¡ãŒãžããã«ãããç°å¢ããšã®èšå®ã¯ãããã€æã«æ³šå ¥ïŒConfigMapsãSecretsããŸãã¯ã·ãŒã¯ã¬ãããããŒãžã£ïŒããŸãããããããšã¹ããŒãžã³ã°ãšæ¬çªã¯åããã€ããªã§åããŸãã
VMïŒsystemdã§ååãªããšãå€ã
ä»®æ³ãã·ã³ã«ãããã€ããå Žåãsystemdãå°ããªãªãŒã±ã¹ãã¬ãŒã¿ã®åœ¹ãæãããŸããäœæ¥ãã£ã¬ã¯ããªãç°å¢ãã¡ã€ã«ãåèµ·åããªã·ãŒãæç¢ºã«ãããŠããããã¡ã€ã«ãäœæããstdout/stderrããã°ã³ã¬ã¯ã¿ãjournaldã«éãããã«ããŠãã€ã³ã·ãã³ãæã«SSHã§æ¢çŽ¢ããäºæ ãé¿ããŸãã
ã¯ã©ã¹ã¿ããªããŠãå®å šãªããŒã«ã¢ãŠãã¯å¯èœã§ãããã«ãŒ/ã°ãªãŒã³æ¹åŒã¯åçŽã§æå¹ã§ãïŒ2ã€ã®ãã£ã¬ã¯ããªïŒãŸãã¯VMïŒãçšæããŠããŒããã©ã³ãµãåãæ¿ããåã®ããŒãžã§ã³ãçŽ æ©ãããŒã«ããã¯ã§ããç¶æ ã«ããŠãããŸããã«ããªã¢ãåæ§ã§ãæ°ããŒãžã§ã³ã«å°éã®ãã©ãã£ãã¯ãæµããŠåé¡ã確èªããŠããå šé¢å±éããŸãã
ãããã€ããå®äºããšããŒã¯ããåã«ãã©ãã§ãåããã¹ããããã€ã¹ã¢ãŒã¯ãã§ãã¯ãå®è¡ããŠãã ããïŒ
- ãã«ã¹ãšã³ããã€ã³ããOKãè¿ããäŸåå ãžå°éã§ããããšã確èª
- å°ããªå®éã®ã¢ã¯ã·ã§ã³ãå®è¡ïŒäŸïŒãã¹ãã¬ã³ãŒãã®äœæãšèªã¿åãïŒ
- ãµãŒãã¹ã®version/build IDãã³ããããšäžèŽããã確èª
- ãã§ãã¯ã«å€±æãããããŒã«ããã¯ããŠã¢ã©ãŒããäžãã
AppMasterã§çæããããã¯ãšã³ãã§ããã®ã¢ãããŒãã¯æå¹ã§ãïŒäžåºŠãã«ãããŠã¢ãŒãã£ãã¡ã¯ãããããã€ããç°å¢èšå®ã§éããåžåããããšã§ãå Žåœããçãªã¹ã¯ãªããã«é Œããªãéçšãã§ããŸãã
ãã€ãã©ã€ã³ãäžå®å®ã«ããå žåçãªééã
å£ãããªãªãŒã¹ã®å€ãã¯ãæªãã³ãŒããã§ã¯ãªãããã€ãã©ã€ã³ã®æ¯ãèããå®è¡ããšã«ç°ãªãããšãåå ã§ããGoããã¯ãšã³ãåãCI/CDãèœã¡çããŠäºæž¬å¯èœã«ããã«ã¯ã次ã®ãã¿ãŒã³ã«æ³šæããŠãã ããã
ãµãã©ã€ãºãæãééããã¿ãŒã³
ãããã€ããšã«ã¬ãŒããªãã§èªåçã«ãã€ã°ã¬ãŒã·ã§ã³ãå®è¡ããã®ã¯å€å žçãªå€±æã§ããããŒãã«ããã¯ã䌎ããã€ã°ã¬ãŒã·ã§ã³ã¯è² è·ã®é«ããµãŒãã¹ã忢ãããŸããæ¬çªã§ã¯æ¿èªãå¿ èŠãªã¹ãããã«ãããåå®è¡å¯èœã«ãããªã©ã®å¯Ÿçãã
latest ã¿ã°ãã¢ã³ãã³ã®ããŒã¹ã€ã¡ãŒãžã䜿ãã®ãåå ã§ããDockerã€ã¡ãŒãžãšGoããŒãžã§ã³ãåºå®ããŠãã«ãç°å¢ã®ããªãããé²ããŸãã
ç°å¢ããŸããã§äžæçã«ããŒã¿ããŒã¹ãå ±æããã®ããæåžžåããããããã¹ãããŒã¿ãã¹ããŒãžã³ã°ãžæµããæ¬çªã«åœ±é¿ãäžããåå ã«ãªããŸããç°å¢ããšã«å¥ã®ããŒã¿ããŒã¹ãšè³æ Œæ å ±ã䜿ã£ãŠãã ããã
ãã«ã¹ãã§ãã¯ããªãŒããã¹ãã§ãã¯ããªããšããããã€ããæåãããŠããµãŒãã¹ã¯å£ããŠããããã©ãã£ãã¯ãæ©ãæµããŠããŸããŸããã¢ããªãèµ·åãDBã«æ¥ç¶ã§ããŠãªã¯ãšã¹ããæãããã確èªãããã§ãã¯ãå ¥ããŠãã ããã
æåŸã«ãã·ãŒã¯ã¬ãããèšå®ãã¢ã¯ã»ã¹ã®ææè ãäžæç¢ºã ãšãªãªãŒã¹ã¯æšæž¬äœæ¥ã«ãªããŸãã誰ãã·ãŒã¯ã¬ãããäœããå転ãããæ³šå ¥ããããæç¢ºã«ããŠãããŸãã
çŸå®çãªå€±æäŸïŒããŒã ã倿ŽãããŒãžããã€ãã©ã€ã³ããããã€ããã€ã°ã¬ãŒã·ã§ã³ãèªåã§å§ãŸããã¹ããŒãžã³ã°ã§ã¯ããŒã¿ãå°ãªããŠå®äºããããæ¬çªã§ã¯å€§éããŒã¿ã§ã¿ã€ã ã¢ãŠãããŠããŸããã€ã¡ãŒãžãåºå®ããç°å¢åé¢ããã²ãŒãä»ãã®ãã€ã°ã¬ãŒã·ã§ã³ã«ããŠããã°ãå®å šã«æ¢ããããŠããã¯ãã§ãã
AppMasterã§çæããå Žåãåçæãå€ãã®ãã¡ã€ã«ã«è§Šãã®ã§ãããã®ã«ãŒã«ã¯ããã«éèŠã§ããå ¥åãäºæž¬å¯èœã«ããæç€ºçãªã²ãŒãã眮ãããšã§å€§ããªå€æŽããªã¹ã¯ã®é«ããªãªãŒã¹ã«ãªãã®ãé²ããŸãã
äºæž¬å¯èœãªCI/CDã®ããã®ã¯ã€ãã¯ãã§ãã¯ãªã¹ã
Goããã¯ãšã³ãã®CI/CDã«ã€ããŠãåé ç®ã«æç¢ºã«ãã¯ãããšçããããã°ãªãªãŒã¹ã¯æ¥œã«ãªããŸãã
- ç°å¢ãåºå®ããïŒã³ãŒãã ãã§ãªãïŒã GoããŒãžã§ã³ãšãã«ãã³ã³ããã€ã¡ãŒãžããã³ããããŒã«ã«ãšCIã§åãã»ããã¢ããã䜿ãã
- ãã€ãã©ã€ã³ã3ã€ã®ç°¡åãªã³ãã³ãã§åãããã«ããã 1ã€ã§ãã«ãã1ã€ã§ãã¹ãã1ã€ã§ãããã€å¯èœãªã¢ãŒãã£ãã¡ã¯ããçæããã
- ãã€ã°ã¬ãŒã·ã§ã³ãæ¬çªã³ãŒããšããŠæ±ãã ãã€ã°ã¬ãŒã·ã§ã³å®è¡ããšã«ãã°ãæ®ããããŒã«ããã¯ã®æå³ãææžåããã
- 远跡å¯èœãªäžå€ã¢ãŒãã£ãã¡ã¯ããäœãã äžåºŠãã«ãããŠã³ãããSHAã§ã¿ã°ä»ãããåãã«ãããã«ç°å¢éã§ããã¢ãŒãããã
- æ©ã倱æãããã§ãã¯ã§ãããã€ããã ãªãŒããã¹/ã©ã€ããã¹ãã§ãã¯ãšæ¯åå®è¡ããçãã¹ã¢ãŒã¯ãã¹ãã远å ããã
æ¬çªã¢ã¯ã»ã¹ã¯éå®ãç£æ»å¯èœã«ããŸããCIã¯å°çšã®ãµãŒãã¹ã¢ã«ãŠã³ãã§ãããã€ããã·ãŒã¯ã¬ããã¯éäžç®¡çããæåã®æ¬çªæäœã¯èª°ãäœããã€ãã£ããã®èšé²ãæ®ãããã«ããŸãã
çŸå®çãªäŸãšä»é±ããå§ããããæ¬¡ã®ã¹ããã
4人ã®å°ããªãªãã¹ããŒã ãé±1åãªãªãŒã¹ããŸãããããã¯ãããŒã ãã¯ãŒã¯ãããŒãç¹°ãè¿ãæ¹åããã®ã§ãããã¯ãšã³ãã®åçæãé »ç¹ã«è¡ããŸãã圌ãã®ç®æšã¯åçŽïŒå€äžã®ç·æ¥å¯Ÿå¿ãæžããã誰ãé©ããªããªãªãŒã¹ã
éææ¥ã®å
žåçãªå€æŽïŒcustomers ã«æ°ãããã£ãŒã«ãã远å ïŒã¹ããŒã倿ŽïŒãããããæžã蟌ãAPIãæŽæ°ïŒã³ãŒã倿ŽïŒããã€ãã©ã€ã³ã¯ããããäžã€ã®ãªãªãŒã¹ãšããŠæ±ããŸããäžã€ã®ã¢ãŒãã£ãã¡ã¯ãããã«ããããã®æ£ç¢ºãªã¢ãŒãã£ãã¡ã¯ãã§ãã¹ããå®è¡ãããã®åŸã«ãã€ã°ã¬ãŒã·ã§ã³ãé©çšããŠãããã€ããŸãããããããšããŒã¿ããŒã¹ãã³ãŒãããå
ã«é²ãã ããã³ãŒããã¹ããŒããšåã£ãŠããªããŸãŸãããã€ãããããšããªããªããŸãã
ã¹ããŒã倿Žããããšãã€ãã©ã€ã³ã«ã»ãŒããã£ã²ãŒããå ¥ããŸãããã€ã°ã¬ãŒã·ã§ã³ãå¢åïŒnullableãªã«ã©ã 远å ãªã©ïŒãããã§ãã¯ããã«ã©ã åé€ãå€§èŠæš¡ãªããŒãã«æžãæãã®ãããªå±éºãªæäœã¯ãã©ã°ãç«ãŠãŠæ¬çªåã§æ¢ããŸããããŒã ã¯ãã€ã°ã¬ãŒã·ã§ã³ãæžãçŽãããèšç»ããããŠã£ã³ããŠã§å®è¡ããŸãã
ãã¹ãã«å€±æãããäœãå ã«é²ã¿ãŸããããã¬ãããã¯ã·ã§ã³ç°å¢ã§ãã€ã°ã¬ãŒã·ã§ã³ã倱æããŠãåæ§ã§ãããã€ãã©ã€ã³ã¯ãä»åã¯ç¹å¥ã«æŒãéãããããªæåãããŠã¯ãããŸããã
å€ãã®ããŒã ã«æå¹ãªç°¡åãªæ¬¡ã®ã¹ãããïŒ
- ãŸãã¯äžã€ã®ç°å¢ããå§ããïŒãªã»ããããããdevãããã€ïŒã
- ãã€ãã©ã€ã³ã¯åžžã«äžã€ã®ããŒãžã§ã³ä»ããã«ãã¢ãŒãã£ãã¡ã¯ããçæããããã«ããã
- ãã€ã°ã¬ãŒã·ã§ã³ã¯devã§ã¯èªåå®è¡ãæ¬çªã§ã¯æ¿èªãå¿ é ã«ããã
- devãæ°é±éå®å®ããŠããstagingã远å ããã
- æ¬çªã²ãŒãã远å ããç·ã®ãã¹ããšæåããstagingãããã€ãèŠæ±ããã
AppMasterã§ããã¯ãšã³ããçæããŠãããªããåçæãåããã€ãã©ã€ã³æ®µéå ã«åããŠãã ããïŒåçæâãã«ãâãã¹ãâå®å šãªç°å¢ã§ãã€ã°ã¬ãŒã·ã§ã³âãããã€ãçæããããœãŒã¹ãä»ã®ãœãŒã¹ãšåæ§ã«æ±ããã¿ã°ä»ããããããŒãžã§ã³ããåãæé ã§åçŸã§ããããã«ããŸãã
ãããã質å
Goã®ããŒãžã§ã³ãšãã«ãç°å¢ãåºå®ããŠãåãå ¥åãåžžã«åããã€ããªãã€ã¡ãŒãžãçæããããã«ããŸããããã§ãèªåã®ç°å¢ã§ã¯åããå·®åãæžãã倱æã®åçŸãšä¿®æ£ã容æã«ãªããŸãã
åçæã¯ãšã³ããã€ã³ããããŒã¿ã¢ãã«ãäŸåé¢ä¿ãå€ããå¯èœæ§ãããã誰ãæäœæ¥ã§ç·šéããŠããªããŠãå·®åãåºãŸãããã€ãã©ã€ã³ãéãããšã§ããã®ãããªå€æŽãåžžã«åããã§ãã¯ãåããå®å šã«é²ããããŸãã
äžåºŠãã«ãããŠããã®ãŸãŸdevâstagingâprodãžãšããã¢ãŒãããŠãã ãããç°å¢ããšã«åãã«ããããšãåãã³ãããã§ããã¹ãããŠããªããã«ããåºè·ããŠããŸãå±éºããããŸãã
PRããšã«é«éã²ãŒããéãã®ãè¯ãã§ãïŒãã©ãŒããããåºæ¬çãªéçãã§ãã¯ããã«ããã¿ã€ã ã¢ãŠãä»ãã®ãŠããããã¹ããéããŠå³æ Œã«ããŠãããšã誰ãåé¿ããªããªããŸãã
ãµãŒãã¹ããããã¯ã·ã§ã³ã«è¿ãèšå®ã§èµ·åããPostgreSQLãªã©å®éã®äŸåãµãŒãã¹ã«æ¥ç¶ããŠããçãã¹ã€ãŒããåã圢ã«ããŸããç®çã¯ãã³ã³ãã€ã«ã¯éããèµ·åããªãããæãŸããããšã§ãCIãæ°æéã®E2Eã«ããªãããšã§ãã
ãã€ã°ã¬ãŒã·ã§ã³ã¯æé»ã§æ¯åå®è¡ãããã®ã§ã¯ãªããæç¢ºã«ç®¡çããããªãªãŒã¹æé ãšããŠæ±ã£ãŠãã ããããã°ãæ®ããåäžå®è¡ã®ããã¯ã䜿ããå·»ãæ»ããé£ãã倿Žã¯æ¿èªãå¿ é ã«ããŸãã
Kubernetesã§ã¯ãªãŒããã¹ãã§ãã¯ãå°å ¥ããŠãæ°ããPodãæ¬åœã«æºåã§ããŠãããã©ãã£ãã¯ãéãããã«ããŸããLivenessãã§ãã¯ã§ãã³ã°ããã³ã³ãããåèµ·åããçŸå®çãªãªãœãŒã¹èŠæ±ãšå¶éãèšå®ããŠãã ããããããæãããããåé¡ã®åå ã§ãã
ä»®æ³ãã·ã³ã®å Žåãsystemdã®ãŠããããã¡ã€ã«ãšäžè²«ãããªãªãŒã¹ã¹ã¯ãªãããããã°ååã«å®å®ãããããã€ãå¯èœã§ããã¢ãŒãã£ãã¡ã¯ãã¢ãã«ã¯ã³ã³ãããšåãã«ããŠããããã€åŸã«å°ããªã¹ã¢ãŒã¯ãã§ãã¯ãèµ°ãããŸãããã
ã·ãŒã¯ã¬ããã¯ãªããžããªã«ãã€ã¡ãŒãžã«ãCIãã°ã«ã眮ããªãã§ãã ããããããã€æã«ãããŒãžããªã·ãŒã¯ã¬ããã¹ãã¢ããæ³šå ¥ãã誰ãèªããããå¶éãã宿çãªããŒããŒã·ã§ã³ãéçšã«çµã¿èŸŒã¿ãŸãã
åçæã¯ä»ã®å€æŽãšåããã€ãã©ã€ã³å ã§æ±ããŸãïŒåçæâãã«ãâãã¹ãâããã±ãŒãžâã²ãŒãä»ãã§ãã€ã°ã¬ãŒããšãããã€ãAppMasterã§çæããŠãããªãããã®æµãã«ä¹ããããšã§äœãå€ãã£ãããæšæž¬ããå¿ èŠããªããªããŸãã


