ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

JRuby と SQL Server を利用した Rails の開発環境を作る

この記事は、永和システムマネジメントのアドベントカレンダー 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-mssqlactiverecord-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