Flutter + fastlaneでCICDしよう

はじめに

Flutter 1.0!!! ついに来ましたね!!!

この記事はFlutter #2 Advent Calendar 2018 5日目の記事です。

2日前にFlutterのビルドコマンドを追ってみようを投稿したのですが、せっかくFlutterが面白い感じになっているのにカレンダーが開いているのはもったいないよなー、と言うことで1日開けて投稿します。

Flutter + CICID

個人開発であれ、業務開発であれ、CIやCDは開発の質を上げる取り組みとして当たり前に取り組まれるようになってきました。しかしながら、CIやCDの環境を0から組み上げるのは難しく、案外参考となる事例がないものです。

今回はFlutterでCICDを考えるときに検討すると良さそうな項目の列挙と、いくつか試みてみた中で気づいたことをまとめてみたいと思います。あくまで個人の体験ベースとなりますが、参考になれば幸いです。

概略

公式ドキュメントはこちら。

flutter.io

Flutterの公式サンプルはこちら。

flutter/examples/flutter_gallery at master · flutter/flutter · GitHub

まずは上記2ページに軽く目を通すことをお勧めします。

公式ドキュメントはFlutterとfastlaneを組み合わせ、ビルドする方法を紹介しています。 flutter buildコマンドによってapkappを生成、生成されたファイルをfastlaneを利用して操作していますね。 fastlaneは直接Flutterへの操作はしておらず、あくまで生成されたAndroidiOSの世界の成果物に対して処理をするだけという点を注意してもらえれば、読み取りやすいかなと思います。

この構成はCI環境に依存しないことを強く意識しているのかな、と個人的に感じますね。

先日の記事で書いた通り、FlutterのbuildコマンドはDartファイルです。 そのためFlutter SDKさえ用意してしまえば(Flutter SDKをgitで落としてしまえば)、Flutterプロジェクトはビルドすることが可能です。

このため「Flutterのgitを落とす -> Flutter buildコマンドを実行する -> android or iosディレクトリへ移動する -> fastlaneを実行する」という手順を実現するスクリプトさえあれば環境を選びません。 つまり、どのCIサーバー上であってもFlutterのCI環境として利用できるという仕組みです。面白い。

備考:Fastlaneって?

docs.fastlane.tools

iOSエンジニアの方は馴染み深いツールになるかと思いますが、Androidエンジニアで触れている方は少数派なのではないでしょうか? fastlaneには解説記事があるため、しっかりと理解したい方は個別に検索していただければと思います。本ブログ記事で必要となる知識は、だいたい下記の通りです。

  1. fastlaneはRubyで書かれたビルド、アップロード処理などを簡易に記述できるツール
    1. Jenkinsのスクリプトや、Gradle pluginにより追加されるtaskのようなもの
    2. Google Play Console/iTunes Connectへのアップロードスクリプトも用意済み
  2. fastlaneの記述
    1. Fastfileに記述されたlaneと呼ばれる実行単位がある
    2. アプリIDを管理するAppflieなど、いくつかの環境設定用ファイルも存在する
  3. 動作するOS
    1. macOSはもちろんLinux上でも動作するため、各種CIサービス上で走らせることができる
    2. CIサービスごとに用意されたスクリプトではないため、CIのロックインをある程度防げる

利用例

以前FlutterのCIについてLTしました。

speakerdeck.com

github.com

発表時からの変化としては、 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 BetaGoogle Play Consoleへアップロードすることは簡単です。 同様にiOSアプリでは多くの場合fastlaneを利用するでしょうが、BitriseなどのiOSアプリ対応CIに用意されているステップの組み合わせで対応することも可能と言えます。

AndroidiOSの両環境を同時に対応する場合には、fastlaneを導入しておいたほうがよさそうです。 これはfastfileに処理がまとめられるという話以上に、AndroidiOSの両環境をビルドできるCIサーバーのスイッチングコストが挙げられます。

多くの場合、iOSのビルド環境を整えるためには課金プランの登録が必要です。そのため、料金プランの変更や新たなCI環境への以降を検討するケースを想定しておくべきだと考えます。

例えば開発開始時にBitriseを選び無料プランで開発を進めていたところ、1つのタグからAndroidiOSのビルドが10分以内に終わらなくなり、有料プランへ移動するケースなどです。

このためCIサービスに依存しない形でビルドやアップロード処理を記述しておくことが、各OSのみの場合よりも重要になるのではないか、と睨んでいます。 この辺りは実際にビルドするプロジェクトが増えてくれば、知見として共有されていくと思われます。

終わりに

駆け足ではありましたが、Flutter + fastlaneによるCICD環境の紹介をしました。 Flutterのビルド環境などを追っている時にも感じたのですが、AndroidiOSのプロジェクトで蓄積された知見を元にFlutterの環境は構築されています。また、常にマルチプラットフォームが意識されているなと思います。(CI環境でも、どこでも対応できるように作られていると感じました。)

ぜひぜひCICD環境を構築して、今まで以上にFlutterで高速な開発をしてみてください! 明日は superman9387さんの投稿になります。お楽しみに!