こんにちは、@tomorrowkey です。 STORES CRMモバイルチームで STORES ブランドアプリ の開発しています。 STORES ブランドアプリ とは、お商売をしているオーナーさんごとにオリジナルアプリを作り、お客様へのクーポンの配布やお店からのご案内をとおして、双方にとってよい関係性を築いていくためのサービスです。
BitriseのLinux系のBuildStackで、Ruby 2.7.xから3.xへの移行がアナウンスされていました。*1
ブランドアプリのCIでもRuby 3.2.1へ移行をしたので、その対応内容を紹介したいと思います。
スケジュール
アナウンスでは、6/12に指定がない場合のRubyバージョンが3.2.xに変更され、6/26にRuby 2.xが削除されるようです。
なぜ最初からRuby 3.xを使っていないのか
ブランドアプリのプロジェクトにCIを導入したのは2022年10月ごろです。Ruby 2.7.xのサポートは 2023年3月にEOLとなることが分かっていましたが、そのときに3.xを使うことができませんでした。
なぜ使えなかったかというと、BitriseのLinux系のBuild StackにはRuby 2.7.xしかインストールされていなかったからです。
Ruby 3.x以降を使うには、Ruby 3.xがインストールされたDockerイメージを自分で用意するか、CIのステップのなかでRubyをインストールするといった方法しかありませんでした。
BitriseでどうやってRuby 3.xに移行すればいいのか
4/25 にRubyバージョンを切り替えられるDockerイメージが公式から提供されるようになりました。
Rubyのバージョン切り替えによく使われるのは rbenvやrvmですが、Bitriseでは asdf が使われています。*2
Rubyだけではなく、他の言語のバージョン切り替えを容易にさせたかったのでrbenvではなくasdfが採用されたのではないかと推測します。 BitriseのLinux系のBuildStackではRubyの他にPythonもインストールされています。
Ruby 3.xを使うにはどうすればいいのか
アナウンスでは2種類の方法を紹介しています。
ビルドステップでバージョンを切り替える
asdfは asdf global ruby 3.2.1
というコマンドで使用するRubyバージョンを切り替えることができます。
ビルドステップの初期で、このコマンドを実行することによってバージョンを切り替えることができます。
バージョン指定するファイルをVCSにコミットする
asdfはプロジェクトのルートディレクトリにある .tools-versions
ファイルを設定ファイルとして使用し、言語のバージョンが決定されます。
例えば次の内容であれば、Ruby 3.2.2とPython 3.10.4が使われるようになります。
ruby 3.2.2 python 3.10.4
このファイルをVCSにコミットしておけばCIでは自動的にRubyのバージョンが切り替わるようになります。
開発環境ではすでにrbenvを使ってるからasdfを使いたくない
CIでRubyバージョンを切り替えるためには .tools-versions
ファイルをコミットするのが一番スマートだなと思いますが
開発チームではrbenvが広く使われているということであれば、.ruby-version
ファイルと .tools-versions
両方をコミットしておく必要があります。
asdfでは .ruby-version
ファイルを使うことができるオプションが用意されていますが、残念ながらBitriseではデフォルトで有効になっていませんでした。
両方をコミットしておくのは二重管理になってしまうので、避けたいです。
そこで、VCSには .ruby-version
をコミットしておくようにして、CIではこのファイルを読み取ってasdfでバージョン指定するようにすることで解決しました。
- script@1: title: Set Ruby version inputs: - content: |- #!/usr/bin/env bash set -eo pipefail asdf global ruby $(cat .ruby-version)
これによって開発環境とCIで同じRubyバージョンを扱うことができるようになりました。
おわりに
BitriseでのRubyバージョン切り替えの方法を紹介しました。実際には単に切り替えるだけではなくさらにRubyのAPI変更に追従も必要ですが、Fastlaneで使っているスクリプトでは大した内容はなかったので、割愛します。 STORES ブランドアプリのモバイルアプリ開発は多くのアプリをビルドする必要があり、CIに対する改善が不可欠なチームになっています。ただアプリを作るだけでなく、どうやったら効率よく開発を進められるか考えることが好きな方がいらっしゃいましたら、ぜひ一緒にモバイルアプリ開発をしましょう。