pyenv、rbenv、ndenvをシステム全体・システムワイドにインストールし、Python、Ruby、Node.jsのバージョンを使い分ける 〜Amazon Linux、CentOSで実行できる最新バージョンを自動インストールするシェルスクリプト(バッチ処理プログラム)〜

3月 6, 2017AWS,EC2,Node.js,Programming,Python,Ruby,Shell Script

AWSのAmazon EC2においてAmazon LinuxやCentOSなどを用いてサーバアプリケーションを実装する際にシステム要件で使用するプログラム言語のバージョンが指定・限定されている場合もあるかと思います。

その場合、運良く該当のバージョンがyumリポジトリにあれば良いのですが、該当のバージョンがyumに存在しなければソースからインストールする必要があります。

ただプログラム言語パッケージを配布元からそのままソースでインストールするとバージョンを入れ替える場合などパッケージ管理の点でインストール、アンインストールが複雑になってきます。

今回はプログラム言語Python、Ruby、Node.jsでそれぞれ有志が用意している簡単にプログラム言語のインストール、アンインストール、バージョン切り替えが可能なパッケージ管理ツールpyenv、rbenv、ndenvをシステム全体・システムワイドにインストールする方法を備忘録として記載しておきます。

ちなみにプログラム言語Python、Ruby、Node.jsとパッケージ管理ツールpyenv、rbenv、ndenvの対応は下記のようになります。

Python:pyenv
Ruby:rbenv
Node.js:ndenv

pyenv、rbenv、ndenvをシステム全体・システムワイドにインストールし、Python、Ruby、Node.jsのバージョンを使い分ける 〜Amazon Linux、CentOSで実行できる最新バージョンを自動インストールするシェルスクリプト(バッチ処理プログラム)〜

yumで前提となる必要パッケージをインストールする

yum install -y gcc gcc-c++ make git openssl-devel zlib-devel readline-devel sqlite-devel bzip2-devel

pyenvをシステム全体・システムワイドにインストールしてPythonをインストール

pyenvを/usr/local/にインストール

[magtranetwork@localhost ~]# sudo su -
[root@localhost ~]# git clone https://github.com/pyenv/pyenv.git /usr/local/pyenv
[root@localhost ~]# git clone https://github.com/pyenv/pyenv-virtualenv.git /usr/local/pyenv/plugins/pyenv-virtualenv

ログイン時に設定を読み込むスクリプトを記述

[root@localhost ~]# vim /etc/profile.d/pyenv.sh
export PYENV_ROOT="/usr/local/pyenv"
export PATH="${PYENV_ROOT}/bin:${PATH}"
eval "$(pyenv init -)"

ログインシェルを実行

[root@localhost ~]# exec $SHELL -l

pyenvでバージョンを指定してPythonをインストール

インストールできるバージョンの一覧を参照

[root@localhost ~]# pyenv install -l

バージョンを指定してインストール

[root@localhost ~]# pyenv install 2.7.13

インストールしたバージョンを確認

[root@localhost ~]# pyenv versions

インストールしたバージョンをシステム全体で使用するように設定

[root@localhost ~]# pyenv global 2.7.13
[root@localhost ~]# pyenv rehash

pythonコマンドが指定したバージョンで実行できることを確認

[root@localhost ~]# python --version

rbenvをシステム全体・システムワイドにインストールしてRubyをインストール

rbenvを/usr/local/にインストール

[magtranetwork@localhost ~]# sudo su -
[root@localhost ~]# git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv
[root@localhost ~]# git clone https://github.com/rbenv/ruby-build.git /usr/local/rbenv/plugins/ruby-build

ログイン時に設定を読み込むスクリプトを記述

[root@localhost ~]# vim /etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"

ログインシェルを実行

[root@localhost ~]# exec $SHELL -l

rbenvでバージョンを指定してRubyをインストール

インストールできるバージョンの一覧を参照

[root@localhost ~]# rbenv install -l

バージョンを指定してインストール

[root@localhost ~]# rbenv install 2.3.3

インストールしたバージョンを確認

[root@localhost ~]# rbenv versions

インストールしたバージョンをシステム全体で使用するように設定

[root@localhost ~]# rbenv global 2.3.3
[root@localhost ~]# rbenv rehash

rubyコマンドが指定したバージョンで実行できることを確認

[root@localhost ~]# ruby -v

ndenvをシステム全体・システムワイドにインストールしてNode.jsをインストール

ndenvを/usr/local/にインストール

[magtranetwork@localhost ~]# sudo su -
[root@localhost ~]# git clone https://github.com/riywo/ndenv.git /usr/local/ndenv
[root@localhost ~]# mkdir -p /usr/local/ndenv/plugins
[root@localhost ~]# git clone https://github.com/riywo/node-build.git /usr/local/ndenv/plugins/node-build

ログイン時に設定を読み込むスクリプトを記述

[root@localhost ~]# vim /etc/profile.d/ndenv.sh
export NDENV_ROOT=/usr/local/ndenv
export PATH="$NDENV_ROOT/bin:$PATH"
eval "$(ndenv init -)" 

ログインシェルを実行

[root@localhost ~]# exec $SHELL -l

ndenvでバージョンを指定してNode.jsをインストール

インストールできるバージョンの一覧を参照

[root@localhost ~]# ndenv install -l

バージョンを指定してインストール

[root@localhost ~]# ndenv install v6.9.2

インストールしたバージョンを確認

[root@localhost ~]# ndenv versions

インストールしたバージョンをシステム全体で使用するように設定

[root@localhost ~]# ndenv global v6.9.2
[root@localhost ~]# ndenv rehash

nodeコマンドが指定したバージョンで実行できることを確認

[root@localhost ~]# node -v

pyenv、rbenv、ndenvで最新バージョンをインストールし、古いバージョンを削除するシェルスクリプト(バッチ処理プログラム)

上記でpyenv、rbenv、ndenvをシステム全体・システムワイドにインストールして、Python、Ruby、Node.jsをインストール方法を記載しました。

続いてはpyenv、rbenv、ndenvそれぞれをアップデートして最新化した上で、指定したバージョンのPython、Ruby、Node.jsにアップグレードまたはダウングレードし、指定したバージョン以外をアンインストールするシェルスクリプト(バッチ処理プログラム)を記載します。

主にpyenv、rbenv、ndenvを用いたPython、Ruby、Node.jsのバージョンアップ運用を想定しています。

pyenvでPythonの最新バージョンをインストールし、古いバージョンを削除するシェルスクリプト(バッチ処理プログラム)

<実行内容>
・現在のバージョンのPIPリストのエクスポート
・指定したバージョンのPythonのインストール
・指定したバージョン以外のPythonとPIPのアンインストール
・指定したバージョンのグローバル利用設定
・エクスポートしたPIPリストからPIPをインストール

vim install_new_python.sh
#!/bin/bash

WORK_DIR=/tmp
PIP_LIST_FILE=/tmp/pip_freeze.txt

uninstall() {
  pip freeze | grep -v "^-e" | xargs pip uninstall -y
}

NEW_VER=$1

if [ "${NEW_VER}" = "" ]; then
  echo "Input Target Version."
  exit 1
fi

pip freeze > ${PIP_LIST_FILE}

PYENVPATH=`pyenv root`
echo $PYENVPATH
cd $PYENVPATH
git pull
cd ${WORK_DIR}

IS_VER=`pyenv install -l | grep "${NEW_VER}$" | wc -l`

if [ "${IS_VER}" = "0" ]; then
  echo "Target Version is not Exists."
  rm -rf ${PIP_LIST_FILE}
  exit 1
fi

pyenv install ${NEW_VER}
pyenv global ${NEW_VER}
pyenv rehash

PYTHONS=`ls -1 $PYENVPATH/versions | grep -v ${NEW_VER}`
for python in $PYTHONS; do
  echo '---------------------------------------'
  echo $python
  pyenv local $python
  uninstall
  pyenv uninstall $python
done

pyenv global ${NEW_VER}
pyenv rehash

rm -f ~/.python-version

pip install pip --upgrade
pip install setuptools --upgrade
pip install -r ${PIP_LIST_FILE}

<実行例>
・pyenvのアップデート(git pullによるリポジトリ最新化)
・インストールするバージョンを検索する。

cd `pyenv root` && git pull
pyenv install -l

・インストールするバージョンを引数に設定して実行する。

bash install_new_python.sh 2.7.13

rbenvでRubyの最新バージョンをインストールし、古いバージョンを削除するシェルスクリプト(バッチ処理プログラム)

<実行内容>
・現在のバージョンのGEMリストのエクスポート
・指定したバージョンのRubyのインストール
・指定したバージョン以外のRubyとGEMのアンインストール
・指定したバージョンのグローバル利用設定
・エクスポートしたGEMリストから最新のGEMをインストール

vim install_new_ruby.sh
#!/bin/bash

WORK_DIR=/tmp
GEM_LIST_FILE=/tmp/gem_list.txt

uninstall() {
  list=`gem list --no-versions`
  for gem in $list; do
    gem uninstall $gem -aIx
  done
  gem list
  gem install bundler
}

NEW_VER=$1

if [ "${NEW_VER}" = "" ]; then
  echo "Input Target Version."
  exit 1
fi

gem list > ${GEM_LIST_FILE}

RBENVPATH=`rbenv root`
echo $RBENVPATH
cd $RBENVPATH
git pull
cd ${WORK_DIR}

IS_VER=`rbenv install -l | grep "${NEW_VER}$" | wc -l`

if [ "${IS_VER}" = "0" ]; then
  echo "Target Version is not Exists."
  exit 1
fi

rbenv install ${NEW_VER}
rbenv global ${NEW_VER}
rbenv rehash

RUBIES=`ls -1 $RBENVPATH/versions | grep -v ${NEW_VER}`
for ruby in $RUBIES; do
  echo '---------------------------------------'
  echo $ruby
  rbenv local $ruby
  uninstall
  rbenv uninstall $ruby
done

rbenv global ${NEW_VER}
rbenv rehash

rm -f ~/.ruby-version

gem install `cat ${GEM_LIST_FILE} | awk '{print $1}'`

<実行例>
・rbenvのアップデート(git pullによるリポジトリ最新化)
・インストールするバージョンを検索する。

cd `rbenv root` && git pull

・インストールするバージョンを引数に設定して実行する。

bash install_new_ruby.sh 2.3.3

ndenvでNode.jsの最新バージョンをインストールし、古いバージョンを削除するシェルスクリプト(バッチ処理プログラム)

<実行内容>
・指定したバージョンのNode.jsのインストール
・指定したバージョン以外のNode.jsのアンインストール
・指定したバージョンのグローバル利用設定

vim install_new_node.sh
#!/bin/bash

WORK_DIR=/tmp

NEW_VER=$1

if [ "${NEW_VER}" = "" ]; then
  echo "Input Target Version."
  exit 1
fi

NDENVPATH=`ndenv root`
echo $NDENVPATH
cd $NDENVPATH
git pull
cd ${WORK_DIR}

IS_VER=`ndenv install -l | grep "${NEW_VER}$" | wc -l`

if [ "${IS_VER}" = "0" ]; then
  echo "Target Version is not Exists."
  exit 1
fi

ndenv install ${NEW_VER}
ndenv global ${NEW_VER}
ndenv rehash

NODES=`ls -1 $NDENVPATH/versions | grep -v ${NEW_VER}`
for node in $NODES; do
  echo '---------------------------------------'
  echo $node
  ndenv uninstall $node
done

ndenv global ${NEW_VER}
ndenv rehash

rm -f ~/.node-version

<実行例>
・ndenvのアップデート(git pullによるリポジトリ最新化)
・インストールするバージョンを検索する。

cd `ndenv root` && git pull
ndenv install -l

・インストールするバージョンを引数に設定して実行する。

bash install_new_node.sh v6.9.2
Reference: Tech Blog citing related sources