Linux Ruby3.3.1インストール完全に理解した(rbenv)

# 環境

H/W : HP ENVY x360 Convertible 13-ar0xxx(CPU:Ryzen7 3700U Mem:16GB) 
OS : Linux(Debian12 bookworm on WSL2)
Host OS : Windows11 Home 23H2

# はじめに

何度やってもRubyをすんなりインストールできないヘタレが完全に理解したので投稿します。

# 参考URL
**今回インストール作業で参考にしたサイト(Qiita)**
[Debianシステム全体にrbenvを導入する](https://qiita.com/OverZenith/items/402521c31d00c560f54e)
[DebianにRubyを入れる方法](https://qiita.com/mikihit0/items/48793c2b96e6a6eb8444)
[rbenvでRubyをインストール](https://qiita.com/abgata20000/items/8bfd25d76692063cc012)

**Macbook AirにrbenvでRubyを導入したときの私の記事（参考）**
[MacでRuby3.2.1 インストールメモ](https://qiita.com/edward999th/items/821b02136720a3900bae)

# 準備

## Debian on WSL2（インストール環境）

WSL2でDebianが入っている環境で作業しています。
Redhat系のLinuxでもほぼ同じです。

```bash:
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

## sudoersの設定

sudoで毎度パスワードを入れるのが億劫なのでvisudoでNOPASSWD指定しました。
Debian系の場合はsudoグループ、Redhat系の場合はwheelグループに入っているユーザがsudoできるようにすると良いと思います。
WSL2のDebianの場合、該当ユーザは最初からsudoグループに入っています。

```bash:
$ sudo visudo
※以下を設定
（変更前）
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL)  ALL
（変更後）
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) NOPASSWD: ALL
```

## 導入に必要なパッケージ導入

git、gccなど必要なパッケージを導入します。

```bash:
$ sudo apt install libreadline-dev git build-essential libssl-dev zlib1g-dev libyaml-dev libffi-dev zlib1g-dev
```
（参考）Redhat系の場合は以下のようにyum installとなります。
```
$ sudo yum install git curl gcc make openssl openssl-devel gcc-c++ readline-devel libxml2-devel libxslt-devel bzip2 libffi-devel libyaml-devel
```
ruby3.2系からlibyaml、libffiのソースが同梱されなくなった影響で該当のパッケージを導入する必要があります。
Redhat系の場合、libyaml-develについてはデフォルトのリポジトリ設定では導入できないのでディストリビューション毎に必要なリポジトリを有効化する必要があります。（Debian系はlibffi-dev、libyaml-devと名前が異なる）
(例：--enablerepo=powertools ※AlmaLinuxの場合）
Debianでは特に意識せずに導入できました。

# 導入手順

## rbenvの導入

```bash:
$ sudo git clone https://github.com/rbenv/rbenv.git /usr/local/lib/rbenv
```

## ruby-buildの導入

```bash:
$ sudo git clone https://github.com/rbenv/ruby-build.git /usr/local/lib/rbenv/plugins/ruby-build
```

## グループ作成とディレクトリ権限変更

rubyグループを作成し、任意のユーザ(myuser)をrubyグループに参加させる
```bash:
$ sudo groupadd ruby
$ sudo usermod -aG ruby myuser
$ sudo groups myuser
myuser : myuser adm cdrom sudo dip plugdev users ruby
$ groups
myuser adm cdrom sudo dip plugdev users ※rubyはまだ反映されない。
```

一旦、myuserでログインし直し、rubyグループに参加していることを確認する
```bash:
$ exit
（ログインし直し）
$ groups
myuser adm cdrom sudo dip plugdev users ruby
```

rbenvディレクトリのグループ所有権をrubyに変更し、読み・書き・実行の権限を付与
```bash:
$ cd /usr/local/lib/
$ ls
rbenv
$ sudo chgrp -R ruby rbenv
$ sudo chmod -R g+rwxX rbenv
$ ls -l
drwxrwxr-x 14 root ruby 4096 May 22 10:56 rbenv
```

## 環境変数設定

/etc/profile.d/ruby.shに環境変数を設定（パスを通す等）し、sourceコマンドで反映
```bash:
$ sudo vi /etc/profile.d/rbenv.sh
（下記内容を編集して保存）
export RBENV_ROOT=/usr/local/lib/rbenv
export PATH=${RBENV_ROOT}/bin:${PATH}
eval "$(rbenv init -)"

$ source /etc/profile.d/rbenv.sh
$ echo $PATH
```

## rubyインストール

rbenvコマンドでインストール可能なバージョンを確認
※--listオプションで主なrubyバージョンを、--list-allオプションですべてのrubyバージョン（派生製品含む）を表示する
```bash:
$ rbenv install --list
3.0.7
3.1.5
3.2.4
3.3.1
jruby-9.4.7.0
mruby-3.3.0
picoruby-3.0.0
truffleruby-24.0.1
truffleruby+graalvm-24.0.1

Only latest stable releases for each Ruby implementation are shown.
Use `rbenv install --list-all' to show all local versions.
```

ruby最新版をインストール
```bash:
$ rbenv install -v 3.3.1
```

インストールされたことを確認
```bash:
$ rbenv versions
  3.3.1
```

global指定で該当のバージョンを有効化（複数バージョンをインストールした場合切替えできる）
```bash:
$ rbenv global 3.3.1
$ rbenv versions
* 3.3.1 (set by /usr/local/lib/rbenv/version)
$ ruby -v
ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]
```

## gemのアップデート

折角なのでgemの最新版を入れておきます。
記事を書いた時点では3.5.10が最新です。
3.5.10にバージョンアップしてからupdateコマンドでモジュールを最新化します。
```bash:
$ gem update --system 3.5.10
$ gem update
```
必要なモジュールをinstall
```bash:
$ gem install bundler pry
```

# おわりに

良く行う作業はメモを作り、定期的に手順の見直しをしておくといざというときに慌てないで済みます。