STORES Product Blog

こだわりを持ったお商売を支える「STORES」のテクノロジー部門のメンバーによるブログです。

Bitrise CIでRuby 2.7 EOL対応をした

こんにちは、@tomorrowkey です。 STORES CRMモバイルチームで STORES ブランドアプリ の開発しています。 STORES ブランドアプリ とは、お商売をしているオーナーさんごとにオリジナルアプリを作り、お客様へのクーポンの配布やお店からのご案内をとおして、双方にとってよい関係性を築いていくためのサービスです。

STORES ブランドアプリ

BitriseのLinux系のBuildStackで、Ruby 2.7.xから3.xへの移行がアナウンスされていました。*1

discuss.bitrise.io

ブランドアプリの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イメージが公式から提供されるようになりました。

discuss.bitrise.io

Rubyのバージョン切り替えによく使われるのは rbenvやrvmですが、Bitriseでは asdf が使われています。*2

https://asdf-vm.com/

Rubyだけではなく、他の言語のバージョン切り替えを容易にさせたかったのでrbenvではなくasdfが採用されたのではないかと推測します。 BitriseのLinux系のBuildStackではRubyの他にPythonもインストールされています。

Ruby 3.xを使うにはどうすればいいのか

アナウンスでは2種類の方法を紹介しています。

ビルドステップでバージョンを切り替える

asdfasdf 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バージョン切り替えの方法を紹介しました。実際には単に切り替えるだけではなくさらにRubyAPI変更に追従も必要ですが、Fastlaneで使っているスクリプトでは大した内容はなかったので、割愛します。 STORES ブランドアプリのモバイルアプリ開発は多くのアプリをビルドする必要があり、CIに対する改善が不可欠なチームになっています。ただアプリを作るだけでなく、どうやったら効率よく開発を進められるか考えることが好きな方がいらっしゃいましたら、ぜひ一緒にモバイルアプリ開発をしましょう。

*1:macOSのBuildStackでは以前からrbenvを利用することができたため、すでにRuby 3.xを利用しているということであれば、iOS向けのCIでは対応は必要ありません。

*2:asdfでも内部的にはrbenvが使われています