😎

「ruby on rails」開発環境(「WSL2」の「docker compose」で動作)にてリモートデバッグを使えるようにした話

に公開

はじめに

諸事情があり、
ruby '3.1.2'
'rails', '~> 7.0.3'
と古めのため
新しめのバージョンだと若干、変わるかもしれません。

すいません、詳しくは、わかってません。

現時点でわかったことだけ、記述しました。

今後、詳しくわかれば、加筆、修正するかもしれません。

各種構成

「.env」と「.env.example」を作成した

プロジェクトルートの直下に、

  • .env
  • .env.example
    を作成した「.env」は「.gitignore」に追加した

.gitignore
(抜粋)

.idea
.DS_Store
.vscode
.env

.env.example

WORKSPACE_PATH=/path/to/your/workspace

.envは、同じフォーマットで、/path/to/your/workspaceの部分を
実際値とした。

なのですが、この記事では、
プロジェクトルートのフォルダを「/path/to/your/workspace」として
説明を書くこととする

この環境変数「WORKSPACE_PATH」は、
後述の「docker-compose.yml」で利用可能な状態として
実際に利用しているのは、後述の「Procfile.dev」である。

docker-compose.yml

  • 12345ポートの追加
  • 「foreman start」に「-f Procfile.dev」を追加
  • 「environment:」に「- WORKSPACE_PATH=${WORKSPACE_PATH}」を追加した

対応前(該当箇所抜粋)

  app: 
    build: .
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    command: bash -c "bundle install && bundle exec foreman start"
    depends_on:
      - mailcatcher
      - redis
    environment:
      - TZ=Asia/Tokyo

対応後(該当箇所抜粋)

  app: 
    build: .
    volumes:
      - .:/app
    ports:
      - "3000:3000"
      - "12345:12345"    # ★ rdbg用のデバッグポート
    command: bash -c "bundle install && bundle exec foreman start -f Procfile.dev"
    depends_on:
      - mailcatcher
      - redis
    environment:
      - TZ=Asia/Tokyo
      - WORKSPACE_PATH=${WORKSPACE_PATH}

Procfile.dev

Procfile.devをプロジェクトルートの直下 ( docker-compose.ymlと同じ位置 )
に作って下記の中身にした

web: bash -lc 'printf "config set :no_quit true\nconfig set :map /app ${WORKSPACE_PATH}\n" > /tmp/rdbg.init && exec bundle exec rdbg -n -O --open --host 0.0.0.0 --port 12345 -x /tmp/rdbg.init -- bin/rails s -b 0.0.0.0 -p 3000'
sidekiq: bundle exec sidekiq -q default

docker-compose.ymlに

    volumes:
      - .:/app

の記述があるため、
rdbgデバッガーが、例として
コンテナ側のパス
/app/app/controllers/xxxx_controller.rb

ホスト側のパス
/path/to/your/workspace/app/controllers/xxxx_controller.rb
に対応していることを理解しなければならない
そのためのパスマッピングの設定が必要である

config set :map /app ${WORKSPACE_PATH}
の部分がそれに該当し、
${WORKSPACE_PATH}の値は、/path/to/your/workspace などとなり
実際の値は、.envに書いておくことにしている。

具体的な設定値は、/tmp/rdbg.init に書き込まれることとなり
それを読み込んだ、「exec bundle exec rdbg なにがし」の
内部として「bin/rails s -b 0.0.0.0 -p 3000」が起動するような構成にしてある。

Procfile
が下記の通り、存在し、「sidekiq: bundle exec sidekiq -q default」
の部分は、上記のProcfile.devではそのまま持ってきた

web: bin/rails s -p 3000 -b 0.0.0.0
sidekiq: bundle exec sidekiq -q default

Gemfile

group :development, :test do
の内部に、「gem 'debug'」の記述が必要であるとのこと

<抜粋>

group :development, :test do
  # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
  gem 'debug', '~> 1.11.0', platforms: %i[mri mingw x64_mingw]

launch.json

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "rdbg",
      "name": "Attach: Rails in Docker",
      "request": "attach",
      "rdbgPath": "rdbg",
      "debugPort": "127.0.0.1:12345",
      "localfsMap": "/app:${workspaceFolder}"
    }
  ]
}

VS Code拡張機能

どれが決め手でデバッガーが動いたのか不明です
https://marketplace.visualstudio.com/items?itemName=koichisasada.vscode-rdbg
https://marketplace.visualstudio.com/items?itemName=shopify.ruby-extensions-pack
https://marketplace.visualstudio.com/items?itemName=shopify.ruby-lsp
https://marketplace.visualstudio.com/items?itemName=sorbet.sorbet-vscode-extension
を入れた状況で
デバッガーの動作に成功しました。

Discussion