CIを使ってFlutterのCI/CDをやっているのですが、CI環境において複数のFlutterのバージョンを管理する必要があり、少し悩んだので以下にまとめます。mini上で動かしています。今回、Flutterのバージョンアップの検証が必要になったのですが、すでに配信中のアプリで利用しているFlutterのバージョンに対してはバージョンアップが完了するまでの間に緊急パッチを宛てる可能性があります。そのため、緊急パッチのビルド時につかうFlutterのバージョンと、バージョンアップ検証で使うFlutterのバージョンをそれぞれのビルドで使い分ける必要があります。検討した解決策CI環境上で複数のflutterのバージョンを動作させる方法として、以下の2つ案を考えました。CIの実行時に使うバージョンを動的に切り替えられるようにするメリット・デメリットは以下の通りです。Runnerに対応するブランチの命名規則を決める必要がある.gitlab-ci.ymlの設定が煩雑になる。Runnerで実行させる、という設定ができます。https://docs.gitlab.com/ce/ci/yaml/しかしデメリットで書いた通り、普段の開発においてはfetuareブランチやhotfixブランチを切ったりリリースタグを切ったりとブランチの命名規則を複数考慮してgitlab-ci.ymlを設定するのはなかなか骨が折れます。今回は設定が煩雑になることに加え、バージョンアップ版のリリースまでの移行期間のみ並行運用が走ること、また都度実行で増える実行時間が2-3分程度で待てるレベルであることを踏まえて2を選択することにしました。各ビルドで使うflutterのバージョンはpubspec.yamlに記載できるため、それを使ってflutterのバージョンを切り替えてからCIを実行するように.gitlab-ci.ymlを設定します。1.9.1+hotfix.6...yamlから特定のキーの値を取得するのにはyqが使えます。yq.readthedocs.iopubspec.yamlに記載されたバージョンでflutterのversionを切り替えるシェルは以下のように記載できます。checkoutするときに付与する必要があります。channelで事前に指定し、かつupgradeを実行して最新化しておく必要があります。versionコマンドは失敗してしまいます。1.13.3.なので、今回はflutterコマンドがインストールされている場所~/development/flutterに移動し、master上でpullして都度タグをcheckoutする方式を取るようにしました。precacheすることで依存するライブラリが落ちてきます。Flutter最後に↑のシェルを.gitlab-ci.ymlのbefore_scriptの中で実行するように設定すれば完成です。./set-flutter-version.sh...似たような感じでxcode-selectすればXCodeのバージョンも指定できそうですね。buildなどと同様にビルドさせる環境のツールのバージョンはgitレポジトリに定義含めてしまって、CIの実行の度に動的に変えられるようにしておくと管理が便利になりますね。Buildみたいにキャッシュできたらいいのになー。Runner上で動的に切り替えるTweet広告を非表示にするもっと読むコメントを書く2019-12-14FlutterでID/Password入力画面を作ってみるFlutterでID/Pass入力画面を作るときに設定するのパラメータをちょっと調べたのてまとめてみます。(※入力のバリデーションやオートフォーカス等のアクションは含みません)よくあるID/Pass入力画面の要件よくあるID/Passの入力画面の要件といえばこんな感じでしょうか。半角英数が入力できるPassword半角英数が入力できる入力内容はマスクしたい入力内容を確認したいので、マスクの表示非表示を切り替えられるようにしたい予測変換はさせたくないしヒストリーに記録なんてさせたくない入力欄のコピペはブロックしたい入力フォームはTextInputFiledを使えば実現できます。中でTextFieldをラップしているようです。API上記の要件に絡みそうなパラメータは以下の通りです。obscureText入力内容のマスク表示の切り替えautocorrectオートコレクト・予測変換の有効・無効化enableInteractiveSelection入力エリアのセレクトアクション(コピペ、選択、削除など)の有効・無効化TextInputType立ち上げるキーボードタイプ。APIdatetimeemailAddressmultilinenumberphonetexturlvisiblePassword今回の要件では、以下のような設定にするのがよさそうです。メールアドレスとかだとサジェストがあると嬉しいかもしれない。コピペしたいケースがありそうなので。IDがメールアドレスのケースも多く、とりあえず半角英数で立ち上がってほしいので。右端に目のアイコンを用意し、クリックで切り替えられるようにする。パスワードは守りたいので。コピペはブロックしたいので。パスワードを見せる専用のキーボードタイプ。v1.9.1+hotfix-6から使える模様。Widgetに上記の設定をしてiOS/Androidそれぞれエミュレータで動かしてみます。今回試したコードサンプルはこちら。garallyにもあり、今回の実装の参考にしました。github.com実行環境は以下の通りです。(simulator)挙動確認iOS想定通り動いてそうです。AndroidAndroidも大丈夫そうです。余談:TextInputTypeがvisiblePasswordじゃないとAndroidでautocorrectが効かないらしい。そもそもFlutterにはautocorrectのバグがあったようです。github.comこのバグの対処のために、最新のstableであるv1.12.13+hotfix.5ではenableSuggestionsというパラメータが追加されたようです。このパラメータ追加で予測変換を一律制御できるのかな〜と思ったのですがそもそもAndroidのみとのこと。IssueのコメントにあるようにTextInputType.textだと予測変換の無効化は効かない模様。入力のI/O周りはAndroidとiOSの両OSのモジュールをうまくラップして制御するのが難しいのでしょうかね。いえばWebやDesktopもあるんだった・・・。あと今回他のサービスはどうなってるのかな〜と思っていろいろ調べたのですが、ほとんどがWebViewでの入力画面が立ち上がるパターンでした。API経由で取得するシェルを書きました。${TAG_NAME},${TIMESTAMP_JST}donetag一覧の取得は/api/v4/projects/${PROJECT_ID}/repository/tagsのエンドポイントを叩くと取れます。https://docs.gitlab.com/ce/api/tag一覧の取得はページングのハンドリングが必要なので、レスポンスヘッダーのX-Total-Pagesからページ数を取得し、最終的にはfor文で回してjqで加工したものを連結します。タイムゾーンの設定によってはUTCで結果が帰ってくるので、最後にdateコマンドでJSTに変換しています。上記のシェルを実行すると以下のようなcsvが取得できます。1.5.0,2019-09-30T10:59:49.000Z1.4.0,2019-09-26T15:35:21.000Z1.3.2,2019-09-20T19:00:11.000Z1.3.1,2019-09-17T18:21:30.000Z1.3.0,2019-09-11T21:01:37.000Z1.2.0,2019-09-03T22:08:34.000Z1.1.0,2019-08-27T22:41:38.000Z1.0.2,2019-08-20T22:37:28.000Z1.0.1,2019-08-13T22:13:56.000Z1.0.0,2019-08-06T21:38:05.000Z0.3.0,2019-07-30T21:16:30.000Z0.2.0,2019-07-23T22:38:51.000Z0.1.0,2019-07-17T15:30:01.000ZあとはこれをSpreadSheetなりExcelなりPythonなりで集計すればリリース頻度の分析の集計ができます。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。