pyenv、rbenv、ndenvをシステム全体・システムワイドにインストールし、Python、Ruby、Node.jsのバージョンを使い分ける 〜Amazon Linux、CentOSで実行できる最新バージョンを自動インストールするシェルスクリプト(バッチ処理プログラム)〜
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.2Reference: Tech Blog citing related sources