つばくろぐ @takamii228

知は力なり

Jenkinsのビルドエージェントとしてmac miniを設定する手順をまとめた

ここ最近はGitLab CIにどっぷりだったのだけど、久しぶりにJenkinsでiOSのCI/CDを組む必要が出てきたのでmac miniをビルドエージェントに登録する手順をQIita記事にまとめました。

qiita.com

基本的な流れはGitLab CIと同じですね。JNLPという仕組みを使ってるところが大きな違いでしょうか。 GitLabと比較してJNLPを使う分ポートを一つ多く開けないと行けない点がポイントですね。

またGitLab CIの場合はgitlab-runner register / installコマンドでlaunchd登録してくれて再起動時に自動起動してくれるようですがJenkinsの場合はそのような仕組みはないので自前で準備しました。launchdのplistファイルの書き方も勉強になりました。

リポジトリとジョブ設定の連携でいうとGitLab CIの場合はGitLabと密になっているのでトリガー設定はshedule実行以外はほぼ不要です。その一方でJenkinsはリポジトリ連携を細かくやらないと行けない点が面倒ですね。

Jenkinsの唯一いい点でいうとParameterized Buildでオンデマンドのジョブ定義がやりやすい点でしょうか。もしかしたら最近のGitLab CIでもできたような気がしますがうろ覚えですのでどなたか教えてください。

「私の情報の集め方、知識の学び方」を書き直した

以前自分の情報収集のやり方について以下のブログにまとめていました。

takamii.hatenablog.com

ここではGitPitchというサービスを使ってgithubリポジトリにおいたmarkdownからスライドを生成していたのですが、このGitPitchが2021/3/1にサービスが終了するそうです。

Service on gitpitch.com is shutting down on March 1, 2021.

github.com

そこで内容を一部修正、加筆しつつスライド化してspeakerdeckに再アップロードしました。

speakerdeck.com

コロナでリモートワークがメインになって変わってたところもあるなーと修正していて感じました。

まとめていた内容はライフステージの変化や自身の置かれた状況によって変わりそうなので、定期的に見直すと良さそうだなと思いました。

Firebase App Distributionを使って内部向けに継続的にネイティブアプリを配信する

はじめに

ネイティブアプリの内部テストを円滑にすすめるために、Firebase App Distributionを使ってアプリを配信する仕組みを触る機会があったので手順をまとめておきます。

Visual Studio App Centerを使ったアプリ配信の仕組みについては以前まとめたこちらをご確認ください。

takamii.hatenablog.com

Firebase App Distributionとは

Firebase App DistributionはFirebaseに含まれるアプリ配信機能です。モバイルアプリ開発において、Push通知機能やCrashlytics・Analyticsの連携などでFirebaseを使う機会は多いと思います。開発したアプリを実機に配信する方法はケーブルをつないで手動でインストールする方法もありますが、このようなアプリ配信サービスを使うことで、開発中のアプリをインターネット越しにアプリを配信することができます。リモートワークが当たり前になった今、モバイルアプリの内部配信にうってつけの機能ですね。

firebase.google.com

Firebase App Distributionには以下の特徴があると公式に記載されています。

  • Cross-platform
  • Fast distributions
  • Fits into your workflow
  • Tester management
  • Works with Crashlytics

配布対象はAndroidiOSアプリに対応していて、CLIやFastlane経由で利用できるようです。またアプリの配信先としてテスターグループが管理できるようです。 ただしFirebase App DistributionはまだBetaマークがついているので正式版ではない点に注意が必要です。

今回はベータ版ではありますが、Firebase App Distributionを使って実際にアプリを配信して実機端末にインストールするまでの手順をまとめます。

1. Firebaseプロジェクトを作成する

まずFirebaseコンソール上で今回の検証用の新しいFirebaseプロジェクトを作成します。Push通知やCrashlytics用にすでにプロジェクトがある場合は不要です。

プロジェクトを作成したら配信用のiOSAndroidのアプリをFirebaseプロジェクトと紐付けます。Push通知やCrashlyticsのときと同様にアプリのApplication ID、Bundle IDを入力するとFirebaseの連携用のjsonファイル・plistファイルがダウンロードできます。

f:id:takamii228:20210110161957p:plain

f:id:takamii228:20210110153646p:plain

このあとそれぞれアプリにFirebase SDKを組み込んでビルドをするのですが、Firebase App Distributionの利用のみであればApplication ID、Bundle IDの登録までで大丈夫です。以下のスクリーンショットのようにアプリが登録されていれば設定は完了です。

f:id:takamii228:20210110162145j:plain

ここに表示されているApp IDは後で利用するのでそれぞれメモしておきましょう。

2. apkファイル・ipaファイルを作成する

Visual Studio App Centerのときと同様に、ここではビルド済みのapkファイル・ipaファイルを配布するというシナリオにします。

今回もFlutterのプロジェクト作成時のアプリをベースにapkファイルとipaファイルを作成しておきます。こういうときはクロスプラットフォームは便利ですね。

apkの署名はデフォルトのデバッグプロファイルで、ipaは後でインストールする端末の情報を含んだprovisioning profileファイルで署名したものを用意します。

なおFlutterを使ってapk・ipaファイルを作成する手順はこちらを参考にしてください。

takamii.hatenablog.com

3. Firebase App Distributionへapk・ipaファイルをアップロードする

Firebase App Distributionへのアップロード方法は以下の方法があります。

  • Firebase Console上で手動でアップロードする
  • Firebase CLIを使う
  • fastlaneを使う
  • Gradle Pluginを使う(Androidのみ)

今回はCI/CDパイプラインでの利用を想定して、2番目のFirebase CLIを利用することにします。

Firebase CLIを公式のガイドに沿ってインストールします。

firebase.google.com

今回利用したバージョンは以下です。

$ firebase --version                   
9.1.2

Firebaseへのアップロードするために利用するトークンは以下のコマンドで発行することができます。

$ firebase login:ci

コマンドを実行するとGoogleの認証画面が立ち上がるので、さきほど作成したFirebaseプロジェクトに紐づくGoogleアカウントで認証します。認証が成功するとトークンが取得できます。

$ firebase login:ci

Visit this URL on this device to log in:
https://accounts.google.com/o/oauth2/auth?xxxxxxxx

Waiting for authentication...

✔  Success! Use this token to login on a CI server:

1//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Example: firebase deploy --token "$FIREBASE_TOKEN"

Firbease CLIを使ったApp Distributionへのアップロードコマンドオプションは公式ドキュメントに記載されています。パラメータ一覧は以下になります。

  • app : Firebaseで登録したApp ID
  • token : Firebaseのアクセストーク
  • release-notes (release-notes-file) : リリースノートの文字列(ファイル)
  • testers / (testers-file) : アプリのインストールを招待するメールアドレス、複数の場合はカンマ区切り(ファイル)
  • groups / (groups-file) : アプリのインストールを招待するグループ、複数の場合はカンマ区切り(ファイル)
  • debug : デバッグフラグ、オンの場合はログファイルを出力する

appは先程メモしたApp ID、tokenは発行したアクセストークンを指定すればよさそうです。

配信対象のテスターやグループはまだ未設定だったのでFirebase Console上で作成します。今回はサンプルとしてDevelopersグループとSalesMembersというグループを異なるメールアドレスで1つずつ設定してみました。

f:id:takamii228:20210110160248j:plain

設定するパラメータが準備できたので、あとはCLIを実行するだけです。App Centerと違ってFirebaseの場合はワンライナーでかけます。上記のApp Distribution用のパラメータに加えて、FirebaseのプロジェクトIDも忘れずに設定しましょう。

$ firebase appdistribution:distribute ${UPLOAD_FILE_PATH} \
 --token "${FIREBASE_AUTH_TOKEN}" \
 --project "${FIREBASE_PROJECT_ID}" \
 --app "${FIREBASE_APP_ID}" \
 --release-notes "${RELEASE_NOTE}" \
 --groups "${GROUP_NAME}" --debug

アップロードに成功すると以下のようなログが表示されます。

...
✔  uploaded distribution successfully! 
i  adding release notes... 
...
✔  added release notes successfully 
i  adding testers/groups... 
...
✔  added testers/groups successfully 

コンソール画面を見るとアプリがアップロードされていることがわかります。

f:id:takamii228:20210110162751j:plain

Androidアプリと同様にiOSアプリもアップロードします。

f:id:takamii228:20210110163112j:plain

4. アプリを端末にインストールする。

アップロードが完了するとDevelopersに登録したメールアドレスにメールが届いているので、インストールする端末でメールを確認します。

Android上でapkファイルをインストールする

メールの案内に従ってアプリをインストールします。メールを開くとFirebase App Distributionへの権限追加の案内がでるので内容を確認して許可してインストール画面へ遷移します。

インストール画面ではFirebase App Tester Appのインストールのポップアップが出ます。これはWeb APKというやつなのだろうか、案内に従ってインストールします。Google Play以外からのインストールなのでもろもろの権限の追加を行ってインストールします。

f:id:takamii228:20210110164622j:plainf:id:takamii228:20210110164727j:plainf:id:takamii228:20210110165024j:plainf:id:takamii228:20210110165120j:plain

Firebase App Tester上で利用するGoogleアカウントで認証し、もろもろの権限を設定すると配信中のアプリがダウンロードできるようになります。リストにあるアプリをダウンロードすると無事配信されたアプリをインストールすることができます。

f:id:takamii228:20210110165438j:plainf:id:takamii228:20210110165605j:plain[f:id:takamii228:20210110165636j:plainf:id:takamii228:20210110165647j:plain

iOS上でipaファイルをインストールする

iOSも同様にメールの案内に従ってアプリをインストールします。一連の作業はSafariで行う必要があるためSafariの起動を促されます。SafariでコピーしたURLを起動してGoogleアカウントで認証します。

f:id:takamii228:20210110163916j:plainf:id:takamii228:20210110165935p:plainf:id:takamii228:20210110170010p:plainf:id:takamii228:20210110164024j:plain

iOSの場合はFirebase App DistributionからのOver The Air方式でのアプリのインストールを許可するために、プロファイルのインストール作業が別途必要になります。合わせてFirebase App Distributionへデバイス登録の処理が走ります。

f:id:takamii228:20210110164032j:plainf:id:takamii228:20210110170333p:plainf:id:takamii228:20210110170358p:plainf:id:takamii228:20210110170420p:plain

プロファイルの設定が完了するとアプリがインストールできるようになります。Firebase App Testerへのショートカットもホームスクリーンに追加されていますね。

f:id:takamii228:20210110164230j:plainf:id:takamii228:20210110164243j:plainf:id:takamii228:20210110170611p:plainf:id:takamii228:20210110170658p:plain

以上がFirebase App DistributionでのAndroidiOSアプリの配布・インストール手順になります。

インストールしたあとにコンソール画面を見てみるとちゃんとインストールされた数がカウントされています。

f:id:takamii228:20210110170935p:plain

f:id:takamii228:20210110170947p:plain

5. テストグループを使った権限制御

上記の手順ではDevelopersグループへの配信を行っていました。試しにSalesMembersのアカウントでダウンロード画面を見てみたら以下のような画面になっていました。きちんと配信対象の制御ができてそうです。

f:id:takamii228:20210110171303j:plainf:id:takamii228:20210110171312p:plain

パイプラインとの統合

以上の検証からFirebase CLIを使ってApp Distributionを使ったアプリ配布ができました。 あとはtag pushやreleaseブランチ作成契機でapkファイル作成、ipaファイル作成を行った後に、Firebase CLIを使ってApp Distributionにアップロードするパイプラインを作成すれば、以下のようなモバイルアプリの継続的デリバリーを実現するCDパイプラインが実現できそうです。

Release Noteパラメータにtag名を連携するとアプリのバージョン区別として利用できそうです。

f:id:takamii228:20210110172014p:plain

その他の機能

Firebase App Distributionはアプリの配布以外にもiOSのみですが、in-app alertsという機能が提供されているようです。 こちらをアプリに組み込んでおくと、最新のアプリが配布された場合にアプリ上でダイアログで教えてくれるようになるようです。

firebase.google.com

その他のアップデートは11月の公式ブログで紹介されています。SDK経由でこれから様々な機能追加が期待されますね。

firebase.googleblog.com

まとめ

以上がFirebase App Distribution経由でapk・ipaファイルを配信する手順になります。

内部で手軽にアプリを配信できるような仕組みを用意しておくことで、モバイルアプリでもサーバサイドと同等レベルのよりEnd-to-Endの継続的デリバリーが実現でき、QAやUI確認等の開発のフィードバックライフサイクルをより短縮することができるでしょう。