一分一秒真剣勝負!

Ruby, Railsなど。Web系の技術ネタを充実させたい・・が、そうなるかは分からない。

全ユーザーで共通のrbenv+ruby-buildを使用する環境を構築する

複数人が利用する開発環境のサーバにRubyを入れる場合、rbenvを使ってバージョン管理する時のまとめ。環境はCentOSですが、Debian系でも同じですね。

rbenv, ruby-build インストール

rbenv, ruby-build を /usr/local にインストールします。

$ cd /usr/local
$ git clone git://github.com/sstephenson/rbenv.git rbenv
$ mkdir rbenv/shims rbenv/versions
$ chgrp -R groupname rbenv
$ chmod -R g+rwxXs rbenv
$ git clone git://github.com/sstephenson/ruby-build.git ruby-build
$ cd ruby-build
$ ./install.sh
$ rbenv install # これでインストールできるrubyのバージョン一覧が出ます
$ rbenv install 1.9.2-p290 # rubyをインストール
$ rbenv global 1.9.2-p290 # 標準で使用するrubyのバージョンを指定

環境変数の設定

以下の環境変数を設定するわけですが、問題はどこでやるか。

export RBENV_ROOT="/usr/local/rbenv"
export PATH="/usr/local/rbenv/bin:$PATH"
eval "$(rbenv init -)"

Shared install of rbenvではユーザー毎にシェルの初期化ファイル内で設定することを奨励していますが、これは状況次第だと思います。以下の2パターンから選ぶといいのではないでしょうか。

1. サーバ自体を構築し始める時

/etc/skel 配下の各ファイルに設定しておけば、ユーザー追加時にコピーされるのであとは開発者個人がそのまま使うか消すかすればいい感じ。メンバー全員Rubyに詳しければこれでいいかも。

2. 既にユーザーが存在する時

/etc/profile に書いてしまうかrbenv + ruby-build を system-wide にインストールするのように /etc/profile.d 配下にrbenv.shを作るなどすれば良いと思います。メンバーにRubyのコードは書けるけど、環境面はサッパリな人がいたりする場合はこっちかなと。

おまけ(CentOS)

 rbenvも入れたのでgodでプロセス監視しようかなーと思い立ち、gem installした時のこと。

% sudo gem install god
/usr/local/rbenv/shims/gem: line 4: exec: rbenv: not found

 あれなんで?

$ sudo env
TERM=xterm-256color
MAIL=/var/spool/mail/hogehoge
HOSTNAME=hogehoge.com
HISTSIZE=1000
INPUTRC=/etc/inputrc
LS_COLORS=
LANG=en_US.UTF-8
HOME=/home/spacyz
SHELL=/bin/zsh
LOGNAME=root
USER=root
USERNAME=root
PATH=/usr/bin:/bin # PATHが通ってねえ!
SUDO_COMMAND=/bin/env
SUDO_USER=spacyz
SUDO_UID=500
SUDO_GID=508

 PATH通ってねえ!
 ・・・どうやらCentOSではsudoした時にデフォルトではPATHが引き継がれないようです。毎回オプションで指定するのも面倒なので、/etc/sudoers を編集します。

# ここにPATHを追記すればよかった
Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY"
# こういうこと
Defaults    env_keep = "PATH COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY"

 これでオプション指定無しで引き継いでくれる。しかしCentOSは色々とやらないと使い勝手が悪いイメージがあるな。

追記

id:a666666さんにコメ欄で突っ込まれたので、rbenv globalとか追記。確かに書いておかないとハマる人いるかも・・。あとsudoのオプションで環境変数引き継げるのは知ってますが、それが面倒と書いてます。