信頼性の高い継続的インテグレーション(CI)システムの構築に向けた取り組みの一環として、Gojekの開発者エクスペリエンス(devX)チームは最近、AndroidおよびiOSモバイルアプリの開発とインテグレーションのスケーリングに関する課題にどのように取り組んだかについて説明した。devXチームのエンジニアリングマネージャであるDinesh C氏は、1日あたり140を超えるエンジニアと1100近くのパイプラインをトリガーするため、迅速に提供するためにパイプラインを分離することが重要であると自身のブログで強調した。
信頼性の高いCIシステムにより、開発チームはコードをより早く出荷できるため、製品マネージャは機能に関する早期のフィードバックを得ることができる。Dinesh氏は、何百人ものエンジニアが共通の目標に向けて取り組んでいるため、パイプラインが組織に影響を与えると説明した。これは、モバイルアプリにCI/CDを採用するという現在のトレンドに沿っており、Appinventivチームによると、提供されるメリットには、自動ビルド、通信の改善、自動出荷、ゼロサーバーメンテナンスがある。
パイプラインを並列または迅速な間隔で実行するには、マシン(「ランナー」)が必要であった。限られた数のランナーで課題を克服するために、devXチームはGitLab Runnerを使用してジョブを実行し、統計値をGitLab CI/CDに送り返す。チームはGitLabランナー構成ファイルを使用して、各ランナーと並行して実行できるジョブの数を定義した。これにより、パイプラインの完了時間が短縮された。
効果的なパイプラインを作成するために、Dinesh氏は重要な変数として待機時間と完了時間を挙げた。開発者が約10~20回のコミットを行い、毎日平均300分のパイプラインが実行されている場合、パイプラインの開始と完了を待機すると、エクスペリエンスが低下する。パイプラインには、機能やインフラストラクチャの要件も異なる。Dinesh氏は、パイプラインカテゴリの例を挙げて、インフラストラクチャの計画にはパイプラインの分類が必要であることを強調した。
ソース: https://blog.gojekengineering.com/running-ci-for-mobile-engineers-at-scale-de951b556cf4
各パイプラインを異なるステージに分割した後、各ステージは最小の単位、つまり「ジョブ」に分割される。Dinesh氏はさらに、ランタイム環境とメモリ要件がジョブのインフラストラクチャニーズを決定するという、変数要素について詳しく説明した。ジョブのタイプに基づいて、パイプラインは次の図に示すように分類された。
ソース: https://blog.gojekengineering.com/running-ci-for-mobile-engineers-at-scale-de951b556cf4
フィードバックの点については、ELKスタックをフィードバックの監視と測定に使用した。パイプラインを介して収集されたメトリックは、Curl HTTPを介してElasticデータストアに渡された。Dinesh氏は、インフラストラクチャとパイプラインの統計はDevOpsチームを支援するために収集され、コードメトリックは開発者を支援するために収集されると述べた。Slackボットは、パイプラインのステータスについてマージリクエストの作成者に通知するために使用された。
関連ニュースで、Ionicフレームワークの共同創設者/CEOであるMax Lynch氏が、Ionicが管理するマネージドモバイルビルド環境について書いた。これにより、チームはGitLabトリガービルドなどのCI/CDツールを使用してコードをAppflowにプッシュできるため、モバイル開発インフラストラクチャを管理し、アプリストアで公開または更新できる。Appflowチームは、モバイルビルドツールとオペレーティングシステムを最新の状態に保ち、セキュリティ問題にパッチを当てていく。
Gojekの将来に関して、devXチームは、CIシステムをプラグアンドプレイソフトウェアとしてパッケージ化することを目指している。そして、おそらくオープンソース化することを目指している。