bitbank techblog

ビットバンクでのネイティブアプリケーション開発におけるCI/CD環境

これは ビットバンク株式会社 Advent Calendar 2020 の 2 日目の記事です。

はじめに

こんにちは。
エンジニアの taptappun です。

ビットバンクではスマートフォン向けのネイティブアプリケーションの配信も行っています。
まだご利用ではない方はぜひこちらからダウンロードしてご利用ください。

1-42-4

今回、ネイティブアプリケーション開発における CI/CD 環境の構築を行いました。現在も絶賛稼働中ですのでこの環境を構築した過程について紹介します。

CI/CD とは

  • CI: Continuous integration(継続的インテグレーション)
  • CD: Continuous delivery(継続的デリバリ)

ソフトウェア開発において自動化を取り入れることで顧客にアプリケーションを提供する頻度を高める手法のことを CI/CD と言います。

一般的には以下のような図に表されるようなフローが自動的に行われて開発が進むような開発環境となります。

3-3

参考

構築する環境における要件

まず今回なぜネイティブアプリケーションの開発環境における CI/CD 環境を構築したのか?これによってどういった課題の解決となったのか述べていきたいと思います。

課題

CI/CD 環境を構築する以前までは以下のような課題がありました

  • ネイティブアプリケーションの開発〜ストア公開までのフローが整理されていない
  • 社内で開発者以外の人達にテストをしてもらうためにはストアの環境を利用する以外の環境がない(ストア内の環境であるため、何らかの事由により配信ミスや開発中のアプリケーションが公開されてしまうなどのリスクが伴う)
  • ビルド〜ストアへの公開やテストが可能な人が属人的になっている(たとえば「ストアに公開したいので taptappun さんビルドして対応してください」といった専門の担当者が必要になる)
  • ビルドの設定や署名などの手順が煩雑であるのでストアに公開するまでの間にヒューマンエラーが発生するリスクがある
  • 各種ビルドからアプリケーションの配布までのフローが手動で行われているので時間がかかる

など

課題を解決するための要件

上記の課題の解決のために以下の要件を満たした環境の構築を目指しました。

  • CI/CD 環境を構築して導入することで開発、ビルド、配信などの自動化を行う
  • 開発したアプリケーションを社内に配信して複数人でのテスト・検証を可能にする

サービスの比較

結論

ビットバンクでは以下のサービスを使用するようにしました

また一部では Github も使用しています。

以降では使用するサービスの選定にあたり調査した結果をまとめてみました

比較した CI/CD サービス

名前 提供会社 価格 特徴
Gitlab CI Gitlab 省略 + Git リポジトリと一体化
- iOS のビルドを行うためにはオンプレマシンが必要
Visual Studio App Center(旧HockeyApp) Microsoft Build 無制限: ¥4,480/月
UI テスト: ¥11,088/月
ターゲットテスト: ¥1,120/月
Visual Studio App Center は Microsoft Azure の一部
+ アプリケーションの配布機能と一体化(配布は無料)
+ Android/iOS ともにビルド可能
+ 機能が豊富
- Git リポジトリは外部から取得してくる必要あり
- 採用実績が少ない
Github Actions Microsoft Linux: 0.008 ドル/1 分
macOS: 0.08 ドル/1 分
+ Git リポジトリと一体化
+ Android/iOS ともにビルド可能
- 選定当時 β 版であったため動作と仕様が不安定な可能性がある
Bitrise bitrise 36 ドル〜270 ドル/月 + Android/iOS ともにビルド可能
+ 採用実績が多い
△ タスクの組み立ては GUI で行う
- Git リポジトリは外部から取得してくる必要あり
Circle CI Circle CI 30 ドル〜3000 ドル/月 + Android/iOS ともにビルド可能
+ 採用実績が多い
- Git リポジトリは外部から取得してくる必要あり
Travis CI Travis CI 63 ドル〜448 ドル/月 + Android/iOS ともにビルド可能
- Git リポジトリは外部から取得してくる必要あり

アプリケーション配信サービス

名前 提供会社 価格 特徴
Visual Studio App Center(旧HockeyApp) Microsoft Build 無制限: ¥4,480/月
UI テスト: ¥11,088/月
ターゲットテスト: ¥1,120/月
Visual Studio App Center は Microsoft Azure の一部
+ CI/CD 機能と一体化
+ アプリケーションの配布は無料
+ 機能が豊富
- 採用実績が少ない
DeployGate デプロイゲート(ミクシーから独立) 月額 3,300 円/アカウント + 配布、管理が容易
+ CrashLog などの Log もトラッキングして収集できる
+ 採用実績が豊富
- 配布だけで機能は少ない
Firebase App Distribution Google 無料(今後値段が変わる可能性あり) + 開発環境との親和性が高い
+ 無料
+ CrashLog などの Log もトラッキングして収集できる
- まだ β 版
- 機能・仕様・料金面で変更がありそう

使用するサービスの選定にあたり参考にした記事

他の会社ではどのようなサービスが使われているのか調査しました。

上記のようにほかの会社では Bitrise + DeployGate での構成が割と一般的であることがわかりました。

選定経緯

もともと Gitlab にてソースコードの管理を行っていたため、Gitlab CIを活用できるだけ活用します。
そしてCI/CD 環境およびアプリケーションの配布環境の両方の機能を提供しているVisual Studio App Center を利用することが最適であると結論付けたので、今回この環境を利用することにしました。
また後述のVisual Studio App Centerでの Git リポジトリの参照の関係上 Github を一度中継して、こちらのリポジトリを参照するようにしました。

環境構築

Build から配布までの流れ

使用しているサービスとの構成の関係上、Android と iOS とでは処理の流れが異なります。以降に Android, iOS それぞれにおける社内への配布とストアへの配信の流れを示します。

Android のアプリケーションを社内に配布する場合

1

Android のアプリケーションをストアに配信する場合

2

iOS のアプリケーションを社内に配布する場合

iOS を Build するためには Xcode が必要になります。XcodeMacOS にのみインストールできます。
Gitlab 上では MacOS を使用できないので、Build は Android の場合とは異なりVisual Studio App Center 上で行います。

3

iOS のアプリケーションをストアに配信する場合

4

Visual Studio App Center の活用

Visual Studio App Centerを CI/CD 環境とうまく連携させるためには appcenter-cli を活用して、CLI にて操作できるようにします。

appcenter-cliのインストール

まずは appcenter-cli を以下のコマンドでインストールします。

npm install -g appcenter-cli
ログイン

次に Visual Studio App Center にログインします。

appcenter login

上記のコマンドを実行することでブラウザが開くので、ここに記された文字列を CLI 側に貼り付けて進むことで各種コマンドを実行できます。

4-3

ログアウト

Visual Studio App Center からログアウトするときは以下のコマンドを実行することでログアウトできます。

appcenter logout
Visual Studio App Center で実行するプロジェクトの ID のリストを取得する

以下のコマンドで現在 Visual Studio App Center にログイン中のユーザーが操作可能なプロジェクトの一覧の情報を表示します。

appcenter apps list

ここで表示された情報を Build や配布するときに指定することで各種機能が使用できます。

Visual Studio App Center でこれから実行するプロジェクトを指定する

各種機能を使用するためにプロジェクトを指定します。上記で取得できたプロジェクトの ID を用いて以下のコマンドを実行することで指定できます。

appcenter apps set-current プロジェクトのID

プロジェクトを指定することで各種機能を使用できます。

Visual Studio App Center にアプリケーションを配布する

アプリケーションを配布するには distribute という機能を使用します。distribute の機能を利用するにはアップロードするファイル名と配布する対象の Group が最低限必要になります。
Visual Studio App Center のコンソール上より配信したい Group をあらかじめ作成しておきます。
そして、以下のコマンドを実行することで appcenter-cli でアプリケーションを配信できます

appcenter distribute release --file [Androidならapk, iOSならipaファイルのpath] --release-notes "リリースノートに記載する内容" --group 配信したいGroup名

配信には--file オプションと --group オプションがないとエラーとなってしまいますので注意が必要です。

Gitlab CI での Android の Build から配信までのフロー

Gitlab CI で実行するために .gitlab-ci.yml に Android の Build の様子を記述していきます。
以下の内容は Android において Build するまでの様子になります

image: openjdk:8-jdk

stages:
  - build

.setup-android-sdk: &setup-android-sdk
  variables:
    ANDROID_COMPILE_SDK: '29'
    ANDROID_BUILD_TOOLS: '29.0.2'
    ANDROID_SDK_TOOLS: '4333796'
  before_script:
    - apt --quiet update --yes
    - apt --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
    - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_TOOLS}.zip
    - unzip -d android-sdk-linux android-sdk.zip
    # ファイルがないとWaringが出るので対応のためにファイルを作る
    - mkdir -p /root/.android
    - touch /root/.android/repositories.cfg
    - echo y | android-sdk-linux/tools/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
    - echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
    - echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
    - export ANDROID_HOME=$PWD/android-sdk-linux
    - export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
    - chmod +x ./gradlew
    - set +o pipefail
    - yes | android-sdk-linux/tools/bin/sdkmanager --licenses
    - set -o pipefail

debugBuild:
  stage: build
  script:
    - ./gradlew assembleDebug
  <<: *setup-android-sdk
  artifacts:
    paths:
      - app/build/outputs/

Android SDK などを実行できる環境をまずはセットアップして、./gradlew assembleDebug にて Android の Build を行っています。
Build にて生成された apk ファイルは上記の Visual Studio App Center のアプリケーションを配布する各種コマンドを .gitlab-ci.yml に追記していくことで、Visual Studio App Centerに配布しています。

Visual Studio App Center における iOS アプリケーションの Build から配信までのフロー

iOS アプリケーションの Build が行われる設定はすべてVisual Studio App Centerのコンソール上で行われます。

Git リポジトリと連携する

Visual Studio App Center が対応している Git リポジトリと連携することで、そのあとの自動 Build の設定などができます。

5-2

GitHub を選択するとすぐに以下のような OAuth の認可の画面が表示され、OAuth の認可を承認することで GitHub との連携は完了します。

Build するリポジトリの設定

Git リポジトリとの連携が完了すると Build 対象のリポジトリとブランチを指定して Build するための設定を進めます。
リポジトリとブランチは設定したら自動的に Build が行われるようになるので以降は再度指定する必要はありませんし、設定を変更したい場合はいったん解除してから指定し直します。

iOS で Build するための各種設定

Visual Studio App Center での Build では Xcode での Archive を行って Build が行われます。
以降では各種設定すべきことについてあげていきます。

  • Shared Scheme: BuildConfiguration (Debug Build なのか Release Build)の切り替えはVisual Studio App Center 側からはできないのでそれぞれに対応した Scheme を選択して対応することをお勧めします
  • Xcode Version: Build する Xcode のバージョンを指定します
  • Build frequency: Build が実行されるタイミングを設定できます。Build this branch on every push と設定すると対象の branch に push があった場合、それを検知して自動的に Build を行います。
  • Sign builds: 署名した Build を行うため、「On」に切り替えます。そして署名した Build に必要な Provisioning Profile (mobileprovisionファイル)とCertificate(p12ファイル)をそれぞれアップロードします。各種ファイルは Apple Developer よりダウンロードしてください。
  • Distribute builds: Build が終わったら自動的に配布する機能になります。そのまま配布してしまいたいのでこの機能を「On」にして、配布したい対象の Groups を指定します。
  • Advanced: これは Build の進捗具合を表示する画像が取得になる機能になります。

6-1

7-1

iOS アプリケーションの署名をつけて Build するのに必要なそれぞれのファイルについては以下などを参考にしてください。

すべての設定が完了したら「Save」を押して Build の設定を完了します。
またこの時に Build が正常に行われるか確認が行われるます。正常に行われない場合、エラーとなり「Save」できませんので注意してください。

これらの設定が完了したら、ブランチに push されたら自動的に iOS アプリケーションの Build およびアプリケーションの配信までを自動的に行ってくれます。

そのほか、自動 Build 以外に実行したこと

Android、iOS 共に上記の自動実行にあたり以下の機能も一緒に実行するようにしました。

  • Linter, formatter の実行
  • ドキュメントの自動生成

いずれもコマンドを実行するだけで機能を使うことができる状態になっていたので、途中に実行するようにしています。

今後の展開

テストの自動実行も実装したかったのですが、エミュレータの構築などが必要なため同様に調査して自動的に実行できるようにしていきたいと思います。
また自動的にストアに配信する機能の調査も行いましたが、ストア配信の自動化はリスクがあるため実施しない運びとなりました。

まとめ

今回は ビットバンク において導入した CI/CD サービスについてや Build から配布までの環境構築の流れと方法についてをメインに紹介しました。
ぜひネイティブアプリケーションにおける CI/CD 環境構築の参考にしていただければとおもいます。

Author image
About taptappun
expand_less