株匏䌚瀟メドレヌのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟メドレヌ

株匏䌚瀟メドレヌ の技術ブログ

å…š1414ä»¶

こんにちは、むンキュベヌション本郚で゚ンゞニアをしおいたす䞖嘉良です。 むンキュベヌション本郚は 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 で利甚しおいる監芖ツヌル+α を玹介させおいただきたした。 これらのツヌルを駆䜿しながら、ナヌザの皆様に安心しおお䜿いいただけるようサヌビスの安定皌動に尜力しおいたす。 ご芧いただきありがずうございたした。