この記事は、永和システムマネジメントのアドベントカレンダー ESM Advent Calendar 2024 の 3 日目の記事です。
はじめに
@wai-doi です。自分が以前アサインされていた Rails アプリケーションは、古い JRuby と Rails に SQL Server を組み合わせた構成のアプリケーションでした。
最近の Rails で JRuby と SQL Server を使った構成で開発をしようとする場合、どのように環境構築できるのか気になったため調べてみました。
方針
なるべく個人の環境に依存しないように Docker を利用して構築します。また、Rails 7.2 から rails new
で作成できるようになった Dev Container を利用してみることにしました。
目標は、ローカル環境で Scaffold を生成して CRUD 操作ができるようになるまでとしました。
実行環境
- Apple M3 Pro
- macOS Sonoma 14.4
- Docker Desktop 4.32.0
利用した Docker Image
JRuby
JRuby の公式のイメージを利用しました。
https://hub.docker.com/_/jruby
JRuby のバージョンは 9.4.8.0
、Java のバージョンは 11 の jruby:9.4.8.0-jdk11
のイメージを利用しました。 11 を利用した理由は後述します。
SQL Server
SQL Server には Microsoft の公式が出しているイメージを利用しました。
https://hub.docker.com/r/microsoft/mssql-server
最新の mcr.microsoft.com/mssql/server:2022-latest
のイメージを利用しました。
docker-compose.yml
docker-compose.yml は以下のようになりました。
version: '3'
services:
app:
image: jruby:9.4.8.0-jdk11
command: sleep infinity
environment:
DB_USER: sa
DB_PASSWORD: Passw0rd!
volumes:
- ..:/workspace:cached
- bundle:/usr/local/bundle
network_mode: service:db
db:
platform: linux/amd64
image: mcr.microsoft.com/mssql/server:2022-latest
environment:
ACCEPT_EULA: Y
MSSQL_SA_PASSWORD: Passw0rd!
volumes:
- mssql-data:/var/opt/mssql
volumes:
bundle:
mssql-data:
JRuby で動作する Rails の app サービスと、SQL Server の db サービスの構成です。
db の environment にある ACCEPT_EULA: Y
は Microsoft のライセンスに承諾するために必要です。MSSQL_SA_PASSWORD
には任意のパスワードが必要です。このパスワードと同じものを app から sa
ユーザーで接続するときに必要になるため、後で database.yml で利用できるよう environment に書いています。
devcontainer.json
Dev Container で開発できるように devcontainer.json
を作成し、以下のようになりました。
{
"name": "jruby_mssql_rails_app",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"username": "vscode"
}
},
"remoteUser": "vscode"
}
dockerComposeFile
に先ほどの docker-compose.yml
を指定して、service
に JRuby コンテナのサービス名の app
を入れます。
features の common-utils
は今回は関係ないですが、開発をするための便利なコマンドを使えるにするために入れています。 vscode
という一般ユーザーを作っています。
利用した gem
Railsで JRuby と SQL Server を利用できるようにするための gem を紹介します。
activerecord-jdbc-alt-adapter
https://rubygems.org/gems/activerecord-jdbc-alt-adapter
activerecord-jdbc-alt-adapter
は JRuby 対応の ActiveRecord と SQL Server の Adapter 用の gemです。今回調べた中では、比較的メンテナンスされている gem でした。
安定版で最新の 70.2 を使います。そのため、対応している Rails は 7.0 系になります。
※ 類似の gem として
activerecord-jdbcsqlserver-adapter がありましたが、Rails 5.2 系への対応からメンテナンスが止まってしまっているようなので、今回は利用しませんでした。
jdbc-mssql
jdbc-mssql
は activerecord-jdbc-alt-adapter
の README の Usage に書かれていた gem でしたので利用します。JDBC Driver が同梱されているようです。
https://bundler.rubygems.org/gems/jdbc-mssql
安定版で最新は 12.2.0 でしたが、DB 接続時に ActiveRecord::JDBCError: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption.
のエラーが発生してしまいました。
jdbc-mssql
が 0.9.0、Java が 11 の組み合わせでうまく行きましたので、jdbc-mssql
は 0.9.0 を利用しました。
Gemfile
Gemfile
の一部抜粋は以下のようになりました。
gem "rails", "7.0.8.6"
platforms :jruby do
gem "activerecord-jdbc-alt-adapter", "70.2.0"
gem "jdbc-mssql", "0.9.0"
end
Rails は 7.0 系で最新の 7.0.8.6 を利用しました。
前述した gem は platforms :jruby
のブロックの中に追加します。
database.yml
config/database.yml
は以下のようになりました。
default: &default
adapter: sqlserver
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV['DB_USER'] %>
password: <%= ENV['DB_PASSWORD'] %>
development:
<<: *default
database: jruby_mssql_rails_app_development
adapter には sqlserver
を指定します。
username と password には docker-compose.yml
で設定した環境変数を用いています。
おわりに
以上の環境構築を行なって、Scaffold で簡単に動作確認できることを確認できました。
今回環境構築したコードは https://github.com/wai-doi/jruby-mssql-rails-app へ上げていますのでご参照ください。
今回のようなマイナーな構成では利用できる gem の調査に苦労しましたが、いろんな構成を経験することで知見が広がり、よい取り組みになりました。
株式会社永和システムマネジメントでは、Ruby とアジャイルソフトウェア開発を通じてコミュニティと成長したいエンジニアを絶賛募集しています。
agile.esm.co.jp