見出し画像

[CI/CD]iOSアプリのBitrise+fastlane+Deploygate 環境について

今回はテストアプリ配布のアップを自動化した際の内容を紹介しようと思います。
日頃コードを中心に取り扱うことが多いエンジニアにとってCI/CDの操作は馴染みがなく慣れるのは大変ですが、一度全体のをつかむと便利な開発環境を構築することができます。

改善したかったこと
開発中のアプリ配布フローが、自社サーバー内にアーカイブをアップ、社内の配布サイトにリンク更新と手動に近い運用で、手間とサーバーのアーカイブ管理が大変なので極力自動にするため、Bitrise+fastlane+Deploygateを使ってCI/CD化しました。

構成理由
アプリがiOS対応だけの場合はXcode Cloudを使う方が良い場合もあります。今回はAndroidアプリも構築すること考え、共通で使用できるBitrise+fastlaneにしました。
アプリのアップ先はtestflyghtだとアップに20分ほどかかるので、それより早いDeploygateを選びました。

要点
コード認証はFastlane matchとApp store connect APIを使用しています。
ビルド、deploygateへのアップ、slackへの結果通知は、他CI/CDへ移行しやすいようになるべくfastlaneで実行しています。
Bitriseのワークフローの実行(ビルド)はSlackからの入力フォームで行っています。

準備やおおまかな手順

  1. DeployGateアカウントのセットアップ

  2. Bitriseアカウントの作成とセットアップ

  3. Bitriseワークフローの作成、環境変数の設定

  4. Fastlaneのセットアップ

  5. Fastfileファイルのlane編集

  6. Slackからビルドできるよう設定(SlackのWorkflowとOutgoing WebHooks)

Bitriseのワークフローと環境変数の設定
ワークフローでは以下のような設定をしています

環境変数も必要に応じて設定しています

fastlaneの設定について
lane内のコードは簡潔に書くと以下のようになっています。

app_store_connect_api_key(
  key_id: ENV["APPLE_API_KEY"],
  issuer_id: ENV["APPLE_API_KEY_ISSUER_ID"],
  key_content: ENV["APPLE_API_KEY_CONTENT"]
)

match(
  type: "adhoc",
  readonly: false,
  verbose: true,
  fail_on_name_taken: false,
  git_url: ENV["MATCH_GIT_URL"],
  storage_mode: "git",
  app_identifier: bundle_ids,
  username: ENV["APPLE_USERNAME"],
  team_id: ENV["APPLE_TEAM_ID"],
  team_name: ENV["APPLE_TEAM_NAME"]
)

gym(
  workspace: ENV["BITRISE_PROJECT_PATH"],
  scheme: scheme_name,
  export_method: ENV["BITRISE_DISTRIBUTION_METHOD"],
  export_options: { compileBitcode: false }
)

deploygate(
  api_token: ENV["DEPLOYGATE_API_TOKEN"],
  user: ENV["DEPLOYGATE_USER_NAME"],
  message: release_notes,
  distribution_name: ENV["BITRISE_GIT_BRANCH"].match?(/\A(\w*\/)?v?\d+\.\d+\.\d+(\.\d+)?\z/) ? "#{ota_type}OTA" : "",
  release_note: release_notes
)

slack(
  message: "#{ENV["DEPLOY_USER"]}: #{ENV["BITRISE_APP_TITLE"]}/[#{ota_type}]\n#{ENV["BITRISE_GIT_BRANCH"]}  has been uploaded to deploygate.\nURL: #{deployed_url}/binaries/#{lane_context[SharedValues::DEPLOYGATE_REVISION]}"
)

少し工夫している点では、deploygateのdistribution_nameには、もしブランチ名が「/v3.12.0」のようなリリース番号のブランチの場合は、配布ページにもアップするよう指定しています。

distribution_name: ENV["BITRISE_GIT_BRANCH"].match?(/\A(\w*\/)?v?\d+\.\d+\.\d+(\.\d+)?\z/) ? "#{ota_type}OTA" : "",

slackのmessageには、slackに送信する完了通知のメッセージにアップしたdeploygateのダウンロードURLを記載するよう処理しています。

message: "#{ENV["DEPLOY_USER"]}: #{ENV["BITRISE_APP_TITLE"]}/[#{ota_type}]\n#{ENV["BITRISE_GIT_BRANCH"]}  has been uploaded to deploygate.\nURL: #{deployed_url}/binaries/#{lane_context[SharedValues::DEPLOYGATE_REVISION]}"

Slackからのワークフローの実行について
Bitriseのワークフローの実行は、SlackのWorkflowとOutgoing WebHooksを使用して、以下のようなSlackのフォームを作成し、そこからコマンドをBitriseに送信して実行しています。


最後に
今回は証明書の管理についてはFastlane matchを使いましたが、今後はさらに管理が楽なXcode cloud-managedに変更する予定です。
また、毎回手作業で行うUDIDの登録処理もDeploygateとSlackのWorkflowを使い自動でUDID登録、再配布ができそうなので、改善できたらブログに紹介したいと思います。

採用情報はこちら▼