inSmartBank

AI家計簿アプリ「ワンバンク」を開発・運営する株式会社スマートバンクの Tech Blog です。より幅広いテーマはnoteで発信中です https://note.com/smartbankinc

Close to the Edge: 常にRubyとRuby on Railsの先端を追うという試み

こんにちは。エンジニアの @moznion です。

最新バージョンの言語やライブラリ、追いたいですよね。バグが直っていたり、新しい機能が使えたり、パフォーマンスが改善されていたりと良いことづくめなことに加え、新しいバージョンを使っているとなんだか不思議と気分が良いものです。

スマートバンクではMock Serverと呼ばれている、エンジニアが開発のために使うためのRailsアプリ *1 を内部で運用しています。

今回はこのアプリを最新のRubyとRailsで動かしているという事例を紹介します。

最新のRubyを使う

Mock ServerではDockerを利用して運用されているため、以下のようなDockerfileを記述して最新のRubyに追従しています。

# check=error=true
FROM debian:trixie
# FROM ruby:latest # <= 4.0.0-preview3でzjitを使うためにマニュアルビルドしている。一段落したらこのイメージを使って良い。

WORKDIR /b43-mock-server
ENV LANG=C.UTF-8 \
  DEBIAN_FRONTEND=noninteractive

# Install build tools and dependencies for Ruby and general tools
RUN apt-get update -qq \
  && apt-get -y install --no-install-recommends \
      build-essential \
      autoconf \
      bison \
      libssl-dev \
      libyaml-dev \
      libreadline-dev \
      zlib1g-dev \
      libncurses5-dev \
      libffi-dev \
      libgdbm-dev \
      libjemalloc-dev \
      libsqlite3-dev \
      pkg-config \
      rust-all \
      less \
      jq \
      procps \
      wget \
      tar \
      gzip \
      gcc \
      make \
      git \
      awscli \
      nodejs \
      npm \
      ca-certificates \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

ENV RUBY_VERSION=4.0.0-preview3
RUN wget https://cache.ruby-lang.org/pub/ruby/4.0/ruby-${RUBY_VERSION}.tar.gz \
  && tar xzf ruby-${RUBY_VERSION}.tar.gz \
  && cd ruby-${RUBY_VERSION} \
  && ./configure \
      --disable-install-doc \
      --enable-shared \
      --enable-zjit \
      --enable-yjit \
  && make -j$(nproc) \
  && make install \
  && cd .. \
  && rm -rf ruby-${RUBY_VERSION} ruby-${RUBY_VERSION}.tar.gz
  
# ...

Dockerfile中のコメントにあるように、zjitを有効にするためにRubyをソースコードからビルドしているのですが、たった今確認をしたところ、docker-library/ruby#509 にてzjit対応が取り込まれたので、今は FROM ruby:4.0.0-preview3 と書いてあげるだけで良さそうです。

あるいはrubylang/rubyのコンテナイメージを使うという方法もあるでしょう *2

ちなみに、こちらに関しては「masterブランチのものを使う」という意見も出たのですが、それは流石に攻めすぎだろうということで現状の運用に落ち着いています。

最新のRailsを使う

これに関しては実に簡単。Gemfileに以下のように書くとGitHub上のrails/railsのmainブランチの実装を参照して取ってこられるようになります。

git_source(:github) { |repo| "https://github.com/#{repo}.git" }

gem 'rails', git: 'https://github.com/rails/rails.git', branch: 'main'

[追記]
id:r7kamuraさんから

gem 'rails', github: 'rails/rails', branch: 'main'

だけで動くのでは? というおたよりを頂きました。なるほど、こちらのほうが良さそうです。

[追記ここまで]

そしてdependabotに更新させることで定期的に最新のmainを取り込み、運用をしています。なおMock Serverは毎日自動でデプロイされています。

auto mergedで勢いがあって良いですね

スマートバンクでのdependabotの運用テクニックについてはこちらも併せてご覧ください: GitHub Appを使ってDependabotが作るpull requestを自動マージさせる - inSmartBank

最新に追従しておくことについての良さ

冒頭に書いたように、最新のバージョンはバグが直っていたり新機能が使えたりという良さもありますが、最新のバージョンに追従している環境を1つ運用しておくことによって他に商用で動いているプロダクトのアップグレードの準備ができるという良さもあると考えています。何か不具合や、意図せぬ挙動に出会った時にupstreamにフィードバックしたり、何らかの形で貢献したりもできますしね。

昨今ではRailsのバージョンアップはそこまで困難ではなくなっているかもしれませんが、しかしそれでもアップグレードは慎重に行うべきであるのは変わりません。その実験・検証用途に使える環境があるというのはかなり便利です。

また言語の新しい機能を試してみたり、今回導入されたzjitのような新機軸を試してみるというようなこともできて良いですね。目的としては「検証」が占める割合が大きいですが、単純に「やってみて楽しい」という知的興味を満たすための「おたのしみ」要素も兼ねています。

商用環境では利用しない

先日開催されたRubyリリース30周年パーティーでid:k0kubunさんにも指摘されましたが *3、実際のユーザーに影響のある商用環境では実験的なバージョンを利用するべきではないでしょう。

今回の Mock Server のようなほどよい規模感で、社内の開発者だけが使う、ダウンしても深刻な問題が出ない、というような都合の良い環境があるからこそ試せていることだと思っています。

これはid:sfujiwaraさんが良くおっしゃっている「自分だけの庭を持つと良い」という話に通じるところがあると思っており、そういった「好き勝手に実験ができる環境」を持つというところが実のところ重要なのかもしれません。


というわけで、スマートバンクが実践している「最新のバージョンに追従する」という事例をご紹介しました。みなさんは最新ですか?

スマートバンクでは「最新」が好きなエンジニアを募集しています。

smartbank.co.jp

*1:スマートバンクは決済に利用できるプリペイドカードサービスを提供しているのですが、検証のために都度実決済をしていると破産してしまうので、モックされた決済を実行するというような機能群を備えています

*2:これがやりたかったのでパッチを送ったという経緯があります: https://github.com/ruby/docker-images/pull/142

*3:https://speakerdeck.com/k0kubun/ruby-release-30th-anniversary-party

We create the new normal of easy budgeting, easy banking, and easy living.
In this tech blog, engineers and other members will share their insights.