はじめに
Flutter 1.0!!! ついに来ましたね!!!
We just announced the general availability of Flutter 1.0 at #FlutterLive!
— Flutter (@flutterio) 2018年12月4日
Thank you to all the amazing engineers who made this possible and to our awesome community for their support. pic.twitter.com/ncrTMBFjex
この記事はFlutter #2 Advent Calendar 2018 5日目の記事です。
2日前にFlutterのビルドコマンドを追ってみようを投稿したのですが、せっかくFlutterが面白い感じになっているのにカレンダーが開いているのはもったいないよなー、と言うことで1日開けて投稿します。
Flutter + CICID
個人開発であれ、業務開発であれ、CIやCDは開発の質を上げる取り組みとして当たり前に取り組まれるようになってきました。しかしながら、CIやCDの環境を0から組み上げるのは難しく、案外参考となる事例がないものです。
今回はFlutterでCICDを考えるときに検討すると良さそうな項目の列挙と、いくつか試みてみた中で気づいたことをまとめてみたいと思います。あくまで個人の体験ベースとなりますが、参考になれば幸いです。
概略
公式ドキュメントはこちら。
Flutterの公式サンプルはこちら。
flutter/examples/flutter_gallery at master · flutter/flutter · GitHub
まずは上記2ページに軽く目を通すことをお勧めします。
公式ドキュメントはFlutterとfastlaneを組み合わせ、ビルドする方法を紹介しています。
flutter build
コマンドによってapk
やapp
を生成、生成されたファイルをfastlane
を利用して操作していますね。
fastlane
は直接Flutterへの操作はしておらず、あくまで生成されたAndroidやiOSの世界の成果物に対して処理をするだけという点を注意してもらえれば、読み取りやすいかなと思います。
この構成はCI環境に依存しないことを強く意識しているのかな、と個人的に感じますね。
先日の記事で書いた通り、FlutterのbuildコマンドはDartファイルです。 そのためFlutter SDKさえ用意してしまえば(Flutter SDKをgitで落としてしまえば)、Flutterプロジェクトはビルドすることが可能です。
このため「Flutterのgitを落とす -> Flutter buildコマンドを実行する -> android or iosディレクトリへ移動する -> fastlaneを実行する」という手順を実現するスクリプトさえあれば環境を選びません。 つまり、どのCIサーバー上であってもFlutterのCI環境として利用できるという仕組みです。面白い。
備考:Fastlaneって?
iOSエンジニアの方は馴染み深いツールになるかと思いますが、Androidエンジニアで触れている方は少数派なのではないでしょうか? fastlaneには解説記事があるため、しっかりと理解したい方は個別に検索していただければと思います。本ブログ記事で必要となる知識は、だいたい下記の通りです。
- fastlaneはRubyで書かれたビルド、アップロード処理などを簡易に記述できるツール
- Jenkinsのスクリプトや、Gradle pluginにより追加されるtaskのようなもの
- Google Play Console/iTunes Connectへのアップロードスクリプトも用意済み
- fastlaneの記述
- Fastfileに記述されたlaneと呼ばれる実行単位がある
- アプリIDを管理するAppflieなど、いくつかの環境設定用ファイルも存在する
- 動作するOS
利用例
以前FlutterのCIについてLTしました。
発表時からの変化としては、 Flutter + Bitrise + DeployGateから Flutter + fastlane + Bitrise + DeployGateの構成になりました。(パブリックリポジトリのため、どこまでFastfileへの記述を行うか悩み中ですが、iOSのAdHocビルドはほぼfastlaneで対応しています。)
privateなリポジトリであれば、AndroidではGoogle Play Consoleへのアクセスを行うjsonに関する記述が。 iOSではfastlane matchに関する記述に制約がないと思われるので、ビルド後の処理を全てfastlaneにまとめることができます。
fastlaneの環境構築は、ドキュメントがしっかりとしているので、初めて触った人でも1〜2日で作成できると思われます。 うまく組めないところは、一旦実行スクリプト側で吸収してしまえばなんとかなります。とりあえず動くところまで書いて、後ほど詳細を詰めるスタイルで記述するとハードルが低いのでは、と思っています。
環境構築について
Androidのみ、iOSのみ開発するのであれば、それぞれのドメイン知識だけでどうとでもなる印象があります。
Androidアプリであれば、fastlaneを利用せずともGradleプラグインでflutter build apk
し、Crashlytics Beta
やGoogle Play Console
へアップロードすることは簡単です。
同様にiOSアプリでは多くの場合fastlaneを利用するでしょうが、BitriseなどのiOSアプリ対応CIに用意されているステップの組み合わせで対応することも可能と言えます。
AndroidとiOSの両環境を同時に対応する場合には、fastlaneを導入しておいたほうがよさそうです。 これはfastfileに処理がまとめられるという話以上に、AndroidとiOSの両環境をビルドできるCIサーバーのスイッチングコストが挙げられます。
多くの場合、iOSのビルド環境を整えるためには課金プランの登録が必要です。そのため、料金プランの変更や新たなCI環境への以降を検討するケースを想定しておくべきだと考えます。
例えば開発開始時にBitriseを選び無料プランで開発を進めていたところ、1つのタグからAndroidとiOSのビルドが10分以内に終わらなくなり、有料プランへ移動するケースなどです。
このためCIサービスに依存しない形でビルドやアップロード処理を記述しておくことが、各OSのみの場合よりも重要になるのではないか、と睨んでいます。 この辺りは実際にビルドするプロジェクトが増えてくれば、知見として共有されていくと思われます。
終わりに
駆け足ではありましたが、Flutter + fastlaneによるCICD環境の紹介をしました。 Flutterのビルド環境などを追っている時にも感じたのですが、AndroidやiOSのプロジェクトで蓄積された知見を元にFlutterの環境は構築されています。また、常にマルチプラットフォームが意識されているなと思います。(CI環境でも、どこでも対応できるように作られていると感じました。)
ぜひぜひCICD環境を構築して、今まで以上にFlutterで高速な開発をしてみてください! 明日は superman9387さんの投稿になります。お楽しみに!