見出し画像

Github Actions で Firebase App Distribution にデプロイする

お世話になります。 watura Inc. の watura です。別記事に書いたように株式会社 watura を作ったので名乗ってみました。
ややこしいですね。ということで、ハンドルネームをそのまま会社名にするのはダメそうってことがよくわかりました。

前に、Bitrise を使ってデプロイするぞーという記事を書きました。

本業としては、11月から WillBooster 株式会社で働いていて、そこで表題を達成したので記事にしてみました。

Github Actions とは

Github が提供している、CI/CD です。2019/11/13 から正式に提供されました。

Github Actions を使いたかった理由としては、

無料で始められる
Github だけで始められる
Git 連携が強い

Bitrise や Jenkins などの既存 CI は、web hook を使ったり、ポーリングしたりという面倒なことをやって、git の更新をしるという手続きが必要でした。
それが、YAMLにちょろっと書くだけで、今までだと面倒だったことができるようになったのは非常に嬉しかったです。

Flutter アプリをデプロイする

さて、今私は Flutter を使ったアプリを作っています。まだ、作り始めたところでほとんど何もないのですが、Firebase App Distribution に Github Actions 経由でデプロイできるようにしました。

大きくなる前から、手軽に実機で使い続けられるようにするのはなかなかいいですよ。

Flutter でCDする詳細な方法は、公式ドキュメントを参照してください。

Android

人生初めてのAndroidアプリの配信だったので、 鍵まわりをどう管理するのがいいのかわからなかったので手動で作ってみました。もっと正しい管理の方法があれば知りたいです。。。

1. ソースコードのチェックアウト
2. Flutter のインストール
3. パスワード類のファイル作成
4. APK を作る
5. artifact として github からダウンロードできるようにする
6. firebase-tools を入れて、distribution にアップロード

と言う流れになっています。

Github Actions では秘匿値を、設定画面から登録すると、${{ secrets.HOGEEE }} でアクセスできるようになります。
これを使って、漏れたら困る値を管理します。

Firebase command の実行

yarn add firebase-tools をしておいて、yarn firebase で実行できるようにしています。

探していないので、あるかわからないですが、Github Actions にも Firebase Tools を使うアクションがすでに登録されているかもしれないです。

Firebase App Distribution へのアップロードに FIREBASE_TOKEN というものを渡しているのですが、これは firebase login:ci で作れる値です。

Flutter の Web 対応とか面白そうだなぁと触っていたので、Flutter は dev channel を入れてみています。

iOS

Android に比べて、iOS は少し複雑になっています。
Github Actions だけではなく、いつものように fastlane を使います。

fastlane が必要になる理由ですが、 flutter command では ipa を作れないためと、いつもの証明書系管理ですね。
Runner.app と言うふうに .app なら作れるのですが、.ipa は作れません。

1. ソースコードのチェックアウト
2. Flutter のインストール
3. .app を作る
4. fastlane でビルドする
       1. Match で証明書類を取得する
       2. automatic_code_signing で証明書類をセットする
       3. gym でビルドする
5. firebase-tools を入れて、distribution にアップロード を渡しています。

CI で match を実行するときにハマるポイントとして、パスワード付きのTemporary Keychain を使わないといけないようです。

MATCH_KEYCHAIN_NAMEMATCH_KEYCHAIN_PASSWORD を指定すると、match側で使ってくれるようになります。

    if is_ci
     ENV['MATCH_KEYCHAIN_NAME'] = 'TempKeychain'
     ENV['MATCH_KEYCHAIN_PASSWORD'] = 'TempKeychainPassword'
     create_temp_keychain
   end
  private_lane :create_temp_keychain do
   create_keychain(
       name: ENV['MATCH_KEYCHAIN_NAME'],
       password: ENV['MATCH_KEYCHAIN_PASSWORD'],
       timeout: 1800
   )
 end

4-1 の PERSONAL_TOKEN は Github の Personal Access Token を Github Actions 側から渡しています。

細かいコードは Gist をみて欲しいのですが、これだけの設定で Github Actions を使って Flutter アプリを Firebase App Distribution にアップロードできるようになりました。
なお、最後の Firebase にあげているところを、DeployGate とかにすれば同じように簡単にアップロードできると思います。


もっと改良できたらいいなぁという感じのコードになっているので、きっといつか時間を見つけてもっといい感じにしたいです。

iOS, Android 両方いっぺんにキャッシュを使ってやる
全部 fastlane で頑張る
全部 Github Actions で頑張る
各TOKEN の取り扱い(個人アカウントに依存)
TestFlight や AppStore にデプロイする

などなど。

まとめ

Github Actions を使うには、YAML を書くだけでいいです。GUI で楽々設定とかはできないですが、よくある YAML を書くだけでできるのはいい感じです。また、Git との連携が他の CI/CD に比べて密なのもいいと思いました。

Flutter のデプロイは若干不便な感じですが、一回こう作ったことで、次に別のプロダクトをデプロイするぞってなっても流用できそうです。

今後、CI/CD が必要な状況になったら積極的に Github Actions を使うのではないかと思います。 Bitrise も大好きなんですけどね

この記事が気に入ったらサポートをしてみませんか?