Circle CI の iOS ビルドが有料になったため、BITRISE に移行しました

Circle CI の iOS ビルドは現在無料では利用できなくなったので、BITRISE という無料で iOS ビルドが利用できるサービスに移行しました。簡単に構築の流れをおさらいしておきます。

処理の流れ

主に以下の処理を実現していきます。

  1. Build Number を自動的にインクリメントできるようにします。
  2. Apple Developer にログインして、プロビジョ二ングプロファイルを自動的に取得します。
  3. Adhoc あるいは AppStore 用の署名を行えるようにします。
  4. Github の master に PUSH されたら、AdHoc ビルドを行い fabric 経由で配信するようにします。
  5. release あるいは develop で始まるブランチが作成されてたら、リリースビルド後 iTunes Connect にアップロードを行い、そのまま Testflight あるいは審査に出せるようにします。

アプリケーションの連携

まずは、BITRISE に Github プロジェクトを連携させます。BITRISE へは Github ログインでログインすると進めやすいです。

  1. ADD NEW APP よりアプリケーションを設定します。
  2. Github のリポジトリ設定画面で BITRISE で発行された Webhooks を登録します。

ワークフローの設定

BITRISE ではワークフローと呼ばれる、各処理を連結させる仕組みがあります。fastlane やシェル実行など大抵のものは雛形が用意されているので、殆どのケースでプログラミングなどせずに処理を定義することができます。

今回は、master / release のワークフローを用意し、以下のように設定しました。

  1. Preparing the Build Environment
  2. Activate App SSH key
  3. Git Clone Repository
  4. Run CocoaPods install
  5. Set Xcode Project Build Number
  6. fastlane
  7. Deploy to bitrise.io
  8. Cleaning up the Virtual Machine

Set Xcode Project Build Number は、Build Number をインクリメントするための雛形になります。
標準では BITRISE のビルド番号が入るようになっていますが、今回は Circle CI からの移行ですので、Build Number Offset を 1000 にして、1000 から始まるようにしています。

環境変数の設定

ビルド中に利用する環境変数を管理画面から設定しておきます。
ワークフローの設定項目に Secret Env Vars というのがるので、今回はそこから設定しました。

KEYCHAIN_NAME ios-build.keychain
KEYCHAIN_PASSWORD キーチェーンのパスワード
P12_PASSPHRASE 証明書のパスフレーズ
DELIVER_PASSWORD Apple IDのパスワード
CRASHLYTICS_API_TOKEN FabricのAPI KEY
CRASHLYTICS_BUILD_SECRET FabricのBuild Secret
GYM_CODE_SIGNING_IDENTITY コード署名に使うIDを設定

トリガーの設定

PUSH が行われた際に、どのブランチでの操作かによってワークフローを振り分けることができます。
ワークフローの設定項目に Triggers というのがるので、そこから設定します。

トリガーは登録順に評価されていきます。 * でワイルドカード指定も可能です。

  • Trigger pattern: master – will trigger Workflow: master
  • Trigger pattern: release* – will trigger Workflow: release
  • Trigger pattern: develop* – will trigger Workflow: release

fastlane の設定

Circle CI で利用していたものを再利用できますが、以下のようなレーンを定義しています。

  lane :adhoc do
    create_keychain(
      default_keychain: true,
      unlock: true,
      timeout: 3600,
      lock_when_sleeps: true
    )
    import_certificate certificate_path: "Resources/ios_distribution.cer"
    import_certificate certificate_path: "Resources/ios_distribution.p12", certificate_password: ENV["P12_PASSPHRASE"]
    sigh(
      adhoc: true,
    )
    ENV["PROFILE_UDID"] = lane_context[SharedValues::SIGH_UDID]
    gym(
      clean: true,
      use_legacy_build_api: true,
      scheme: "Sample",
      configuration: "AdHoc",
    )
    crashlytics(
      groups: "developers",
      notifications: false
    )
  end

  lane :release do
    create_keychain(
      default_keychain: true,
      unlock: true,
      timeout: 3600,
      lock_when_sleeps: true
    )
    import_certificate certificate_path: "Resources/ios_distribution.cer"
    import_certificate certificate_path: "Resources/ios_distribution.p12", certificate_password: ENV["P12_PASSPHRASE"]
    sigh
    ENV["PROFILE_UDID"] = lane_context[SharedValues::SIGH_UDID]
    gym(
      clean: true,
      use_legacy_build_api: true,
      scheme: "Sample",
      configuration: "Release",
    )
    testflight(
      skip_submission: true
    )
  end

完成

これで一通り動作すると思います。簡単ですね!