ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã§ãšã³ãžãã¢ãããŠããŸãäžåè¯ã§ãã ã€ã³ãã¥ããŒã·ã§ã³æ¬éšã¯ 2020 幎 2 æããæ°èŠäºæ¥ã®éæãªã©ãç®çã«æ°èšãããã®ã§ããããã®äžã§ãè¥æã®éšé¡ãšããŠæ¥ã
é 匵ã£ãŠããŸãã CTO 平山ã®ã€ã³ã¿ãã¥ãŒãšãšãã«ã€ã³ãã¥ããŒã·ã§ã³ããŒã ã®ç޹ä»èšäºããã³ãŒãã¬ãŒããµã€ãã«æ²èŒãããŠããŸãããã¡ãããã²ã芧ãã ããã www.medley.jp www.medley.jp ããŠãä»åã¯ç€Ÿå
ã§è¡ã£ãŠããå匷äŒïŒããã¯ã©ã³ãã®äžã§ãKotlin/Nativeãã«ã€ããŠçºè¡šããæ©äŒããã£ãã®ã§ç޹ä»ãããŠããã ããŸãã Kotlin/Native ã«ã€ã㊠Kotlin 㯠JetBrains 瀟ã«ãã£ãŠ 2011 幎ã«çºè¡šãããããã°ã©ãã³ã°èšèªã§ãã çŸåšã§ã¯ Android éçºãªã©ã§äž»æµã®èšèªãšãªã£ãŠãããå€ãã®äººã«å©çšãããŠãããšæããŸãã Kotlin/Native ãšã¯ãã㪠Kotlin ã䜿ã£ãŠæ§ã
ãªãã©ãããã©ãŒã äžã§å®è¡å¯èœãªãã¡ã€ã«ãçæããããšãããããžã§ã¯ãã§ãã Kotlin/Native - Kotlin Programming Language ä»çµã¿ãšããŠã¯ Kotlin ã®ã³ãŒããããšã« LLVM ãçæãããããæ§ã
ãªãã©ãããã©ãŒã ã§å©çšå¯èœãªãã€ãã£ããã€ããªã«ã³ã³ãã€ã«ããããšã§è¿œå ã®ã©ã³ã¿ã€ã ã JVM ãªãã§åäœããããã«ããŠããŸãã ãµããŒãããŠãããã©ãããã©ãŒã ã¯äžèšã®ãšããã§ãã iOS (arm32, arm64, simulator x86_64) macOS (x86_64) watchOS (arm32, arm64, x86) tvOS (arm64, x86_64) Android (arm32, arm64, x86, x86_64) Windows (mingw x86_64, x86) Linux (x86_64, arm32, arm64, MIPS, MIPS little endian) WebAssembly (wasm32) ã³ãŒãã®å
±éåã«ã€ã㊠Kotlin/Native ã®ãã¥ãŒããªã¢ã«ãåèã«ãAndroid / iOS ã§å
±éåã®æµãã远ã£ãŠã¿ãŸãã äœæããããããžã§ã¯ã㯠Android / iOS ã§ãããã âHello, World!â ãåºåããã·ã³ãã«ãªããã°ã©ã ã§ãã Kotlin Playground: Edit, Run, Share Kotlin Code Online éåžžã®ãããžã§ã¯ããšã¯å¥ã« SharedCode ãšãããããžã§ã¯ããäœæãããã®äžã« Kotlin/Native (Android / iOS å
±éã®ã³ãŒã) ãèšè¿°ããŠãããŸãã ããããã®ã³ãŒãã®ã¬ã€ã¢ãŠãã¯ä»¥äžã®éãã§ãã â» SharedCode ãèªã¿èŸŒãããã®ãã«ããã©ãããã©ãŒã ã®ããã® gradle ãã¡ã€ã«ãå¿
èŠã§ãå
çšã®ãŠã§ããµã€ãã«èšèŒãããŠããŸãã commonMain ã®äžã« ãexpectã ãšããããŒã¯ãŒãã䜿ã£ãŠæœè±¡åã®ãããªãã®ã宣èšãã androidMain / iOSMain ãšãã£ãåãã©ãããã©ãŒã ã®å®è£
ã®äžã§ ãactualã ãšããããŒã¯ãŒãã䜿çšããŠãã®å
容ãèšè¿°ããŸãã // commonMain expect fun platformName (): String // androidMain actual fun platformName (): String { return "Android" } // iOSMain actual fun platformName (): String { return UIDevice.currentDevice. systemName () + " " + UIDevice.currentDevice.systemVersion } ãã®ãã¥ãŒããªã¢ã«ã«ã¯èšèŒãããŸãããããexpectã ãšããããŒã¯ãŒãã¯ã¯ã©ã¹ã颿°ã»ã¢ãããŒã·ã§ã³ãšãã£ããã¹ãŠã®ãã®ã«å®çŸ©ããããšãã§ããŸãã Platform-Specific Declarations - Kotlin Programming Language ãŸã iOSMain å
ã§ããã° iOS ã® Foundation ãã¬ãŒã ã¯ãŒã¯ãšãã£ãããã«ãåãã©ãããã©ãŒã ããšã®ãã¬ãŒã ã¯ãŒã¯ãããããå©çšããããšãã§ããŸãã ããããŠã§ãããSharedCode ã®ã©ã€ãã©ãªã¯ Android/iOS ã®ãããžã§ã¯ããã䜿ãæ
£ããã©ã€ãã©ãªãšåãããã«ã€ã³ããŒãããããšãã§ããŸãã Kotlin/Native ã®å¶çŽã«ã€ã㊠JVM äžã§ Kotlin ãåãããŠããæã«ã¯æšæºã©ã€ãã©ãªãã¡ã¢ãªç®¡çã«ã¯ Java ã®è³ç£ãå©çšããããšãã§ããŸããããKotlin/Native ã§ã¯ãããå©çšããããšãã§ããªããšããå¶çŽããããŸãã å
·äœçã«ã¢ããªãäœæããéã«ã¯äžèšã®ç¹ã«æ³šæãå¿
èŠã§ããã Java ã®æšæºã©ã€ãã©ãªã䜿çšããŠããã©ã€ãã©ãªãå©çšã§ããªããã Kotlin ã§èšè¿°ãããã©ã€ãã©ãªã®ã¿ã䜿çšãã iOS ã¢ããªãéçºããéã«ã¯ memScope, alloc / free ãªã©ãå©çšããŠã¡ã¢ãªç®¡çãèªåã§è¡ãå¿
èŠããã Java ã®è³ç£ãå©çšã§ããªã Kotlin ã«å¯ŸããŠå¿é
ããããšããããŸããããKotlin/Native åãã«æ§ã
ãªã©ã€ãã©ãªã æäŸãããŠããããããå©çšããããšã§åé¡ã解決ããŸããã çŸç¶ã¯æ¥ä»ç®¡çã§ãããµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã§æäœããå¿
èŠãããã®ãäžæºã§ãããKotlin/Native ã®çºå±ã«ãã£ãŠãããã£ãäžäŸ¿ãã¯è§£æ±ºãããããã«é¡ã£ãŠããŸãã ãsuspendã 颿°ã iOS åŽããçŽæ¥åŒã³åºãããšãã§ããªã (ã³ãŒã«ããã¯é¢æ°ããªã©ã«å€æããŠåŒã³åºãå¿
èŠããã) Kotlin ã§å®çŸ©ãã宣èšãåã®äžéšã Swift ã ãšå¥åã«ãªã£ãŠãã (ã objc_runtime_nameã ã ãswift_nameã ãåç
§ããå¿
èŠããã) ãcompanion objectã ã ãobjectã ãªã©ã·ã³ã°ã«ãã³ã®å®£èšã«å¯ŸããŠãªããžã§ã¯ããããªãŒãºããã ãThreadLocal / SharedImmutableã ã®ã¢ãããŒã·ã§ã³ãä»äžããå¿
èŠããã ãã¡ã㯠iOS ã§å©çšããå Žåã®æ³šæã§ãããããã€ãã® Kotlin ã®æ©èœãå©çšã§ããªãã£ããã远å ã®èšè¿°ãå¿
èŠãªãã®ããããŸãã 詳ããã¯äžèšã®è³æãåç
§ãã ããã Kotlin/Native as an Apple Framework - Kotlin Programming Language kotlin-native/IMMUTABILITY.md Kotlin/Native ã®å©çšäŸ ãŸã ãŸã å©çšäŸãå°ãªãããåèã«ãªãè³æãªã©ãããŸããªãã®ã§ããã以äžã®å®è£
ããªãŒãã³ãœãŒã¹ãšããŠå
¬éãããŠããããæ§æãé°å²æ°ãæŽãããã«ã¯ã¡ããã©è¯ãè³æãšãªããŸããã GitHub - JetBrains/kotlinconf-app: KotlinConf Schedule Application GitHub - DroidKaigi/conference-app-2020: The Official Conference App for DroidKaigi 2020 Tokyo ãŸãšã åŒç€Ÿã§ã¯ ãCLINICSã ãšãããªã³ã©ã€ã³èšºå¯ãè¡ãããšãã§ããã¢ããªããªãªãŒã¹ããŠããŸãã CLINICS ãé·æçã«éçšããŠããããã®æè¡èª¿æ»ã®äžç°ãšããŠãè¿å¹Žã® Android çéã§è©±é¡ã«ããã£ãŠãããKotlin/Nativeãã«ã€ããŠæ€èšŒãçºè¡šããŠã¿ãŸããã ãŸã ãŸã çºå±éäžæã®ããæè¡ã§ãããå®çšæ§ã®ãããããžã§ã¯ãã ãšæããŸãã®ã§ãèå³ã®ããæ¹ã¯ãã²äžåºŠã詊ããã ããïŒ
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã§ãšã³ãžãã¢ãããŠããŸãäžåè¯ã§ãã ã€ã³ãã¥ããŒã·ã§ã³æ¬éšã¯ 2020 幎 2 æããæ°èŠäºæ¥ã®éæãªã©ãç®çã«æ°èšãããã®ã§ããããã®äžã§ãè¥æã®éšé¡ãšããŠæ¥ã
é 匵ã£ãŠããŸãã CTO 平山ã®ã€ã³ã¿ãã¥ãŒãšãšãã«ã€ã³ãã¥ããŒã·ã§ã³ããŒã ã®ç޹ä»èšäºããã³ãŒãã¬ãŒããµã€ãã«æ²èŒãããŠããŸãããã¡ãããã²ã芧ãã ããã www.medley.jp www.medley.jp ããŠãä»åã¯ç€Ÿå
ã§è¡ã£ãŠããå匷äŒïŒããã¯ã©ã³ãã®äžã§ãKotlin/Nativeãã«ã€ããŠçºè¡šããæ©äŒããã£ãã®ã§ç޹ä»ãããŠããã ããŸãã Kotlin/Native ã«ã€ã㊠Kotlin 㯠JetBrains 瀟ã«ãã£ãŠ 2011 幎ã«çºè¡šãããããã°ã©ãã³ã°èšèªã§ãã çŸåšã§ã¯ Android éçºãªã©ã§äž»æµã®èšèªãšãªã£ãŠãããå€ãã®äººã«å©çšãããŠãããšæããŸãã Kotlin/Native ãšã¯ãã㪠Kotlin ã䜿ã£ãŠæ§ã
ãªãã©ãããã©ãŒã äžã§å®è¡å¯èœãªãã¡ã€ã«ãçæããããšãããããžã§ã¯ãã§ãã Kotlin/Native - Kotlin Programming Language ä»çµã¿ãšããŠã¯ Kotlin ã®ã³ãŒããããšã« LLVM ãçæãããããæ§ã
ãªãã©ãããã©ãŒã ã§å©çšå¯èœãªãã€ãã£ããã€ããªã«ã³ã³ãã€ã«ããããšã§è¿œå ã®ã©ã³ã¿ã€ã ã JVM ãªãã§åäœããããã«ããŠããŸãã ãµããŒãããŠãããã©ãããã©ãŒã ã¯äžèšã®ãšããã§ãã iOS (arm32, arm64, simulator x86_64) macOS (x86_64) watchOS (arm32, arm64, x86) tvOS (arm64, x86_64) Android (arm32, arm64, x86, x86_64) Windows (mingw x86_64, x86) Linux (x86_64, arm32, arm64, MIPS, MIPS little endian) WebAssembly (wasm32) ã³ãŒãã®å
±éåã«ã€ã㊠Kotlin/Native ã®ãã¥ãŒããªã¢ã«ãåèã«ãAndroid / iOS ã§å
±éåã®æµãã远ã£ãŠã¿ãŸãã äœæããããããžã§ã¯ã㯠Android / iOS ã§ãããã âHello, World!â ãåºåããã·ã³ãã«ãªããã°ã©ã ã§ãã Kotlin Playground: Edit, Run, Share Kotlin Code Online éåžžã®ãããžã§ã¯ããšã¯å¥ã« SharedCode ãšãããããžã§ã¯ããäœæãããã®äžã« Kotlin/Native (Android / iOS å
±éã®ã³ãŒã) ãèšè¿°ããŠãããŸãã ããããã®ã³ãŒãã®ã¬ã€ã¢ãŠãã¯ä»¥äžã®éãã§ãã â» SharedCode ãèªã¿èŸŒãããã®ãã«ããã©ãããã©ãŒã ã®ããã® gradle ãã¡ã€ã«ãå¿
èŠã§ãå
çšã®ãŠã§ããµã€ãã«èšèŒãããŠããŸãã commonMain ã®äžã« ãexpectã ãšããããŒã¯ãŒãã䜿ã£ãŠæœè±¡åã®ãããªãã®ã宣èšãã androidMain / iOSMain ãšãã£ãåãã©ãããã©ãŒã ã®å®è£
ã®äžã§ ãactualã ãšããããŒã¯ãŒãã䜿çšããŠãã®å
容ãèšè¿°ããŸãã // commonMain expect fun platformName (): String // androidMain actual fun platformName (): String { return "Android" } // iOSMain actual fun platformName (): String { return UIDevice.currentDevice. systemName () + " " + UIDevice.currentDevice.systemVersion } ãã®ãã¥ãŒããªã¢ã«ã«ã¯èšèŒãããŸãããããexpectã ãšããããŒã¯ãŒãã¯ã¯ã©ã¹ã颿°ã»ã¢ãããŒã·ã§ã³ãšãã£ããã¹ãŠã®ãã®ã«å®çŸ©ããããšãã§ããŸãã Platform-Specific Declarations - Kotlin Programming Language ãŸã iOSMain å
ã§ããã° iOS ã® Foundation ãã¬ãŒã ã¯ãŒã¯ãšãã£ãããã«ãåãã©ãããã©ãŒã ããšã®ãã¬ãŒã ã¯ãŒã¯ãããããå©çšããããšãã§ããŸãã ããããŠã§ãããSharedCode ã®ã©ã€ãã©ãªã¯ Android/iOS ã®ãããžã§ã¯ããã䜿ãæ
£ããã©ã€ãã©ãªãšåãããã«ã€ã³ããŒãããããšãã§ããŸãã Kotlin/Native ã®å¶çŽã«ã€ã㊠JVM äžã§ Kotlin ãåãããŠããæã«ã¯æšæºã©ã€ãã©ãªãã¡ã¢ãªç®¡çã«ã¯ Java ã®è³ç£ãå©çšããããšãã§ããŸããããKotlin/Native ã§ã¯ãããå©çšããããšãã§ããªããšããå¶çŽããããŸãã å
·äœçã«ã¢ããªãäœæããéã«ã¯äžèšã®ç¹ã«æ³šæãå¿
èŠã§ããã Java ã®æšæºã©ã€ãã©ãªã䜿çšããŠããã©ã€ãã©ãªãå©çšã§ããªããã Kotlin ã§èšè¿°ãããã©ã€ãã©ãªã®ã¿ã䜿çšãã iOS ã¢ããªãéçºããéã«ã¯ memScope, alloc / free ãªã©ãå©çšããŠã¡ã¢ãªç®¡çãèªåã§è¡ãå¿
èŠããã Java ã®è³ç£ãå©çšã§ããªã Kotlin ã«å¯ŸããŠå¿é
ããããšããããŸããããKotlin/Native åãã«æ§ã
ãªã©ã€ãã©ãªã æäŸãããŠããããããå©çšããããšã§åé¡ã解決ããŸããã çŸç¶ã¯æ¥ä»ç®¡çã§ãããµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã§æäœããå¿
èŠãããã®ãäžæºã§ãããKotlin/Native ã®çºå±ã«ãã£ãŠãããã£ãäžäŸ¿ãã¯è§£æ±ºãããããã«é¡ã£ãŠããŸãã ãsuspendã 颿°ã iOS åŽããçŽæ¥åŒã³åºãããšãã§ããªã (ã³ãŒã«ããã¯é¢æ°ããªã©ã«å€æããŠåŒã³åºãå¿
èŠããã) Kotlin ã§å®çŸ©ãã宣èšãåã®äžéšã Swift ã ãšå¥åã«ãªã£ãŠãã (ã objc_runtime_nameã ã ãswift_nameã ãåç
§ããå¿
èŠããã) ãcompanion objectã ã ãobjectã ãªã©ã·ã³ã°ã«ãã³ã®å®£èšã«å¯ŸããŠãªããžã§ã¯ããããªãŒãºããã ãThreadLocal / SharedImmutableã ã®ã¢ãããŒã·ã§ã³ãä»äžããå¿
èŠããã ãã¡ã㯠iOS ã§å©çšããå Žåã®æ³šæã§ãããããã€ãã® Kotlin ã®æ©èœãå©çšã§ããªãã£ããã远å ã®èšè¿°ãå¿
èŠãªãã®ããããŸãã 詳ããã¯äžèšã®è³æãåç
§ãã ããã Kotlin/Native as an Apple Framework - Kotlin Programming Language kotlin-native/IMMUTABILITY.md Kotlin/Native ã®å©çšäŸ ãŸã ãŸã å©çšäŸãå°ãªãããåèã«ãªãè³æãªã©ãããŸããªãã®ã§ããã以äžã®å®è£
ããªãŒãã³ãœãŒã¹ãšããŠå
¬éãããŠããããæ§æãé°å²æ°ãæŽãããã«ã¯ã¡ããã©è¯ãè³æãšãªããŸããã GitHub - JetBrains/kotlinconf-app: KotlinConf Schedule Application GitHub - DroidKaigi/conference-app-2020: The Official Conference App for DroidKaigi 2020 Tokyo ãŸãšã åŒç€Ÿã§ã¯ ãCLINICSã ãšãããªã³ã©ã€ã³èšºå¯ãè¡ãããšãã§ããã¢ããªããªãªãŒã¹ããŠããŸãã CLINICS ãé·æçã«éçšããŠããããã®æè¡èª¿æ»ã®äžç°ãšããŠãè¿å¹Žã® Android çéã§è©±é¡ã«ããã£ãŠãããKotlin/Nativeãã«ã€ããŠæ€èšŒãçºè¡šããŠã¿ãŸããã ãŸã ãŸã çºå±éäžæã®ããæè¡ã§ãããå®çšæ§ã®ãããããžã§ã¯ãã ãšæããŸãã®ã§ãèå³ã®ããæ¹ã¯ãã²äžåºŠã詊ããã ããïŒ
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã§ãšã³ãžãã¢ãããŠããŸãäžåè¯ã§ãã ã€ã³ãã¥ããŒã·ã§ã³æ¬éšã¯ 2020 幎 2 æããæ°èŠäºæ¥ã®éæãªã©ãç®çã«æ°èšãããã®ã§ããããã®äžã§ãè¥æã®éšé¡ãšããŠæ¥ã
é 匵ã£ãŠããŸãã CTO 平山ã®ã€ã³ã¿ãã¥ãŒãšãšãã«ã€ã³ãã¥ããŒã·ã§ã³ããŒã ã®ç޹ä»èšäºããã³ãŒãã¬ãŒããµã€ãã«æ²èŒãããŠããŸãããã¡ãããã²ã芧ãã ããã www.medley.jp www.medley.jp ããŠãä»åã¯ç€Ÿå
ã§è¡ã£ãŠããå匷äŒïŒããã¯ã©ã³ãã®äžã§ãKotlin/Nativeãã«ã€ããŠçºè¡šããæ©äŒããã£ãã®ã§ç޹ä»ãããŠããã ããŸãã Kotlin/Native ã«ã€ã㊠Kotlin 㯠JetBrains 瀟ã«ãã£ãŠ 2011 幎ã«çºè¡šãããããã°ã©ãã³ã°èšèªã§ãã çŸåšã§ã¯ Android éçºãªã©ã§äž»æµã®èšèªãšãªã£ãŠãããå€ãã®äººã«å©çšãããŠãããšæããŸãã Kotlin/Native ãšã¯ãã㪠Kotlin ã䜿ã£ãŠæ§ã
ãªãã©ãããã©ãŒã äžã§å®è¡å¯èœãªãã¡ã€ã«ãçæããããšãããããžã§ã¯ãã§ãã Kotlin/Native - Kotlin Programming Language ä»çµã¿ãšããŠã¯ Kotlin ã®ã³ãŒããããšã« LLVM ãçæãããããæ§ã
ãªãã©ãããã©ãŒã ã§å©çšå¯èœãªãã€ãã£ããã€ããªã«ã³ã³ãã€ã«ããããšã§è¿œå ã®ã©ã³ã¿ã€ã ã JVM ãªãã§åäœããããã«ããŠããŸãã ãµããŒãããŠãããã©ãããã©ãŒã ã¯äžèšã®ãšããã§ãã iOS (arm32, arm64, simulator x86_64) macOS (x86_64) watchOS (arm32, arm64, x86) tvOS (arm64, x86_64) Android (arm32, arm64, x86, x86_64) Windows (mingw x86_64, x86) Linux (x86_64, arm32, arm64, MIPS, MIPS little endian) WebAssembly (wasm32) ã³ãŒãã®å
±éåã«ã€ã㊠Kotlin/Native ã®ãã¥ãŒããªã¢ã«ãåèã«ãAndroid / iOS ã§å
±éåã®æµãã远ã£ãŠã¿ãŸãã äœæããããããžã§ã¯ã㯠Android / iOS ã§ãããã âHello, World!â ãåºåããã·ã³ãã«ãªããã°ã©ã ã§ãã Kotlin Playground: Edit, Run, Share Kotlin Code Online éåžžã®ãããžã§ã¯ããšã¯å¥ã« SharedCode ãšãããããžã§ã¯ããäœæãããã®äžã« Kotlin/Native (Android / iOS å
±éã®ã³ãŒã) ãèšè¿°ããŠãããŸãã ããããã®ã³ãŒãã®ã¬ã€ã¢ãŠãã¯ä»¥äžã®éãã§ãã â» SharedCode ãèªã¿èŸŒãããã®ãã«ããã©ãããã©ãŒã ã®ããã® gradle ãã¡ã€ã«ãå¿
èŠã§ãå
çšã®ãŠã§ããµã€ãã«èšèŒãããŠããŸãã commonMain ã®äžã« ãexpectã ãšããããŒã¯ãŒãã䜿ã£ãŠæœè±¡åã®ãããªãã®ã宣èšãã androidMain / iOSMain ãšãã£ãåãã©ãããã©ãŒã ã®å®è£
ã®äžã§ ãactualã ãšããããŒã¯ãŒãã䜿çšããŠãã®å
容ãèšè¿°ããŸãã // commonMain expect fun platformName (): String // androidMain actual fun platformName (): String { return "Android" } // iOSMain actual fun platformName (): String { return UIDevice.currentDevice. systemName () + " " + UIDevice.currentDevice.systemVersion } ãã®ãã¥ãŒããªã¢ã«ã«ã¯èšèŒãããŸãããããexpectã ãšããããŒã¯ãŒãã¯ã¯ã©ã¹ã颿°ã»ã¢ãããŒã·ã§ã³ãšãã£ããã¹ãŠã®ãã®ã«å®çŸ©ããããšãã§ããŸãã Platform-Specific Declarations - Kotlin Programming Language ãŸã iOSMain å
ã§ããã° iOS ã® Foundation ãã¬ãŒã ã¯ãŒã¯ãšãã£ãããã«ãåãã©ãããã©ãŒã ããšã®ãã¬ãŒã ã¯ãŒã¯ãããããå©çšããããšãã§ããŸãã ããããŠã§ãããSharedCode ã®ã©ã€ãã©ãªã¯ Android/iOS ã®ãããžã§ã¯ããã䜿ãæ
£ããã©ã€ãã©ãªãšåãããã«ã€ã³ããŒãããããšãã§ããŸãã Kotlin/Native ã®å¶çŽã«ã€ã㊠JVM äžã§ Kotlin ãåãããŠããæã«ã¯æšæºã©ã€ãã©ãªãã¡ã¢ãªç®¡çã«ã¯ Java ã®è³ç£ãå©çšããããšãã§ããŸããããKotlin/Native ã§ã¯ãããå©çšããããšãã§ããªããšããå¶çŽããããŸãã å
·äœçã«ã¢ããªãäœæããéã«ã¯äžèšã®ç¹ã«æ³šæãå¿
èŠã§ããã Java ã®æšæºã©ã€ãã©ãªã䜿çšããŠããã©ã€ãã©ãªãå©çšã§ããªããã Kotlin ã§èšè¿°ãããã©ã€ãã©ãªã®ã¿ã䜿çšãã iOS ã¢ããªãéçºããéã«ã¯ memScope, alloc / free ãªã©ãå©çšããŠã¡ã¢ãªç®¡çãèªåã§è¡ãå¿
èŠããã Java ã®è³ç£ãå©çšã§ããªã Kotlin ã«å¯ŸããŠå¿é
ããããšããããŸããããKotlin/Native åãã«æ§ã
ãªã©ã€ãã©ãªã æäŸãããŠããããããå©çšããããšã§åé¡ã解決ããŸããã çŸç¶ã¯æ¥ä»ç®¡çã§ãããµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã§æäœããå¿
èŠãããã®ãäžæºã§ãããKotlin/Native ã®çºå±ã«ãã£ãŠãããã£ãäžäŸ¿ãã¯è§£æ±ºãããããã«é¡ã£ãŠããŸãã ãsuspendã 颿°ã iOS åŽããçŽæ¥åŒã³åºãããšãã§ããªã (ã³ãŒã«ããã¯é¢æ°ããªã©ã«å€æããŠåŒã³åºãå¿
èŠããã) Kotlin ã§å®çŸ©ãã宣èšãåã®äžéšã Swift ã ãšå¥åã«ãªã£ãŠãã (ã objc_runtime_nameã ã ãswift_nameã ãåç
§ããå¿
èŠããã) ãcompanion objectã ã ãobjectã ãªã©ã·ã³ã°ã«ãã³ã®å®£èšã«å¯ŸããŠãªããžã§ã¯ããããªãŒãºããã ãThreadLocal / SharedImmutableã ã®ã¢ãããŒã·ã§ã³ãä»äžããå¿
èŠããã ãã¡ã㯠iOS ã§å©çšããå Žåã®æ³šæã§ãããããã€ãã® Kotlin ã®æ©èœãå©çšã§ããªãã£ããã远å ã®èšè¿°ãå¿
èŠãªãã®ããããŸãã 詳ããã¯äžèšã®è³æãåç
§ãã ããã Kotlin/Native as an Apple Framework - Kotlin Programming Language kotlin-native/IMMUTABILITY.md Kotlin/Native ã®å©çšäŸ ãŸã ãŸã å©çšäŸãå°ãªãããåèã«ãªãè³æãªã©ãããŸããªãã®ã§ããã以äžã®å®è£
ããªãŒãã³ãœãŒã¹ãšããŠå
¬éãããŠããããæ§æãé°å²æ°ãæŽãããã«ã¯ã¡ããã©è¯ãè³æãšãªããŸããã GitHub - JetBrains/kotlinconf-app: KotlinConf Schedule Application GitHub - DroidKaigi/conference-app-2020: The Official Conference App for DroidKaigi 2020 Tokyo ãŸãšã åŒç€Ÿã§ã¯ ãCLINICSã ãšãããªã³ã©ã€ã³èšºå¯ãè¡ãããšãã§ããã¢ããªããªãªãŒã¹ããŠããŸãã CLINICS ãé·æçã«éçšããŠããããã®æè¡èª¿æ»ã®äžç°ãšããŠãè¿å¹Žã® Android çéã§è©±é¡ã«ããã£ãŠãããKotlin/Nativeãã«ã€ããŠæ€èšŒãçºè¡šããŠã¿ãŸããã ãŸã ãŸã çºå±éäžæã®ããæè¡ã§ãããå®çšæ§ã®ãããããžã§ã¯ãã ãšæããŸãã®ã§ãèå³ã®ããæ¹ã¯ãã²äžåºŠã詊ããã ããïŒ
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã§ãšã³ãžãã¢ãããŠããŸãäžåè¯ã§ãã ã€ã³ãã¥ããŒã·ã§ã³æ¬éšã¯ 2020 幎 2 æããæ°èŠäºæ¥ã®éæãªã©ãç®çã«æ°èšãããã®ã§ããããã®äžã§ãè¥æã®éšé¡ãšããŠæ¥ã
é 匵ã£ãŠããŸãã CTO 平山ã®ã€ã³ã¿ãã¥ãŒãšãšãã«ã€ã³ãã¥ããŒã·ã§ã³ããŒã ã®ç޹ä»èšäºããã³ãŒãã¬ãŒããµã€ãã«æ²èŒãããŠããŸãããã¡ãããã²ã芧ãã ããã www.medley.jp www.medley.jp ããŠãä»åã¯ç€Ÿå
ã§è¡ã£ãŠããå匷äŒïŒããã¯ã©ã³ãã®äžã§ãKotlin/Nativeãã«ã€ããŠçºè¡šããæ©äŒããã£ãã®ã§ç޹ä»ãããŠããã ããŸãã Kotlin/Native ã«ã€ã㊠Kotlin 㯠JetBrains 瀟ã«ãã£ãŠ 2011 幎ã«çºè¡šãããããã°ã©ãã³ã°èšèªã§ãã çŸåšã§ã¯ Android éçºãªã©ã§äž»æµã®èšèªãšãªã£ãŠãããå€ãã®äººã«å©çšãããŠãããšæããŸãã Kotlin/Native ãšã¯ãã㪠Kotlin ã䜿ã£ãŠæ§ã
ãªãã©ãããã©ãŒã äžã§å®è¡å¯èœãªãã¡ã€ã«ãçæããããšãããããžã§ã¯ãã§ãã Kotlin/Native - Kotlin Programming Language ä»çµã¿ãšããŠã¯ Kotlin ã®ã³ãŒããããšã« LLVM ãçæãããããæ§ã
ãªãã©ãããã©ãŒã ã§å©çšå¯èœãªãã€ãã£ããã€ããªã«ã³ã³ãã€ã«ããããšã§è¿œå ã®ã©ã³ã¿ã€ã ã JVM ãªãã§åäœããããã«ããŠããŸãã ãµããŒãããŠãããã©ãããã©ãŒã ã¯äžèšã®ãšããã§ãã iOS (arm32, arm64, simulator x86_64) macOS (x86_64) watchOS (arm32, arm64, x86) tvOS (arm64, x86_64) Android (arm32, arm64, x86, x86_64) Windows (mingw x86_64, x86) Linux (x86_64, arm32, arm64, MIPS, MIPS little endian) WebAssembly (wasm32) ã³ãŒãã®å
±éåã«ã€ã㊠Kotlin/Native ã®ãã¥ãŒããªã¢ã«ãåèã«ãAndroid / iOS ã§å
±éåã®æµãã远ã£ãŠã¿ãŸãã äœæããããããžã§ã¯ã㯠Android / iOS ã§ãããã âHello, World!â ãåºåããã·ã³ãã«ãªããã°ã©ã ã§ãã Kotlin Playground: Edit, Run, Share Kotlin Code Online éåžžã®ãããžã§ã¯ããšã¯å¥ã« SharedCode ãšãããããžã§ã¯ããäœæãããã®äžã« Kotlin/Native (Android / iOS å
±éã®ã³ãŒã) ãèšè¿°ããŠãããŸãã ããããã®ã³ãŒãã®ã¬ã€ã¢ãŠãã¯ä»¥äžã®éãã§ãã â» SharedCode ãèªã¿èŸŒãããã®ãã«ããã©ãããã©ãŒã ã®ããã® gradle ãã¡ã€ã«ãå¿
èŠã§ãå
çšã®ãŠã§ããµã€ãã«èšèŒãããŠããŸãã commonMain ã®äžã« ãexpectã ãšããããŒã¯ãŒãã䜿ã£ãŠæœè±¡åã®ãããªãã®ã宣èšãã androidMain / iOSMain ãšãã£ãåãã©ãããã©ãŒã ã®å®è£
ã®äžã§ ãactualã ãšããããŒã¯ãŒãã䜿çšããŠãã®å
容ãèšè¿°ããŸãã // commonMain expect fun platformName (): String // androidMain actual fun platformName (): String { return "Android" } // iOSMain actual fun platformName (): String { return UIDevice.currentDevice. systemName () + " " + UIDevice.currentDevice.systemVersion } ãã®ãã¥ãŒããªã¢ã«ã«ã¯èšèŒãããŸãããããexpectã ãšããããŒã¯ãŒãã¯ã¯ã©ã¹ã颿°ã»ã¢ãããŒã·ã§ã³ãšãã£ããã¹ãŠã®ãã®ã«å®çŸ©ããããšãã§ããŸãã Platform-Specific Declarations - Kotlin Programming Language ãŸã iOSMain å
ã§ããã° iOS ã® Foundation ãã¬ãŒã ã¯ãŒã¯ãšãã£ãããã«ãåãã©ãããã©ãŒã ããšã®ãã¬ãŒã ã¯ãŒã¯ãããããå©çšããããšãã§ããŸãã ããããŠã§ãããSharedCode ã®ã©ã€ãã©ãªã¯ Android/iOS ã®ãããžã§ã¯ããã䜿ãæ
£ããã©ã€ãã©ãªãšåãããã«ã€ã³ããŒãããããšãã§ããŸãã Kotlin/Native ã®å¶çŽã«ã€ã㊠JVM äžã§ Kotlin ãåãããŠããæã«ã¯æšæºã©ã€ãã©ãªãã¡ã¢ãªç®¡çã«ã¯ Java ã®è³ç£ãå©çšããããšãã§ããŸããããKotlin/Native ã§ã¯ãããå©çšããããšãã§ããªããšããå¶çŽããããŸãã å
·äœçã«ã¢ããªãäœæããéã«ã¯äžèšã®ç¹ã«æ³šæãå¿
èŠã§ããã Java ã®æšæºã©ã€ãã©ãªã䜿çšããŠããã©ã€ãã©ãªãå©çšã§ããªããã Kotlin ã§èšè¿°ãããã©ã€ãã©ãªã®ã¿ã䜿çšãã iOS ã¢ããªãéçºããéã«ã¯ memScope, alloc / free ãªã©ãå©çšããŠã¡ã¢ãªç®¡çãèªåã§è¡ãå¿
èŠããã Java ã®è³ç£ãå©çšã§ããªã Kotlin ã«å¯ŸããŠå¿é
ããããšããããŸããããKotlin/Native åãã«æ§ã
ãªã©ã€ãã©ãªã æäŸãããŠããããããå©çšããããšã§åé¡ã解決ããŸããã çŸç¶ã¯æ¥ä»ç®¡çã§ãããµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã§æäœããå¿
èŠãããã®ãäžæºã§ãããKotlin/Native ã®çºå±ã«ãã£ãŠãããã£ãäžäŸ¿ãã¯è§£æ±ºãããããã«é¡ã£ãŠããŸãã ãsuspendã 颿°ã iOS åŽããçŽæ¥åŒã³åºãããšãã§ããªã (ã³ãŒã«ããã¯é¢æ°ããªã©ã«å€æããŠåŒã³åºãå¿
èŠããã) Kotlin ã§å®çŸ©ãã宣èšãåã®äžéšã Swift ã ãšå¥åã«ãªã£ãŠãã (ã objc_runtime_nameã ã ãswift_nameã ãåç
§ããå¿
èŠããã) ãcompanion objectã ã ãobjectã ãªã©ã·ã³ã°ã«ãã³ã®å®£èšã«å¯ŸããŠãªããžã§ã¯ããããªãŒãºããã ãThreadLocal / SharedImmutableã ã®ã¢ãããŒã·ã§ã³ãä»äžããå¿
èŠããã ãã¡ã㯠iOS ã§å©çšããå Žåã®æ³šæã§ãããããã€ãã® Kotlin ã®æ©èœãå©çšã§ããªãã£ããã远å ã®èšè¿°ãå¿
èŠãªãã®ããããŸãã 詳ããã¯äžèšã®è³æãåç
§ãã ããã Kotlin/Native as an Apple Framework - Kotlin Programming Language kotlin-native/IMMUTABILITY.md Kotlin/Native ã®å©çšäŸ ãŸã ãŸã å©çšäŸãå°ãªãããåèã«ãªãè³æãªã©ãããŸããªãã®ã§ããã以äžã®å®è£
ããªãŒãã³ãœãŒã¹ãšããŠå
¬éãããŠããããæ§æãé°å²æ°ãæŽãããã«ã¯ã¡ããã©è¯ãè³æãšãªããŸããã GitHub - JetBrains/kotlinconf-app: KotlinConf Schedule Application GitHub - DroidKaigi/conference-app-2020: The Official Conference App for DroidKaigi 2020 Tokyo ãŸãšã åŒç€Ÿã§ã¯ ãCLINICSã ãšãããªã³ã©ã€ã³èšºå¯ãè¡ãããšãã§ããã¢ããªããªãªãŒã¹ããŠããŸãã CLINICS ãé·æçã«éçšããŠããããã®æè¡èª¿æ»ã®äžç°ãšããŠãè¿å¹Žã® Android çéã§è©±é¡ã«ããã£ãŠãããKotlin/Nativeãã«ã€ããŠæ€èšŒãçºè¡šããŠã¿ãŸããã ãŸã ãŸã çºå±éäžæã®ããæè¡ã§ãããå®çšæ§ã®ãããããžã§ã¯ãã ãšæããŸãã®ã§ãèå³ã®ããæ¹ã¯ãã²äžåºŠã詊ããã ããïŒ
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã§ãšã³ãžãã¢ãããŠããŸãäžåè¯ã§ãã ã€ã³ãã¥ããŒã·ã§ã³æ¬éšã¯ 2020 幎 2 æããæ°èŠäºæ¥ã®éæãªã©ãç®çã«æ°èšãããã®ã§ããããã®äžã§ãè¥æã®éšé¡ãšããŠæ¥ã
é 匵ã£ãŠããŸãã CTO 平山ã®ã€ã³ã¿ãã¥ãŒãšãšãã«ã€ã³ãã¥ããŒã·ã§ã³ããŒã ã®ç޹ä»èšäºããã³ãŒãã¬ãŒããµã€ãã«æ²èŒãããŠããŸãããã¡ãããã²ã芧ãã ããã www.medley.jp www.medley.jp ããŠãä»åã¯ç€Ÿå
ã§è¡ã£ãŠããå匷äŒïŒããã¯ã©ã³ãã®äžã§ãKotlin/Nativeãã«ã€ããŠçºè¡šããæ©äŒããã£ãã®ã§ç޹ä»ãããŠããã ããŸãã Kotlin/Native ã«ã€ã㊠Kotlin 㯠JetBrains 瀟ã«ãã£ãŠ 2011 幎ã«çºè¡šãããããã°ã©ãã³ã°èšèªã§ãã çŸåšã§ã¯ Android éçºãªã©ã§äž»æµã®èšèªãšãªã£ãŠãããå€ãã®äººã«å©çšãããŠãããšæããŸãã Kotlin/Native ãšã¯ãã㪠Kotlin ã䜿ã£ãŠæ§ã
ãªãã©ãããã©ãŒã äžã§å®è¡å¯èœãªãã¡ã€ã«ãçæããããšãããããžã§ã¯ãã§ãã Kotlin/Native - Kotlin Programming Language ä»çµã¿ãšããŠã¯ Kotlin ã®ã³ãŒããããšã« LLVM ãçæãããããæ§ã
ãªãã©ãããã©ãŒã ã§å©çšå¯èœãªãã€ãã£ããã€ããªã«ã³ã³ãã€ã«ããããšã§è¿œå ã®ã©ã³ã¿ã€ã ã JVM ãªãã§åäœããããã«ããŠããŸãã ãµããŒãããŠãããã©ãããã©ãŒã ã¯äžèšã®ãšããã§ãã iOS (arm32, arm64, simulator x86_64) macOS (x86_64) watchOS (arm32, arm64, x86) tvOS (arm64, x86_64) Android (arm32, arm64, x86, x86_64) Windows (mingw x86_64, x86) Linux (x86_64, arm32, arm64, MIPS, MIPS little endian) WebAssembly (wasm32) ã³ãŒãã®å
±éåã«ã€ã㊠Kotlin/Native ã®ãã¥ãŒããªã¢ã«ãåèã«ãAndroid / iOS ã§å
±éåã®æµãã远ã£ãŠã¿ãŸãã äœæããããããžã§ã¯ã㯠Android / iOS ã§ãããã âHello, World!â ãåºåããã·ã³ãã«ãªããã°ã©ã ã§ãã Kotlin Playground: Edit, Run, Share Kotlin Code Online éåžžã®ãããžã§ã¯ããšã¯å¥ã« SharedCode ãšãããããžã§ã¯ããäœæãããã®äžã« Kotlin/Native (Android / iOS å
±éã®ã³ãŒã) ãèšè¿°ããŠãããŸãã ããããã®ã³ãŒãã®ã¬ã€ã¢ãŠãã¯ä»¥äžã®éãã§ãã â» SharedCode ãèªã¿èŸŒãããã®ãã«ããã©ãããã©ãŒã ã®ããã® gradle ãã¡ã€ã«ãå¿
èŠã§ãå
çšã®ãŠã§ããµã€ãã«èšèŒãããŠããŸãã commonMain ã®äžã« ãexpectã ãšããããŒã¯ãŒãã䜿ã£ãŠæœè±¡åã®ãããªãã®ã宣èšãã androidMain / iOSMain ãšãã£ãåãã©ãããã©ãŒã ã®å®è£
ã®äžã§ ãactualã ãšããããŒã¯ãŒãã䜿çšããŠãã®å
容ãèšè¿°ããŸãã // commonMain expect fun platformName (): String // androidMain actual fun platformName (): String { return "Android" } // iOSMain actual fun platformName (): String { return UIDevice.currentDevice. systemName () + " " + UIDevice.currentDevice.systemVersion } ãã®ãã¥ãŒããªã¢ã«ã«ã¯èšèŒãããŸãããããexpectã ãšããããŒã¯ãŒãã¯ã¯ã©ã¹ã颿°ã»ã¢ãããŒã·ã§ã³ãšãã£ããã¹ãŠã®ãã®ã«å®çŸ©ããããšãã§ããŸãã Platform-Specific Declarations - Kotlin Programming Language ãŸã iOSMain å
ã§ããã° iOS ã® Foundation ãã¬ãŒã ã¯ãŒã¯ãšãã£ãããã«ãåãã©ãããã©ãŒã ããšã®ãã¬ãŒã ã¯ãŒã¯ãããããå©çšããããšãã§ããŸãã ããããŠã§ãããSharedCode ã®ã©ã€ãã©ãªã¯ Android/iOS ã®ãããžã§ã¯ããã䜿ãæ
£ããã©ã€ãã©ãªãšåãããã«ã€ã³ããŒãããããšãã§ããŸãã Kotlin/Native ã®å¶çŽã«ã€ã㊠JVM äžã§ Kotlin ãåãããŠããæã«ã¯æšæºã©ã€ãã©ãªãã¡ã¢ãªç®¡çã«ã¯ Java ã®è³ç£ãå©çšããããšãã§ããŸããããKotlin/Native ã§ã¯ãããå©çšããããšãã§ããªããšããå¶çŽããããŸãã å
·äœçã«ã¢ããªãäœæããéã«ã¯äžèšã®ç¹ã«æ³šæãå¿
èŠã§ããã Java ã®æšæºã©ã€ãã©ãªã䜿çšããŠããã©ã€ãã©ãªãå©çšã§ããªããã Kotlin ã§èšè¿°ãããã©ã€ãã©ãªã®ã¿ã䜿çšãã iOS ã¢ããªãéçºããéã«ã¯ memScope, alloc / free ãªã©ãå©çšããŠã¡ã¢ãªç®¡çãèªåã§è¡ãå¿
èŠããã Java ã®è³ç£ãå©çšã§ããªã Kotlin ã«å¯ŸããŠå¿é
ããããšããããŸããããKotlin/Native åãã«æ§ã
ãªã©ã€ãã©ãªã æäŸãããŠããããããå©çšããããšã§åé¡ã解決ããŸããã çŸç¶ã¯æ¥ä»ç®¡çã§ãããµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã§æäœããå¿
èŠãããã®ãäžæºã§ãããKotlin/Native ã®çºå±ã«ãã£ãŠãããã£ãäžäŸ¿ãã¯è§£æ±ºãããããã«é¡ã£ãŠããŸãã ãsuspendã 颿°ã iOS åŽããçŽæ¥åŒã³åºãããšãã§ããªã (ã³ãŒã«ããã¯é¢æ°ããªã©ã«å€æããŠåŒã³åºãå¿
èŠããã) Kotlin ã§å®çŸ©ãã宣èšãåã®äžéšã Swift ã ãšå¥åã«ãªã£ãŠãã (ã objc_runtime_nameã ã ãswift_nameã ãåç
§ããå¿
èŠããã) ãcompanion objectã ã ãobjectã ãªã©ã·ã³ã°ã«ãã³ã®å®£èšã«å¯ŸããŠãªããžã§ã¯ããããªãŒãºããã ãThreadLocal / SharedImmutableã ã®ã¢ãããŒã·ã§ã³ãä»äžããå¿
èŠããã ãã¡ã㯠iOS ã§å©çšããå Žåã®æ³šæã§ãããããã€ãã® Kotlin ã®æ©èœãå©çšã§ããªãã£ããã远å ã®èšè¿°ãå¿
èŠãªãã®ããããŸãã 詳ããã¯äžèšã®è³æãåç
§ãã ããã Kotlin/Native as an Apple Framework - Kotlin Programming Language kotlin-native/IMMUTABILITY.md Kotlin/Native ã®å©çšäŸ ãŸã ãŸã å©çšäŸãå°ãªãããåèã«ãªãè³æãªã©ãããŸããªãã®ã§ããã以äžã®å®è£
ããªãŒãã³ãœãŒã¹ãšããŠå
¬éãããŠããããæ§æãé°å²æ°ãæŽãããã«ã¯ã¡ããã©è¯ãè³æãšãªããŸããã GitHub - JetBrains/kotlinconf-app: KotlinConf Schedule Application GitHub - DroidKaigi/conference-app-2020: The Official Conference App for DroidKaigi 2020 Tokyo ãŸãšã åŒç€Ÿã§ã¯ ãCLINICSã ãšãããªã³ã©ã€ã³èšºå¯ãè¡ãããšãã§ããã¢ããªããªãªãŒã¹ããŠããŸãã CLINICS ãé·æçã«éçšããŠããããã®æè¡èª¿æ»ã®äžç°ãšããŠãè¿å¹Žã® Android çéã§è©±é¡ã«ããã£ãŠãããKotlin/Nativeãã«ã€ããŠæ€èšŒãçºè¡šããŠã¿ãŸããã ãŸã ãŸã çºå±éäžæã®ããæè¡ã§ãããå®çšæ§ã®ãããããžã§ã¯ãã ãšæããŸãã®ã§ãèå³ã®ããæ¹ã¯ãã²äžåºŠã詊ããã ããïŒ
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã§ãšã³ãžãã¢ãããŠããŸãäžåè¯ã§ãã ã€ã³ãã¥ããŒã·ã§ã³æ¬éšã¯ 2020 幎 2 æããæ°èŠäºæ¥ã®éæãªã©ãç®çã«æ°èšãããã®ã§ããããã®äžã§ãè¥æã®éšé¡ãšããŠæ¥ã
é 匵ã£ãŠããŸãã CTO 平山ã®ã€ã³ã¿ãã¥ãŒãšãšãã«ã€ã³ãã¥ããŒã·ã§ã³ããŒã ã®ç޹ä»èšäºããã³ãŒãã¬ãŒããµã€ãã«æ²èŒãããŠããŸãããã¡ãããã²ã芧ãã ããã https://www.medley.jp/team/creator-story-incubation.html ããŠãä»åã¯ç€Ÿå
ã§è¡ã£ãŠããå匷äŒïŒããã¯ã©ã³ãã®äžã§ãKotlin/Nativeãã«ã€ããŠçºè¡šããæ©äŒããã£ãã®ã§ç޹ä»ãããŠããã ããŸãã Kotlin/Native ã«ã€ã㊠Kotlin 㯠JetBrains 瀟ã«ãã£ãŠ 2011 幎ã«çºè¡šãããããã°ã©ãã³ã°èšèªã§ãã çŸåšã§ã¯ Android éçºãªã©ã§äž»æµã®èšèªãšãªã£ãŠãããå€ãã®äººã«å©çšãããŠãããšæããŸãã Kotlin/Native ãšã¯ãã㪠Kotlin ã䜿ã£ãŠæ§ã
ãªãã©ãããã©ãŒã äžã§å®è¡å¯èœãªãã¡ã€ã«ãçæããããšãããããžã§ã¯ãã§ãã Kotlin/Native - Kotlin Programming Language ä»çµã¿ãšããŠã¯ Kotlin ã®ã³ãŒããããšã« LLVM ãçæãããããæ§ã
ãªãã©ãããã©ãŒã ã§å©çšå¯èœãªãã€ãã£ããã€ããªã«ã³ã³ãã€ã«ããããšã§è¿œå ã®ã©ã³ã¿ã€ã ã JVM ãªãã§åäœããããã«ããŠããŸãã ãµããŒãããŠãããã©ãããã©ãŒã ã¯äžèšã®ãšããã§ãã iOS (arm32, arm64, simulator x86_64) macOS (x86_64) watchOS (arm32, arm64, x86) tvOS (arm64, x86_64) Android (arm32, arm64, x86, x86_64) Windows (mingw x86_64, x86) Linux (x86_64, arm32, arm64, MIPS, MIPS little endian) WebAssembly (wasm32) ã³ãŒãã®å
±éåã«ã€ã㊠Kotlin/Native ã®ãã¥ãŒããªã¢ã«ãåèã«ãAndroid / iOS ã§å
±éåã®æµãã远ã£ãŠã¿ãŸãã äœæããããããžã§ã¯ã㯠Android / iOS ã§ãããã âHello, World!â ãåºåããã·ã³ãã«ãªããã°ã©ã ã§ãã Kotlin Playground: Edit, Run, Share Kotlin Code Online éåžžã®ãããžã§ã¯ããšã¯å¥ã« SharedCode ãšãããããžã§ã¯ããäœæãããã®äžã« Kotlin/Native (Android / iOS å
±éã®ã³ãŒã) ãèšè¿°ããŠãããŸãã ããããã®ã³ãŒãã®ã¬ã€ã¢ãŠãã¯ä»¥äžã®éãã§ãã â» SharedCode ãèªã¿èŸŒãããã®ãã«ããã©ãããã©ãŒã ã®ããã® gradle ãã¡ã€ã«ãå¿
èŠã§ãå
çšã®ãŠã§ããµã€ãã«èšèŒãããŠããŸãã commonMain ã®äžã« ãexpectã ãšããããŒã¯ãŒãã䜿ã£ãŠæœè±¡åã®ãããªãã®ã宣èšãã androidMain / iOSMain ãšãã£ãåãã©ãããã©ãŒã ã®å®è£
ã®äžã§ ãactualã ãšããããŒã¯ãŒãã䜿çšããŠãã®å
容ãèšè¿°ããŸãã // commonMain expect fun platformName (): String // androidMain actual fun platformName (): String { return "Android" } // iOSMain actual fun platformName (): String { return UIDevice.currentDevice. systemName () + " " + UIDevice.currentDevice.systemVersion } ãã®ãã¥ãŒããªã¢ã«ã«ã¯èšèŒãããŸãããããexpectã ãšããããŒã¯ãŒãã¯ã¯ã©ã¹ã颿°ã»ã¢ãããŒã·ã§ã³ãšãã£ããã¹ãŠã®ãã®ã«å®çŸ©ããããšãã§ããŸãã Platform-Specific Declarations - Kotlin Programming Language ãŸã iOSMain å
ã§ããã° iOS ã® Foundation ãã¬ãŒã ã¯ãŒã¯ãšãã£ãããã«ãåãã©ãããã©ãŒã ããšã®ãã¬ãŒã ã¯ãŒã¯ãããããå©çšããããšãã§ããŸãã ããããŠã§ãããSharedCode ã®ã©ã€ãã©ãªã¯ Android/iOS ã®ãããžã§ã¯ããã䜿ãæ
£ããã©ã€ãã©ãªãšåãããã«ã€ã³ããŒãããããšãã§ããŸãã Kotlin/Native ã®å¶çŽã«ã€ã㊠JVM äžã§ Kotlin ãåãããŠããæã«ã¯æšæºã©ã€ãã©ãªãã¡ã¢ãªç®¡çã«ã¯ Java ã®è³ç£ãå©çšããããšãã§ããŸããããKotlin/Native ã§ã¯ãããå©çšããããšãã§ããªããšããå¶çŽããããŸãã å
·äœçã«ã¢ããªãäœæããéã«ã¯äžèšã®ç¹ã«æ³šæãå¿
èŠã§ããã Java ã®æšæºã©ã€ãã©ãªã䜿çšããŠããã©ã€ãã©ãªãå©çšã§ããªããã Kotlin ã§èšè¿°ãããã©ã€ãã©ãªã®ã¿ã䜿çšãã iOS ã¢ããªãéçºããéã«ã¯ memScope, alloc / free ãªã©ãå©çšããŠã¡ã¢ãªç®¡çãèªåã§è¡ãå¿
èŠããã Java ã®è³ç£ãå©çšã§ããªã Kotlin ã«å¯ŸããŠå¿é
ããããšããããŸããããKotlin/Native åãã«æ§ã
ãªã©ã€ãã©ãªã æäŸãããŠããããããå©çšããããšã§åé¡ã解決ããŸããã çŸç¶ã¯æ¥ä»ç®¡çã§ãããµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã§æäœããå¿
èŠãããã®ãäžæºã§ãããKotlin/Native ã®çºå±ã«ãã£ãŠãããã£ãäžäŸ¿ãã¯è§£æ±ºãããããã«é¡ã£ãŠããŸãã ãsuspendã 颿°ã iOS åŽããçŽæ¥åŒã³åºãããšãã§ããªã (ã³ãŒã«ããã¯é¢æ°ããªã©ã«å€æããŠåŒã³åºãå¿
èŠããã) Kotlin ã§å®çŸ©ãã宣èšãåã®äžéšã Swift ã ãšå¥åã«ãªã£ãŠãã (ã objc_runtime_nameã ã ãswift_nameã ãåç
§ããå¿
èŠããã) ãcompanion objectã ã ãobjectã ãªã©ã·ã³ã°ã«ãã³ã®å®£èšã«å¯ŸããŠãªããžã§ã¯ããããªãŒãºããã ãThreadLocal / SharedImmutableã ã®ã¢ãããŒã·ã§ã³ãä»äžããå¿
èŠããã ãã¡ã㯠iOS ã§å©çšããå Žåã®æ³šæã§ãããããã€ãã® Kotlin ã®æ©èœãå©çšã§ããªãã£ããã远å ã®èšè¿°ãå¿
èŠãªãã®ããããŸãã 詳ããã¯äžèšã®è³æãåç
§ãã ããã Kotlin/Native as an Apple Framework - Kotlin Programming Language kotlin-native/IMMUTABILITY.md Kotlin/Native ã®å©çšäŸ ãŸã ãŸã å©çšäŸãå°ãªãããåèã«ãªãè³æãªã©ãããŸããªãã®ã§ããã以äžã®å®è£
ããªãŒãã³ãœãŒã¹ãšããŠå
¬éãããŠããããæ§æãé°å²æ°ãæŽãããã«ã¯ã¡ããã©è¯ãè³æãšãªããŸããã GitHub - JetBrains/kotlinconf-app: KotlinConf Schedule Application GitHub - DroidKaigi/conference-app-2020: The Official Conference App for DroidKaigi 2020 Tokyo ãŸãšã åŒç€Ÿã§ã¯ ãCLINICSã ãšãããªã³ã©ã€ã³èšºå¯ãè¡ãããšãã§ããã¢ããªããªãªãŒã¹ããŠããŸãã CLINICS ãé·æçã«éçšããŠããããã®æè¡èª¿æ»ã®äžç°ãšããŠãè¿å¹Žã® Android çéã§è©±é¡ã«ããã£ãŠãããKotlin/Nativeãã«ã€ããŠæ€èšŒãçºè¡šããŠã¿ãŸããã ãŸã ãŸã çºå±éäžæã®ããæè¡ã§ãããå®çšæ§ã®ãããããžã§ã¯ãã ãšæããŸãã®ã§ãèå³ã®ããæ¹ã¯ãã²äžåºŠã詊ããã ããïŒ
ããã«ã¡ã¯ãã€ã³ãã¥ããŒã·ã§ã³æ¬éšã§ãšã³ãžãã¢ãããŠããŸãäžåè¯ã§ãã ã€ã³ãã¥ããŒã·ã§ã³æ¬éšã¯ 2020 幎 2 æããæ°èŠäºæ¥ã®éæãªã©ãç®çã«æ°èšãããã®ã§ããããã®äžã§ãè¥æã®éšé¡ãšããŠæ¥ã
é 匵ã£ãŠããŸãã CTO 平山ã®ã€ã³ã¿ãã¥ãŒãšãšãã«ã€ã³ãã¥ããŒã·ã§ã³ããŒã ã®ç޹ä»èšäºããã³ãŒãã¬ãŒããµã€ãã«æ²èŒãããŠããŸãããã¡ãããã²ã芧ãã ããã www.medley.jp www.medley.jp ããŠãä»åã¯ç€Ÿå
ã§è¡ã£ãŠããå匷äŒïŒããã¯ã©ã³ãã®äžã§ãKotlin/Nativeãã«ã€ããŠçºè¡šããæ©äŒããã£ãã®ã§ç޹ä»ãããŠããã ããŸãã Kotlin/Native ã«ã€ã㊠Kotlin 㯠JetBrains 瀟ã«ãã£ãŠ 2011 幎ã«çºè¡šãããããã°ã©ãã³ã°èšèªã§ãã çŸåšã§ã¯ Android éçºãªã©ã§äž»æµã®èšèªãšãªã£ãŠãããå€ãã®äººã«å©çšãããŠãããšæããŸãã Kotlin/Native ãšã¯ãã㪠Kotlin ã䜿ã£ãŠæ§ã
ãªãã©ãããã©ãŒã äžã§å®è¡å¯èœãªãã¡ã€ã«ãçæããããšãããããžã§ã¯ãã§ãã Kotlin/Native - Kotlin Programming Language ä»çµã¿ãšããŠã¯ Kotlin ã®ã³ãŒããããšã« LLVM ãçæãããããæ§ã
ãªãã©ãããã©ãŒã ã§å©çšå¯èœãªãã€ãã£ããã€ããªã«ã³ã³ãã€ã«ããããšã§è¿œå ã®ã©ã³ã¿ã€ã ã JVM ãªãã§åäœããããã«ããŠããŸãã ãµããŒãããŠãããã©ãããã©ãŒã ã¯äžèšã®ãšããã§ãã iOS (arm32, arm64, simulator x86_64) macOS (x86_64) watchOS (arm32, arm64, x86) tvOS (arm64, x86_64) Android (arm32, arm64, x86, x86_64) Windows (mingw x86_64, x86) Linux (x86_64, arm32, arm64, MIPS, MIPS little endian) WebAssembly (wasm32) ã³ãŒãã®å
±éåã«ã€ã㊠Kotlin/Native ã®ãã¥ãŒããªã¢ã«ãåèã«ãAndroid / iOS ã§å
±éåã®æµãã远ã£ãŠã¿ãŸãã äœæããããããžã§ã¯ã㯠Android / iOS ã§ãããã âHello, World!â ãåºåããã·ã³ãã«ãªããã°ã©ã ã§ãã Kotlin Playground: Edit, Run, Share Kotlin Code Online éåžžã®ãããžã§ã¯ããšã¯å¥ã« SharedCode ãšãããããžã§ã¯ããäœæãããã®äžã« Kotlin/Native (Android / iOS å
±éã®ã³ãŒã) ãèšè¿°ããŠãããŸãã ããããã®ã³ãŒãã®ã¬ã€ã¢ãŠãã¯ä»¥äžã®éãã§ãã â» SharedCode ãèªã¿èŸŒãããã®ãã«ããã©ãããã©ãŒã ã®ããã® gradle ãã¡ã€ã«ãå¿
èŠã§ãå
çšã®ãŠã§ããµã€ãã«èšèŒãããŠããŸãã commonMain ã®äžã« ãexpectã ãšããããŒã¯ãŒãã䜿ã£ãŠæœè±¡åã®ãããªãã®ã宣èšãã androidMain / iOSMain ãšãã£ãåãã©ãããã©ãŒã ã®å®è£
ã®äžã§ ãactualã ãšããããŒã¯ãŒãã䜿çšããŠãã®å
容ãèšè¿°ããŸãã // commonMain expect fun platformName (): String // androidMain actual fun platformName (): String { return "Android" } // iOSMain actual fun platformName (): String { return UIDevice.currentDevice. systemName () + " " + UIDevice.currentDevice.systemVersion } ãã®ãã¥ãŒããªã¢ã«ã«ã¯èšèŒãããŸãããããexpectã ãšããããŒã¯ãŒãã¯ã¯ã©ã¹ã颿°ã»ã¢ãããŒã·ã§ã³ãšãã£ããã¹ãŠã®ãã®ã«å®çŸ©ããããšãã§ããŸãã Platform-Specific Declarations - Kotlin Programming Language ãŸã iOSMain å
ã§ããã° iOS ã® Foundation ãã¬ãŒã ã¯ãŒã¯ãšãã£ãããã«ãåãã©ãããã©ãŒã ããšã®ãã¬ãŒã ã¯ãŒã¯ãããããå©çšããããšãã§ããŸãã ããããŠã§ãããSharedCode ã®ã©ã€ãã©ãªã¯ Android/iOS ã®ãããžã§ã¯ããã䜿ãæ
£ããã©ã€ãã©ãªãšåãããã«ã€ã³ããŒãããããšãã§ããŸãã Kotlin/Native ã®å¶çŽã«ã€ã㊠JVM äžã§ Kotlin ãåãããŠããæã«ã¯æšæºã©ã€ãã©ãªãã¡ã¢ãªç®¡çã«ã¯ Java ã®è³ç£ãå©çšããããšãã§ããŸããããKotlin/Native ã§ã¯ãããå©çšããããšãã§ããªããšããå¶çŽããããŸãã å
·äœçã«ã¢ããªãäœæããéã«ã¯äžèšã®ç¹ã«æ³šæãå¿
èŠã§ããã Java ã®æšæºã©ã€ãã©ãªã䜿çšããŠããã©ã€ãã©ãªãå©çšã§ããªããã Kotlin ã§èšè¿°ãããã©ã€ãã©ãªã®ã¿ã䜿çšãã iOS ã¢ããªãéçºããéã«ã¯ memScope, alloc / free ãªã©ãå©çšããŠã¡ã¢ãªç®¡çãèªåã§è¡ãå¿
èŠããã Java ã®è³ç£ãå©çšã§ããªã Kotlin ã«å¯ŸããŠå¿é
ããããšããããŸããããKotlin/Native åãã«æ§ã
ãªã©ã€ãã©ãªã æäŸãããŠããããããå©çšããããšã§åé¡ã解決ããŸããã çŸç¶ã¯æ¥ä»ç®¡çã§ãããµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã§æäœããå¿
èŠãããã®ãäžæºã§ãããKotlin/Native ã®çºå±ã«ãã£ãŠãããã£ãäžäŸ¿ãã¯è§£æ±ºãããããã«é¡ã£ãŠããŸãã ãsuspendã 颿°ã iOS åŽããçŽæ¥åŒã³åºãããšãã§ããªã (ã³ãŒã«ããã¯é¢æ°ããªã©ã«å€æããŠåŒã³åºãå¿
èŠããã) Kotlin ã§å®çŸ©ãã宣èšãåã®äžéšã Swift ã ãšå¥åã«ãªã£ãŠãã (ã objc_runtime_nameã ã ãswift_nameã ãåç
§ããå¿
èŠããã) ãcompanion objectã ã ãobjectã ãªã©ã·ã³ã°ã«ãã³ã®å®£èšã«å¯ŸããŠãªããžã§ã¯ããããªãŒãºããã ãThreadLocal / SharedImmutableã ã®ã¢ãããŒã·ã§ã³ãä»äžããå¿
èŠããã ãã¡ã㯠iOS ã§å©çšããå Žåã®æ³šæã§ãããããã€ãã® Kotlin ã®æ©èœãå©çšã§ããªãã£ããã远å ã®èšè¿°ãå¿
èŠãªãã®ããããŸãã 詳ããã¯äžèšã®è³æãåç
§ãã ããã Kotlin/Native as an Apple Framework - Kotlin Programming Language kotlin-native/IMMUTABILITY.md Kotlin/Native ã®å©çšäŸ ãŸã ãŸã å©çšäŸãå°ãªãããåèã«ãªãè³æãªã©ãããŸããªãã®ã§ããã以äžã®å®è£
ããªãŒãã³ãœãŒã¹ãšããŠå
¬éãããŠããããæ§æãé°å²æ°ãæŽãããã«ã¯ã¡ããã©è¯ãè³æãšãªããŸããã GitHub - JetBrains/kotlinconf-app: KotlinConf Schedule Application GitHub - DroidKaigi/conference-app-2020: The Official Conference App for DroidKaigi 2020 Tokyo ãŸãšã åŒç€Ÿã§ã¯ ãCLINICSã ãšãããªã³ã©ã€ã³èšºå¯ãè¡ãããšãã§ããã¢ããªããªãªãŒã¹ããŠããŸãã CLINICS ãé·æçã«éçšããŠããããã®æè¡èª¿æ»ã®äžç°ãšããŠãè¿å¹Žã® Android çéã§è©±é¡ã«ããã£ãŠãããKotlin/Nativeãã«ã€ããŠæ€èšŒãçºè¡šããŠã¿ãŸããã ãŸã ãŸã çºå±éäžæã®ããæè¡ã§ãããå®çšæ§ã®ãããããžã§ã¯ãã ãšæããŸãã®ã§ãèå³ã®ããæ¹ã¯ãã²äžåºŠã詊ããã ããïŒ
ããã«ã¡ã¯ãã¡ãã¬ãŒãããã¯ãéçºå®€ ãšã³ãžãã¢ã®å²žç°ã§ãã å
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããå»çä»è·åéã®äººæãã©ãããã©ãŒã ããžã§ãã¡ãã¬ãŒãã®éçºã§å©çšããŠãã CircleCI ã§ã® CI/CD ã«ã€ããŠã®åãçµã¿ãçºè¡šããŸããã®ã§ã玹ä»ãããŠããã ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®éçºã§ CircleCI ãã©ã®ããã«å©çšããŠããã ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ãäž»ã«æ¬¡ã® 2 ã€ã CircleCI ãçšããŠè¡ãªã£ãŠããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ããã〠ãããã€ã«é¢ããŠã¯ãECS ç°å¢ãš EC2 ç°å¢ãžã® 2 éãã®ãããã€ã CircleCI ãå©çšããŠè¡ãªã£ãŠããŸãã ãã®ãã CircleCI ã® Workflow ã¯ããŠããããã¹ãã»æ§æãã§ãã¯ããEC2 ãžã®ãããã€ããECS ãžã®ãããã€ãã® 3 ã€ã«åãããŠããŸãã 3 ã€ã® Workflow ã倧ãŸãã«èª¬æãããŠããã ããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ãžã§ãã¡ãã¬ãŒã¯äž»ã«ãµãŒããµã€ãã Ruby on Railsãããã³ããšã³ãã React ã䜿ã£ãŠéçºãããŠããŸãã ãã®ãããŠããããã¹ãã«ã¯ RSpec ã» Jest ããæ§æãã§ãã¯ã«ã¯ Rubocop ãš ESLint å©çšããŠããŸãã ãã® Workflow 㯠3 ã€ã®ãžã§ãã§æ§æãããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« bundle install ã» yarn install ãªã©ãè¡ãããŠããããã¹ãã»æ§æãã§ãã¯ã®å®è¡ã«å¿
èŠãªäŸåã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããCircleCI ã®ãã£ãã·ã¥æ©èœãçšããŠãã£ãã·ã¥ãè¡ãªã£ãŠããŸã RSpec ã®å®è¡ 2 ã³ã³ãããå©çšããŠã®äžŠåå®è¡ãè¡ãªã£ãŠããŸã æ§æãã§ãã¯ãš Jest ã®å®è¡ RSpec ãšæ¯èŒã㊠Jest ã§ã®ãã¹ãã³ãŒãã¯ããªã¥ãŒã ãå°ãªãã»å®è¡æéãçããããæ§æãã§ãã¯ãšäžç·ã« 1 ã€ã®ãžã§ãã«ããŠããŸã ãã® Workflow ã¯ã©ã®ãã©ã³ãã§ã GitHub ãž Push ãè¡ããããã³ã«å®è¡ãããããã«ããŠããŸãã EC2 ãžã®ããã〠ãã® Workflow ã§ã¯ãããã€ãè¡ãããã®æºåãšãæåéã EC2 ãžã®ãããã€ãè¡ãªã£ãŠããŸãã ãããã€ã«ã¯ Ruby gem ã® Capistrano ãå©çšããŠããŸãã äžèšã®ãã㪠2 ã€ã®ãžã§ãã§æ§æããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« åè¿°ã®ãŠããããã¹ãã»æ§æãã§ãã¯ã® Workflow ã® 1 ã€ç®ãšåã圹å²ã§ã ãã«ããšããã〠Rails ã® assets:precompile ã yarn build ãªã©ã®åŠçãšãCapistrano ãçšãããããã€ãè¡ãªã£ãŠããŸã ãã® Workflow ã¯ç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã ECS ãžã®ããã〠ãã® Workflow ã§ã¯ ECS ãžãããã€ããããã® Docker image äœæãšãã®ããã®ãã«ããªã©ãè¡ãªã£ãŠããŸãã ãžã§ãã¯äžèšã®ããã« 4 ã€ã§æ§æãããŠããŸãã npm package ã®ã€ã³ã¹ããŒã« ããã³ããšã³ãã®ãã«ã Gem ã®ã€ã³ã¹ããŒã«ãš Rails ã® assets:precompile Docker image ã®äœæãš Push ãã¡ãã® Workflow ãç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã æ±ããŠãã課é¡ãš assets:precompile ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ CircleCI ã®åãžã§ããå
šãŠæ£åžžã«å®äºããããšã PR ãããŒãžããæ¡ä»¶ã® 1 ã€ã«ããŠããŸãã ãããå Workflow ã»ãžã§ãã®å®è¡æéãé·ãããžã§ãã®å®è¡åŸ
ã¡ãããªããã°ãããªããšããç¶æ³ãããèµ·ãã£ãŠããŸã£ãŠããŸããã ç¹ã«æéãããã£ãŠããã®ããäžèšã® 3 ã€ã§ããã ãEC2 ãžã®ãããã€ãWorkflow ã®ããããã€ããžã§ã ãECS ãžã®ãããã€ãWorkflow ã®ãGem ã®ã€ã³ã¹ããŒã«ãš Rails ã® asset_precompileããžã§ã ãRSpec ã®å®è¡ããžã§ã RSpec ã®æžãæ¹ãªã©ãæ¹åããããšã§ççž®ã§ããããã岿ãããŠããã ããŸã ãããã«ã€ããŠèª¿æ»ãããšããã1ã» 2 ã¯ãassets:precompile ãäž»ã«æéã䜿ã£ãŠããããšãåãããŸããã ãã®ç¹ã«ã€ããŠåå ãšè¡ãªã£ãæ¹åã説æããããŠããã ãããšæããŸãã assets:precompile ã«æéãããã ãžã§ãã¡ãã¬ãŒã§ã¯ Rails ã®ã¢ã»ãããã€ãã©ã€ã³ãå©çšããŠãã¢ã»ãããã¡ã€ã«ã®ã³ã³ãã€ã«ã»æå°åãªã©ãè¡ãªã£ãŠããŸãã ãããå®è¡ããéã« assets:precompile ã³ãã³ããå©çšããŠããŸãã ãŸããåã³ãã³ãå®è¡æã«ã³ã³ãã€ã«ãããã¡ã€ã«ã AWS S3 ãã±ããã«ã¢ããããŒãããããã« asset_sync gem ãå©çšããŠããŸãã ãã®ã³ãã³ãã®å®è¡ã«ã¯ 9 åãã 10 åã»ã©ã®æéãããã£ãŠãããäžèšã® 2 ã€ã®åå ã§é
ããªã£ãŠããŸããã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ãã¡ãã«ã€ããŠã¯èªãã§åã®ããšãã§ãããããã〠Workflow ãå®è¡ããããã³ã«ã¢ã»ãããã¡ã€ã«ã®å€æŽæç¡ã«é¢ããããæ¯å 3 åã»ã©ãè²»ãããŠå
šãŠã®ã¢ã»ãããã¡ã€ã«ãã³ã³ãã€ã«ã»æå°åããŠããŸããã ãã¡ãã®è§£æ±ºçãšããŠã¯ã CircleCI ã®å
¬åŒããã¥ã¡ã³ãã§ãäŸãèŒããããŠããŸã ãã assets:precompile ã³ãã³ãã§çæããããã¡ã€ã«ã眮ããããã£ã¬ã¯ããªïŒ public/assets ïŒã CircleCI ã§ãã£ãã·ã¥ãããããšã§å¯Ÿå¿ããŸããã ãã£ãã·ã¥ãããããšã§ãæ¯å 3 åã»ã©ããã£ãŠããåŠçã 1 åã»ã©ã«ççž®ããããšãã§ããŸããã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã ãã¡ãã€ããŠã¯ããå°ãèæ¯ãè€éãã€ããŸã 解決ãŸã§ã¯ã§ããŠããŸããã ãŸã asset_sync ãå©çšãããã¡ã€ã«ã®ã¢ããããŒãåŠçã§ãããæ¯å 6 å以äžã®æéãããã£ãŠããŸããã CircleCI ã®ãã°ãããããèŠãŠã¿ããšã¢ããããŒãèªäœã«æéãããã£ãŠããã®ã§ã¯ãªãããã©ã®ãã¡ã€ã«ãã¢ããããŒããã¹ãããã倿ããåŠçã«å€ãã®æéãè²»ãããŠããããšãåãããŸããã ïŒ1 ãã¡ã€ã«ãã¢ããããŒãããŠããªãã 6 å 20 ç§ããã£ãŠããïŒ ããã§ã asset_sync gem ã®ãœãŒã¹ã³ãŒããèªãã§ã¿ããšããã¢ããããŒãå
ã® S3 ãã±ããã«ãããã¡ã€ã«ãå
šãŠååŸãã assets:precompile ã³ãã³ããçæãããã¡ã€ã«ã®ãã¡ã€ã«åãšæ¯èŒããããšããåŠçããããŸããã ãã®åŠçãæªããã®ã§ã¯ãªãããšæããS3 ãã±ããã確èªããŠã¿ããšããæ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ãååšããããšãåãããŸããã æ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ã®æ
å ±ãååŸããŠããããšãèãããš 6 åä»¥äžæéããããã®ãçŽåŸã§ãã ãã®åé¡ã®è§£æ±ºçã¯äžèšã® 2 ã€ãèãåŸããšèããŸããã äžèŠãªãã¡ã€ã«ã S3 ãã±ããããåé€ãã ååã®ãããã€ãšã®æ¯èŒãã㊠S3 ã«ã¢ã¯ã»ã¹ããã«ã¢ããããŒããã¹ããã¡ã€ã«ãã©ããã倿ããããã«ãã 1 ã€ç®ã®æ¹æ³ã¯æ£æ»æ³ã§ãæ°åäžãã¡ã€ã«ãå
šãŠäœ¿ã£ãŠããããã§ã¯ãªãããå©çšãããŠããªããã¡ã€ã«ãåé€ããŠããŸãæ¹æ³ã§ãã asset_sync ãæ©ããªããS3 ã®å©çšæãå°ãªããªããããã®æ¹æ³ãåããã®ã§ããã°ããã®æ¹æ³ã§è§£æ±ºããã®ãè¯ãããã«æããŸãã ãžã§ãã¡ãã¬ãŒã§ããã®æ¹æ³ãåããªãããšæ€èšããŸãããããžã§ãã¡ãã¬ãŒããé
ä¿¡ããŠãã HTML ã¡ãŒã«ãªã©ã§ãå©çšããŠãããã¡ã€ã«ãããããäžæŠã«ã¢ã¯ã»ã¹ãããŠããªããããšãã£ãŠåé€ããããšãã§ããããã®æ¹æ³ã§ã®è§£æ±ºã¯äžæŠæå¿µããŸããã 2 ã€ç®ã®æ¹æ³ã¯ assets:precompile ã³ãã³ããçæãã manifest ãã¡ã€ã«ïŒçæãããã¡ã€ã«ã®ãªã¹ããªã©ãèšè¿°ãããŠããïŒãš CircleCI ã®ãã£ãã·ã¥æ©èœã䜿ã£ãŠççž®ããæ¹æ³ã§ãã manifest ãã¡ã€ã«ã¯ãã³ã³ãã€ã«åŸã®ã¢ã»ãããã¡ã€ã«ãåºåããããã£ã¬ã¯ããªïŒ public/assets/ ïŒã«åãããã«åºåããããŸããäžèšã§ public/assets ã CircleCI ã®ãã£ãã·ã¥æ©èœã§ãã£ãã·ã¥ããããã«ãããããmanifest ãã¡ã€ã«ãäžç·ã«ãã£ãã·ã¥ãããããã«ãªã£ãŠããŸãã assets:precompile ã®å®è¡ã«ããä»åäœæããã manifest ãã¡ã€ã«ãšããã£ãã·ã¥ãããŠãã manifest ãã¡ã€ã«ãæ¯èŒããŠå·®åãåºããã¡ã€ã«ã ãã S3 ã«ã¢ããããŒãããããã«ããããšãã詊ã¿ã§ãã ãã®åŠç㯠asset_sync gem ã§ã¯ã§ãããã«ãªãã£ãã®ã§ãã·ã§ã«ã¹ã¯ãªãããš Rake ã¿ã¹ã¯ãäœæããŠå®è¡ããŠã¿ããšããããã¢ããããŒããã¹ããã¡ã€ã«ãã©ãããã倿ããããã®æéãã»ãŒãªããªãã6 å以äžã®ççž®ãããããšãã§ããŸããã ãã ãæ€èšŒãäžååãªãããå®éçšã«ä¹ããããšã¯ãŸã ã§ããŠããŸããã CircleCI ã®ãžã§ãå®è¡æéãççž®ããå°ããªæ¹åäºé
äžè¿°ã®éããå Workflow ã§å€§ããæéãè²»ãããŠããã®ã¯ assets:precompile ãš RSpec ã®å®è¡ã§ãããã现ããªç¹ãšããŠã¯ä»ã«ãå°ããæ¹åãããããšããããŸãã ã³ãŒãã®ãã§ãã¯ã¢ãŠã CircleCI ã§ã¯çµã¿èŸŒã¿ã®ã³ãã³ããšã㊠checkout ã³ãã³ãããããŸãã ããã¯å¯Ÿè±¡ã®ãªããžããªã®ãã©ã³ããã¯ããŒã³ããŠãããã³ãã³ãã§ããããžã§ãã¡ãã¬ãŒã¯ã¢ãã¬ãã«è¿ãæ§æã«ãªã£ãŠãããã³ãŒãããŒã¹ã®ãµã€ãºãå±¥æŽã倧ããããã¯ããŒã³ããã ãã§ããçšåºŠã®æéãããã£ãŠããŸã£ãŠããŸãã ããã§ãŸãã¯ã .git ãã£ã¬ã¯ããªã CircleCI ã®ãã£ãã·ã¥æ©èœãå©çšããŠãã£ãã·ã¥ããããã«ããŠã¿ãŸããã ãããšã checkout ã³ãã³ãèªäœã¯å€§ããççž®ããŸãããããã£ãã·ã¥ã® save/restore ã«ççž®ãã以äžã®æéããããããã«ãªã£ãŠããŸããŸããã å¥ã®æ¹æ³ãšã㊠checkout ã³ãã³ããå©çšããã«ãGit ã® Shallow clone ã Sparse clone ãé§äœ¿ããŠå¿
èŠãªãã¡ã€ã«ãå±¥æŽã ããã¯ããŒã³ãããšããããšãã§ããŸãã çŸåšã¯ Sparse clone ãäžéšå°å
¥ããŠã¿ãŠãããShallow clone ãå°å
¥ããããšèããŠããŸãã Docker image ã®äœæ ãžã§ãã¡ãã¬ãŒã§ã¯ ECS ãžã®ãããã€ã®éã« CircleCI äžã§ Docker image ããã«ãããŠããããã docker build ã³ãã³ãã®å®è¡æéãå¯èœãªéãæããããšèããŠããŸãã ççž®ããæ¹æ³ã¯æ§ã
ããããšæããŸãããCircleCI äžã§ã Dokcer Buildkit ãå©çšããããšãããŸãã®ã§ããããå©çšããŠãã«ãããããšã§ç°¡åã«ççž®ããããšãã§ããŸãã 詳ãã㯠Docker ã®ã¬ã€ã ã«èšèŒã®éãã§ã¯ãããŸãããDOCKER_BUILDKIT=1 ãæå®ã㊠docker build ãå®è¡ããã ãã§å©çšããããšãã§ãããžã§ãã¡ãã¬ãŒã§ã¯ 2 åã»ã©ããã£ãŠãããã«ãã 40 ç§ã»ã©ççž®ããããšãã§ããŸããã ãŸãšã ä»åã¯ãTechLunch ã§çºè¡šãããžã§ãã¡ãã¬ãŒã«ããã CircleCI ã®æŽ»çšãšæ¹åã®åãçµã¿ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ä»å玹ä»ãããŠããã ãã以å€ã«ãæ§ã
ãªçšéããããä»åŸãããã«ããŸã掻çšããŠãããããšæã£ãŠããŸãã ã芧ããã ãããããšãããããŸããã
ããã«ã¡ã¯ãã¡ãã¬ãŒãããã¯ãéçºå®€ ãšã³ãžãã¢ã®å²žç°ã§ãã å
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããå»çä»è·åéã®äººæãã©ãããã©ãŒã ããžã§ãã¡ãã¬ãŒãã®éçºã§å©çšããŠãã CircleCI ã§ã® CI/CD ã«ã€ããŠã®åãçµã¿ãçºè¡šããŸããã®ã§ã玹ä»ãããŠããã ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®éçºã§ CircleCI ãã©ã®ããã«å©çšããŠããã ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ãäž»ã«æ¬¡ã® 2 ã€ã CircleCI ãçšããŠè¡ãªã£ãŠããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ããã〠ãããã€ã«é¢ããŠã¯ãECS ç°å¢ãš EC2 ç°å¢ãžã® 2 éãã®ãããã€ã CircleCI ãå©çšããŠè¡ãªã£ãŠããŸãã ãã®ãã CircleCI ã® Workflow ã¯ããŠããããã¹ãã»æ§æãã§ãã¯ããEC2 ãžã®ãããã€ããECS ãžã®ãããã€ãã® 3 ã€ã«åãããŠããŸãã 3 ã€ã® Workflow ã倧ãŸãã«èª¬æãããŠããã ããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ãžã§ãã¡ãã¬ãŒã¯äž»ã«ãµãŒããµã€ãã Ruby on Railsãããã³ããšã³ãã React ã䜿ã£ãŠéçºãããŠããŸãã ãã®ãããŠããããã¹ãã«ã¯ RSpec ã» Jest ããæ§æãã§ãã¯ã«ã¯ Rubocop ãš ESLint å©çšããŠããŸãã ãã® Workflow 㯠3 ã€ã®ãžã§ãã§æ§æãããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« bundle install ã» yarn install ãªã©ãè¡ãããŠããããã¹ãã»æ§æãã§ãã¯ã®å®è¡ã«å¿
èŠãªäŸåã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããCircleCI ã®ãã£ãã·ã¥æ©èœãçšããŠãã£ãã·ã¥ãè¡ãªã£ãŠããŸã RSpec ã®å®è¡ 2 ã³ã³ãããå©çšããŠã®äžŠåå®è¡ãè¡ãªã£ãŠããŸã æ§æãã§ãã¯ãš Jest ã®å®è¡ RSpec ãšæ¯èŒã㊠Jest ã§ã®ãã¹ãã³ãŒãã¯ããªã¥ãŒã ãå°ãªãã»å®è¡æéãçããããæ§æãã§ãã¯ãšäžç·ã« 1 ã€ã®ãžã§ãã«ããŠããŸã ãã® Workflow ã¯ã©ã®ãã©ã³ãã§ã GitHub ãž Push ãè¡ããããã³ã«å®è¡ãããããã«ããŠããŸãã EC2 ãžã®ããã〠ãã® Workflow ã§ã¯ãããã€ãè¡ãããã®æºåãšãæåéã EC2 ãžã®ãããã€ãè¡ãªã£ãŠããŸãã ãããã€ã«ã¯ Ruby gem ã® Capistrano ãå©çšããŠããŸãã äžèšã®ãã㪠2 ã€ã®ãžã§ãã§æ§æããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« åè¿°ã®ãŠããããã¹ãã»æ§æãã§ãã¯ã® Workflow ã® 1 ã€ç®ãšåã圹å²ã§ã ãã«ããšããã〠Rails ã® assets:precompile ã yarn build ãªã©ã®åŠçãšãCapistrano ãçšãããããã€ãè¡ãªã£ãŠããŸã ãã® Workflow ã¯ç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã ECS ãžã®ããã〠ãã® Workflow ã§ã¯ ECS ãžãããã€ããããã® Docker image äœæãšãã®ããã®ãã«ããªã©ãè¡ãªã£ãŠããŸãã ãžã§ãã¯äžèšã®ããã« 4 ã€ã§æ§æãããŠããŸãã npm package ã®ã€ã³ã¹ããŒã« ããã³ããšã³ãã®ãã«ã Gem ã®ã€ã³ã¹ããŒã«ãš Rails ã® assets:precompile Docker image ã®äœæãš Push ãã¡ãã® Workflow ãç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã æ±ããŠãã課é¡ãš assets:precompile ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ CircleCI ã®åãžã§ããå
šãŠæ£åžžã«å®äºããããšã PR ãããŒãžããæ¡ä»¶ã® 1 ã€ã«ããŠããŸãã ãããå Workflow ã»ãžã§ãã®å®è¡æéãé·ãããžã§ãã®å®è¡åŸ
ã¡ãããªããã°ãããªããšããç¶æ³ãããèµ·ãã£ãŠããŸã£ãŠããŸããã ç¹ã«æéãããã£ãŠããã®ããäžèšã® 3 ã€ã§ããã ãEC2 ãžã®ãããã€ãWorkflow ã®ããããã€ããžã§ã ãECS ãžã®ãããã€ãWorkflow ã®ãGem ã®ã€ã³ã¹ããŒã«ãš Rails ã® asset_precompileããžã§ã ãRSpec ã®å®è¡ããžã§ã RSpec ã®æžãæ¹ãªã©ãæ¹åããããšã§ççž®ã§ããããã岿ãããŠããã ããŸã ãããã«ã€ããŠèª¿æ»ãããšããã1ã» 2 ã¯ãassets:precompile ãäž»ã«æéã䜿ã£ãŠããããšãåãããŸããã ãã®ç¹ã«ã€ããŠåå ãšè¡ãªã£ãæ¹åã説æããããŠããã ãããšæããŸãã assets:precompile ã«æéãããã ãžã§ãã¡ãã¬ãŒã§ã¯ Rails ã®ã¢ã»ãããã€ãã©ã€ã³ãå©çšããŠãã¢ã»ãããã¡ã€ã«ã®ã³ã³ãã€ã«ã»æå°åãªã©ãè¡ãªã£ãŠããŸãã ãããå®è¡ããéã« assets:precompile ã³ãã³ããå©çšããŠããŸãã ãŸããåã³ãã³ãå®è¡æã«ã³ã³ãã€ã«ãããã¡ã€ã«ã AWS S3 ãã±ããã«ã¢ããããŒãããããã« asset_sync gem ãå©çšããŠããŸãã ãã®ã³ãã³ãã®å®è¡ã«ã¯ 9 åãã 10 åã»ã©ã®æéãããã£ãŠãããäžèšã® 2 ã€ã®åå ã§é
ããªã£ãŠããŸããã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ãã¡ãã«ã€ããŠã¯èªãã§åã®ããšãã§ãããããã〠Workflow ãå®è¡ããããã³ã«ã¢ã»ãããã¡ã€ã«ã®å€æŽæç¡ã«é¢ããããæ¯å 3 åã»ã©ãè²»ãããŠå
šãŠã®ã¢ã»ãããã¡ã€ã«ãã³ã³ãã€ã«ã»æå°åããŠããŸããã ãã¡ãã®è§£æ±ºçãšããŠã¯ã CircleCI ã®å
¬åŒããã¥ã¡ã³ãã§ãäŸãèŒããããŠããŸã ãã assets:precompile ã³ãã³ãã§çæããããã¡ã€ã«ã眮ããããã£ã¬ã¯ããªïŒ public/assets ïŒã CircleCI ã§ãã£ãã·ã¥ãããããšã§å¯Ÿå¿ããŸããã ãã£ãã·ã¥ãããããšã§ãæ¯å 3 åã»ã©ããã£ãŠããåŠçã 1 åã»ã©ã«ççž®ããããšãã§ããŸããã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã ãã¡ãã€ããŠã¯ããå°ãèæ¯ãè€éãã€ããŸã 解決ãŸã§ã¯ã§ããŠããŸããã ãŸã asset_sync ãå©çšãããã¡ã€ã«ã®ã¢ããããŒãåŠçã§ãããæ¯å 6 å以äžã®æéãããã£ãŠããŸããã CircleCI ã®ãã°ãããããèŠãŠã¿ããšã¢ããããŒãèªäœã«æéãããã£ãŠããã®ã§ã¯ãªãããã©ã®ãã¡ã€ã«ãã¢ããããŒããã¹ãããã倿ããåŠçã«å€ãã®æéãè²»ãããŠããããšãåãããŸããã ïŒ1 ãã¡ã€ã«ãã¢ããããŒãããŠããªãã 6 å 20 ç§ããã£ãŠããïŒ ããã§ã asset_sync gem ã®ãœãŒã¹ã³ãŒããèªãã§ã¿ããšããã¢ããããŒãå
ã® S3 ãã±ããã«ãããã¡ã€ã«ãå
šãŠååŸãã assets:precompile ã³ãã³ããçæãããã¡ã€ã«ã®ãã¡ã€ã«åãšæ¯èŒããããšããåŠçããããŸããã ãã®åŠçãæªããã®ã§ã¯ãªãããšæããS3 ãã±ããã確èªããŠã¿ããšããæ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ãååšããããšãåãããŸããã æ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ã®æ
å ±ãååŸããŠããããšãèãããš 6 åä»¥äžæéããããã®ãçŽåŸã§ãã ãã®åé¡ã®è§£æ±ºçã¯äžèšã® 2 ã€ãèãåŸããšèããŸããã äžèŠãªãã¡ã€ã«ã S3 ãã±ããããåé€ãã ååã®ãããã€ãšã®æ¯èŒãã㊠S3 ã«ã¢ã¯ã»ã¹ããã«ã¢ããããŒããã¹ããã¡ã€ã«ãã©ããã倿ããããã«ãã 1 ã€ç®ã®æ¹æ³ã¯æ£æ»æ³ã§ãæ°åäžãã¡ã€ã«ãå
šãŠäœ¿ã£ãŠããããã§ã¯ãªãããå©çšãããŠããªããã¡ã€ã«ãåé€ããŠããŸãæ¹æ³ã§ãã asset_sync ãæ©ããªããS3 ã®å©çšæãå°ãªããªããããã®æ¹æ³ãåããã®ã§ããã°ããã®æ¹æ³ã§è§£æ±ºããã®ãè¯ãããã«æããŸãã ãžã§ãã¡ãã¬ãŒã§ããã®æ¹æ³ãåããªãããšæ€èšããŸãããããžã§ãã¡ãã¬ãŒããé
ä¿¡ããŠãã HTML ã¡ãŒã«ãªã©ã§ãå©çšããŠãããã¡ã€ã«ãããããäžæŠã«ã¢ã¯ã»ã¹ãããŠããªããããšãã£ãŠåé€ããããšãã§ããããã®æ¹æ³ã§ã®è§£æ±ºã¯äžæŠæå¿µããŸããã 2 ã€ç®ã®æ¹æ³ã¯ assets:precompile ã³ãã³ããçæãã manifest ãã¡ã€ã«ïŒçæãããã¡ã€ã«ã®ãªã¹ããªã©ãèšè¿°ãããŠããïŒãš CircleCI ã®ãã£ãã·ã¥æ©èœã䜿ã£ãŠççž®ããæ¹æ³ã§ãã manifest ãã¡ã€ã«ã¯ãã³ã³ãã€ã«åŸã®ã¢ã»ãããã¡ã€ã«ãåºåããããã£ã¬ã¯ããªïŒ public/assets/ ïŒã«åãããã«åºåããããŸããäžèšã§ public/assets ã CircleCI ã®ãã£ãã·ã¥æ©èœã§ãã£ãã·ã¥ããããã«ãããããmanifest ãã¡ã€ã«ãäžç·ã«ãã£ãã·ã¥ãããããã«ãªã£ãŠããŸãã assets:precompile ã®å®è¡ã«ããä»åäœæããã manifest ãã¡ã€ã«ãšããã£ãã·ã¥ãããŠãã manifest ãã¡ã€ã«ãæ¯èŒããŠå·®åãåºããã¡ã€ã«ã ãã S3 ã«ã¢ããããŒãããããã«ããããšãã詊ã¿ã§ãã ãã®åŠç㯠asset_sync gem ã§ã¯ã§ãããã«ãªãã£ãã®ã§ãã·ã§ã«ã¹ã¯ãªãããš Rake ã¿ã¹ã¯ãäœæããŠå®è¡ããŠã¿ããšããããã¢ããããŒããã¹ããã¡ã€ã«ãã©ãããã倿ããããã®æéãã»ãŒãªããªãã6 å以äžã®ççž®ãããããšãã§ããŸããã ãã ãæ€èšŒãäžååãªãããå®éçšã«ä¹ããããšã¯ãŸã ã§ããŠããŸããã CircleCI ã®ãžã§ãå®è¡æéãççž®ããå°ããªæ¹åäºé
äžè¿°ã®éããå Workflow ã§å€§ããæéãè²»ãããŠããã®ã¯ assets:precompile ãš RSpec ã®å®è¡ã§ãããã现ããªç¹ãšããŠã¯ä»ã«ãå°ããæ¹åãããããšããããŸãã ã³ãŒãã®ãã§ãã¯ã¢ãŠã CircleCI ã§ã¯çµã¿èŸŒã¿ã®ã³ãã³ããšã㊠checkout ã³ãã³ãããããŸãã ããã¯å¯Ÿè±¡ã®ãªããžããªã®ãã©ã³ããã¯ããŒã³ããŠãããã³ãã³ãã§ããããžã§ãã¡ãã¬ãŒã¯ã¢ãã¬ãã«è¿ãæ§æã«ãªã£ãŠãããã³ãŒãããŒã¹ã®ãµã€ãºãå±¥æŽã倧ããããã¯ããŒã³ããã ãã§ããçšåºŠã®æéãããã£ãŠããŸã£ãŠããŸãã ããã§ãŸãã¯ã .git ãã£ã¬ã¯ããªã CircleCI ã®ãã£ãã·ã¥æ©èœãå©çšããŠãã£ãã·ã¥ããããã«ããŠã¿ãŸããã ãããšã checkout ã³ãã³ãèªäœã¯å€§ããççž®ããŸãããããã£ãã·ã¥ã® save/restore ã«ççž®ãã以äžã®æéããããããã«ãªã£ãŠããŸããŸããã å¥ã®æ¹æ³ãšã㊠checkout ã³ãã³ããå©çšããã«ãGit ã® Shallow clone ã Sparse clone ãé§äœ¿ããŠå¿
èŠãªãã¡ã€ã«ãå±¥æŽã ããã¯ããŒã³ãããšããããšãã§ããŸãã çŸåšã¯ Sparse clone ãäžéšå°å
¥ããŠã¿ãŠãããShallow clone ãå°å
¥ããããšèããŠããŸãã Docker image ã®äœæ ãžã§ãã¡ãã¬ãŒã§ã¯ ECS ãžã®ãããã€ã®éã« CircleCI äžã§ Docker image ããã«ãããŠããããã docker build ã³ãã³ãã®å®è¡æéãå¯èœãªéãæããããšèããŠããŸãã ççž®ããæ¹æ³ã¯æ§ã
ããããšæããŸãããCircleCI äžã§ã Dokcer Buildkit ãå©çšããããšãããŸãã®ã§ããããå©çšããŠãã«ãããããšã§ç°¡åã«ççž®ããããšãã§ããŸãã 詳ãã㯠Docker ã®ã¬ã€ã ã«èšèŒã®éãã§ã¯ãããŸãããDOCKER_BUILDKIT=1 ãæå®ã㊠docker build ãå®è¡ããã ãã§å©çšããããšãã§ãããžã§ãã¡ãã¬ãŒã§ã¯ 2 åã»ã©ããã£ãŠãããã«ãã 40 ç§ã»ã©ççž®ããããšãã§ããŸããã ãŸãšã ä»åã¯ãTechLunch ã§çºè¡šãããžã§ãã¡ãã¬ãŒã«ããã CircleCI ã®æŽ»çšãšæ¹åã®åãçµã¿ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ä»å玹ä»ãããŠããã ãã以å€ã«ãæ§ã
ãªçšéããããä»åŸãããã«ããŸã掻çšããŠãããããšæã£ãŠããŸãã ã芧ããã ãããããšãããããŸããã
ããã«ã¡ã¯ãã¡ãã¬ãŒãããã¯ãéçºå®€ ãšã³ãžãã¢ã®å²žç°ã§ãã å
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããå»çä»è·åéã®äººæãã©ãããã©ãŒã ããžã§ãã¡ãã¬ãŒãã®éçºã§å©çšããŠãã CircleCI ã§ã® CI/CD ã«ã€ããŠã®åãçµã¿ãçºè¡šããŸããã®ã§ã玹ä»ãããŠããã ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®éçºã§ CircleCI ãã©ã®ããã«å©çšããŠããã ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ãäž»ã«æ¬¡ã® 2 ã€ã CircleCI ãçšããŠè¡ãªã£ãŠããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ããã〠ãããã€ã«é¢ããŠã¯ãECS ç°å¢ãš EC2 ç°å¢ãžã® 2 éãã®ãããã€ã CircleCI ãå©çšããŠè¡ãªã£ãŠããŸãã ãã®ãã CircleCI ã® Workflow ã¯ããŠããããã¹ãã»æ§æãã§ãã¯ããEC2 ãžã®ãããã€ããECS ãžã®ãããã€ãã® 3 ã€ã«åãããŠããŸãã 3 ã€ã® Workflow ã倧ãŸãã«èª¬æãããŠããã ããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ãžã§ãã¡ãã¬ãŒã¯äž»ã«ãµãŒããµã€ãã Ruby on Railsãããã³ããšã³ãã React ã䜿ã£ãŠéçºãããŠããŸãã ãã®ãããŠããããã¹ãã«ã¯ RSpec ã» Jest ããæ§æãã§ãã¯ã«ã¯ Rubocop ãš ESLint å©çšããŠããŸãã ãã® Workflow 㯠3 ã€ã®ãžã§ãã§æ§æãããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« bundle install ã» yarn install ãªã©ãè¡ãããŠããããã¹ãã»æ§æãã§ãã¯ã®å®è¡ã«å¿
èŠãªäŸåã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããCircleCI ã®ãã£ãã·ã¥æ©èœãçšããŠãã£ãã·ã¥ãè¡ãªã£ãŠããŸã RSpec ã®å®è¡ 2 ã³ã³ãããå©çšããŠã®äžŠåå®è¡ãè¡ãªã£ãŠããŸã æ§æãã§ãã¯ãš Jest ã®å®è¡ RSpec ãšæ¯èŒã㊠Jest ã§ã®ãã¹ãã³ãŒãã¯ããªã¥ãŒã ãå°ãªãã»å®è¡æéãçããããæ§æãã§ãã¯ãšäžç·ã« 1 ã€ã®ãžã§ãã«ããŠããŸã ãã® Workflow ã¯ã©ã®ãã©ã³ãã§ã GitHub ãž Push ãè¡ããããã³ã«å®è¡ãããããã«ããŠããŸãã EC2 ãžã®ããã〠ãã® Workflow ã§ã¯ãããã€ãè¡ãããã®æºåãšãæåéã EC2 ãžã®ãããã€ãè¡ãªã£ãŠããŸãã ãããã€ã«ã¯ Ruby gem ã® Capistrano ãå©çšããŠããŸãã äžèšã®ãã㪠2 ã€ã®ãžã§ãã§æ§æããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« åè¿°ã®ãŠããããã¹ãã»æ§æãã§ãã¯ã® Workflow ã® 1 ã€ç®ãšåã圹å²ã§ã ãã«ããšããã〠Rails ã® assets:precompile ã yarn build ãªã©ã®åŠçãšãCapistrano ãçšãããããã€ãè¡ãªã£ãŠããŸã ãã® Workflow ã¯ç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã ECS ãžã®ããã〠ãã® Workflow ã§ã¯ ECS ãžãããã€ããããã® Docker image äœæãšãã®ããã®ãã«ããªã©ãè¡ãªã£ãŠããŸãã ãžã§ãã¯äžèšã®ããã« 4 ã€ã§æ§æãããŠããŸãã npm package ã®ã€ã³ã¹ããŒã« ããã³ããšã³ãã®ãã«ã Gem ã®ã€ã³ã¹ããŒã«ãš Rails ã® assets:precompile Docker image ã®äœæãš Push ãã¡ãã® Workflow ãç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã æ±ããŠãã課é¡ãš assets:precompile ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ CircleCI ã®åãžã§ããå
šãŠæ£åžžã«å®äºããããšã PR ãããŒãžããæ¡ä»¶ã® 1 ã€ã«ããŠããŸãã ãããå Workflow ã»ãžã§ãã®å®è¡æéãé·ãããžã§ãã®å®è¡åŸ
ã¡ãããªããã°ãããªããšããç¶æ³ãããèµ·ãã£ãŠããŸã£ãŠããŸããã ç¹ã«æéãããã£ãŠããã®ããäžèšã® 3 ã€ã§ããã ãEC2 ãžã®ãããã€ãWorkflow ã®ããããã€ããžã§ã ãECS ãžã®ãããã€ãWorkflow ã®ãGem ã®ã€ã³ã¹ããŒã«ãš Rails ã® asset_precompileããžã§ã ãRSpec ã®å®è¡ããžã§ã RSpec ã®æžãæ¹ãªã©ãæ¹åããããšã§ççž®ã§ããããã岿ãããŠããã ããŸã ãããã«ã€ããŠèª¿æ»ãããšããã1ã» 2 ã¯ãassets:precompile ãäž»ã«æéã䜿ã£ãŠããããšãåãããŸããã ãã®ç¹ã«ã€ããŠåå ãšè¡ãªã£ãæ¹åã説æããããŠããã ãããšæããŸãã assets:precompile ã«æéãããã ãžã§ãã¡ãã¬ãŒã§ã¯ Rails ã®ã¢ã»ãããã€ãã©ã€ã³ãå©çšããŠãã¢ã»ãããã¡ã€ã«ã®ã³ã³ãã€ã«ã»æå°åãªã©ãè¡ãªã£ãŠããŸãã ãããå®è¡ããéã« assets:precompile ã³ãã³ããå©çšããŠããŸãã ãŸããåã³ãã³ãå®è¡æã«ã³ã³ãã€ã«ãããã¡ã€ã«ã AWS S3 ãã±ããã«ã¢ããããŒãããããã« asset_sync gem ãå©çšããŠããŸãã ãã®ã³ãã³ãã®å®è¡ã«ã¯ 9 åãã 10 åã»ã©ã®æéãããã£ãŠãããäžèšã® 2 ã€ã®åå ã§é
ããªã£ãŠããŸããã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ãã¡ãã«ã€ããŠã¯èªãã§åã®ããšãã§ãããããã〠Workflow ãå®è¡ããããã³ã«ã¢ã»ãããã¡ã€ã«ã®å€æŽæç¡ã«é¢ããããæ¯å 3 åã»ã©ãè²»ãããŠå
šãŠã®ã¢ã»ãããã¡ã€ã«ãã³ã³ãã€ã«ã»æå°åããŠããŸããã ãã¡ãã®è§£æ±ºçãšããŠã¯ã CircleCI ã®å
¬åŒããã¥ã¡ã³ãã§ãäŸãèŒããããŠããŸã ãã assets:precompile ã³ãã³ãã§çæããããã¡ã€ã«ã眮ããããã£ã¬ã¯ããªïŒ public/assets ïŒã CircleCI ã§ãã£ãã·ã¥ãããããšã§å¯Ÿå¿ããŸããã ãã£ãã·ã¥ãããããšã§ãæ¯å 3 åã»ã©ããã£ãŠããåŠçã 1 åã»ã©ã«ççž®ããããšãã§ããŸããã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã ãã¡ãã€ããŠã¯ããå°ãèæ¯ãè€éãã€ããŸã 解決ãŸã§ã¯ã§ããŠããŸããã ãŸã asset_sync ãå©çšãããã¡ã€ã«ã®ã¢ããããŒãåŠçã§ãããæ¯å 6 å以äžã®æéãããã£ãŠããŸããã CircleCI ã®ãã°ãããããèŠãŠã¿ããšã¢ããããŒãèªäœã«æéãããã£ãŠããã®ã§ã¯ãªãããã©ã®ãã¡ã€ã«ãã¢ããããŒããã¹ãããã倿ããåŠçã«å€ãã®æéãè²»ãããŠããããšãåãããŸããã ïŒ1 ãã¡ã€ã«ãã¢ããããŒãããŠããªãã 6 å 20 ç§ããã£ãŠããïŒ ããã§ã asset_sync gem ã®ãœãŒã¹ã³ãŒããèªãã§ã¿ããšããã¢ããããŒãå
ã® S3 ãã±ããã«ãããã¡ã€ã«ãå
šãŠååŸãã assets:precompile ã³ãã³ããçæãããã¡ã€ã«ã®ãã¡ã€ã«åãšæ¯èŒããããšããåŠçããããŸããã ãã®åŠçãæªããã®ã§ã¯ãªãããšæããS3 ãã±ããã確èªããŠã¿ããšããæ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ãååšããããšãåãããŸããã æ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ã®æ
å ±ãååŸããŠããããšãèãããš 6 åä»¥äžæéããããã®ãçŽåŸã§ãã ãã®åé¡ã®è§£æ±ºçã¯äžèšã® 2 ã€ãèãåŸããšèããŸããã äžèŠãªãã¡ã€ã«ã S3 ãã±ããããåé€ãã ååã®ãããã€ãšã®æ¯èŒãã㊠S3 ã«ã¢ã¯ã»ã¹ããã«ã¢ããããŒããã¹ããã¡ã€ã«ãã©ããã倿ããããã«ãã 1 ã€ç®ã®æ¹æ³ã¯æ£æ»æ³ã§ãæ°åäžãã¡ã€ã«ãå
šãŠäœ¿ã£ãŠããããã§ã¯ãªãããå©çšãããŠããªããã¡ã€ã«ãåé€ããŠããŸãæ¹æ³ã§ãã asset_sync ãæ©ããªããS3 ã®å©çšæãå°ãªããªããããã®æ¹æ³ãåããã®ã§ããã°ããã®æ¹æ³ã§è§£æ±ºããã®ãè¯ãããã«æããŸãã ãžã§ãã¡ãã¬ãŒã§ããã®æ¹æ³ãåããªãããšæ€èšããŸãããããžã§ãã¡ãã¬ãŒããé
ä¿¡ããŠãã HTML ã¡ãŒã«ãªã©ã§ãå©çšããŠãããã¡ã€ã«ãããããäžæŠã«ã¢ã¯ã»ã¹ãããŠããªããããšãã£ãŠåé€ããããšãã§ããããã®æ¹æ³ã§ã®è§£æ±ºã¯äžæŠæå¿µããŸããã 2 ã€ç®ã®æ¹æ³ã¯ assets:precompile ã³ãã³ããçæãã manifest ãã¡ã€ã«ïŒçæãããã¡ã€ã«ã®ãªã¹ããªã©ãèšè¿°ãããŠããïŒãš CircleCI ã®ãã£ãã·ã¥æ©èœã䜿ã£ãŠççž®ããæ¹æ³ã§ãã manifest ãã¡ã€ã«ã¯ãã³ã³ãã€ã«åŸã®ã¢ã»ãããã¡ã€ã«ãåºåããããã£ã¬ã¯ããªïŒ public/assets/ ïŒã«åãããã«åºåããããŸããäžèšã§ public/assets ã CircleCI ã®ãã£ãã·ã¥æ©èœã§ãã£ãã·ã¥ããããã«ãããããmanifest ãã¡ã€ã«ãäžç·ã«ãã£ãã·ã¥ãããããã«ãªã£ãŠããŸãã assets:precompile ã®å®è¡ã«ããä»åäœæããã manifest ãã¡ã€ã«ãšããã£ãã·ã¥ãããŠãã manifest ãã¡ã€ã«ãæ¯èŒããŠå·®åãåºããã¡ã€ã«ã ãã S3 ã«ã¢ããããŒãããããã«ããããšãã詊ã¿ã§ãã ãã®åŠç㯠asset_sync gem ã§ã¯ã§ãããã«ãªãã£ãã®ã§ãã·ã§ã«ã¹ã¯ãªãããš Rake ã¿ã¹ã¯ãäœæããŠå®è¡ããŠã¿ããšããããã¢ããããŒããã¹ããã¡ã€ã«ãã©ãããã倿ããããã®æéãã»ãŒãªããªãã6 å以äžã®ççž®ãããããšãã§ããŸããã ãã ãæ€èšŒãäžååãªãããå®éçšã«ä¹ããããšã¯ãŸã ã§ããŠããŸããã CircleCI ã®ãžã§ãå®è¡æéãççž®ããå°ããªæ¹åäºé
äžè¿°ã®éããå Workflow ã§å€§ããæéãè²»ãããŠããã®ã¯ assets:precompile ãš RSpec ã®å®è¡ã§ãããã现ããªç¹ãšããŠã¯ä»ã«ãå°ããæ¹åãããããšããããŸãã ã³ãŒãã®ãã§ãã¯ã¢ãŠã CircleCI ã§ã¯çµã¿èŸŒã¿ã®ã³ãã³ããšã㊠checkout ã³ãã³ãããããŸãã ããã¯å¯Ÿè±¡ã®ãªããžããªã®ãã©ã³ããã¯ããŒã³ããŠãããã³ãã³ãã§ããããžã§ãã¡ãã¬ãŒã¯ã¢ãã¬ãã«è¿ãæ§æã«ãªã£ãŠãããã³ãŒãããŒã¹ã®ãµã€ãºãå±¥æŽã倧ããããã¯ããŒã³ããã ãã§ããçšåºŠã®æéãããã£ãŠããŸã£ãŠããŸãã ããã§ãŸãã¯ã .git ãã£ã¬ã¯ããªã CircleCI ã®ãã£ãã·ã¥æ©èœãå©çšããŠãã£ãã·ã¥ããããã«ããŠã¿ãŸããã ãããšã checkout ã³ãã³ãèªäœã¯å€§ããççž®ããŸãããããã£ãã·ã¥ã® save/restore ã«ççž®ãã以äžã®æéããããããã«ãªã£ãŠããŸããŸããã å¥ã®æ¹æ³ãšã㊠checkout ã³ãã³ããå©çšããã«ãGit ã® Shallow clone ã Sparse clone ãé§äœ¿ããŠå¿
èŠãªãã¡ã€ã«ãå±¥æŽã ããã¯ããŒã³ãããšããããšãã§ããŸãã çŸåšã¯ Sparse clone ãäžéšå°å
¥ããŠã¿ãŠãããShallow clone ãå°å
¥ããããšèããŠããŸãã Docker image ã®äœæ ãžã§ãã¡ãã¬ãŒã§ã¯ ECS ãžã®ãããã€ã®éã« CircleCI äžã§ Docker image ããã«ãããŠããããã docker build ã³ãã³ãã®å®è¡æéãå¯èœãªéãæããããšèããŠããŸãã ççž®ããæ¹æ³ã¯æ§ã
ããããšæããŸãããCircleCI äžã§ã Dokcer Buildkit ãå©çšããããšãããŸãã®ã§ããããå©çšããŠãã«ãããããšã§ç°¡åã«ççž®ããããšãã§ããŸãã 詳ãã㯠Docker ã®ã¬ã€ã ã«èšèŒã®éãã§ã¯ãããŸãããDOCKER_BUILDKIT=1 ãæå®ã㊠docker build ãå®è¡ããã ãã§å©çšããããšãã§ãããžã§ãã¡ãã¬ãŒã§ã¯ 2 åã»ã©ããã£ãŠãããã«ãã 40 ç§ã»ã©ççž®ããããšãã§ããŸããã ãŸãšã ä»åã¯ãTechLunch ã§çºè¡šãããžã§ãã¡ãã¬ãŒã«ããã CircleCI ã®æŽ»çšãšæ¹åã®åãçµã¿ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ä»å玹ä»ãããŠããã ãã以å€ã«ãæ§ã
ãªçšéããããä»åŸãããã«ããŸã掻çšããŠãããããšæã£ãŠããŸãã ã芧ããã ãããããšãããããŸããã
ããã«ã¡ã¯ãã¡ãã¬ãŒãããã¯ãéçºå®€ ãšã³ãžãã¢ã®å²žç°ã§ãã å
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããå»çä»è·åéã®äººæãã©ãããã©ãŒã ããžã§ãã¡ãã¬ãŒãã®éçºã§å©çšããŠãã CircleCI ã§ã® CI/CD ã«ã€ããŠã®åãçµã¿ãçºè¡šããŸããã®ã§ã玹ä»ãããŠããã ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®éçºã§ CircleCI ãã©ã®ããã«å©çšããŠããã ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ãäž»ã«æ¬¡ã® 2 ã€ã CircleCI ãçšããŠè¡ãªã£ãŠããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ããã〠ãããã€ã«é¢ããŠã¯ãECS ç°å¢ãš EC2 ç°å¢ãžã® 2 éãã®ãããã€ã CircleCI ãå©çšããŠè¡ãªã£ãŠããŸãã ãã®ãã CircleCI ã® Workflow ã¯ããŠããããã¹ãã»æ§æãã§ãã¯ããEC2 ãžã®ãããã€ããECS ãžã®ãããã€ãã® 3 ã€ã«åãããŠããŸãã 3 ã€ã® Workflow ã倧ãŸãã«èª¬æãããŠããã ããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ãžã§ãã¡ãã¬ãŒã¯äž»ã«ãµãŒããµã€ãã Ruby on Railsãããã³ããšã³ãã React ã䜿ã£ãŠéçºãããŠããŸãã ãã®ãããŠããããã¹ãã«ã¯ RSpec ã» Jest ããæ§æãã§ãã¯ã«ã¯ Rubocop ãš ESLint å©çšããŠããŸãã ãã® Workflow 㯠3 ã€ã®ãžã§ãã§æ§æãããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« bundle install ã» yarn install ãªã©ãè¡ãããŠããããã¹ãã»æ§æãã§ãã¯ã®å®è¡ã«å¿
èŠãªäŸåã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããCircleCI ã®ãã£ãã·ã¥æ©èœãçšããŠãã£ãã·ã¥ãè¡ãªã£ãŠããŸã RSpec ã®å®è¡ 2 ã³ã³ãããå©çšããŠã®äžŠåå®è¡ãè¡ãªã£ãŠããŸã æ§æãã§ãã¯ãš Jest ã®å®è¡ RSpec ãšæ¯èŒã㊠Jest ã§ã®ãã¹ãã³ãŒãã¯ããªã¥ãŒã ãå°ãªãã»å®è¡æéãçããããæ§æãã§ãã¯ãšäžç·ã« 1 ã€ã®ãžã§ãã«ããŠããŸã ãã® Workflow ã¯ã©ã®ãã©ã³ãã§ã GitHub ãž Push ãè¡ããããã³ã«å®è¡ãããããã«ããŠããŸãã EC2 ãžã®ããã〠ãã® Workflow ã§ã¯ãããã€ãè¡ãããã®æºåãšãæåéã EC2 ãžã®ãããã€ãè¡ãªã£ãŠããŸãã ãããã€ã«ã¯ Ruby gem ã® Capistrano ãå©çšããŠããŸãã äžèšã®ãã㪠2 ã€ã®ãžã§ãã§æ§æããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« åè¿°ã®ãŠããããã¹ãã»æ§æãã§ãã¯ã® Workflow ã® 1 ã€ç®ãšåã圹å²ã§ã ãã«ããšããã〠Rails ã® assets:precompile ã yarn build ãªã©ã®åŠçãšãCapistrano ãçšãããããã€ãè¡ãªã£ãŠããŸã ãã® Workflow ã¯ç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã ECS ãžã®ããã〠ãã® Workflow ã§ã¯ ECS ãžãããã€ããããã® Docker image äœæãšãã®ããã®ãã«ããªã©ãè¡ãªã£ãŠããŸãã ãžã§ãã¯äžèšã®ããã« 4 ã€ã§æ§æãããŠããŸãã npm package ã®ã€ã³ã¹ããŒã« ããã³ããšã³ãã®ãã«ã Gem ã®ã€ã³ã¹ããŒã«ãš Rails ã® assets:precompile Docker image ã®äœæãš Push ãã¡ãã® Workflow ãç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã æ±ããŠãã課é¡ãš assets:precompile ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ CircleCI ã®åãžã§ããå
šãŠæ£åžžã«å®äºããããšã PR ãããŒãžããæ¡ä»¶ã® 1 ã€ã«ããŠããŸãã ãããå Workflow ã»ãžã§ãã®å®è¡æéãé·ãããžã§ãã®å®è¡åŸ
ã¡ãããªããã°ãããªããšããç¶æ³ãããèµ·ãã£ãŠããŸã£ãŠããŸããã ç¹ã«æéãããã£ãŠããã®ããäžèšã® 3 ã€ã§ããã ãEC2 ãžã®ãããã€ãWorkflow ã®ããããã€ããžã§ã ãECS ãžã®ãããã€ãWorkflow ã®ãGem ã®ã€ã³ã¹ããŒã«ãš Rails ã® asset_precompileããžã§ã ãRSpec ã®å®è¡ããžã§ã RSpec ã®æžãæ¹ãªã©ãæ¹åããããšã§ççž®ã§ããããã岿ãããŠããã ããŸã ãããã«ã€ããŠèª¿æ»ãããšããã1ã» 2 ã¯ãassets:precompile ãäž»ã«æéã䜿ã£ãŠããããšãåãããŸããã ãã®ç¹ã«ã€ããŠåå ãšè¡ãªã£ãæ¹åã説æããããŠããã ãããšæããŸãã assets:precompile ã«æéãããã ãžã§ãã¡ãã¬ãŒã§ã¯ Rails ã®ã¢ã»ãããã€ãã©ã€ã³ãå©çšããŠãã¢ã»ãããã¡ã€ã«ã®ã³ã³ãã€ã«ã»æå°åãªã©ãè¡ãªã£ãŠããŸãã ãããå®è¡ããéã« assets:precompile ã³ãã³ããå©çšããŠããŸãã ãŸããåã³ãã³ãå®è¡æã«ã³ã³ãã€ã«ãããã¡ã€ã«ã AWS S3 ãã±ããã«ã¢ããããŒãããããã« asset_sync gem ãå©çšããŠããŸãã ãã®ã³ãã³ãã®å®è¡ã«ã¯ 9 åãã 10 åã»ã©ã®æéãããã£ãŠãããäžèšã® 2 ã€ã®åå ã§é
ããªã£ãŠããŸããã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ãã¡ãã«ã€ããŠã¯èªãã§åã®ããšãã§ãããããã〠Workflow ãå®è¡ããããã³ã«ã¢ã»ãããã¡ã€ã«ã®å€æŽæç¡ã«é¢ããããæ¯å 3 åã»ã©ãè²»ãããŠå
šãŠã®ã¢ã»ãããã¡ã€ã«ãã³ã³ãã€ã«ã»æå°åããŠããŸããã ãã¡ãã®è§£æ±ºçãšããŠã¯ã CircleCI ã®å
¬åŒããã¥ã¡ã³ãã§ãäŸãèŒããããŠããŸã ãã assets:precompile ã³ãã³ãã§çæããããã¡ã€ã«ã眮ããããã£ã¬ã¯ããªïŒ public/assets ïŒã CircleCI ã§ãã£ãã·ã¥ãããããšã§å¯Ÿå¿ããŸããã ãã£ãã·ã¥ãããããšã§ãæ¯å 3 åã»ã©ããã£ãŠããåŠçã 1 åã»ã©ã«ççž®ããããšãã§ããŸããã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã ãã¡ãã€ããŠã¯ããå°ãèæ¯ãè€éãã€ããŸã 解決ãŸã§ã¯ã§ããŠããŸããã ãŸã asset_sync ãå©çšãããã¡ã€ã«ã®ã¢ããããŒãåŠçã§ãããæ¯å 6 å以äžã®æéãããã£ãŠããŸããã CircleCI ã®ãã°ãããããèŠãŠã¿ããšã¢ããããŒãèªäœã«æéãããã£ãŠããã®ã§ã¯ãªãããã©ã®ãã¡ã€ã«ãã¢ããããŒããã¹ãããã倿ããåŠçã«å€ãã®æéãè²»ãããŠããããšãåãããŸããã ïŒ1 ãã¡ã€ã«ãã¢ããããŒãããŠããªãã 6 å 20 ç§ããã£ãŠããïŒ ããã§ã asset_sync gem ã®ãœãŒã¹ã³ãŒããèªãã§ã¿ããšããã¢ããããŒãå
ã® S3 ãã±ããã«ãããã¡ã€ã«ãå
šãŠååŸãã assets:precompile ã³ãã³ããçæãããã¡ã€ã«ã®ãã¡ã€ã«åãšæ¯èŒããããšããåŠçããããŸããã ãã®åŠçãæªããã®ã§ã¯ãªãããšæããS3 ãã±ããã確èªããŠã¿ããšããæ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ãååšããããšãåãããŸããã æ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ã®æ
å ±ãååŸããŠããããšãèãããš 6 åä»¥äžæéããããã®ãçŽåŸã§ãã ãã®åé¡ã®è§£æ±ºçã¯äžèšã® 2 ã€ãèãåŸããšèããŸããã äžèŠãªãã¡ã€ã«ã S3 ãã±ããããåé€ãã ååã®ãããã€ãšã®æ¯èŒãã㊠S3 ã«ã¢ã¯ã»ã¹ããã«ã¢ããããŒããã¹ããã¡ã€ã«ãã©ããã倿ããããã«ãã 1 ã€ç®ã®æ¹æ³ã¯æ£æ»æ³ã§ãæ°åäžãã¡ã€ã«ãå
šãŠäœ¿ã£ãŠããããã§ã¯ãªãããå©çšãããŠããªããã¡ã€ã«ãåé€ããŠããŸãæ¹æ³ã§ãã asset_sync ãæ©ããªããS3 ã®å©çšæãå°ãªããªããããã®æ¹æ³ãåããã®ã§ããã°ããã®æ¹æ³ã§è§£æ±ºããã®ãè¯ãããã«æããŸãã ãžã§ãã¡ãã¬ãŒã§ããã®æ¹æ³ãåããªãããšæ€èšããŸãããããžã§ãã¡ãã¬ãŒããé
ä¿¡ããŠãã HTML ã¡ãŒã«ãªã©ã§ãå©çšããŠãããã¡ã€ã«ãããããäžæŠã«ã¢ã¯ã»ã¹ãããŠããªããããšãã£ãŠåé€ããããšãã§ããããã®æ¹æ³ã§ã®è§£æ±ºã¯äžæŠæå¿µããŸããã 2 ã€ç®ã®æ¹æ³ã¯ assets:precompile ã³ãã³ããçæãã manifest ãã¡ã€ã«ïŒçæãããã¡ã€ã«ã®ãªã¹ããªã©ãèšè¿°ãããŠããïŒãš CircleCI ã®ãã£ãã·ã¥æ©èœã䜿ã£ãŠççž®ããæ¹æ³ã§ãã manifest ãã¡ã€ã«ã¯ãã³ã³ãã€ã«åŸã®ã¢ã»ãããã¡ã€ã«ãåºåããããã£ã¬ã¯ããªïŒ public/assets/ ïŒã«åãããã«åºåããããŸããäžèšã§ public/assets ã CircleCI ã®ãã£ãã·ã¥æ©èœã§ãã£ãã·ã¥ããããã«ãããããmanifest ãã¡ã€ã«ãäžç·ã«ãã£ãã·ã¥ãããããã«ãªã£ãŠããŸãã assets:precompile ã®å®è¡ã«ããä»åäœæããã manifest ãã¡ã€ã«ãšããã£ãã·ã¥ãããŠãã manifest ãã¡ã€ã«ãæ¯èŒããŠå·®åãåºããã¡ã€ã«ã ãã S3 ã«ã¢ããããŒãããããã«ããããšãã詊ã¿ã§ãã ãã®åŠç㯠asset_sync gem ã§ã¯ã§ãããã«ãªãã£ãã®ã§ãã·ã§ã«ã¹ã¯ãªãããš Rake ã¿ã¹ã¯ãäœæããŠå®è¡ããŠã¿ããšããããã¢ããããŒããã¹ããã¡ã€ã«ãã©ãããã倿ããããã®æéãã»ãŒãªããªãã6 å以äžã®ççž®ãããããšãã§ããŸããã ãã ãæ€èšŒãäžååãªãããå®éçšã«ä¹ããããšã¯ãŸã ã§ããŠããŸããã CircleCI ã®ãžã§ãå®è¡æéãççž®ããå°ããªæ¹åäºé
äžè¿°ã®éããå Workflow ã§å€§ããæéãè²»ãããŠããã®ã¯ assets:precompile ãš RSpec ã®å®è¡ã§ãããã现ããªç¹ãšããŠã¯ä»ã«ãå°ããæ¹åãããããšããããŸãã ã³ãŒãã®ãã§ãã¯ã¢ãŠã CircleCI ã§ã¯çµã¿èŸŒã¿ã®ã³ãã³ããšã㊠checkout ã³ãã³ãããããŸãã ããã¯å¯Ÿè±¡ã®ãªããžããªã®ãã©ã³ããã¯ããŒã³ããŠãããã³ãã³ãã§ããããžã§ãã¡ãã¬ãŒã¯ã¢ãã¬ãã«è¿ãæ§æã«ãªã£ãŠãããã³ãŒãããŒã¹ã®ãµã€ãºãå±¥æŽã倧ããããã¯ããŒã³ããã ãã§ããçšåºŠã®æéãããã£ãŠããŸã£ãŠããŸãã ããã§ãŸãã¯ã .git ãã£ã¬ã¯ããªã CircleCI ã®ãã£ãã·ã¥æ©èœãå©çšããŠãã£ãã·ã¥ããããã«ããŠã¿ãŸããã ãããšã checkout ã³ãã³ãèªäœã¯å€§ããççž®ããŸãããããã£ãã·ã¥ã® save/restore ã«ççž®ãã以äžã®æéããããããã«ãªã£ãŠããŸããŸããã å¥ã®æ¹æ³ãšã㊠checkout ã³ãã³ããå©çšããã«ãGit ã® Shallow clone ã Sparse clone ãé§äœ¿ããŠå¿
èŠãªãã¡ã€ã«ãå±¥æŽã ããã¯ããŒã³ãããšããããšãã§ããŸãã çŸåšã¯ Sparse clone ãäžéšå°å
¥ããŠã¿ãŠãããShallow clone ãå°å
¥ããããšèããŠããŸãã Docker image ã®äœæ ãžã§ãã¡ãã¬ãŒã§ã¯ ECS ãžã®ãããã€ã®éã« CircleCI äžã§ Docker image ããã«ãããŠããããã docker build ã³ãã³ãã®å®è¡æéãå¯èœãªéãæããããšèããŠããŸãã ççž®ããæ¹æ³ã¯æ§ã
ããããšæããŸãããCircleCI äžã§ã Dokcer Buildkit ãå©çšããããšãããŸãã®ã§ããããå©çšããŠãã«ãããããšã§ç°¡åã«ççž®ããããšãã§ããŸãã 詳ãã㯠Docker ã®ã¬ã€ã ã«èšèŒã®éãã§ã¯ãããŸãããDOCKER_BUILDKIT=1 ãæå®ã㊠docker build ãå®è¡ããã ãã§å©çšããããšãã§ãããžã§ãã¡ãã¬ãŒã§ã¯ 2 åã»ã©ããã£ãŠãããã«ãã 40 ç§ã»ã©ççž®ããããšãã§ããŸããã ãŸãšã ä»åã¯ãTechLunch ã§çºè¡šãããžã§ãã¡ãã¬ãŒã«ããã CircleCI ã®æŽ»çšãšæ¹åã®åãçµã¿ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ä»å玹ä»ãããŠããã ãã以å€ã«ãæ§ã
ãªçšéããããä»åŸãããã«ããŸã掻çšããŠãããããšæã£ãŠããŸãã ã芧ããã ãããããšãããããŸããã
ããã«ã¡ã¯ãã¡ãã¬ãŒãããã¯ãéçºå®€ ãšã³ãžãã¢ã®å²žç°ã§ãã å
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããå»çä»è·åéã®äººæãã©ãããã©ãŒã ããžã§ãã¡ãã¬ãŒãã®éçºã§å©çšããŠãã CircleCI ã§ã® CI/CD ã«ã€ããŠã®åãçµã¿ãçºè¡šããŸããã®ã§ã玹ä»ãããŠããã ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®éçºã§ CircleCI ãã©ã®ããã«å©çšããŠããã ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ãäž»ã«æ¬¡ã® 2 ã€ã CircleCI ãçšããŠè¡ãªã£ãŠããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ããã〠ãããã€ã«é¢ããŠã¯ãECS ç°å¢ãš EC2 ç°å¢ãžã® 2 éãã®ãããã€ã CircleCI ãå©çšããŠè¡ãªã£ãŠããŸãã ãã®ãã CircleCI ã® Workflow ã¯ããŠããããã¹ãã»æ§æãã§ãã¯ããEC2 ãžã®ãããã€ããECS ãžã®ãããã€ãã® 3 ã€ã«åãããŠããŸãã 3 ã€ã® Workflow ã倧ãŸãã«èª¬æãããŠããã ããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ãžã§ãã¡ãã¬ãŒã¯äž»ã«ãµãŒããµã€ãã Ruby on Railsãããã³ããšã³ãã React ã䜿ã£ãŠéçºãããŠããŸãã ãã®ãããŠããããã¹ãã«ã¯ RSpec ã» Jest ããæ§æãã§ãã¯ã«ã¯ Rubocop ãš ESLint å©çšããŠããŸãã ãã® Workflow 㯠3 ã€ã®ãžã§ãã§æ§æãããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« bundle install ã» yarn install ãªã©ãè¡ãããŠããããã¹ãã»æ§æãã§ãã¯ã®å®è¡ã«å¿
èŠãªäŸåã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããCircleCI ã®ãã£ãã·ã¥æ©èœãçšããŠãã£ãã·ã¥ãè¡ãªã£ãŠããŸã RSpec ã®å®è¡ 2 ã³ã³ãããå©çšããŠã®äžŠåå®è¡ãè¡ãªã£ãŠããŸã æ§æãã§ãã¯ãš Jest ã®å®è¡ RSpec ãšæ¯èŒã㊠Jest ã§ã®ãã¹ãã³ãŒãã¯ããªã¥ãŒã ãå°ãªãã»å®è¡æéãçããããæ§æãã§ãã¯ãšäžç·ã« 1 ã€ã®ãžã§ãã«ããŠããŸã ãã® Workflow ã¯ã©ã®ãã©ã³ãã§ã GitHub ãž Push ãè¡ããããã³ã«å®è¡ãããããã«ããŠããŸãã EC2 ãžã®ããã〠ãã® Workflow ã§ã¯ãããã€ãè¡ãããã®æºåãšãæåéã EC2 ãžã®ãããã€ãè¡ãªã£ãŠããŸãã ãããã€ã«ã¯ Ruby gem ã® Capistrano ãå©çšããŠããŸãã äžèšã®ãã㪠2 ã€ã®ãžã§ãã§æ§æããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« åè¿°ã®ãŠããããã¹ãã»æ§æãã§ãã¯ã® Workflow ã® 1 ã€ç®ãšåã圹å²ã§ã ãã«ããšããã〠Rails ã® assets:precompile ã yarn build ãªã©ã®åŠçãšãCapistrano ãçšãããããã€ãè¡ãªã£ãŠããŸã ãã® Workflow ã¯ç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã ECS ãžã®ããã〠ãã® Workflow ã§ã¯ ECS ãžãããã€ããããã® Docker image äœæãšãã®ããã®ãã«ããªã©ãè¡ãªã£ãŠããŸãã ãžã§ãã¯äžèšã®ããã« 4 ã€ã§æ§æãããŠããŸãã npm package ã®ã€ã³ã¹ããŒã« ããã³ããšã³ãã®ãã«ã Gem ã®ã€ã³ã¹ããŒã«ãš Rails ã® assets:precompile Docker image ã®äœæãš Push ãã¡ãã® Workflow ãç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã æ±ããŠãã課é¡ãš assets:precompile ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ CircleCI ã®åãžã§ããå
šãŠæ£åžžã«å®äºããããšã PR ãããŒãžããæ¡ä»¶ã® 1 ã€ã«ããŠããŸãã ãããå Workflow ã»ãžã§ãã®å®è¡æéãé·ãããžã§ãã®å®è¡åŸ
ã¡ãããªããã°ãããªããšããç¶æ³ãããèµ·ãã£ãŠããŸã£ãŠããŸããã ç¹ã«æéãããã£ãŠããã®ããäžèšã® 3 ã€ã§ããã ãEC2 ãžã®ãããã€ãWorkflow ã®ããããã€ããžã§ã ãECS ãžã®ãããã€ãWorkflow ã®ãGem ã®ã€ã³ã¹ããŒã«ãš Rails ã® asset_precompileããžã§ã ãRSpec ã®å®è¡ããžã§ã RSpec ã®æžãæ¹ãªã©ãæ¹åããããšã§ççž®ã§ããããã岿ãããŠããã ããŸã ãããã«ã€ããŠèª¿æ»ãããšããã1ã» 2 ã¯ãassets:precompile ãäž»ã«æéã䜿ã£ãŠããããšãåãããŸããã ãã®ç¹ã«ã€ããŠåå ãšè¡ãªã£ãæ¹åã説æããããŠããã ãããšæããŸãã assets:precompile ã«æéãããã ãžã§ãã¡ãã¬ãŒã§ã¯ Rails ã®ã¢ã»ãããã€ãã©ã€ã³ãå©çšããŠãã¢ã»ãããã¡ã€ã«ã®ã³ã³ãã€ã«ã»æå°åãªã©ãè¡ãªã£ãŠããŸãã ãããå®è¡ããéã« assets:precompile ã³ãã³ããå©çšããŠããŸãã ãŸããåã³ãã³ãå®è¡æã«ã³ã³ãã€ã«ãããã¡ã€ã«ã AWS S3 ãã±ããã«ã¢ããããŒãããããã« asset_sync gem ãå©çšããŠããŸãã ãã®ã³ãã³ãã®å®è¡ã«ã¯ 9 åãã 10 åã»ã©ã®æéãããã£ãŠãããäžèšã® 2 ã€ã®åå ã§é
ããªã£ãŠããŸããã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ãã¡ãã«ã€ããŠã¯èªãã§åã®ããšãã§ãããããã〠Workflow ãå®è¡ããããã³ã«ã¢ã»ãããã¡ã€ã«ã®å€æŽæç¡ã«é¢ããããæ¯å 3 åã»ã©ãè²»ãããŠå
šãŠã®ã¢ã»ãããã¡ã€ã«ãã³ã³ãã€ã«ã»æå°åããŠããŸããã ãã¡ãã®è§£æ±ºçãšããŠã¯ã CircleCI ã®å
¬åŒããã¥ã¡ã³ãã§ãäŸãèŒããããŠããŸã ãã assets:precompile ã³ãã³ãã§çæããããã¡ã€ã«ã眮ããããã£ã¬ã¯ããªïŒ public/assets ïŒã CircleCI ã§ãã£ãã·ã¥ãããããšã§å¯Ÿå¿ããŸããã ãã£ãã·ã¥ãããããšã§ãæ¯å 3 åã»ã©ããã£ãŠããåŠçã 1 åã»ã©ã«ççž®ããããšãã§ããŸããã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã ãã¡ãã€ããŠã¯ããå°ãèæ¯ãè€éãã€ããŸã 解決ãŸã§ã¯ã§ããŠããŸããã ãŸã asset_sync ãå©çšãããã¡ã€ã«ã®ã¢ããããŒãåŠçã§ãããæ¯å 6 å以äžã®æéãããã£ãŠããŸããã CircleCI ã®ãã°ãããããèŠãŠã¿ããšã¢ããããŒãèªäœã«æéãããã£ãŠããã®ã§ã¯ãªãããã©ã®ãã¡ã€ã«ãã¢ããããŒããã¹ãããã倿ããåŠçã«å€ãã®æéãè²»ãããŠããããšãåãããŸããã ïŒ1 ãã¡ã€ã«ãã¢ããããŒãããŠããªãã 6 å 20 ç§ããã£ãŠããïŒ ããã§ã asset_sync gem ã®ãœãŒã¹ã³ãŒããèªãã§ã¿ããšããã¢ããããŒãå
ã® S3 ãã±ããã«ãããã¡ã€ã«ãå
šãŠååŸãã assets:precompile ã³ãã³ããçæãããã¡ã€ã«ã®ãã¡ã€ã«åãšæ¯èŒããããšããåŠçããããŸããã ãã®åŠçãæªããã®ã§ã¯ãªãããšæããS3 ãã±ããã確èªããŠã¿ããšããæ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ãååšããããšãåãããŸããã æ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ã®æ
å ±ãååŸããŠããããšãèãããš 6 åä»¥äžæéããããã®ãçŽåŸã§ãã ãã®åé¡ã®è§£æ±ºçã¯äžèšã® 2 ã€ãèãåŸããšèããŸããã äžèŠãªãã¡ã€ã«ã S3 ãã±ããããåé€ãã ååã®ãããã€ãšã®æ¯èŒãã㊠S3 ã«ã¢ã¯ã»ã¹ããã«ã¢ããããŒããã¹ããã¡ã€ã«ãã©ããã倿ããããã«ãã 1 ã€ç®ã®æ¹æ³ã¯æ£æ»æ³ã§ãæ°åäžãã¡ã€ã«ãå
šãŠäœ¿ã£ãŠããããã§ã¯ãªãããå©çšãããŠããªããã¡ã€ã«ãåé€ããŠããŸãæ¹æ³ã§ãã asset_sync ãæ©ããªããS3 ã®å©çšæãå°ãªããªããããã®æ¹æ³ãåããã®ã§ããã°ããã®æ¹æ³ã§è§£æ±ºããã®ãè¯ãããã«æããŸãã ãžã§ãã¡ãã¬ãŒã§ããã®æ¹æ³ãåããªãããšæ€èšããŸãããããžã§ãã¡ãã¬ãŒããé
ä¿¡ããŠãã HTML ã¡ãŒã«ãªã©ã§ãå©çšããŠãããã¡ã€ã«ãããããäžæŠã«ã¢ã¯ã»ã¹ãããŠããªããããšãã£ãŠåé€ããããšãã§ããããã®æ¹æ³ã§ã®è§£æ±ºã¯äžæŠæå¿µããŸããã 2 ã€ç®ã®æ¹æ³ã¯ assets:precompile ã³ãã³ããçæãã manifest ãã¡ã€ã«ïŒçæãããã¡ã€ã«ã®ãªã¹ããªã©ãèšè¿°ãããŠããïŒãš CircleCI ã®ãã£ãã·ã¥æ©èœã䜿ã£ãŠççž®ããæ¹æ³ã§ãã manifest ãã¡ã€ã«ã¯ãã³ã³ãã€ã«åŸã®ã¢ã»ãããã¡ã€ã«ãåºåããããã£ã¬ã¯ããªïŒ public/assets/ ïŒã«åãããã«åºåããããŸããäžèšã§ public/assets ã CircleCI ã®ãã£ãã·ã¥æ©èœã§ãã£ãã·ã¥ããããã«ãããããmanifest ãã¡ã€ã«ãäžç·ã«ãã£ãã·ã¥ãããããã«ãªã£ãŠããŸãã assets:precompile ã®å®è¡ã«ããä»åäœæããã manifest ãã¡ã€ã«ãšããã£ãã·ã¥ãããŠãã manifest ãã¡ã€ã«ãæ¯èŒããŠå·®åãåºããã¡ã€ã«ã ãã S3 ã«ã¢ããããŒãããããã«ããããšãã詊ã¿ã§ãã ãã®åŠç㯠asset_sync gem ã§ã¯ã§ãããã«ãªãã£ãã®ã§ãã·ã§ã«ã¹ã¯ãªãããš Rake ã¿ã¹ã¯ãäœæããŠå®è¡ããŠã¿ããšããããã¢ããããŒããã¹ããã¡ã€ã«ãã©ãããã倿ããããã®æéãã»ãŒãªããªãã6 å以äžã®ççž®ãããããšãã§ããŸããã ãã ãæ€èšŒãäžååãªãããå®éçšã«ä¹ããããšã¯ãŸã ã§ããŠããŸããã CircleCI ã®ãžã§ãå®è¡æéãççž®ããå°ããªæ¹åäºé
äžè¿°ã®éããå Workflow ã§å€§ããæéãè²»ãããŠããã®ã¯ assets:precompile ãš RSpec ã®å®è¡ã§ãããã现ããªç¹ãšããŠã¯ä»ã«ãå°ããæ¹åãããããšããããŸãã ã³ãŒãã®ãã§ãã¯ã¢ãŠã CircleCI ã§ã¯çµã¿èŸŒã¿ã®ã³ãã³ããšã㊠checkout ã³ãã³ãããããŸãã ããã¯å¯Ÿè±¡ã®ãªããžããªã®ãã©ã³ããã¯ããŒã³ããŠãããã³ãã³ãã§ããããžã§ãã¡ãã¬ãŒã¯ã¢ãã¬ãã«è¿ãæ§æã«ãªã£ãŠãããã³ãŒãããŒã¹ã®ãµã€ãºãå±¥æŽã倧ããããã¯ããŒã³ããã ãã§ããçšåºŠã®æéãããã£ãŠããŸã£ãŠããŸãã ããã§ãŸãã¯ã .git ãã£ã¬ã¯ããªã CircleCI ã®ãã£ãã·ã¥æ©èœãå©çšããŠãã£ãã·ã¥ããããã«ããŠã¿ãŸããã ãããšã checkout ã³ãã³ãèªäœã¯å€§ããççž®ããŸãããããã£ãã·ã¥ã® save/restore ã«ççž®ãã以äžã®æéããããããã«ãªã£ãŠããŸããŸããã å¥ã®æ¹æ³ãšã㊠checkout ã³ãã³ããå©çšããã«ãGit ã® Shallow clone ã Sparse clone ãé§äœ¿ããŠå¿
èŠãªãã¡ã€ã«ãå±¥æŽã ããã¯ããŒã³ãããšããããšãã§ããŸãã çŸåšã¯ Sparse clone ãäžéšå°å
¥ããŠã¿ãŠãããShallow clone ãå°å
¥ããããšèããŠããŸãã Docker image ã®äœæ ãžã§ãã¡ãã¬ãŒã§ã¯ ECS ãžã®ãããã€ã®éã« CircleCI äžã§ Docker image ããã«ãããŠããããã docker build ã³ãã³ãã®å®è¡æéãå¯èœãªéãæããããšèããŠããŸãã ççž®ããæ¹æ³ã¯æ§ã
ããããšæããŸãããCircleCI äžã§ã Dokcer Buildkit ãå©çšããããšãããŸãã®ã§ããããå©çšããŠãã«ãããããšã§ç°¡åã«ççž®ããããšãã§ããŸãã 詳ãã㯠Docker ã®ã¬ã€ã ã«èšèŒã®éãã§ã¯ãããŸãããDOCKER_BUILDKIT=1 ãæå®ã㊠docker build ãå®è¡ããã ãã§å©çšããããšãã§ãããžã§ãã¡ãã¬ãŒã§ã¯ 2 åã»ã©ããã£ãŠãããã«ãã 40 ç§ã»ã©ççž®ããããšãã§ããŸããã ãŸãšã ä»åã¯ãTechLunch ã§çºè¡šãããžã§ãã¡ãã¬ãŒã«ããã CircleCI ã®æŽ»çšãšæ¹åã®åãçµã¿ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ä»å玹ä»ãããŠããã ãã以å€ã«ãæ§ã
ãªçšéããããä»åŸãããã«ããŸã掻çšããŠãããããšæã£ãŠããŸãã ã芧ããã ãããããšãããããŸããã
ããã«ã¡ã¯ãã¡ãã¬ãŒãããã¯ãéçºå®€ ãšã³ãžãã¢ã®å²žç°ã§ãã å
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããå»çä»è·åéã®äººæãã©ãããã©ãŒã ããžã§ãã¡ãã¬ãŒãã®éçºã§å©çšããŠãã CircleCI ã§ã® CI/CD ã«ã€ããŠã®åãçµã¿ãçºè¡šããŸããã®ã§ã玹ä»ãããŠããã ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®éçºã§ CircleCI ãã©ã®ããã«å©çšããŠããã ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ãäž»ã«æ¬¡ã® 2 ã€ã CircleCI ãçšããŠè¡ãªã£ãŠããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ããã〠ãããã€ã«é¢ããŠã¯ãECS ç°å¢ãš EC2 ç°å¢ãžã® 2 éãã®ãããã€ã CircleCI ãå©çšããŠè¡ãªã£ãŠããŸãã ãã®ãã CircleCI ã® Workflow ã¯ããŠããããã¹ãã»æ§æãã§ãã¯ããEC2 ãžã®ãããã€ããECS ãžã®ãããã€ãã® 3 ã€ã«åãããŠããŸãã 3 ã€ã® Workflow ã倧ãŸãã«èª¬æãããŠããã ããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ãžã§ãã¡ãã¬ãŒã¯äž»ã«ãµãŒããµã€ãã Ruby on Railsãããã³ããšã³ãã React ã䜿ã£ãŠéçºãããŠããŸãã ãã®ãããŠããããã¹ãã«ã¯ RSpec ã» Jest ããæ§æãã§ãã¯ã«ã¯ Rubocop ãš ESLint å©çšããŠããŸãã ãã® Workflow 㯠3 ã€ã®ãžã§ãã§æ§æãããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« bundle install ã» yarn install ãªã©ãè¡ãããŠããããã¹ãã»æ§æãã§ãã¯ã®å®è¡ã«å¿
èŠãªäŸåã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããCircleCI ã®ãã£ãã·ã¥æ©èœãçšããŠãã£ãã·ã¥ãè¡ãªã£ãŠããŸã RSpec ã®å®è¡ 2 ã³ã³ãããå©çšããŠã®äžŠåå®è¡ãè¡ãªã£ãŠããŸã æ§æãã§ãã¯ãš Jest ã®å®è¡ RSpec ãšæ¯èŒã㊠Jest ã§ã®ãã¹ãã³ãŒãã¯ããªã¥ãŒã ãå°ãªãã»å®è¡æéãçããããæ§æãã§ãã¯ãšäžç·ã« 1 ã€ã®ãžã§ãã«ããŠããŸã ãã® Workflow ã¯ã©ã®ãã©ã³ãã§ã GitHub ãž Push ãè¡ããããã³ã«å®è¡ãããããã«ããŠããŸãã EC2 ãžã®ããã〠ãã® Workflow ã§ã¯ãããã€ãè¡ãããã®æºåãšãæåéã EC2 ãžã®ãããã€ãè¡ãªã£ãŠããŸãã ãããã€ã«ã¯ Ruby gem ã® Capistrano ãå©çšããŠããŸãã äžèšã®ãã㪠2 ã€ã®ãžã§ãã§æ§æããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« åè¿°ã®ãŠããããã¹ãã»æ§æãã§ãã¯ã® Workflow ã® 1 ã€ç®ãšåã圹å²ã§ã ãã«ããšããã〠Rails ã® assets:precompile ã yarn build ãªã©ã®åŠçãšãCapistrano ãçšãããããã€ãè¡ãªã£ãŠããŸã ãã® Workflow ã¯ç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã ECS ãžã®ããã〠ãã® Workflow ã§ã¯ ECS ãžãããã€ããããã® Docker image äœæãšãã®ããã®ãã«ããªã©ãè¡ãªã£ãŠããŸãã ãžã§ãã¯äžèšã®ããã« 4 ã€ã§æ§æãããŠããŸãã npm package ã®ã€ã³ã¹ããŒã« ããã³ããšã³ãã®ãã«ã Gem ã®ã€ã³ã¹ããŒã«ãš Rails ã® assets:precompile Docker image ã®äœæãš Push ãã¡ãã® Workflow ãç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã æ±ããŠãã課é¡ãš assets:precompile ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ CircleCI ã®åãžã§ããå
šãŠæ£åžžã«å®äºããããšã PR ãããŒãžããæ¡ä»¶ã® 1 ã€ã«ããŠããŸãã ãããå Workflow ã»ãžã§ãã®å®è¡æéãé·ãããžã§ãã®å®è¡åŸ
ã¡ãããªããã°ãããªããšããç¶æ³ãããèµ·ãã£ãŠããŸã£ãŠããŸããã ç¹ã«æéãããã£ãŠããã®ããäžèšã® 3 ã€ã§ããã ãEC2 ãžã®ãããã€ãWorkflow ã®ããããã€ããžã§ã ãECS ãžã®ãããã€ãWorkflow ã®ãGem ã®ã€ã³ã¹ããŒã«ãš Rails ã® asset_precompileããžã§ã ãRSpec ã®å®è¡ããžã§ã RSpec ã®æžãæ¹ãªã©ãæ¹åããããšã§ççž®ã§ããããã岿ãããŠããã ããŸã ãããã«ã€ããŠèª¿æ»ãããšããã1ã» 2 ã¯ãassets:precompile ãäž»ã«æéã䜿ã£ãŠããããšãåãããŸããã ãã®ç¹ã«ã€ããŠåå ãšè¡ãªã£ãæ¹åã説æããããŠããã ãããšæããŸãã assets:precompile ã«æéãããã ãžã§ãã¡ãã¬ãŒã§ã¯ Rails ã®ã¢ã»ãããã€ãã©ã€ã³ãå©çšããŠãã¢ã»ãããã¡ã€ã«ã®ã³ã³ãã€ã«ã»æå°åãªã©ãè¡ãªã£ãŠããŸãã ãããå®è¡ããéã« assets:precompile ã³ãã³ããå©çšããŠããŸãã ãŸããåã³ãã³ãå®è¡æã«ã³ã³ãã€ã«ãããã¡ã€ã«ã AWS S3 ãã±ããã«ã¢ããããŒãããããã« asset_sync gem ãå©çšããŠããŸãã ãã®ã³ãã³ãã®å®è¡ã«ã¯ 9 åãã 10 åã»ã©ã®æéãããã£ãŠãããäžèšã® 2 ã€ã®åå ã§é
ããªã£ãŠããŸããã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ãã¡ãã«ã€ããŠã¯èªãã§åã®ããšãã§ãããããã〠Workflow ãå®è¡ããããã³ã«ã¢ã»ãããã¡ã€ã«ã®å€æŽæç¡ã«é¢ããããæ¯å 3 åã»ã©ãè²»ãããŠå
šãŠã®ã¢ã»ãããã¡ã€ã«ãã³ã³ãã€ã«ã»æå°åããŠããŸããã ãã¡ãã®è§£æ±ºçãšããŠã¯ã CircleCI ã®å
¬åŒããã¥ã¡ã³ãã§ãäŸãèŒããããŠããŸã ãã assets:precompile ã³ãã³ãã§çæããããã¡ã€ã«ã眮ããããã£ã¬ã¯ããªïŒ public/assets ïŒã CircleCI ã§ãã£ãã·ã¥ãããããšã§å¯Ÿå¿ããŸããã ãã£ãã·ã¥ãããããšã§ãæ¯å 3 åã»ã©ããã£ãŠããåŠçã 1 åã»ã©ã«ççž®ããããšãã§ããŸããã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã ãã¡ãã€ããŠã¯ããå°ãèæ¯ãè€éãã€ããŸã 解決ãŸã§ã¯ã§ããŠããŸããã ãŸã asset_sync ãå©çšãããã¡ã€ã«ã®ã¢ããããŒãåŠçã§ãããæ¯å 6 å以äžã®æéãããã£ãŠããŸããã CircleCI ã®ãã°ãããããèŠãŠã¿ããšã¢ããããŒãèªäœã«æéãããã£ãŠããã®ã§ã¯ãªãããã©ã®ãã¡ã€ã«ãã¢ããããŒããã¹ãããã倿ããåŠçã«å€ãã®æéãè²»ãããŠããããšãåãããŸããã ïŒ1 ãã¡ã€ã«ãã¢ããããŒãããŠããªãã 6 å 20 ç§ããã£ãŠããïŒ ããã§ã asset_sync gem ã®ãœãŒã¹ã³ãŒããèªãã§ã¿ããšããã¢ããããŒãå
ã® S3 ãã±ããã«ãããã¡ã€ã«ãå
šãŠååŸãã assets:precompile ã³ãã³ããçæãããã¡ã€ã«ã®ãã¡ã€ã«åãšæ¯èŒããããšããåŠçããããŸããã ãã®åŠçãæªããã®ã§ã¯ãªãããšæããS3 ãã±ããã確èªããŠã¿ããšããæ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ãååšããããšãåãããŸããã æ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ã®æ
å ±ãååŸããŠããããšãèãããš 6 åä»¥äžæéããããã®ãçŽåŸã§ãã ãã®åé¡ã®è§£æ±ºçã¯äžèšã® 2 ã€ãèãåŸããšèããŸããã äžèŠãªãã¡ã€ã«ã S3 ãã±ããããåé€ãã ååã®ãããã€ãšã®æ¯èŒãã㊠S3 ã«ã¢ã¯ã»ã¹ããã«ã¢ããããŒããã¹ããã¡ã€ã«ãã©ããã倿ããããã«ãã 1 ã€ç®ã®æ¹æ³ã¯æ£æ»æ³ã§ãæ°åäžãã¡ã€ã«ãå
šãŠäœ¿ã£ãŠããããã§ã¯ãªãããå©çšãããŠããªããã¡ã€ã«ãåé€ããŠããŸãæ¹æ³ã§ãã asset_sync ãæ©ããªããS3 ã®å©çšæãå°ãªããªããããã®æ¹æ³ãåããã®ã§ããã°ããã®æ¹æ³ã§è§£æ±ºããã®ãè¯ãããã«æããŸãã ãžã§ãã¡ãã¬ãŒã§ããã®æ¹æ³ãåããªãããšæ€èšããŸãããããžã§ãã¡ãã¬ãŒããé
ä¿¡ããŠãã HTML ã¡ãŒã«ãªã©ã§ãå©çšããŠãããã¡ã€ã«ãããããäžæŠã«ã¢ã¯ã»ã¹ãããŠããªããããšãã£ãŠåé€ããããšãã§ããããã®æ¹æ³ã§ã®è§£æ±ºã¯äžæŠæå¿µããŸããã 2 ã€ç®ã®æ¹æ³ã¯ assets:precompile ã³ãã³ããçæãã manifest ãã¡ã€ã«ïŒçæãããã¡ã€ã«ã®ãªã¹ããªã©ãèšè¿°ãããŠããïŒãš CircleCI ã®ãã£ãã·ã¥æ©èœã䜿ã£ãŠççž®ããæ¹æ³ã§ãã manifest ãã¡ã€ã«ã¯ãã³ã³ãã€ã«åŸã®ã¢ã»ãããã¡ã€ã«ãåºåããããã£ã¬ã¯ããªïŒ public/assets/ ïŒã«åãããã«åºåããããŸããäžèšã§ public/assets ã CircleCI ã®ãã£ãã·ã¥æ©èœã§ãã£ãã·ã¥ããããã«ãããããmanifest ãã¡ã€ã«ãäžç·ã«ãã£ãã·ã¥ãããããã«ãªã£ãŠããŸãã assets:precompile ã®å®è¡ã«ããä»åäœæããã manifest ãã¡ã€ã«ãšããã£ãã·ã¥ãããŠãã manifest ãã¡ã€ã«ãæ¯èŒããŠå·®åãåºããã¡ã€ã«ã ãã S3 ã«ã¢ããããŒãããããã«ããããšãã詊ã¿ã§ãã ãã®åŠç㯠asset_sync gem ã§ã¯ã§ãããã«ãªãã£ãã®ã§ãã·ã§ã«ã¹ã¯ãªãããš Rake ã¿ã¹ã¯ãäœæããŠå®è¡ããŠã¿ããšããããã¢ããããŒããã¹ããã¡ã€ã«ãã©ãããã倿ããããã®æéãã»ãŒãªããªãã6 å以äžã®ççž®ãããããšãã§ããŸããã ãã ãæ€èšŒãäžååãªãããå®éçšã«ä¹ããããšã¯ãŸã ã§ããŠããŸããã CircleCI ã®ãžã§ãå®è¡æéãççž®ããå°ããªæ¹åäºé
äžè¿°ã®éããå Workflow ã§å€§ããæéãè²»ãããŠããã®ã¯ assets:precompile ãš RSpec ã®å®è¡ã§ãããã现ããªç¹ãšããŠã¯ä»ã«ãå°ããæ¹åãããããšããããŸãã ã³ãŒãã®ãã§ãã¯ã¢ãŠã CircleCI ã§ã¯çµã¿èŸŒã¿ã®ã³ãã³ããšã㊠checkout ã³ãã³ãããããŸãã ããã¯å¯Ÿè±¡ã®ãªããžããªã®ãã©ã³ããã¯ããŒã³ããŠãããã³ãã³ãã§ããããžã§ãã¡ãã¬ãŒã¯ã¢ãã¬ãã«è¿ãæ§æã«ãªã£ãŠãããã³ãŒãããŒã¹ã®ãµã€ãºãå±¥æŽã倧ããããã¯ããŒã³ããã ãã§ããçšåºŠã®æéãããã£ãŠããŸã£ãŠããŸãã ããã§ãŸãã¯ã .git ãã£ã¬ã¯ããªã CircleCI ã®ãã£ãã·ã¥æ©èœãå©çšããŠãã£ãã·ã¥ããããã«ããŠã¿ãŸããã ãããšã checkout ã³ãã³ãèªäœã¯å€§ããççž®ããŸãããããã£ãã·ã¥ã® save/restore ã«ççž®ãã以äžã®æéããããããã«ãªã£ãŠããŸããŸããã å¥ã®æ¹æ³ãšã㊠checkout ã³ãã³ããå©çšããã«ãGit ã® Shallow clone ã Sparse clone ãé§äœ¿ããŠå¿
èŠãªãã¡ã€ã«ãå±¥æŽã ããã¯ããŒã³ãããšããããšãã§ããŸãã çŸåšã¯ Sparse clone ãäžéšå°å
¥ããŠã¿ãŠãããShallow clone ãå°å
¥ããããšèããŠããŸãã Docker image ã®äœæ ãžã§ãã¡ãã¬ãŒã§ã¯ ECS ãžã®ãããã€ã®éã« CircleCI äžã§ Docker image ããã«ãããŠããããã docker build ã³ãã³ãã®å®è¡æéãå¯èœãªéãæããããšèããŠããŸãã ççž®ããæ¹æ³ã¯æ§ã
ããããšæããŸãããCircleCI äžã§ã Dokcer Buildkit ãå©çšããããšãããŸãã®ã§ããããå©çšããŠãã«ãããããšã§ç°¡åã«ççž®ããããšãã§ããŸãã 詳ãã㯠Docker ã®ã¬ã€ã ã«èšèŒã®éãã§ã¯ãããŸãããDOCKER_BUILDKIT=1 ãæå®ã㊠docker build ãå®è¡ããã ãã§å©çšããããšãã§ãããžã§ãã¡ãã¬ãŒã§ã¯ 2 åã»ã©ããã£ãŠãããã«ãã 40 ç§ã»ã©ççž®ããããšãã§ããŸããã ãŸãšã ä»åã¯ãTechLunch ã§çºè¡šãããžã§ãã¡ãã¬ãŒã«ããã CircleCI ã®æŽ»çšãšæ¹åã®åãçµã¿ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ä»å玹ä»ãããŠããã ãã以å€ã«ãæ§ã
ãªçšéããããä»åŸãããã«ããŸã掻çšããŠãããããšæã£ãŠããŸãã ã芧ããã ãããããšãããããŸããã
ããã«ã¡ã¯ãã¡ãã¬ãŒãããã¯ãéçºå®€ ãšã³ãžãã¢ã®å²žç°ã§ãã å
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããå»çä»è·åéã®äººæãã©ãããã©ãŒã ããžã§ãã¡ãã¬ãŒãã®éçºã§å©çšããŠãã CircleCI ã§ã® CI/CD ã«ã€ããŠã®åãçµã¿ãçºè¡šããŸããã®ã§ã玹ä»ãããŠããã ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®éçºã§ CircleCI ãã©ã®ããã«å©çšããŠããã ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ãäž»ã«æ¬¡ã® 2 ã€ã CircleCI ãçšããŠè¡ãªã£ãŠããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ããã〠ãããã€ã«é¢ããŠã¯ãECS ç°å¢ãš EC2 ç°å¢ãžã® 2 éãã®ãããã€ã CircleCI ãå©çšããŠè¡ãªã£ãŠããŸãã ãã®ãã CircleCI ã® Workflow ã¯ããŠããããã¹ãã»æ§æãã§ãã¯ããEC2 ãžã®ãããã€ããECS ãžã®ãããã€ãã® 3 ã€ã«åãããŠããŸãã 3 ã€ã® Workflow ã倧ãŸãã«èª¬æãããŠããã ããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ãžã§ãã¡ãã¬ãŒã¯äž»ã«ãµãŒããµã€ãã Ruby on Railsãããã³ããšã³ãã React ã䜿ã£ãŠéçºãããŠããŸãã ãã®ãããŠããããã¹ãã«ã¯ RSpec ã» Jest ããæ§æãã§ãã¯ã«ã¯ Rubocop ãš ESLint å©çšããŠããŸãã ãã® Workflow 㯠3 ã€ã®ãžã§ãã§æ§æãããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« bundle install ã» yarn install ãªã©ãè¡ãããŠããããã¹ãã»æ§æãã§ãã¯ã®å®è¡ã«å¿
èŠãªäŸåã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããCircleCI ã®ãã£ãã·ã¥æ©èœãçšããŠãã£ãã·ã¥ãè¡ãªã£ãŠããŸã RSpec ã®å®è¡ 2 ã³ã³ãããå©çšããŠã®äžŠåå®è¡ãè¡ãªã£ãŠããŸã æ§æãã§ãã¯ãš Jest ã®å®è¡ RSpec ãšæ¯èŒã㊠Jest ã§ã®ãã¹ãã³ãŒãã¯ããªã¥ãŒã ãå°ãªãã»å®è¡æéãçããããæ§æãã§ãã¯ãšäžç·ã« 1 ã€ã®ãžã§ãã«ããŠããŸã ãã® Workflow ã¯ã©ã®ãã©ã³ãã§ã GitHub ãž Push ãè¡ããããã³ã«å®è¡ãããããã«ããŠããŸãã EC2 ãžã®ããã〠ãã® Workflow ã§ã¯ãããã€ãè¡ãããã®æºåãšãæåéã EC2 ãžã®ãããã€ãè¡ãªã£ãŠããŸãã ãããã€ã«ã¯ Ruby gem ã® Capistrano ãå©çšããŠããŸãã äžèšã®ãã㪠2 ã€ã®ãžã§ãã§æ§æããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« åè¿°ã®ãŠããããã¹ãã»æ§æãã§ãã¯ã® Workflow ã® 1 ã€ç®ãšåã圹å²ã§ã ãã«ããšããã〠Rails ã® assets:precompile ã yarn build ãªã©ã®åŠçãšãCapistrano ãçšãããããã€ãè¡ãªã£ãŠããŸã ãã® Workflow ã¯ç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã ECS ãžã®ããã〠ãã® Workflow ã§ã¯ ECS ãžãããã€ããããã® Docker image äœæãšãã®ããã®ãã«ããªã©ãè¡ãªã£ãŠããŸãã ãžã§ãã¯äžèšã®ããã« 4 ã€ã§æ§æãããŠããŸãã npm package ã®ã€ã³ã¹ããŒã« ããã³ããšã³ãã®ãã«ã Gem ã®ã€ã³ã¹ããŒã«ãš Rails ã® assets:precompile Docker image ã®äœæãš Push ãã¡ãã® Workflow ãç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã æ±ããŠãã課é¡ãš assets:precompile ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ CircleCI ã®åãžã§ããå
šãŠæ£åžžã«å®äºããããšã PR ãããŒãžããæ¡ä»¶ã® 1 ã€ã«ããŠããŸãã ãããå Workflow ã»ãžã§ãã®å®è¡æéãé·ãããžã§ãã®å®è¡åŸ
ã¡ãããªããã°ãããªããšããç¶æ³ãããèµ·ãã£ãŠããŸã£ãŠããŸããã ç¹ã«æéãããã£ãŠããã®ããäžèšã® 3 ã€ã§ããã ãEC2 ãžã®ãããã€ãWorkflow ã®ããããã€ããžã§ã ãECS ãžã®ãããã€ãWorkflow ã®ãGem ã®ã€ã³ã¹ããŒã«ãš Rails ã® asset_precompileããžã§ã ãRSpec ã®å®è¡ããžã§ã RSpec ã®æžãæ¹ãªã©ãæ¹åããããšã§ççž®ã§ããããã岿ãããŠããã ããŸã ãããã«ã€ããŠèª¿æ»ãããšããã1ã» 2 ã¯ãassets:precompile ãäž»ã«æéã䜿ã£ãŠããããšãåãããŸããã ãã®ç¹ã«ã€ããŠåå ãšè¡ãªã£ãæ¹åã説æããããŠããã ãããšæããŸãã assets:precompile ã«æéãããã ãžã§ãã¡ãã¬ãŒã§ã¯ Rails ã®ã¢ã»ãããã€ãã©ã€ã³ãå©çšããŠãã¢ã»ãããã¡ã€ã«ã®ã³ã³ãã€ã«ã»æå°åãªã©ãè¡ãªã£ãŠããŸãã ãããå®è¡ããéã« assets:precompile ã³ãã³ããå©çšããŠããŸãã ãŸããåã³ãã³ãå®è¡æã«ã³ã³ãã€ã«ãããã¡ã€ã«ã AWS S3 ãã±ããã«ã¢ããããŒãããããã« asset_sync gem ãå©çšããŠããŸãã ãã®ã³ãã³ãã®å®è¡ã«ã¯ 9 åãã 10 åã»ã©ã®æéãããã£ãŠãããäžèšã® 2 ã€ã®åå ã§é
ããªã£ãŠããŸããã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ãã¡ãã«ã€ããŠã¯èªãã§åã®ããšãã§ãããããã〠Workflow ãå®è¡ããããã³ã«ã¢ã»ãããã¡ã€ã«ã®å€æŽæç¡ã«é¢ããããæ¯å 3 åã»ã©ãè²»ãããŠå
šãŠã®ã¢ã»ãããã¡ã€ã«ãã³ã³ãã€ã«ã»æå°åããŠããŸããã ãã¡ãã®è§£æ±ºçãšããŠã¯ã CircleCI ã®å
¬åŒããã¥ã¡ã³ãã§ãäŸãèŒããããŠããŸã ãã assets:precompile ã³ãã³ãã§çæããããã¡ã€ã«ã眮ããããã£ã¬ã¯ããªïŒ public/assets ïŒã CircleCI ã§ãã£ãã·ã¥ãããããšã§å¯Ÿå¿ããŸããã ãã£ãã·ã¥ãããããšã§ãæ¯å 3 åã»ã©ããã£ãŠããåŠçã 1 åã»ã©ã«ççž®ããããšãã§ããŸããã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã ãã¡ãã€ããŠã¯ããå°ãèæ¯ãè€éãã€ããŸã 解決ãŸã§ã¯ã§ããŠããŸããã ãŸã asset_sync ãå©çšãããã¡ã€ã«ã®ã¢ããããŒãåŠçã§ãããæ¯å 6 å以äžã®æéãããã£ãŠããŸããã CircleCI ã®ãã°ãããããèŠãŠã¿ããšã¢ããããŒãèªäœã«æéãããã£ãŠããã®ã§ã¯ãªãããã©ã®ãã¡ã€ã«ãã¢ããããŒããã¹ãããã倿ããåŠçã«å€ãã®æéãè²»ãããŠããããšãåãããŸããã ïŒ1 ãã¡ã€ã«ãã¢ããããŒãããŠããªãã 6 å 20 ç§ããã£ãŠããïŒ ããã§ã asset_sync gem ã®ãœãŒã¹ã³ãŒããèªãã§ã¿ããšããã¢ããããŒãå
ã® S3 ãã±ããã«ãããã¡ã€ã«ãå
šãŠååŸãã assets:precompile ã³ãã³ããçæãããã¡ã€ã«ã®ãã¡ã€ã«åãšæ¯èŒããããšããåŠçããããŸããã ãã®åŠçãæªããã®ã§ã¯ãªãããšæããS3 ãã±ããã確èªããŠã¿ããšããæ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ãååšããããšãåãããŸããã æ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ã®æ
å ±ãååŸããŠããããšãèãããš 6 åä»¥äžæéããããã®ãçŽåŸã§ãã ãã®åé¡ã®è§£æ±ºçã¯äžèšã® 2 ã€ãèãåŸããšèããŸããã äžèŠãªãã¡ã€ã«ã S3 ãã±ããããåé€ãã ååã®ãããã€ãšã®æ¯èŒãã㊠S3 ã«ã¢ã¯ã»ã¹ããã«ã¢ããããŒããã¹ããã¡ã€ã«ãã©ããã倿ããããã«ãã 1 ã€ç®ã®æ¹æ³ã¯æ£æ»æ³ã§ãæ°åäžãã¡ã€ã«ãå
šãŠäœ¿ã£ãŠããããã§ã¯ãªãããå©çšãããŠããªããã¡ã€ã«ãåé€ããŠããŸãæ¹æ³ã§ãã asset_sync ãæ©ããªããS3 ã®å©çšæãå°ãªããªããããã®æ¹æ³ãåããã®ã§ããã°ããã®æ¹æ³ã§è§£æ±ºããã®ãè¯ãããã«æããŸãã ãžã§ãã¡ãã¬ãŒã§ããã®æ¹æ³ãåããªãããšæ€èšããŸãããããžã§ãã¡ãã¬ãŒããé
ä¿¡ããŠãã HTML ã¡ãŒã«ãªã©ã§ãå©çšããŠãããã¡ã€ã«ãããããäžæŠã«ã¢ã¯ã»ã¹ãããŠããªããããšãã£ãŠåé€ããããšãã§ããããã®æ¹æ³ã§ã®è§£æ±ºã¯äžæŠæå¿µããŸããã 2 ã€ç®ã®æ¹æ³ã¯ assets:precompile ã³ãã³ããçæãã manifest ãã¡ã€ã«ïŒçæãããã¡ã€ã«ã®ãªã¹ããªã©ãèšè¿°ãããŠããïŒãš CircleCI ã®ãã£ãã·ã¥æ©èœã䜿ã£ãŠççž®ããæ¹æ³ã§ãã manifest ãã¡ã€ã«ã¯ãã³ã³ãã€ã«åŸã®ã¢ã»ãããã¡ã€ã«ãåºåããããã£ã¬ã¯ããªïŒ public/assets/ ïŒã«åãããã«åºåããããŸããäžèšã§ public/assets ã CircleCI ã®ãã£ãã·ã¥æ©èœã§ãã£ãã·ã¥ããããã«ãããããmanifest ãã¡ã€ã«ãäžç·ã«ãã£ãã·ã¥ãããããã«ãªã£ãŠããŸãã assets:precompile ã®å®è¡ã«ããä»åäœæããã manifest ãã¡ã€ã«ãšããã£ãã·ã¥ãããŠãã manifest ãã¡ã€ã«ãæ¯èŒããŠå·®åãåºããã¡ã€ã«ã ãã S3 ã«ã¢ããããŒãããããã«ããããšãã詊ã¿ã§ãã ãã®åŠç㯠asset_sync gem ã§ã¯ã§ãããã«ãªãã£ãã®ã§ãã·ã§ã«ã¹ã¯ãªãããš Rake ã¿ã¹ã¯ãäœæããŠå®è¡ããŠã¿ããšããããã¢ããããŒããã¹ããã¡ã€ã«ãã©ãããã倿ããããã®æéãã»ãŒãªããªãã6 å以äžã®ççž®ãããããšãã§ããŸããã ãã ãæ€èšŒãäžååãªãããå®éçšã«ä¹ããããšã¯ãŸã ã§ããŠããŸããã CircleCI ã®ãžã§ãå®è¡æéãççž®ããå°ããªæ¹åäºé
äžè¿°ã®éããå Workflow ã§å€§ããæéãè²»ãããŠããã®ã¯ assets:precompile ãš RSpec ã®å®è¡ã§ãããã现ããªç¹ãšããŠã¯ä»ã«ãå°ããæ¹åãããããšããããŸãã ã³ãŒãã®ãã§ãã¯ã¢ãŠã CircleCI ã§ã¯çµã¿èŸŒã¿ã®ã³ãã³ããšã㊠checkout ã³ãã³ãããããŸãã ããã¯å¯Ÿè±¡ã®ãªããžããªã®ãã©ã³ããã¯ããŒã³ããŠãããã³ãã³ãã§ããããžã§ãã¡ãã¬ãŒã¯ã¢ãã¬ãã«è¿ãæ§æã«ãªã£ãŠãããã³ãŒãããŒã¹ã®ãµã€ãºãå±¥æŽã倧ããããã¯ããŒã³ããã ãã§ããçšåºŠã®æéãããã£ãŠããŸã£ãŠããŸãã ããã§ãŸãã¯ã .git ãã£ã¬ã¯ããªã CircleCI ã®ãã£ãã·ã¥æ©èœãå©çšããŠãã£ãã·ã¥ããããã«ããŠã¿ãŸããã ãããšã checkout ã³ãã³ãèªäœã¯å€§ããççž®ããŸãããããã£ãã·ã¥ã® save/restore ã«ççž®ãã以äžã®æéããããããã«ãªã£ãŠããŸããŸããã å¥ã®æ¹æ³ãšã㊠checkout ã³ãã³ããå©çšããã«ãGit ã® Shallow clone ã Sparse clone ãé§äœ¿ããŠå¿
èŠãªãã¡ã€ã«ãå±¥æŽã ããã¯ããŒã³ãããšããããšãã§ããŸãã çŸåšã¯ Sparse clone ãäžéšå°å
¥ããŠã¿ãŠãããShallow clone ãå°å
¥ããããšèããŠããŸãã Docker image ã®äœæ ãžã§ãã¡ãã¬ãŒã§ã¯ ECS ãžã®ãããã€ã®éã« CircleCI äžã§ Docker image ããã«ãããŠããããã docker build ã³ãã³ãã®å®è¡æéãå¯èœãªéãæããããšèããŠããŸãã ççž®ããæ¹æ³ã¯æ§ã
ããããšæããŸãããCircleCI äžã§ã Dokcer Buildkit ãå©çšããããšãããŸãã®ã§ããããå©çšããŠãã«ãããããšã§ç°¡åã«ççž®ããããšãã§ããŸãã 詳ãã㯠Docker ã®ã¬ã€ã ã«èšèŒã®éãã§ã¯ãããŸãããDOCKER_BUILDKIT=1 ãæå®ã㊠docker build ãå®è¡ããã ãã§å©çšããããšãã§ãããžã§ãã¡ãã¬ãŒã§ã¯ 2 åã»ã©ããã£ãŠãããã«ãã 40 ç§ã»ã©ççž®ããããšãã§ããŸããã ãŸãšã ä»åã¯ãTechLunch ã§çºè¡šãããžã§ãã¡ãã¬ãŒã«ããã CircleCI ã®æŽ»çšãšæ¹åã®åãçµã¿ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ä»å玹ä»ãããŠããã ãã以å€ã«ãæ§ã
ãªçšéããããä»åŸãããã«ããŸã掻çšããŠãããããšæã£ãŠããŸãã ã芧ããã ãããããšãããããŸããã
ããã«ã¡ã¯ãã¡ãã¬ãŒãããã¯ãéçºå®€ ãšã³ãžãã¢ã®å²žç°ã§ãã å
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããå»çä»è·åéã®äººæãã©ãããã©ãŒã ããžã§ãã¡ãã¬ãŒãã®éçºã§å©çšããŠãã CircleCI ã§ã® CI/CD ã«ã€ããŠã®åãçµã¿ãçºè¡šããŸããã®ã§ã玹ä»ãããŠããã ããããšæããŸãã ãžã§ãã¡ãã¬ãŒã®éçºã§ CircleCI ãã©ã®ããã«å©çšããŠããã ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ãäž»ã«æ¬¡ã® 2 ã€ã CircleCI ãçšããŠè¡ãªã£ãŠããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ããã〠ãããã€ã«é¢ããŠã¯ãECS ç°å¢ãš EC2 ç°å¢ãžã® 2 éãã®ãããã€ã CircleCI ãå©çšããŠè¡ãªã£ãŠããŸãã ãã®ãã CircleCI ã® Workflow ã¯ããŠããããã¹ãã»æ§æãã§ãã¯ããEC2 ãžã®ãããã€ããECS ãžã®ãããã€ãã® 3 ã€ã«åãããŠããŸãã 3 ã€ã® Workflow ã倧ãŸãã«èª¬æãããŠããã ããŸãã ãŠããããã¹ãã»æ§æãã§ã㯠ãžã§ãã¡ãã¬ãŒã¯äž»ã«ãµãŒããµã€ãã Ruby on Railsãããã³ããšã³ãã React ã䜿ã£ãŠéçºãããŠããŸãã ãã®ãããŠããããã¹ãã«ã¯ RSpec ã» Jest ããæ§æãã§ãã¯ã«ã¯ Rubocop ãš ESLint å©çšããŠããŸãã ãã® Workflow 㯠3 ã€ã®ãžã§ãã§æ§æãããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« bundle install ã» yarn install ãªã©ãè¡ãããŠããããã¹ãã»æ§æãã§ãã¯ã®å®è¡ã«å¿
èŠãªäŸåã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããCircleCI ã®ãã£ãã·ã¥æ©èœãçšããŠãã£ãã·ã¥ãè¡ãªã£ãŠããŸã RSpec ã®å®è¡ 2 ã³ã³ãããå©çšããŠã®äžŠåå®è¡ãè¡ãªã£ãŠããŸã æ§æãã§ãã¯ãš Jest ã®å®è¡ RSpec ãšæ¯èŒã㊠Jest ã§ã®ãã¹ãã³ãŒãã¯ããªã¥ãŒã ãå°ãªãã»å®è¡æéãçããããæ§æãã§ãã¯ãšäžç·ã« 1 ã€ã®ãžã§ãã«ããŠããŸã ãã® Workflow ã¯ã©ã®ãã©ã³ãã§ã GitHub ãž Push ãè¡ããããã³ã«å®è¡ãããããã«ããŠããŸãã EC2 ãžã®ããã〠ãã® Workflow ã§ã¯ãããã€ãè¡ãããã®æºåãšãæåéã EC2 ãžã®ãããã€ãè¡ãªã£ãŠããŸãã ãããã€ã«ã¯ Ruby gem ã® Capistrano ãå©çšããŠããŸãã äžèšã®ãã㪠2 ã€ã®ãžã§ãã§æ§æããŠããŸãã ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã« åè¿°ã®ãŠããããã¹ãã»æ§æãã§ãã¯ã® Workflow ã® 1 ã€ç®ãšåã圹å²ã§ã ãã«ããšããã〠Rails ã® assets:precompile ã yarn build ãªã©ã®åŠçãšãCapistrano ãçšãããããã€ãè¡ãªã£ãŠããŸã ãã® Workflow ã¯ç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã ECS ãžã®ããã〠ãã® Workflow ã§ã¯ ECS ãžãããã€ããããã® Docker image äœæãšãã®ããã®ãã«ããªã©ãè¡ãªã£ãŠããŸãã ãžã§ãã¯äžèšã®ããã« 4 ã€ã§æ§æãããŠããŸãã npm package ã®ã€ã³ã¹ããŒã« ããã³ããšã³ãã®ãã«ã Gem ã®ã€ã³ã¹ããŒã«ãš Rails ã® assets:precompile Docker image ã®äœæãš Push ãã¡ãã® Workflow ãç¹å®ã®ãã©ã³ãã§ããå®è¡ãããªãããã«ãªã£ãŠããŸãã æ±ããŠãã課é¡ãš assets:precompile ãžã§ãã¡ãã¬ãŒã®éçºã§ã¯ CircleCI ã®åãžã§ããå
šãŠæ£åžžã«å®äºããããšã PR ãããŒãžããæ¡ä»¶ã® 1 ã€ã«ããŠããŸãã ãããå Workflow ã»ãžã§ãã®å®è¡æéãé·ãããžã§ãã®å®è¡åŸ
ã¡ãããªããã°ãããªããšããç¶æ³ãããèµ·ãã£ãŠããŸã£ãŠããŸããã ç¹ã«æéãããã£ãŠããã®ããäžèšã® 3 ã€ã§ããã ãEC2 ãžã®ãããã€ãWorkflow ã®ããããã€ããžã§ã ãECS ãžã®ãããã€ãWorkflow ã®ãGem ã®ã€ã³ã¹ããŒã«ãš Rails ã® asset_precompileããžã§ã ãRSpec ã®å®è¡ããžã§ã RSpec ã®æžãæ¹ãªã©ãæ¹åããããšã§ççž®ã§ããããã岿ãããŠããã ããŸã ãããã«ã€ããŠèª¿æ»ãããšããã1ã» 2 ã¯ãassets:precompile ãäž»ã«æéã䜿ã£ãŠããããšãåãããŸããã ãã®ç¹ã«ã€ããŠåå ãšè¡ãªã£ãæ¹åã説æããããŠããã ãããšæããŸãã assets:precompile ã«æéãããã ãžã§ãã¡ãã¬ãŒã§ã¯ Rails ã®ã¢ã»ãããã€ãã©ã€ã³ãå©çšããŠãã¢ã»ãããã¡ã€ã«ã®ã³ã³ãã€ã«ã»æå°åãªã©ãè¡ãªã£ãŠããŸãã ãããå®è¡ããéã« assets:precompile ã³ãã³ããå©çšããŠããŸãã ãŸããåã³ãã³ãå®è¡æã«ã³ã³ãã€ã«ãããã¡ã€ã«ã AWS S3 ãã±ããã«ã¢ããããŒãããããã« asset_sync gem ãå©çšããŠããŸãã ãã®ã³ãã³ãã®å®è¡ã«ã¯ 9 åãã 10 åã»ã©ã®æéãããã£ãŠãããäžèšã® 2 ã€ã®åå ã§é
ããªã£ãŠããŸããã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã æ¯å 1 ããã³ã³ãã€ã«ãè¡ãªã£ãŠãã ãã¡ãã«ã€ããŠã¯èªãã§åã®ããšãã§ãããããã〠Workflow ãå®è¡ããããã³ã«ã¢ã»ãããã¡ã€ã«ã®å€æŽæç¡ã«é¢ããããæ¯å 3 åã»ã©ãè²»ãããŠå
šãŠã®ã¢ã»ãããã¡ã€ã«ãã³ã³ãã€ã«ã»æå°åããŠããŸããã ãã¡ãã®è§£æ±ºçãšããŠã¯ã CircleCI ã®å
¬åŒããã¥ã¡ã³ãã§ãäŸãèŒããããŠããŸã ãã assets:precompile ã³ãã³ãã§çæããããã¡ã€ã«ã眮ããããã£ã¬ã¯ããªïŒ public/assets ïŒã CircleCI ã§ãã£ãã·ã¥ãããããšã§å¯Ÿå¿ããŸããã ãã£ãã·ã¥ãããããšã§ãæ¯å 3 åã»ã©ããã£ãŠããåŠçã 1 åã»ã©ã«ççž®ããããšãã§ããŸããã ã³ã³ãã€ã«åŸã®ãã¡ã€ã«ãã¢ããããŒããã S3 ãã±ããã«å€§éã®ãã¡ã€ã«ãååšãã ãã¡ãã€ããŠã¯ããå°ãèæ¯ãè€éãã€ããŸã 解決ãŸã§ã¯ã§ããŠããŸããã ãŸã asset_sync ãå©çšãããã¡ã€ã«ã®ã¢ããããŒãåŠçã§ãããæ¯å 6 å以äžã®æéãããã£ãŠããŸããã CircleCI ã®ãã°ãããããèŠãŠã¿ããšã¢ããããŒãèªäœã«æéãããã£ãŠããã®ã§ã¯ãªãããã©ã®ãã¡ã€ã«ãã¢ããããŒããã¹ãããã倿ããåŠçã«å€ãã®æéãè²»ãããŠããããšãåãããŸããã ïŒ1 ãã¡ã€ã«ãã¢ããããŒãããŠããªãã 6 å 20 ç§ããã£ãŠããïŒ ããã§ã asset_sync gem ã®ãœãŒã¹ã³ãŒããèªãã§ã¿ããšããã¢ããããŒãå
ã® S3 ãã±ããã«ãããã¡ã€ã«ãå
šãŠååŸãã assets:precompile ã³ãã³ããçæãããã¡ã€ã«ã®ãã¡ã€ã«åãšæ¯èŒããããšããåŠçããããŸããã ãã®åŠçãæªããã®ã§ã¯ãªãããšæããS3 ãã±ããã確èªããŠã¿ããšããæ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ãååšããããšãåãããŸããã æ°åäžä»¶ä»¥äžã®ãã¡ã€ã«ã®æ
å ±ãååŸããŠããããšãèãããš 6 åä»¥äžæéããããã®ãçŽåŸã§ãã ãã®åé¡ã®è§£æ±ºçã¯äžèšã® 2 ã€ãèãåŸããšèããŸããã äžèŠãªãã¡ã€ã«ã S3 ãã±ããããåé€ãã ååã®ãããã€ãšã®æ¯èŒãã㊠S3 ã«ã¢ã¯ã»ã¹ããã«ã¢ããããŒããã¹ããã¡ã€ã«ãã©ããã倿ããããã«ãã 1 ã€ç®ã®æ¹æ³ã¯æ£æ»æ³ã§ãæ°åäžãã¡ã€ã«ãå
šãŠäœ¿ã£ãŠããããã§ã¯ãªãããå©çšãããŠããªããã¡ã€ã«ãåé€ããŠããŸãæ¹æ³ã§ãã asset_sync ãæ©ããªããS3 ã®å©çšæãå°ãªããªããããã®æ¹æ³ãåããã®ã§ããã°ããã®æ¹æ³ã§è§£æ±ºããã®ãè¯ãããã«æããŸãã ãžã§ãã¡ãã¬ãŒã§ããã®æ¹æ³ãåããªãããšæ€èšããŸãããããžã§ãã¡ãã¬ãŒããé
ä¿¡ããŠãã HTML ã¡ãŒã«ãªã©ã§ãå©çšããŠãããã¡ã€ã«ãããããäžæŠã«ã¢ã¯ã»ã¹ãããŠããªããããšãã£ãŠåé€ããããšãã§ããããã®æ¹æ³ã§ã®è§£æ±ºã¯äžæŠæå¿µããŸããã 2 ã€ç®ã®æ¹æ³ã¯ assets:precompile ã³ãã³ããçæãã manifest ãã¡ã€ã«ïŒçæãããã¡ã€ã«ã®ãªã¹ããªã©ãèšè¿°ãããŠããïŒãš CircleCI ã®ãã£ãã·ã¥æ©èœã䜿ã£ãŠççž®ããæ¹æ³ã§ãã manifest ãã¡ã€ã«ã¯ãã³ã³ãã€ã«åŸã®ã¢ã»ãããã¡ã€ã«ãåºåããããã£ã¬ã¯ããªïŒ public/assets/ ïŒã«åãããã«åºåããããŸããäžèšã§ public/assets ã CircleCI ã®ãã£ãã·ã¥æ©èœã§ãã£ãã·ã¥ããããã«ãããããmanifest ãã¡ã€ã«ãäžç·ã«ãã£ãã·ã¥ãããããã«ãªã£ãŠããŸãã assets:precompile ã®å®è¡ã«ããä»åäœæããã manifest ãã¡ã€ã«ãšããã£ãã·ã¥ãããŠãã manifest ãã¡ã€ã«ãæ¯èŒããŠå·®åãåºããã¡ã€ã«ã ãã S3 ã«ã¢ããããŒãããããã«ããããšãã詊ã¿ã§ãã ãã®åŠç㯠asset_sync gem ã§ã¯ã§ãããã«ãªãã£ãã®ã§ãã·ã§ã«ã¹ã¯ãªãããš Rake ã¿ã¹ã¯ãäœæããŠå®è¡ããŠã¿ããšããããã¢ããããŒããã¹ããã¡ã€ã«ãã©ãããã倿ããããã®æéãã»ãŒãªããªãã6 å以äžã®ççž®ãããããšãã§ããŸããã ãã ãæ€èšŒãäžååãªãããå®éçšã«ä¹ããããšã¯ãŸã ã§ããŠããŸããã CircleCI ã®ãžã§ãå®è¡æéãççž®ããå°ããªæ¹åäºé
äžè¿°ã®éããå Workflow ã§å€§ããæéãè²»ãããŠããã®ã¯ assets:precompile ãš RSpec ã®å®è¡ã§ãããã现ããªç¹ãšããŠã¯ä»ã«ãå°ããæ¹åãããããšããããŸãã ã³ãŒãã®ãã§ãã¯ã¢ãŠã CircleCI ã§ã¯çµã¿èŸŒã¿ã®ã³ãã³ããšã㊠checkout ã³ãã³ãããããŸãã ããã¯å¯Ÿè±¡ã®ãªããžããªã®ãã©ã³ããã¯ããŒã³ããŠãããã³ãã³ãã§ããããžã§ãã¡ãã¬ãŒã¯ã¢ãã¬ãã«è¿ãæ§æã«ãªã£ãŠãããã³ãŒãããŒã¹ã®ãµã€ãºãå±¥æŽã倧ããããã¯ããŒã³ããã ãã§ããçšåºŠã®æéãããã£ãŠããŸã£ãŠããŸãã ããã§ãŸãã¯ã .git ãã£ã¬ã¯ããªã CircleCI ã®ãã£ãã·ã¥æ©èœãå©çšããŠãã£ãã·ã¥ããããã«ããŠã¿ãŸããã ãããšã checkout ã³ãã³ãèªäœã¯å€§ããççž®ããŸãããããã£ãã·ã¥ã® save/restore ã«ççž®ãã以äžã®æéããããããã«ãªã£ãŠããŸããŸããã å¥ã®æ¹æ³ãšã㊠checkout ã³ãã³ããå©çšããã«ãGit ã® Shallow clone ã Sparse clone ãé§äœ¿ããŠå¿
èŠãªãã¡ã€ã«ãå±¥æŽã ããã¯ããŒã³ãããšããããšãã§ããŸãã çŸåšã¯ Sparse clone ãäžéšå°å
¥ããŠã¿ãŠãããShallow clone ãå°å
¥ããããšèããŠããŸãã Docker image ã®äœæ ãžã§ãã¡ãã¬ãŒã§ã¯ ECS ãžã®ãããã€ã®éã« CircleCI äžã§ Docker image ããã«ãããŠããããã docker build ã³ãã³ãã®å®è¡æéãå¯èœãªéãæããããšèããŠããŸãã ççž®ããæ¹æ³ã¯æ§ã
ããããšæããŸãããCircleCI äžã§ã Dokcer Buildkit ãå©çšããããšãããŸãã®ã§ããããå©çšããŠãã«ãããããšã§ç°¡åã«ççž®ããããšãã§ããŸãã 詳ãã㯠Docker ã®ã¬ã€ã ã«èšèŒã®éãã§ã¯ãããŸãããDOCKER_BUILDKIT=1 ãæå®ã㊠docker build ãå®è¡ããã ãã§å©çšããããšãã§ãããžã§ãã¡ãã¬ãŒã§ã¯ 2 åã»ã©ããã£ãŠãããã«ãã 40 ç§ã»ã©ççž®ããããšãã§ããŸããã ãŸãšã ä»åã¯ãTechLunch ã§çºè¡šãããžã§ãã¡ãã¬ãŒã«ããã CircleCI ã®æŽ»çšãšæ¹åã®åãçµã¿ã«ã€ããŠç޹ä»ãããŠããã ããŸããã ä»å玹ä»ãããŠããã ãã以å€ã«ãæ§ã
ãªçšéããããä»åŸãããã«ããŸã掻çšããŠãããããšæã£ãŠããŸãã ã芧ããã ãããããšãããããŸããã
çæ§ããã«ã¡ã¯ã ãããã¯ãéçºå®€ ãšã³ãžãã¢ã®æ¿±äžã§ãã æ°åã³ãããŠã€ã«ã¹ææçãçåšãæ¯ãã£ãŠãããŸãããçæ§ããããéããã§ãããããå
æ¥ã®ç·æ¥äºæ
宣èšãåããŠãã¡ãã¬ãŒãå
šç€Ÿå¡ãååãªã¢ãŒãã§æ¥åã«åœãã£ãŠããŸãããªã³ã©ã€ã³å»çäºå
žãMEDLEYãã«ãã ã³ãããŠã€ã«ã¹é¢é£ã®ç¹é ãçµãŸããŠããŸãã®ã§ãã²ã芧ãã ããã ããŠå
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSãã®ãµãŒãã¹éå¶ã§äœ¿ãããŠããç£èŠããŒã«çŸ€ã«ã€ããŠçºè¡šããã®ã§ãã玹ä»ãããŠããã ããŸãã CLINICS ã®æŠèŠãšããµãŒãã¹ã«ãããç£èŠã®ç«ã¡äœçœ®ã«ã€ã㊠å
¬åŒããŒãž ã§ãã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ããšéæã£ãŠãã CLINICS ã§ããããã詳现ã«ã¯ãé»åã«ã«ãã·ã¹ãã ã»ãªã³ã©ã€ã³äºçŽã·ã¹ãã ãæäŸããŠããŸãããããäºçŽã»èšºçã»ã«ã«ãã® 3 ãããã¯ãã§å»ççŸå Žã®æ¥åãäžæã«åŒãåããããšãç®çãšãããµãŒãã¹ã CLINICS ã§ãã ãã®ãã¡ãé»åã«ã«ãã·ã¹ãã ã¯ãã æ¥å»æšæºã¬ã»ãããœãã ORCA ããšãã補åãå
å
ããåœ¢ã§æäŸããŠãããORCA èªäœã¯ç¬ç«ããç°å¢ã§åäœããŠããŸãã åœç¶ãªãããORCA èªäœã CLINICS ãšã¯ç¬ç«ãã 1 ãããã¯ãã§ãããããCLINICS åŽã«åé¡ããªããŠã ORCA ãµãŒããããã©ãŒãã³ã¹äœäžãäžå
·åãèµ·ãããŠããŸã£ãããããã㯠CLINICS ã® web ãµãŒããšã®éä¿¡ãããŸããããªããªãã±ãŒã¹ãèããããŸãã é»åã«ã«ãã·ã¹ãã ã¯å»çæ©é¢ã®èšºå¯ã»äŒèšãšãã£ãæ¥åžžæ¥åã®éèŠãªããŒããæ
ã£ãŠãããããã§é害ãçºçãããšæ¥åãæ¢ãŸã£ãŠããŸããŸãïŒææªãæ£è
ããããåŸ
ããããŠããŸãããšããããŸãïŒã ãã®ãããæ¥åã«å€§ããªåœ±é¿ãäžããç®æãäžå¿ã«ãè€æ°ã®ç£èŠããŒã«ã§ã¢ããªã±ãŒã·ã§ã³ã®åäœç¶æ³ããã§ãã¯ããŠããŸãã ç£èŠããŒã«ãããã ããããã¯å®éã« CLINICS ã§å©çšããŠããããŒã«ãç°¡æœã«ã玹ä»ããŠãããŸãã Sentry Application Performance Monitoring & Error Tracking Software Application performance monitoring for developers & software teams to see errors clearer, solve issues faster & continue learning continuously. sentry.io åŒç€Ÿã®ä»ãããã¯ãïŒã ãžã§ãã¡ãã¬ãŒ ããã ä»è·ã®ã»ãã ãïŒã§ãå©çšããŠããç£èŠããŒã«ã§ãã åºæ¬çã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äŸå€ãçºçãããšèªåã§ã¢ã©ãŒããæããŠãããŸãããã¢ããªã±ãŒã·ã§ã³åŽã§ catch ããŠããŸããã®ããäŸå€ã§ã¯ãªããéç¥ãããã€ãã³ãã«ã€ããŠãä»»æã«ã¢ã©ãŒãããããããšãå¯èœã§ãã CLINICS ã§ã¯äŸãã°ã¢ã«ãŠã³ã ID ãã¢ã¯ã»ã¹ãã API ãšã³ããã€ã³ãã»ãã©ã¡ãŒã¿ãªã©æž¡ããŠããšã©ãŒèª¿æ»ã«æŽ»çšããŠããŸãã Mackerel MackerelïŒãã«ã¬ã«ïŒ: å§ãããããŠå¥¥æ·±ããå¯èŠ³æž¬æ§ãã©ãããã©ãŒã Mackerel(ãã«ã¬ã«)ã¯èª°ã§ãç°¡åã«å§ãããã奥深ãå¯èŠ³æž¬æ§ãã©ãããã©ãŒã ãéçšãã€ãŒãžãŒã«ãããªãã¶ãŒãããªãã£ãé«ããæªç¥ã®åé¡ã«ç«ã¡åããéçºè
ã«åãäžããŸãããµãŒããŒç£èŠãMackerelã§ã¯ãããŠã¿ãŸãããïŒç¡æãã©ã³ã2é±éã®ãã©ã€ã¢ã«ããããŸãã mackerel.io GUI ã§ç°¡åã«ç£èŠèšå®ãå¯èœãªãµãŒãã¹ã§ãã åè·ã§äœ¿ã£ãŠããæã¯ GUI ã§ã§ãããšãããŸã§ããè§Šã£ãŠããªãã£ãã®ã§ãããèšå®ãã¡ã€ã«ãæè£œããã°ãèªäœã¹ã¯ãªããã®åºåããã§ãã¯ãããããã§ãã¯ã«å€±æããæäœãåŠçããããâŠãšãã£ãããã¥ã¢ã«ãªç£èŠãå¯èœã§ãã çŸåš CLINICS ã«ãããŠã¯ãORCA ã€ã³ã¹ã¿ã³ã¹ãããããç¬ç«ããŠåäœããŠããŸãããMackerel ã§ã¯ãã® ORCA ã€ã³ã¹ã¿ã³ã¹ãç£èŠããŠããŸãããŸãç£èŠããã ãã§ãªããåäœäžè¯ãèµ·ãããæã®åèµ·ååŠçãªã©ãæ
åœããŠããŸãã AWS CloudWatch & Lambda Amazon CloudWatchïŒãªãœãŒã¹ãšã¢ããªã±ãŒã·ã§ã³ã®ç£èŠãšç®¡çïŒ| AWS Amazon CloudWatch ã¯ãAWS ãªãœãŒã¹ãš AWS ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã®ã¢ãã¿ãªã³ã°ãµãŒãã¹ã§ããæ§ã
ãªã¡ããªã¯ã¹ããã°ãåéã»è¿œè·¡ããããšã§ãã·ã¹ãã å
šäœã®ãªãœãŒã¹äœ¿çšçãã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ãããã³ãªãã¬ãŒã·ã§ã³ã®ç¶æ
ã«ã€ããŠå¯èŠåããããšãã§ããŸãã aws.amazon.com AWS LambdaïŒã€ãã³ãçºçæã«ã³ãŒããå®è¡ïŒ| AWS AWS Lambda ã䜿çšããã°ããµãŒããŒã®ããããžã§ãã³ã°ã管çãªãã§ã³ãŒããå®è¡ã§ããŸãã課éã¯å®éã«äœ¿çšããã³ã³ãã¥ãŒãã£ã³ã°æéã«å¯ŸããŠã®ã¿çºçããã³ãŒããå®è¡ãããŠããªããšãã«ã¯æéãçºçããŸããã aws.amazon.com ã©ã¡ãã AWS ã®æäŸããããŒã«ã§ãã CloudWatch ã¯äž»ã«ãã°ã®èšé²ãšç£èŠãè¡ãããã®ããŒã«ã§ããè€æ°ã®æ©èœããããŸãããCLINICS ã§ã¯äž»ã« Logs, Metrics, Alarm ã䜿çšããŠããŸãã Logs ã¯ãã®åã®éãã䞻㫠AWS ã®ããŒã«ãçºè¡ãããã°ãåéã»æ€çŽ¢ã»é²èЧããæ©èœã§ãåé¡çºçæã® HTTP ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ã確èªããæãªã©ã«å©çšããŠããŸãã Metrics ã¯ãããããã¯ãïŒEC2 ãªãã€ã³ã¹ã¿ã³ã¹, RDS ãªã DB ã€ã³ã¹ã¿ã³ã¹ãªã©è£œåã®äžåäœïŒãÃãã¡ããªã¯ã¹çš®å¥ïŒCPU å©çšçãªã©ïŒããäžåäœãšããŠãçµ±èšæ
å ±ãå¯èŠåããããŒã«ã§ãã ãããã«éŸå€ãèšããè¶
ããå Žåã«ã¢ã©ãŒããçºè¡ããã®ã AlarmâŠãšããäœçœ®ä»ãã§ãã 察ã㊠Lambda ã¯ãããããç£èŠããŒã«ã§ã¯ãããŸããã宿å®è¡ããããã¯äœãã®ã€ãã³ãïŒS3 ã«äœãã¢ããããŒããããããªã©ïŒãããªã¬ãŒãšããŠãåŠçãè¡ãããŒã«ã§ããåŠçããçµæããããã«å¥ã®ããŒã«ãžé£æºïŒSlack éç¥ãªã©ã®å€éšé£æºãå«ãïŒãããããšãå¯èœã§ãã CLINICS ã§ã¯ãäžèšã¢ã©ãŒãéç¥ã®ã»ãã SessionManager çµç±ã§ã€ã³ã¹ã¿ã³ã¹ã« ssh ãã°ã€ã³ããæã®éç¥ããæéã®ãããã€ã³ããŒãã¿ã¹ã¯ãªã©ãçµäºããæã®éç¥ãªã©ã«ãå©çšããŠããŸãã New Relic ã¹ã¿ãã¯å
šäœãã¢ãã¿ãªã³ã°ããããã°ãæ¹å ç»é²ã¯ç¡æãã¯ã¬ãžããã«ãŒãã¯äžèŠã§ããNew Relic Oneãšã¯ã€ãã¯ã¹ã¿ãŒãã§ã€ã³ã¹ã¿ã³ããªãã¶ãŒãããªãã£ãæã«å
¥ããã°ãã€ã³ã¹ãã¥ã«ã¡ã³ããæ°ã¯ãªãã¯ã§å®è¡ã§ããããã«ãªããŸãã newrelic.co.jp New Relic ã¯ãCLINICS ã§ã¯ããã©ãŒãã³ã¹è©äŸ¡ããŒã«ãšããŠå©çšããŠããŸãã ã¡ã€ã³ãšãªãã®ã¯ APM(Application Performance Monitoring)ã§ãã¢ããªã±ãŒã·ã§ã³å
ã®ã©ã®åŠçã«ã©ãã ãæéãããã£ãããªã©ãé²èЧããããšãã§ããŸãã å»çæ©é¢ã¯æéã«ãã£ãŠèšºå¯ããŒã¹ã倧ããå€ããããã1 å 1 åã¯å°ãã®é
å»¶ã§ãã£ãŠããæ¥åãããŒã®ã³ã¢ãªéšåã«çµ¡ãã§ããå Žåãé
å»¶ãé¿ããŠããããšã¯ãããŸãã ãã®ãããªãããšã©ãŒã¯åºãªããã©ãã¬ã¹ãã³ã¹ãé
ãããšãããé£çµ¡ãåããæã®èª¿æ»ã»ã¡ã³ããã³ã¹ã«äž»ã«æŽ»èºããŠãããŸãã Sentry ã®ããã«ãšã©ãŒæ€ç¥ãè¡ãªã£ãããã§ããããŒã«èªäœã®å€æ©èœãããååŸã§ããæ
å ±ã®å€ããæ®µéããšãã£ãå°è±¡ã§ãã Firebase Crashlytics Firebase | Google's Mobile and Web App Development Platform Firebase ã¯ãããããããŒããŠãŒã¶ãŒã«äººæ°ã®ã¢ããªãã²ãŒã ãéçºã§ããããæ¯æŽãã Google ã®ã¢ãã€ã«ããã³ãŠã§ãã¢ããªéçºãã©ãããã©ãŒã ã§ãã firebase.google.com Firebase ããŸãâ倿©èœãªâããŒã«ã§ãããCLINICS ã§ã¯ç£èŠæ©èœãšã㊠Crashlytics ã䜿ã£ãŠããŸãã CLINICS ã§ã¯ãæ£è
ãããäºçŽã»ãªã³ã©ã€ã³èšºçãè¡ãããã®ã¢ããªã iOS / Android ã§å
¬éããŠãããå»çæ©é¢åãã® Web ã¢ããªã±ãŒã·ã§ã³åŽãšé£æºããŠåäœããŸãããã®ãã€ãã£ãã¢ããªã§çºçããã¯ã©ãã·ã¥ãéèšããŠããã®ã Crashlytics ã§ãã Android ã®å Žå㯠build.gradle ã«èšå®ã远èšããŠã¢ããªããã«ããiOS ã®å Žå㯠cocoapods ã§å€éšã©ã€ãã©ãªãšããŠã€ã³ã¹ããŒã«ããããšã§éèšãå¯èœã«ãªããŸããUnity ã¢ããªã«ã察å¿ããŠãããšã®ããšã§ãã ãã®ä»ãç£èŠã§ã¯ãªãã§ããã¢ããªãå©çšããŠãã端æ«ã OS ããŒãžã§ã³ãªã©ã®çµ±èšæ
å ±ã®åéãå¯èœã§ãã PagerDuty ã«ããç£èŠéçŽ PagerDutyïœã€ã³ã·ãã³ã管çãã©ãããã©ãŒã ïœPagerDutyæ ªåŒäŒç€Ÿ PagerDutyïŒãã€ãžã£ãŒãã¥ãŒãã£ïŒã¯ã·ã¹ãã ã®ã€ã³ã·ãã³ã察å¿ãäžå
åãããã©ãããã©ãŒã ã§ããDXæä»£ã«ããããªãã¬ãŒã·ã§ãã«ã»ã¬ãžãªãšã³ã¹ãé«ããé害察å¿ã«è²»ããæéã軜æžããããšã§ã貎éãªãšã³ãžãã¢ãªãœãŒã¹ãããžãã¹æ¡å€§ã«å
ãŠãããšãã§ããŸãã ja.pagerduty.com CLINICS ã§ã¯ãããŸã§ã«æããŠããããŒã«ã䜿ã£ãŠç£èŠãè¡ã£ãŠãããŸãããæšå¹Žãè€æ°ã®ç£èŠãœãŒã¹ããã®ã¢ã©ãŒããäžæ¬åãã¹ããã€ã³ã·ãã³ã管çãµãŒãã¹ PagerDuty ãå°å
¥ããŸããã å°å
¥åŸã¯ãå
šãŠã®ã¢ã©ãŒãããŒã«ã¯ã¢ã©ãŒããäžæŠ PagerDuty ã«éçŽããPagerDuty ãã Slack éç¥ãè¡ããšãã圢åŒã«ãªããŸããã ãŸããPagerDuty ãåºãã¢ã©ãŒãã¯ãæ
åœè
ã確èªããŠã¬ã¹ãã³ã¹ãè¿ãïŒacknowledgeïŒããšãè¡ããã«äžå®æéãéããå Žåãé»è©±ã SMS ã§ã®éç¥ãžå±éããŠããããã«èšå®ããããšãã§ããŸããããã«ãã£ãŠãã¯ãªãã£ã«ã«ãªãšã©ãŒã®èŠèœãšãã確å®ã«é²ããããã«ãªããŸããã ãŸãšã CLINICS ã§å©çšããŠããç£èŠããŒã«+α ã玹ä»ãããŠããã ããŸããã ãããã®ããŒã«ãé§äœ¿ããªããããŠãŒã¶ã®çæ§ã«å®å¿ããŠã䜿ãããã ãããããµãŒãã¹ã®å®å®çšŒåã«å°œåããŠããŸãã ã芧ããã ãããããšãããããŸããã
çæ§ããã«ã¡ã¯ã ãããã¯ãéçºå®€ ãšã³ãžãã¢ã®æ¿±äžã§ãã æ°åã³ãããŠã€ã«ã¹ææçãçåšãæ¯ãã£ãŠãããŸãããçæ§ããããéããã§ãããããå
æ¥ã®ç·æ¥äºæ
宣èšãåããŠãã¡ãã¬ãŒãå
šç€Ÿå¡ãååãªã¢ãŒãã§æ¥åã«åœãã£ãŠããŸãããªã³ã©ã€ã³å»çäºå
žãMEDLEYãã«ãã ã³ãããŠã€ã«ã¹é¢é£ã®ç¹é ãçµãŸããŠããŸãã®ã§ãã²ã芧ãã ããã ããŠå
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSãã®ãµãŒãã¹éå¶ã§äœ¿ãããŠããç£èŠããŒã«çŸ€ã«ã€ããŠçºè¡šããã®ã§ãã玹ä»ãããŠããã ããŸãã CLINICS ã®æŠèŠãšããµãŒãã¹ã«ãããç£èŠã®ç«ã¡äœçœ®ã«ã€ã㊠å
¬åŒããŒãž ã§ãã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ããšéæã£ãŠãã CLINICS ã§ããããã詳现ã«ã¯ãé»åã«ã«ãã·ã¹ãã ã»ãªã³ã©ã€ã³äºçŽã·ã¹ãã ãæäŸããŠããŸãããããäºçŽã»èšºçã»ã«ã«ãã® 3 ãããã¯ãã§å»ççŸå Žã®æ¥åãäžæã«åŒãåããããšãç®çãšãããµãŒãã¹ã CLINICS ã§ãã ãã®ãã¡ãé»åã«ã«ãã·ã¹ãã ã¯ãã æ¥å»æšæºã¬ã»ãããœãã ORCA ããšãã補åãå
å
ããåœ¢ã§æäŸããŠãããORCA èªäœã¯ç¬ç«ããç°å¢ã§åäœããŠããŸãã åœç¶ãªãããORCA èªäœã CLINICS ãšã¯ç¬ç«ãã 1 ãããã¯ãã§ãããããCLINICS åŽã«åé¡ããªããŠã ORCA ãµãŒããããã©ãŒãã³ã¹äœäžãäžå
·åãèµ·ãããŠããŸã£ãããããã㯠CLINICS ã® web ãµãŒããšã®éä¿¡ãããŸããããªããªãã±ãŒã¹ãèããããŸãã é»åã«ã«ãã·ã¹ãã ã¯å»çæ©é¢ã®èšºå¯ã»äŒèšãšãã£ãæ¥åžžæ¥åã®éèŠãªããŒããæ
ã£ãŠãããããã§é害ãçºçãããšæ¥åãæ¢ãŸã£ãŠããŸããŸãïŒææªãæ£è
ããããåŸ
ããããŠããŸãããšããããŸãïŒã ãã®ãããæ¥åã«å€§ããªåœ±é¿ãäžããç®æãäžå¿ã«ãè€æ°ã®ç£èŠããŒã«ã§ã¢ããªã±ãŒã·ã§ã³ã®åäœç¶æ³ããã§ãã¯ããŠããŸãã ç£èŠããŒã«ãããã ããããã¯å®éã« CLINICS ã§å©çšããŠããããŒã«ãç°¡æœã«ã玹ä»ããŠãããŸãã Sentry Application Performance Monitoring & Error Tracking Software Application performance monitoring for developers & software teams to see errors clearer, solve issues faster & continue learning continuously. sentry.io åŒç€Ÿã®ä»ãããã¯ãïŒã ãžã§ãã¡ãã¬ãŒ ããã ä»è·ã®ã»ãã ãïŒã§ãå©çšããŠããç£èŠããŒã«ã§ãã åºæ¬çã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äŸå€ãçºçãããšèªåã§ã¢ã©ãŒããæããŠãããŸãããã¢ããªã±ãŒã·ã§ã³åŽã§ catch ããŠããŸããã®ããäŸå€ã§ã¯ãªããéç¥ãããã€ãã³ãã«ã€ããŠãä»»æã«ã¢ã©ãŒãããããããšãå¯èœã§ãã CLINICS ã§ã¯äŸãã°ã¢ã«ãŠã³ã ID ãã¢ã¯ã»ã¹ãã API ãšã³ããã€ã³ãã»ãã©ã¡ãŒã¿ãªã©æž¡ããŠããšã©ãŒèª¿æ»ã«æŽ»çšããŠããŸãã Mackerel MackerelïŒãã«ã¬ã«ïŒ: å§ãããããŠå¥¥æ·±ããå¯èŠ³æž¬æ§ãã©ãããã©ãŒã Mackerel(ãã«ã¬ã«)ã¯èª°ã§ãç°¡åã«å§ãããã奥深ãå¯èŠ³æž¬æ§ãã©ãããã©ãŒã ãéçšãã€ãŒãžãŒã«ãããªãã¶ãŒãããªãã£ãé«ããæªç¥ã®åé¡ã«ç«ã¡åããéçºè
ã«åãäžããŸãããµãŒããŒç£èŠãMackerelã§ã¯ãããŠã¿ãŸãããïŒç¡æãã©ã³ã2é±éã®ãã©ã€ã¢ã«ããããŸãã mackerel.io GUI ã§ç°¡åã«ç£èŠèšå®ãå¯èœãªãµãŒãã¹ã§ãã åè·ã§äœ¿ã£ãŠããæã¯ GUI ã§ã§ãããšãããŸã§ããè§Šã£ãŠããªãã£ãã®ã§ãããèšå®ãã¡ã€ã«ãæè£œããã°ãèªäœã¹ã¯ãªããã®åºåããã§ãã¯ãããããã§ãã¯ã«å€±æããæäœãåŠçããããâŠãšãã£ãããã¥ã¢ã«ãªç£èŠãå¯èœã§ãã çŸåš CLINICS ã«ãããŠã¯ãORCA ã€ã³ã¹ã¿ã³ã¹ãããããç¬ç«ããŠåäœããŠããŸãããMackerel ã§ã¯ãã® ORCA ã€ã³ã¹ã¿ã³ã¹ãç£èŠããŠããŸãããŸãç£èŠããã ãã§ãªããåäœäžè¯ãèµ·ãããæã®åèµ·ååŠçãªã©ãæ
åœããŠããŸãã AWS CloudWatch & Lambda Amazon CloudWatchïŒãªãœãŒã¹ãšã¢ããªã±ãŒã·ã§ã³ã®ç£èŠãšç®¡çïŒ| AWS Amazon CloudWatch ã¯ãAWS ãªãœãŒã¹ãš AWS ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã®ã¢ãã¿ãªã³ã°ãµãŒãã¹ã§ããæ§ã
ãªã¡ããªã¯ã¹ããã°ãåéã»è¿œè·¡ããããšã§ãã·ã¹ãã å
šäœã®ãªãœãŒã¹äœ¿çšçãã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ãããã³ãªãã¬ãŒã·ã§ã³ã®ç¶æ
ã«ã€ããŠå¯èŠåããããšãã§ããŸãã aws.amazon.com AWS LambdaïŒã€ãã³ãçºçæã«ã³ãŒããå®è¡ïŒ| AWS AWS Lambda ã䜿çšããã°ããµãŒããŒã®ããããžã§ãã³ã°ã管çãªãã§ã³ãŒããå®è¡ã§ããŸãã課éã¯å®éã«äœ¿çšããã³ã³ãã¥ãŒãã£ã³ã°æéã«å¯ŸããŠã®ã¿çºçããã³ãŒããå®è¡ãããŠããªããšãã«ã¯æéãçºçããŸããã aws.amazon.com ã©ã¡ãã AWS ã®æäŸããããŒã«ã§ãã CloudWatch ã¯äž»ã«ãã°ã®èšé²ãšç£èŠãè¡ãããã®ããŒã«ã§ããè€æ°ã®æ©èœããããŸãããCLINICS ã§ã¯äž»ã« Logs, Metrics, Alarm ã䜿çšããŠããŸãã Logs ã¯ãã®åã®éãã䞻㫠AWS ã®ããŒã«ãçºè¡ãããã°ãåéã»æ€çŽ¢ã»é²èЧããæ©èœã§ãåé¡çºçæã® HTTP ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ã確èªããæãªã©ã«å©çšããŠããŸãã Metrics ã¯ãããããã¯ãïŒEC2 ãªãã€ã³ã¹ã¿ã³ã¹, RDS ãªã DB ã€ã³ã¹ã¿ã³ã¹ãªã©è£œåã®äžåäœïŒãÃãã¡ããªã¯ã¹çš®å¥ïŒCPU å©çšçãªã©ïŒããäžåäœãšããŠãçµ±èšæ
å ±ãå¯èŠåããããŒã«ã§ãã ãããã«éŸå€ãèšããè¶
ããå Žåã«ã¢ã©ãŒããçºè¡ããã®ã AlarmâŠãšããäœçœ®ä»ãã§ãã 察ã㊠Lambda ã¯ãããããç£èŠããŒã«ã§ã¯ãããŸããã宿å®è¡ããããã¯äœãã®ã€ãã³ãïŒS3 ã«äœãã¢ããããŒããããããªã©ïŒãããªã¬ãŒãšããŠãåŠçãè¡ãããŒã«ã§ããåŠçããçµæããããã«å¥ã®ããŒã«ãžé£æºïŒSlack éç¥ãªã©ã®å€éšé£æºãå«ãïŒãããããšãå¯èœã§ãã CLINICS ã§ã¯ãäžèšã¢ã©ãŒãéç¥ã®ã»ãã SessionManager çµç±ã§ã€ã³ã¹ã¿ã³ã¹ã« ssh ãã°ã€ã³ããæã®éç¥ããæéã®ãããã€ã³ããŒãã¿ã¹ã¯ãªã©ãçµäºããæã®éç¥ãªã©ã«ãå©çšããŠããŸãã New Relic ã¹ã¿ãã¯å
šäœãã¢ãã¿ãªã³ã°ããããã°ãæ¹å ç»é²ã¯ç¡æãã¯ã¬ãžããã«ãŒãã¯äžèŠã§ããNew Relic Oneãšã¯ã€ãã¯ã¹ã¿ãŒãã§ã€ã³ã¹ã¿ã³ããªãã¶ãŒãããªãã£ãæã«å
¥ããã°ãã€ã³ã¹ãã¥ã«ã¡ã³ããæ°ã¯ãªãã¯ã§å®è¡ã§ããããã«ãªããŸãã newrelic.co.jp New Relic ã¯ãCLINICS ã§ã¯ããã©ãŒãã³ã¹è©äŸ¡ããŒã«ãšããŠå©çšããŠããŸãã ã¡ã€ã³ãšãªãã®ã¯ APM(Application Performance Monitoring)ã§ãã¢ããªã±ãŒã·ã§ã³å
ã®ã©ã®åŠçã«ã©ãã ãæéãããã£ãããªã©ãé²èЧããããšãã§ããŸãã å»çæ©é¢ã¯æéã«ãã£ãŠèšºå¯ããŒã¹ã倧ããå€ããããã1 å 1 åã¯å°ãã®é
å»¶ã§ãã£ãŠããæ¥åãããŒã®ã³ã¢ãªéšåã«çµ¡ãã§ããå Žåãé
å»¶ãé¿ããŠããããšã¯ãããŸãã ãã®ãããªãããšã©ãŒã¯åºãªããã©ãã¬ã¹ãã³ã¹ãé
ãããšãããé£çµ¡ãåããæã®èª¿æ»ã»ã¡ã³ããã³ã¹ã«äž»ã«æŽ»èºããŠãããŸãã Sentry ã®ããã«ãšã©ãŒæ€ç¥ãè¡ãªã£ãããã§ããããŒã«èªäœã®å€æ©èœãããååŸã§ããæ
å ±ã®å€ããæ®µéããšãã£ãå°è±¡ã§ãã Firebase Crashlytics Firebase | Google's Mobile and Web App Development Platform Firebase ã¯ãããããããŒããŠãŒã¶ãŒã«äººæ°ã®ã¢ããªãã²ãŒã ãéçºã§ããããæ¯æŽãã Google ã®ã¢ãã€ã«ããã³ãŠã§ãã¢ããªéçºãã©ãããã©ãŒã ã§ãã firebase.google.com Firebase ããŸãâ倿©èœãªâããŒã«ã§ãããCLINICS ã§ã¯ç£èŠæ©èœãšã㊠Crashlytics ã䜿ã£ãŠããŸãã CLINICS ã§ã¯ãæ£è
ãããäºçŽã»ãªã³ã©ã€ã³èšºçãè¡ãããã®ã¢ããªã iOS / Android ã§å
¬éããŠãããå»çæ©é¢åãã® Web ã¢ããªã±ãŒã·ã§ã³åŽãšé£æºããŠåäœããŸãããã®ãã€ãã£ãã¢ããªã§çºçããã¯ã©ãã·ã¥ãéèšããŠããã®ã Crashlytics ã§ãã Android ã®å Žå㯠build.gradle ã«èšå®ã远èšããŠã¢ããªããã«ããiOS ã®å Žå㯠cocoapods ã§å€éšã©ã€ãã©ãªãšããŠã€ã³ã¹ããŒã«ããããšã§éèšãå¯èœã«ãªããŸããUnity ã¢ããªã«ã察å¿ããŠãããšã®ããšã§ãã ãã®ä»ãç£èŠã§ã¯ãªãã§ããã¢ããªãå©çšããŠãã端æ«ã OS ããŒãžã§ã³ãªã©ã®çµ±èšæ
å ±ã®åéãå¯èœã§ãã PagerDuty ã«ããç£èŠéçŽ PagerDutyïœã€ã³ã·ãã³ã管çãã©ãããã©ãŒã ïœPagerDutyæ ªåŒäŒç€Ÿ PagerDutyïŒãã€ãžã£ãŒãã¥ãŒãã£ïŒã¯ã·ã¹ãã ã®ã€ã³ã·ãã³ã察å¿ãäžå
åãããã©ãããã©ãŒã ã§ããDXæä»£ã«ããããªãã¬ãŒã·ã§ãã«ã»ã¬ãžãªãšã³ã¹ãé«ããé害察å¿ã«è²»ããæéã軜æžããããšã§ã貎éãªãšã³ãžãã¢ãªãœãŒã¹ãããžãã¹æ¡å€§ã«å
ãŠãããšãã§ããŸãã ja.pagerduty.com CLINICS ã§ã¯ãããŸã§ã«æããŠããããŒã«ã䜿ã£ãŠç£èŠãè¡ã£ãŠãããŸãããæšå¹Žãè€æ°ã®ç£èŠãœãŒã¹ããã®ã¢ã©ãŒããäžæ¬åãã¹ããã€ã³ã·ãã³ã管çãµãŒãã¹ PagerDuty ãå°å
¥ããŸããã å°å
¥åŸã¯ãå
šãŠã®ã¢ã©ãŒãããŒã«ã¯ã¢ã©ãŒããäžæŠ PagerDuty ã«éçŽããPagerDuty ãã Slack éç¥ãè¡ããšãã圢åŒã«ãªããŸããã ãŸããPagerDuty ãåºãã¢ã©ãŒãã¯ãæ
åœè
ã確èªããŠã¬ã¹ãã³ã¹ãè¿ãïŒacknowledgeïŒããšãè¡ããã«äžå®æéãéããå Žåãé»è©±ã SMS ã§ã®éç¥ãžå±éããŠããããã«èšå®ããããšãã§ããŸããããã«ãã£ãŠãã¯ãªãã£ã«ã«ãªãšã©ãŒã®èŠèœãšãã確å®ã«é²ããããã«ãªããŸããã ãŸãšã CLINICS ã§å©çšããŠããç£èŠããŒã«+α ã玹ä»ãããŠããã ããŸããã ãããã®ããŒã«ãé§äœ¿ããªããããŠãŒã¶ã®çæ§ã«å®å¿ããŠã䜿ãããã ãããããµãŒãã¹ã®å®å®çšŒåã«å°œåããŠããŸãã ã芧ããã ãããããšãããããŸããã
çæ§ããã«ã¡ã¯ã ãããã¯ãéçºå®€ ãšã³ãžãã¢ã®æ¿±äžã§ãã æ°åã³ãããŠã€ã«ã¹ææçãçåšãæ¯ãã£ãŠãããŸãããçæ§ããããéããã§ãããããå
æ¥ã®ç·æ¥äºæ
宣èšãåããŠãã¡ãã¬ãŒãå
šç€Ÿå¡ãååãªã¢ãŒãã§æ¥åã«åœãã£ãŠããŸãããªã³ã©ã€ã³å»çäºå
žãMEDLEYãã«ãã ã³ãããŠã€ã«ã¹é¢é£ã®ç¹é ãçµãŸããŠããŸãã®ã§ãã²ã芧ãã ããã ããŠå
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSãã®ãµãŒãã¹éå¶ã§äœ¿ãããŠããç£èŠããŒã«çŸ€ã«ã€ããŠçºè¡šããã®ã§ãã玹ä»ãããŠããã ããŸãã CLINICS ã®æŠèŠãšããµãŒãã¹ã«ãããç£èŠã®ç«ã¡äœçœ®ã«ã€ã㊠å
¬åŒããŒãž ã§ãã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ããšéæã£ãŠãã CLINICS ã§ããããã詳现ã«ã¯ãé»åã«ã«ãã·ã¹ãã ã»ãªã³ã©ã€ã³äºçŽã·ã¹ãã ãæäŸããŠããŸãããããäºçŽã»èšºçã»ã«ã«ãã® 3 ãããã¯ãã§å»ççŸå Žã®æ¥åãäžæã«åŒãåããããšãç®çãšãããµãŒãã¹ã CLINICS ã§ãã ãã®ãã¡ãé»åã«ã«ãã·ã¹ãã ã¯ãã æ¥å»æšæºã¬ã»ãããœãã ORCA ããšãã補åãå
å
ããåœ¢ã§æäŸããŠãããORCA èªäœã¯ç¬ç«ããç°å¢ã§åäœããŠããŸãã åœç¶ãªãããORCA èªäœã CLINICS ãšã¯ç¬ç«ãã 1 ãããã¯ãã§ãããããCLINICS åŽã«åé¡ããªããŠã ORCA ãµãŒããããã©ãŒãã³ã¹äœäžãäžå
·åãèµ·ãããŠããŸã£ãããããã㯠CLINICS ã® web ãµãŒããšã®éä¿¡ãããŸããããªããªãã±ãŒã¹ãèããããŸãã é»åã«ã«ãã·ã¹ãã ã¯å»çæ©é¢ã®èšºå¯ã»äŒèšãšãã£ãæ¥åžžæ¥åã®éèŠãªããŒããæ
ã£ãŠãããããã§é害ãçºçãããšæ¥åãæ¢ãŸã£ãŠããŸããŸãïŒææªãæ£è
ããããåŸ
ããããŠããŸãããšããããŸãïŒã ãã®ãããæ¥åã«å€§ããªåœ±é¿ãäžããç®æãäžå¿ã«ãè€æ°ã®ç£èŠããŒã«ã§ã¢ããªã±ãŒã·ã§ã³ã®åäœç¶æ³ããã§ãã¯ããŠããŸãã ç£èŠããŒã«ãããã ããããã¯å®éã« CLINICS ã§å©çšããŠããããŒã«ãç°¡æœã«ã玹ä»ããŠãããŸãã Sentry Application Performance Monitoring & Error Tracking Software Application performance monitoring for developers & software teams to see errors clearer, solve issues faster & continue learning continuously. sentry.io åŒç€Ÿã®ä»ãããã¯ãïŒã ãžã§ãã¡ãã¬ãŒ ããã ä»è·ã®ã»ãã ãïŒã§ãå©çšããŠããç£èŠããŒã«ã§ãã åºæ¬çã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äŸå€ãçºçãããšèªåã§ã¢ã©ãŒããæããŠãããŸãããã¢ããªã±ãŒã·ã§ã³åŽã§ catch ããŠããŸããã®ããäŸå€ã§ã¯ãªããéç¥ãããã€ãã³ãã«ã€ããŠãä»»æã«ã¢ã©ãŒãããããããšãå¯èœã§ãã CLINICS ã§ã¯äŸãã°ã¢ã«ãŠã³ã ID ãã¢ã¯ã»ã¹ãã API ãšã³ããã€ã³ãã»ãã©ã¡ãŒã¿ãªã©æž¡ããŠããšã©ãŒèª¿æ»ã«æŽ»çšããŠããŸãã Mackerel MackerelïŒãã«ã¬ã«ïŒ: å§ãããããŠå¥¥æ·±ããå¯èŠ³æž¬æ§ãã©ãããã©ãŒã Mackerel(ãã«ã¬ã«)ã¯èª°ã§ãç°¡åã«å§ãããã奥深ãå¯èŠ³æž¬æ§ãã©ãããã©ãŒã ãéçšãã€ãŒãžãŒã«ãããªãã¶ãŒãããªãã£ãé«ããæªç¥ã®åé¡ã«ç«ã¡åããéçºè
ã«åãäžããŸãããµãŒããŒç£èŠãMackerelã§ã¯ãããŠã¿ãŸãããïŒç¡æãã©ã³ã2é±éã®ãã©ã€ã¢ã«ããããŸãã mackerel.io GUI ã§ç°¡åã«ç£èŠèšå®ãå¯èœãªãµãŒãã¹ã§ãã åè·ã§äœ¿ã£ãŠããæã¯ GUI ã§ã§ãããšãããŸã§ããè§Šã£ãŠããªãã£ãã®ã§ãããèšå®ãã¡ã€ã«ãæè£œããã°ãèªäœã¹ã¯ãªããã®åºåããã§ãã¯ãããããã§ãã¯ã«å€±æããæäœãåŠçããããâŠãšãã£ãããã¥ã¢ã«ãªç£èŠãå¯èœã§ãã çŸåš CLINICS ã«ãããŠã¯ãORCA ã€ã³ã¹ã¿ã³ã¹ãããããç¬ç«ããŠåäœããŠããŸãããMackerel ã§ã¯ãã® ORCA ã€ã³ã¹ã¿ã³ã¹ãç£èŠããŠããŸãããŸãç£èŠããã ãã§ãªããåäœäžè¯ãèµ·ãããæã®åèµ·ååŠçãªã©ãæ
åœããŠããŸãã AWS CloudWatch & Lambda Amazon CloudWatchïŒãªãœãŒã¹ãšã¢ããªã±ãŒã·ã§ã³ã®ç£èŠãšç®¡çïŒ| AWS Amazon CloudWatch ã¯ãAWS ãªãœãŒã¹ãš AWS ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã®ã¢ãã¿ãªã³ã°ãµãŒãã¹ã§ããæ§ã
ãªã¡ããªã¯ã¹ããã°ãåéã»è¿œè·¡ããããšã§ãã·ã¹ãã å
šäœã®ãªãœãŒã¹äœ¿çšçãã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ãããã³ãªãã¬ãŒã·ã§ã³ã®ç¶æ
ã«ã€ããŠå¯èŠåããããšãã§ããŸãã aws.amazon.com AWS LambdaïŒã€ãã³ãçºçæã«ã³ãŒããå®è¡ïŒ| AWS AWS Lambda ã䜿çšããã°ããµãŒããŒã®ããããžã§ãã³ã°ã管çãªãã§ã³ãŒããå®è¡ã§ããŸãã課éã¯å®éã«äœ¿çšããã³ã³ãã¥ãŒãã£ã³ã°æéã«å¯ŸããŠã®ã¿çºçããã³ãŒããå®è¡ãããŠããªããšãã«ã¯æéãçºçããŸããã aws.amazon.com ã©ã¡ãã AWS ã®æäŸããããŒã«ã§ãã CloudWatch ã¯äž»ã«ãã°ã®èšé²ãšç£èŠãè¡ãããã®ããŒã«ã§ããè€æ°ã®æ©èœããããŸãããCLINICS ã§ã¯äž»ã« Logs, Metrics, Alarm ã䜿çšããŠããŸãã Logs ã¯ãã®åã®éãã䞻㫠AWS ã®ããŒã«ãçºè¡ãããã°ãåéã»æ€çŽ¢ã»é²èЧããæ©èœã§ãåé¡çºçæã® HTTP ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ã確èªããæãªã©ã«å©çšããŠããŸãã Metrics ã¯ãããããã¯ãïŒEC2 ãªãã€ã³ã¹ã¿ã³ã¹, RDS ãªã DB ã€ã³ã¹ã¿ã³ã¹ãªã©è£œåã®äžåäœïŒãÃãã¡ããªã¯ã¹çš®å¥ïŒCPU å©çšçãªã©ïŒããäžåäœãšããŠãçµ±èšæ
å ±ãå¯èŠåããããŒã«ã§ãã ãããã«éŸå€ãèšããè¶
ããå Žåã«ã¢ã©ãŒããçºè¡ããã®ã AlarmâŠãšããäœçœ®ä»ãã§ãã 察ã㊠Lambda ã¯ãããããç£èŠããŒã«ã§ã¯ãããŸããã宿å®è¡ããããã¯äœãã®ã€ãã³ãïŒS3 ã«äœãã¢ããããŒããããããªã©ïŒãããªã¬ãŒãšããŠãåŠçãè¡ãããŒã«ã§ããåŠçããçµæããããã«å¥ã®ããŒã«ãžé£æºïŒSlack éç¥ãªã©ã®å€éšé£æºãå«ãïŒãããããšãå¯èœã§ãã CLINICS ã§ã¯ãäžèšã¢ã©ãŒãéç¥ã®ã»ãã SessionManager çµç±ã§ã€ã³ã¹ã¿ã³ã¹ã« ssh ãã°ã€ã³ããæã®éç¥ããæéã®ãããã€ã³ããŒãã¿ã¹ã¯ãªã©ãçµäºããæã®éç¥ãªã©ã«ãå©çšããŠããŸãã New Relic ã¹ã¿ãã¯å
šäœãã¢ãã¿ãªã³ã°ããããã°ãæ¹å ç»é²ã¯ç¡æãã¯ã¬ãžããã«ãŒãã¯äžèŠã§ããNew Relic Oneãšã¯ã€ãã¯ã¹ã¿ãŒãã§ã€ã³ã¹ã¿ã³ããªãã¶ãŒãããªãã£ãæã«å
¥ããã°ãã€ã³ã¹ãã¥ã«ã¡ã³ããæ°ã¯ãªãã¯ã§å®è¡ã§ããããã«ãªããŸãã newrelic.co.jp New Relic ã¯ãCLINICS ã§ã¯ããã©ãŒãã³ã¹è©äŸ¡ããŒã«ãšããŠå©çšããŠããŸãã ã¡ã€ã³ãšãªãã®ã¯ APM(Application Performance Monitoring)ã§ãã¢ããªã±ãŒã·ã§ã³å
ã®ã©ã®åŠçã«ã©ãã ãæéãããã£ãããªã©ãé²èЧããããšãã§ããŸãã å»çæ©é¢ã¯æéã«ãã£ãŠèšºå¯ããŒã¹ã倧ããå€ããããã1 å 1 åã¯å°ãã®é
å»¶ã§ãã£ãŠããæ¥åãããŒã®ã³ã¢ãªéšåã«çµ¡ãã§ããå Žåãé
å»¶ãé¿ããŠããããšã¯ãããŸãã ãã®ãããªãããšã©ãŒã¯åºãªããã©ãã¬ã¹ãã³ã¹ãé
ãããšãããé£çµ¡ãåããæã®èª¿æ»ã»ã¡ã³ããã³ã¹ã«äž»ã«æŽ»èºããŠãããŸãã Sentry ã®ããã«ãšã©ãŒæ€ç¥ãè¡ãªã£ãããã§ããããŒã«èªäœã®å€æ©èœãããååŸã§ããæ
å ±ã®å€ããæ®µéããšãã£ãå°è±¡ã§ãã Firebase Crashlytics Firebase | Google's Mobile and Web App Development Platform Firebase ã¯ãããããããŒããŠãŒã¶ãŒã«äººæ°ã®ã¢ããªãã²ãŒã ãéçºã§ããããæ¯æŽãã Google ã®ã¢ãã€ã«ããã³ãŠã§ãã¢ããªéçºãã©ãããã©ãŒã ã§ãã firebase.google.com Firebase ããŸãâ倿©èœãªâããŒã«ã§ãããCLINICS ã§ã¯ç£èŠæ©èœãšã㊠Crashlytics ã䜿ã£ãŠããŸãã CLINICS ã§ã¯ãæ£è
ãããäºçŽã»ãªã³ã©ã€ã³èšºçãè¡ãããã®ã¢ããªã iOS / Android ã§å
¬éããŠãããå»çæ©é¢åãã® Web ã¢ããªã±ãŒã·ã§ã³åŽãšé£æºããŠåäœããŸãããã®ãã€ãã£ãã¢ããªã§çºçããã¯ã©ãã·ã¥ãéèšããŠããã®ã Crashlytics ã§ãã Android ã®å Žå㯠build.gradle ã«èšå®ã远èšããŠã¢ããªããã«ããiOS ã®å Žå㯠cocoapods ã§å€éšã©ã€ãã©ãªãšããŠã€ã³ã¹ããŒã«ããããšã§éèšãå¯èœã«ãªããŸããUnity ã¢ããªã«ã察å¿ããŠãããšã®ããšã§ãã ãã®ä»ãç£èŠã§ã¯ãªãã§ããã¢ããªãå©çšããŠãã端æ«ã OS ããŒãžã§ã³ãªã©ã®çµ±èšæ
å ±ã®åéãå¯èœã§ãã PagerDuty ã«ããç£èŠéçŽ PagerDutyïœã€ã³ã·ãã³ã管çãã©ãããã©ãŒã ïœPagerDutyæ ªåŒäŒç€Ÿ PagerDutyïŒãã€ãžã£ãŒãã¥ãŒãã£ïŒã¯ã·ã¹ãã ã®ã€ã³ã·ãã³ã察å¿ãäžå
åãããã©ãããã©ãŒã ã§ããDXæä»£ã«ããããªãã¬ãŒã·ã§ãã«ã»ã¬ãžãªãšã³ã¹ãé«ããé害察å¿ã«è²»ããæéã軜æžããããšã§ã貎éãªãšã³ãžãã¢ãªãœãŒã¹ãããžãã¹æ¡å€§ã«å
ãŠãããšãã§ããŸãã ja.pagerduty.com CLINICS ã§ã¯ãããŸã§ã«æããŠããããŒã«ã䜿ã£ãŠç£èŠãè¡ã£ãŠãããŸãããæšå¹Žãè€æ°ã®ç£èŠãœãŒã¹ããã®ã¢ã©ãŒããäžæ¬åãã¹ããã€ã³ã·ãã³ã管çãµãŒãã¹ PagerDuty ãå°å
¥ããŸããã å°å
¥åŸã¯ãå
šãŠã®ã¢ã©ãŒãããŒã«ã¯ã¢ã©ãŒããäžæŠ PagerDuty ã«éçŽããPagerDuty ãã Slack éç¥ãè¡ããšãã圢åŒã«ãªããŸããã ãŸããPagerDuty ãåºãã¢ã©ãŒãã¯ãæ
åœè
ã確èªããŠã¬ã¹ãã³ã¹ãè¿ãïŒacknowledgeïŒããšãè¡ããã«äžå®æéãéããå Žåãé»è©±ã SMS ã§ã®éç¥ãžå±éããŠããããã«èšå®ããããšãã§ããŸããããã«ãã£ãŠãã¯ãªãã£ã«ã«ãªãšã©ãŒã®èŠèœãšãã確å®ã«é²ããããã«ãªããŸããã ãŸãšã CLINICS ã§å©çšããŠããç£èŠããŒã«+α ã玹ä»ãããŠããã ããŸããã ãããã®ããŒã«ãé§äœ¿ããªããããŠãŒã¶ã®çæ§ã«å®å¿ããŠã䜿ãããã ãããããµãŒãã¹ã®å®å®çšŒåã«å°œåããŠããŸãã ã芧ããã ãããããšãããããŸããã
çæ§ããã«ã¡ã¯ã ãããã¯ãéçºå®€ ãšã³ãžãã¢ã®æ¿±äžã§ãã æ°åã³ãããŠã€ã«ã¹ææçãçåšãæ¯ãã£ãŠãããŸãããçæ§ããããéããã§ãããããå
æ¥ã®ç·æ¥äºæ
宣èšãåããŠãã¡ãã¬ãŒãå
šç€Ÿå¡ãååãªã¢ãŒãã§æ¥åã«åœãã£ãŠããŸãããªã³ã©ã€ã³å»çäºå
žãMEDLEYãã«ãã ã³ãããŠã€ã«ã¹é¢é£ã®ç¹é ãçµãŸããŠããŸãã®ã§ãã²ã芧ãã ããã ããŠå
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSãã®ãµãŒãã¹éå¶ã§äœ¿ãããŠããç£èŠããŒã«çŸ€ã«ã€ããŠçºè¡šããã®ã§ãã玹ä»ãããŠããã ããŸãã CLINICS ã®æŠèŠãšããµãŒãã¹ã«ãããç£èŠã®ç«ã¡äœçœ®ã«ã€ã㊠å
¬åŒããŒãž ã§ãã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ããšéæã£ãŠãã CLINICS ã§ããããã詳现ã«ã¯ãé»åã«ã«ãã·ã¹ãã ã»ãªã³ã©ã€ã³äºçŽã·ã¹ãã ãæäŸããŠããŸãããããäºçŽã»èšºçã»ã«ã«ãã® 3 ãããã¯ãã§å»ççŸå Žã®æ¥åãäžæã«åŒãåããããšãç®çãšãããµãŒãã¹ã CLINICS ã§ãã ãã®ãã¡ãé»åã«ã«ãã·ã¹ãã ã¯ãã æ¥å»æšæºã¬ã»ãããœãã ORCA ããšãã補åãå
å
ããåœ¢ã§æäŸããŠãããORCA èªäœã¯ç¬ç«ããç°å¢ã§åäœããŠããŸãã åœç¶ãªãããORCA èªäœã CLINICS ãšã¯ç¬ç«ãã 1 ãããã¯ãã§ãããããCLINICS åŽã«åé¡ããªããŠã ORCA ãµãŒããããã©ãŒãã³ã¹äœäžãäžå
·åãèµ·ãããŠããŸã£ãããããã㯠CLINICS ã® web ãµãŒããšã®éä¿¡ãããŸããããªããªãã±ãŒã¹ãèããããŸãã é»åã«ã«ãã·ã¹ãã ã¯å»çæ©é¢ã®èšºå¯ã»äŒèšãšãã£ãæ¥åžžæ¥åã®éèŠãªããŒããæ
ã£ãŠãããããã§é害ãçºçãããšæ¥åãæ¢ãŸã£ãŠããŸããŸãïŒææªãæ£è
ããããåŸ
ããããŠããŸãããšããããŸãïŒã ãã®ãããæ¥åã«å€§ããªåœ±é¿ãäžããç®æãäžå¿ã«ãè€æ°ã®ç£èŠããŒã«ã§ã¢ããªã±ãŒã·ã§ã³ã®åäœç¶æ³ããã§ãã¯ããŠããŸãã ç£èŠããŒã«ãããã ããããã¯å®éã« CLINICS ã§å©çšããŠããããŒã«ãç°¡æœã«ã玹ä»ããŠãããŸãã Sentry Application Performance Monitoring & Error Tracking Software Application performance monitoring for developers & software teams to see errors clearer, solve issues faster & continue learning continuously. sentry.io åŒç€Ÿã®ä»ãããã¯ãïŒã ãžã§ãã¡ãã¬ãŒ ããã ä»è·ã®ã»ãã ãïŒã§ãå©çšããŠããç£èŠããŒã«ã§ãã åºæ¬çã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äŸå€ãçºçãããšèªåã§ã¢ã©ãŒããæããŠãããŸãããã¢ããªã±ãŒã·ã§ã³åŽã§ catch ããŠããŸããã®ããäŸå€ã§ã¯ãªããéç¥ãããã€ãã³ãã«ã€ããŠãä»»æã«ã¢ã©ãŒãããããããšãå¯èœã§ãã CLINICS ã§ã¯äŸãã°ã¢ã«ãŠã³ã ID ãã¢ã¯ã»ã¹ãã API ãšã³ããã€ã³ãã»ãã©ã¡ãŒã¿ãªã©æž¡ããŠããšã©ãŒèª¿æ»ã«æŽ»çšããŠããŸãã Mackerel MackerelïŒãã«ã¬ã«ïŒ: å§ãããããŠå¥¥æ·±ããå¯èŠ³æž¬æ§ãã©ãããã©ãŒã Mackerel(ãã«ã¬ã«)ã¯èª°ã§ãç°¡åã«å§ãããã奥深ãå¯èŠ³æž¬æ§ãã©ãããã©ãŒã ãéçšãã€ãŒãžãŒã«ãããªãã¶ãŒãããªãã£ãé«ããæªç¥ã®åé¡ã«ç«ã¡åããéçºè
ã«åãäžããŸãããµãŒããŒç£èŠãMackerelã§ã¯ãããŠã¿ãŸãããïŒç¡æãã©ã³ã2é±éã®ãã©ã€ã¢ã«ããããŸãã mackerel.io GUI ã§ç°¡åã«ç£èŠèšå®ãå¯èœãªãµãŒãã¹ã§ãã åè·ã§äœ¿ã£ãŠããæã¯ GUI ã§ã§ãããšãããŸã§ããè§Šã£ãŠããªãã£ãã®ã§ãããèšå®ãã¡ã€ã«ãæè£œããã°ãèªäœã¹ã¯ãªããã®åºåããã§ãã¯ãããããã§ãã¯ã«å€±æããæäœãåŠçããããâŠãšãã£ãããã¥ã¢ã«ãªç£èŠãå¯èœã§ãã çŸåš CLINICS ã«ãããŠã¯ãORCA ã€ã³ã¹ã¿ã³ã¹ãããããç¬ç«ããŠåäœããŠããŸãããMackerel ã§ã¯ãã® ORCA ã€ã³ã¹ã¿ã³ã¹ãç£èŠããŠããŸãããŸãç£èŠããã ãã§ãªããåäœäžè¯ãèµ·ãããæã®åèµ·ååŠçãªã©ãæ
åœããŠããŸãã AWS CloudWatch & Lambda Amazon CloudWatchïŒãªãœãŒã¹ãšã¢ããªã±ãŒã·ã§ã³ã®ç£èŠãšç®¡çïŒ| AWS Amazon CloudWatch ã¯ãAWS ãªãœãŒã¹ãš AWS ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã®ã¢ãã¿ãªã³ã°ãµãŒãã¹ã§ããæ§ã
ãªã¡ããªã¯ã¹ããã°ãåéã»è¿œè·¡ããããšã§ãã·ã¹ãã å
šäœã®ãªãœãŒã¹äœ¿çšçãã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ãããã³ãªãã¬ãŒã·ã§ã³ã®ç¶æ
ã«ã€ããŠå¯èŠåããããšãã§ããŸãã aws.amazon.com AWS LambdaïŒã€ãã³ãçºçæã«ã³ãŒããå®è¡ïŒ| AWS AWS Lambda ã䜿çšããã°ããµãŒããŒã®ããããžã§ãã³ã°ã管çãªãã§ã³ãŒããå®è¡ã§ããŸãã課éã¯å®éã«äœ¿çšããã³ã³ãã¥ãŒãã£ã³ã°æéã«å¯ŸããŠã®ã¿çºçããã³ãŒããå®è¡ãããŠããªããšãã«ã¯æéãçºçããŸããã aws.amazon.com ã©ã¡ãã AWS ã®æäŸããããŒã«ã§ãã CloudWatch ã¯äž»ã«ãã°ã®èšé²ãšç£èŠãè¡ãããã®ããŒã«ã§ããè€æ°ã®æ©èœããããŸãããCLINICS ã§ã¯äž»ã« Logs, Metrics, Alarm ã䜿çšããŠããŸãã Logs ã¯ãã®åã®éãã䞻㫠AWS ã®ããŒã«ãçºè¡ãããã°ãåéã»æ€çŽ¢ã»é²èЧããæ©èœã§ãåé¡çºçæã® HTTP ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ã確èªããæãªã©ã«å©çšããŠããŸãã Metrics ã¯ãããããã¯ãïŒEC2 ãªãã€ã³ã¹ã¿ã³ã¹, RDS ãªã DB ã€ã³ã¹ã¿ã³ã¹ãªã©è£œåã®äžåäœïŒãÃãã¡ããªã¯ã¹çš®å¥ïŒCPU å©çšçãªã©ïŒããäžåäœãšããŠãçµ±èšæ
å ±ãå¯èŠåããããŒã«ã§ãã ãããã«éŸå€ãèšããè¶
ããå Žåã«ã¢ã©ãŒããçºè¡ããã®ã AlarmâŠãšããäœçœ®ä»ãã§ãã 察ã㊠Lambda ã¯ãããããç£èŠããŒã«ã§ã¯ãããŸããã宿å®è¡ããããã¯äœãã®ã€ãã³ãïŒS3 ã«äœãã¢ããããŒããããããªã©ïŒãããªã¬ãŒãšããŠãåŠçãè¡ãããŒã«ã§ããåŠçããçµæããããã«å¥ã®ããŒã«ãžé£æºïŒSlack éç¥ãªã©ã®å€éšé£æºãå«ãïŒãããããšãå¯èœã§ãã CLINICS ã§ã¯ãäžèšã¢ã©ãŒãéç¥ã®ã»ãã SessionManager çµç±ã§ã€ã³ã¹ã¿ã³ã¹ã« ssh ãã°ã€ã³ããæã®éç¥ããæéã®ãããã€ã³ããŒãã¿ã¹ã¯ãªã©ãçµäºããæã®éç¥ãªã©ã«ãå©çšããŠããŸãã New Relic ã¹ã¿ãã¯å
šäœãã¢ãã¿ãªã³ã°ããããã°ãæ¹å ç»é²ã¯ç¡æãã¯ã¬ãžããã«ãŒãã¯äžèŠã§ããNew Relic Oneãšã¯ã€ãã¯ã¹ã¿ãŒãã§ã€ã³ã¹ã¿ã³ããªãã¶ãŒãããªãã£ãæã«å
¥ããã°ãã€ã³ã¹ãã¥ã«ã¡ã³ããæ°ã¯ãªãã¯ã§å®è¡ã§ããããã«ãªããŸãã newrelic.co.jp New Relic ã¯ãCLINICS ã§ã¯ããã©ãŒãã³ã¹è©äŸ¡ããŒã«ãšããŠå©çšããŠããŸãã ã¡ã€ã³ãšãªãã®ã¯ APM(Application Performance Monitoring)ã§ãã¢ããªã±ãŒã·ã§ã³å
ã®ã©ã®åŠçã«ã©ãã ãæéãããã£ãããªã©ãé²èЧããããšãã§ããŸãã å»çæ©é¢ã¯æéã«ãã£ãŠèšºå¯ããŒã¹ã倧ããå€ããããã1 å 1 åã¯å°ãã®é
å»¶ã§ãã£ãŠããæ¥åãããŒã®ã³ã¢ãªéšåã«çµ¡ãã§ããå Žåãé
å»¶ãé¿ããŠããããšã¯ãããŸãã ãã®ãããªãããšã©ãŒã¯åºãªããã©ãã¬ã¹ãã³ã¹ãé
ãããšãããé£çµ¡ãåããæã®èª¿æ»ã»ã¡ã³ããã³ã¹ã«äž»ã«æŽ»èºããŠãããŸãã Sentry ã®ããã«ãšã©ãŒæ€ç¥ãè¡ãªã£ãããã§ããããŒã«èªäœã®å€æ©èœãããååŸã§ããæ
å ±ã®å€ããæ®µéããšãã£ãå°è±¡ã§ãã Firebase Crashlytics Firebase | Google's Mobile and Web App Development Platform Firebase ã¯ãããããããŒããŠãŒã¶ãŒã«äººæ°ã®ã¢ããªãã²ãŒã ãéçºã§ããããæ¯æŽãã Google ã®ã¢ãã€ã«ããã³ãŠã§ãã¢ããªéçºãã©ãããã©ãŒã ã§ãã firebase.google.com Firebase ããŸãâ倿©èœãªâããŒã«ã§ãããCLINICS ã§ã¯ç£èŠæ©èœãšã㊠Crashlytics ã䜿ã£ãŠããŸãã CLINICS ã§ã¯ãæ£è
ãããäºçŽã»ãªã³ã©ã€ã³èšºçãè¡ãããã®ã¢ããªã iOS / Android ã§å
¬éããŠãããå»çæ©é¢åãã® Web ã¢ããªã±ãŒã·ã§ã³åŽãšé£æºããŠåäœããŸãããã®ãã€ãã£ãã¢ããªã§çºçããã¯ã©ãã·ã¥ãéèšããŠããã®ã Crashlytics ã§ãã Android ã®å Žå㯠build.gradle ã«èšå®ã远èšããŠã¢ããªããã«ããiOS ã®å Žå㯠cocoapods ã§å€éšã©ã€ãã©ãªãšããŠã€ã³ã¹ããŒã«ããããšã§éèšãå¯èœã«ãªããŸããUnity ã¢ããªã«ã察å¿ããŠãããšã®ããšã§ãã ãã®ä»ãç£èŠã§ã¯ãªãã§ããã¢ããªãå©çšããŠãã端æ«ã OS ããŒãžã§ã³ãªã©ã®çµ±èšæ
å ±ã®åéãå¯èœã§ãã PagerDuty ã«ããç£èŠéçŽ PagerDutyïœã€ã³ã·ãã³ã管çãã©ãããã©ãŒã ïœPagerDutyæ ªåŒäŒç€Ÿ PagerDutyïŒãã€ãžã£ãŒãã¥ãŒãã£ïŒã¯ã·ã¹ãã ã®ã€ã³ã·ãã³ã察å¿ãäžå
åãããã©ãããã©ãŒã ã§ããDXæä»£ã«ããããªãã¬ãŒã·ã§ãã«ã»ã¬ãžãªãšã³ã¹ãé«ããé害察å¿ã«è²»ããæéã軜æžããããšã§ã貎éãªãšã³ãžãã¢ãªãœãŒã¹ãããžãã¹æ¡å€§ã«å
ãŠãããšãã§ããŸãã ja.pagerduty.com CLINICS ã§ã¯ãããŸã§ã«æããŠããããŒã«ã䜿ã£ãŠç£èŠãè¡ã£ãŠãããŸãããæšå¹Žãè€æ°ã®ç£èŠãœãŒã¹ããã®ã¢ã©ãŒããäžæ¬åãã¹ããã€ã³ã·ãã³ã管çãµãŒãã¹ PagerDuty ãå°å
¥ããŸããã å°å
¥åŸã¯ãå
šãŠã®ã¢ã©ãŒãããŒã«ã¯ã¢ã©ãŒããäžæŠ PagerDuty ã«éçŽããPagerDuty ãã Slack éç¥ãè¡ããšãã圢åŒã«ãªããŸããã ãŸããPagerDuty ãåºãã¢ã©ãŒãã¯ãæ
åœè
ã確èªããŠã¬ã¹ãã³ã¹ãè¿ãïŒacknowledgeïŒããšãè¡ããã«äžå®æéãéããå Žåãé»è©±ã SMS ã§ã®éç¥ãžå±éããŠããããã«èšå®ããããšãã§ããŸããããã«ãã£ãŠãã¯ãªãã£ã«ã«ãªãšã©ãŒã®èŠèœãšãã確å®ã«é²ããããã«ãªããŸããã ãŸãšã CLINICS ã§å©çšããŠããç£èŠããŒã«+α ã玹ä»ãããŠããã ããŸããã ãããã®ããŒã«ãé§äœ¿ããªããããŠãŒã¶ã®çæ§ã«å®å¿ããŠã䜿ãããã ãããããµãŒãã¹ã®å®å®çšŒåã«å°œåããŠããŸãã ã芧ããã ãããããšãããããŸããã
çæ§ããã«ã¡ã¯ã ãããã¯ãéçºå®€ ãšã³ãžãã¢ã®æ¿±äžã§ãã æ°åã³ãããŠã€ã«ã¹ææçãçåšãæ¯ãã£ãŠãããŸãããçæ§ããããéããã§ãããããå
æ¥ã®ç·æ¥äºæ
宣èšãåããŠãã¡ãã¬ãŒãå
šç€Ÿå¡ãååãªã¢ãŒãã§æ¥åã«åœãã£ãŠããŸãããªã³ã©ã€ã³å»çäºå
žãMEDLEYãã«ãã ã³ãããŠã€ã«ã¹é¢é£ã®ç¹é ãçµãŸããŠããŸãã®ã§ãã²ã芧ãã ããã ããŠå
æ¥ã瀟å
ååŒ·äŒ TechLunch ã«ãŠãåŒç€Ÿã®æäŸããã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ãCLINICSãã®ãµãŒãã¹éå¶ã§äœ¿ãããŠããç£èŠããŒã«çŸ€ã«ã€ããŠçºè¡šããã®ã§ãã玹ä»ãããŠããã ããŸãã CLINICS ã®æŠèŠãšããµãŒãã¹ã«ãããç£èŠã®ç«ã¡äœçœ®ã«ã€ã㊠å
¬åŒããŒãž ã§ãã¯ã©ãŠãèšºçæ¯æŽã·ã¹ãã ããšéæã£ãŠãã CLINICS ã§ããããã詳现ã«ã¯ãé»åã«ã«ãã·ã¹ãã ã»ãªã³ã©ã€ã³äºçŽã·ã¹ãã ãæäŸããŠããŸãããããäºçŽã»èšºçã»ã«ã«ãã® 3 ãããã¯ãã§å»ççŸå Žã®æ¥åãäžæã«åŒãåããããšãç®çãšãããµãŒãã¹ã CLINICS ã§ãã ãã®ãã¡ãé»åã«ã«ãã·ã¹ãã ã¯ãã æ¥å»æšæºã¬ã»ãããœãã ORCA ããšãã補åãå
å
ããåœ¢ã§æäŸããŠãããORCA èªäœã¯ç¬ç«ããç°å¢ã§åäœããŠããŸãã åœç¶ãªãããORCA èªäœã CLINICS ãšã¯ç¬ç«ãã 1 ãããã¯ãã§ãããããCLINICS åŽã«åé¡ããªããŠã ORCA ãµãŒããããã©ãŒãã³ã¹äœäžãäžå
·åãèµ·ãããŠããŸã£ãããããã㯠CLINICS ã® web ãµãŒããšã®éä¿¡ãããŸããããªããªãã±ãŒã¹ãèããããŸãã é»åã«ã«ãã·ã¹ãã ã¯å»çæ©é¢ã®èšºå¯ã»äŒèšãšãã£ãæ¥åžžæ¥åã®éèŠãªããŒããæ
ã£ãŠãããããã§é害ãçºçãããšæ¥åãæ¢ãŸã£ãŠããŸããŸãïŒææªãæ£è
ããããåŸ
ããããŠããŸãããšããããŸãïŒã ãã®ãããæ¥åã«å€§ããªåœ±é¿ãäžããç®æãäžå¿ã«ãè€æ°ã®ç£èŠããŒã«ã§ã¢ããªã±ãŒã·ã§ã³ã®åäœç¶æ³ããã§ãã¯ããŠããŸãã ç£èŠããŒã«ãããã ããããã¯å®éã« CLINICS ã§å©çšããŠããããŒã«ãç°¡æœã«ã玹ä»ããŠãããŸãã Sentry Application Performance Monitoring & Error Tracking Software Application performance monitoring for developers & software teams to see errors clearer, solve issues faster & continue learning continuously. sentry.io åŒç€Ÿã®ä»ãããã¯ãïŒã ãžã§ãã¡ãã¬ãŒ ããã ä»è·ã®ã»ãã ãïŒã§ãå©çšããŠããç£èŠããŒã«ã§ãã åºæ¬çã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äŸå€ãçºçãããšèªåã§ã¢ã©ãŒããæããŠãããŸãããã¢ããªã±ãŒã·ã§ã³åŽã§ catch ããŠããŸããã®ããäŸå€ã§ã¯ãªããéç¥ãããã€ãã³ãã«ã€ããŠãä»»æã«ã¢ã©ãŒãããããããšãå¯èœã§ãã CLINICS ã§ã¯äŸãã°ã¢ã«ãŠã³ã ID ãã¢ã¯ã»ã¹ãã API ãšã³ããã€ã³ãã»ãã©ã¡ãŒã¿ãªã©æž¡ããŠããšã©ãŒèª¿æ»ã«æŽ»çšããŠããŸãã Mackerel MackerelïŒãã«ã¬ã«ïŒ: å§ãããããŠå¥¥æ·±ããå¯èŠ³æž¬æ§ãã©ãããã©ãŒã Mackerel(ãã«ã¬ã«)ã¯èª°ã§ãç°¡åã«å§ãããã奥深ãå¯èŠ³æž¬æ§ãã©ãããã©ãŒã ãéçšãã€ãŒãžãŒã«ãããªãã¶ãŒãããªãã£ãé«ããæªç¥ã®åé¡ã«ç«ã¡åããéçºè
ã«åãäžããŸãããµãŒããŒç£èŠãMackerelã§ã¯ãããŠã¿ãŸãããïŒç¡æãã©ã³ã2é±éã®ãã©ã€ã¢ã«ããããŸãã mackerel.io GUI ã§ç°¡åã«ç£èŠèšå®ãå¯èœãªãµãŒãã¹ã§ãã åè·ã§äœ¿ã£ãŠããæã¯ GUI ã§ã§ãããšãããŸã§ããè§Šã£ãŠããªãã£ãã®ã§ãããèšå®ãã¡ã€ã«ãæè£œããã°ãèªäœã¹ã¯ãªããã®åºåããã§ãã¯ãããããã§ãã¯ã«å€±æããæäœãåŠçããããâŠãšãã£ãããã¥ã¢ã«ãªç£èŠãå¯èœã§ãã çŸåš CLINICS ã«ãããŠã¯ãORCA ã€ã³ã¹ã¿ã³ã¹ãããããç¬ç«ããŠåäœããŠããŸãããMackerel ã§ã¯ãã® ORCA ã€ã³ã¹ã¿ã³ã¹ãç£èŠããŠããŸãããŸãç£èŠããã ãã§ãªããåäœäžè¯ãèµ·ãããæã®åèµ·ååŠçãªã©ãæ
åœããŠããŸãã AWS CloudWatch & Lambda Amazon CloudWatchïŒãªãœãŒã¹ãšã¢ããªã±ãŒã·ã§ã³ã®ç£èŠãšç®¡çïŒ| AWS Amazon CloudWatch ã¯ãAWS ãªãœãŒã¹ãš AWS ã§å®è¡ããã¢ããªã±ãŒã·ã§ã³ã®ã¢ãã¿ãªã³ã°ãµãŒãã¹ã§ããæ§ã
ãªã¡ããªã¯ã¹ããã°ãåéã»è¿œè·¡ããããšã§ãã·ã¹ãã å
šäœã®ãªãœãŒã¹äœ¿çšçãã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ãããã³ãªãã¬ãŒã·ã§ã³ã®ç¶æ
ã«ã€ããŠå¯èŠåããããšãã§ããŸãã aws.amazon.com AWS LambdaïŒã€ãã³ãçºçæã«ã³ãŒããå®è¡ïŒ| AWS AWS Lambda ã䜿çšããã°ããµãŒããŒã®ããããžã§ãã³ã°ã管çãªãã§ã³ãŒããå®è¡ã§ããŸãã課éã¯å®éã«äœ¿çšããã³ã³ãã¥ãŒãã£ã³ã°æéã«å¯ŸããŠã®ã¿çºçããã³ãŒããå®è¡ãããŠããªããšãã«ã¯æéãçºçããŸããã aws.amazon.com ã©ã¡ãã AWS ã®æäŸããããŒã«ã§ãã CloudWatch ã¯äž»ã«ãã°ã®èšé²ãšç£èŠãè¡ãããã®ããŒã«ã§ããè€æ°ã®æ©èœããããŸãããCLINICS ã§ã¯äž»ã« Logs, Metrics, Alarm ã䜿çšããŠããŸãã Logs ã¯ãã®åã®éãã䞻㫠AWS ã®ããŒã«ãçºè¡ãããã°ãåéã»æ€çŽ¢ã»é²èЧããæ©èœã§ãåé¡çºçæã® HTTP ãªã¯ãšã¹ãã®ãã©ã¡ãŒã¿ã確èªããæãªã©ã«å©çšããŠããŸãã Metrics ã¯ãããããã¯ãïŒEC2 ãªãã€ã³ã¹ã¿ã³ã¹, RDS ãªã DB ã€ã³ã¹ã¿ã³ã¹ãªã©è£œåã®äžåäœïŒãÃãã¡ããªã¯ã¹çš®å¥ïŒCPU å©çšçãªã©ïŒããäžåäœãšããŠãçµ±èšæ
å ±ãå¯èŠåããããŒã«ã§ãã ãããã«éŸå€ãèšããè¶
ããå Žåã«ã¢ã©ãŒããçºè¡ããã®ã AlarmâŠãšããäœçœ®ä»ãã§ãã 察ã㊠Lambda ã¯ãããããç£èŠããŒã«ã§ã¯ãããŸããã宿å®è¡ããããã¯äœãã®ã€ãã³ãïŒS3 ã«äœãã¢ããããŒããããããªã©ïŒãããªã¬ãŒãšããŠãåŠçãè¡ãããŒã«ã§ããåŠçããçµæããããã«å¥ã®ããŒã«ãžé£æºïŒSlack éç¥ãªã©ã®å€éšé£æºãå«ãïŒãããããšãå¯èœã§ãã CLINICS ã§ã¯ãäžèšã¢ã©ãŒãéç¥ã®ã»ãã SessionManager çµç±ã§ã€ã³ã¹ã¿ã³ã¹ã« ssh ãã°ã€ã³ããæã®éç¥ããæéã®ãããã€ã³ããŒãã¿ã¹ã¯ãªã©ãçµäºããæã®éç¥ãªã©ã«ãå©çšããŠããŸãã New Relic ã¹ã¿ãã¯å
šäœãã¢ãã¿ãªã³ã°ããããã°ãæ¹å ç»é²ã¯ç¡æãã¯ã¬ãžããã«ãŒãã¯äžèŠã§ããNew Relic Oneãšã¯ã€ãã¯ã¹ã¿ãŒãã§ã€ã³ã¹ã¿ã³ããªãã¶ãŒãããªãã£ãæã«å
¥ããã°ãã€ã³ã¹ãã¥ã«ã¡ã³ããæ°ã¯ãªãã¯ã§å®è¡ã§ããããã«ãªããŸãã newrelic.co.jp New Relic ã¯ãCLINICS ã§ã¯ããã©ãŒãã³ã¹è©äŸ¡ããŒã«ãšããŠå©çšããŠããŸãã ã¡ã€ã³ãšãªãã®ã¯ APM(Application Performance Monitoring)ã§ãã¢ããªã±ãŒã·ã§ã³å
ã®ã©ã®åŠçã«ã©ãã ãæéãããã£ãããªã©ãé²èЧããããšãã§ããŸãã å»çæ©é¢ã¯æéã«ãã£ãŠèšºå¯ããŒã¹ã倧ããå€ããããã1 å 1 åã¯å°ãã®é
å»¶ã§ãã£ãŠããæ¥åãããŒã®ã³ã¢ãªéšåã«çµ¡ãã§ããå Žåãé
å»¶ãé¿ããŠããããšã¯ãããŸãã ãã®ãããªãããšã©ãŒã¯åºãªããã©ãã¬ã¹ãã³ã¹ãé
ãããšãããé£çµ¡ãåããæã®èª¿æ»ã»ã¡ã³ããã³ã¹ã«äž»ã«æŽ»èºããŠãããŸãã Sentry ã®ããã«ãšã©ãŒæ€ç¥ãè¡ãªã£ãããã§ããããŒã«èªäœã®å€æ©èœãããååŸã§ããæ
å ±ã®å€ããæ®µéããšãã£ãå°è±¡ã§ãã Firebase Crashlytics Firebase | Google's Mobile and Web App Development Platform Firebase ã¯ãããããããŒããŠãŒã¶ãŒã«äººæ°ã®ã¢ããªãã²ãŒã ãéçºã§ããããæ¯æŽãã Google ã®ã¢ãã€ã«ããã³ãŠã§ãã¢ããªéçºãã©ãããã©ãŒã ã§ãã firebase.google.com Firebase ããŸãâ倿©èœãªâããŒã«ã§ãããCLINICS ã§ã¯ç£èŠæ©èœãšã㊠Crashlytics ã䜿ã£ãŠããŸãã CLINICS ã§ã¯ãæ£è
ãããäºçŽã»ãªã³ã©ã€ã³èšºçãè¡ãããã®ã¢ããªã iOS / Android ã§å
¬éããŠãããå»çæ©é¢åãã® Web ã¢ããªã±ãŒã·ã§ã³åŽãšé£æºããŠåäœããŸãããã®ãã€ãã£ãã¢ããªã§çºçããã¯ã©ãã·ã¥ãéèšããŠããã®ã Crashlytics ã§ãã Android ã®å Žå㯠build.gradle ã«èšå®ã远èšããŠã¢ããªããã«ããiOS ã®å Žå㯠cocoapods ã§å€éšã©ã€ãã©ãªãšããŠã€ã³ã¹ããŒã«ããããšã§éèšãå¯èœã«ãªããŸããUnity ã¢ããªã«ã察å¿ããŠãããšã®ããšã§ãã ãã®ä»ãç£èŠã§ã¯ãªãã§ããã¢ããªãå©çšããŠãã端æ«ã OS ããŒãžã§ã³ãªã©ã®çµ±èšæ
å ±ã®åéãå¯èœã§ãã PagerDuty ã«ããç£èŠéçŽ PagerDutyïœã€ã³ã·ãã³ã管çãã©ãããã©ãŒã ïœPagerDutyæ ªåŒäŒç€Ÿ PagerDutyïŒãã€ãžã£ãŒãã¥ãŒãã£ïŒã¯ã·ã¹ãã ã®ã€ã³ã·ãã³ã察å¿ãäžå
åãããã©ãããã©ãŒã ã§ããDXæä»£ã«ããããªãã¬ãŒã·ã§ãã«ã»ã¬ãžãªãšã³ã¹ãé«ããé害察å¿ã«è²»ããæéã軜æžããããšã§ã貎éãªãšã³ãžãã¢ãªãœãŒã¹ãããžãã¹æ¡å€§ã«å
ãŠãããšãã§ããŸãã ja.pagerduty.com CLINICS ã§ã¯ãããŸã§ã«æããŠããããŒã«ã䜿ã£ãŠç£èŠãè¡ã£ãŠãããŸãããæšå¹Žãè€æ°ã®ç£èŠãœãŒã¹ããã®ã¢ã©ãŒããäžæ¬åãã¹ããã€ã³ã·ãã³ã管çãµãŒãã¹ PagerDuty ãå°å
¥ããŸããã å°å
¥åŸã¯ãå
šãŠã®ã¢ã©ãŒãããŒã«ã¯ã¢ã©ãŒããäžæŠ PagerDuty ã«éçŽããPagerDuty ãã Slack éç¥ãè¡ããšãã圢åŒã«ãªããŸããã ãŸããPagerDuty ãåºãã¢ã©ãŒãã¯ãæ
åœè
ã確èªããŠã¬ã¹ãã³ã¹ãè¿ãïŒacknowledgeïŒããšãè¡ããã«äžå®æéãéããå Žåãé»è©±ã SMS ã§ã®éç¥ãžå±éããŠããããã«èšå®ããããšãã§ããŸããããã«ãã£ãŠãã¯ãªãã£ã«ã«ãªãšã©ãŒã®èŠèœãšãã確å®ã«é²ããããã«ãªããŸããã ãŸãšã CLINICS ã§å©çšããŠããç£èŠããŒã«+α ã玹ä»ãããŠããã ããŸããã ãããã®ããŒã«ãé§äœ¿ããªããããŠãŒã¶ã®çæ§ã«å®å¿ããŠã䜿ãããã ãããããµãŒãã¹ã®å®å®çšŒåã«å°œåããŠããŸãã ã芧ããã ãããããšãããããŸããã