CentOS 6でrubyのRPMパッケージを作る¶
- 目次
- CentOS 6でrubyのRPMパッケージを作る
CentOS 6の標準搭載rubyのバージョンは1.8.7であり、2014年6月がセキュリティパッチのサポート期間とそろそろ限界が近いものです。
Rubyを使用するアプリケーションは多くが古いバージョンには対応しないので、多くのCentOS 6環境では、新しいバージョンのrubyをソースから野良ビルドしたり、rbenvを導入して1複数バージョンのrubyを混在させるといった状況が生まれています。
そこで、今回はCentOS 6.x向けにrubyの新しいバージョン(2.x)をRPMパッケージとして作成します。
1 rbenvは、CentOSの標準機構であるRPMパッケージシステムやalternativesとはまったく別のruby特有の仕組みであり、CentOSの管理者にとっては余計な負担が生じます(だから管理者目線ではRubyよりPythonが好まれることに・・・)。
作成したRPMパッケージは、本プロジェクトの[ファイル]に添付しています。
http://www.torutk.com/projects/swe/files
最新のRPMパッケージ
- ruby-2.3.4-1.el6.x86_64.rpm
- ruby-2.3.3-1.el6.x86_64.rpm
- ruby-2.3.1-1.el6.x86_64.rpm
- ruby-2.2.5-1.el6.x86_64.rpm
- ruby-2.1.7-1.el6.x86_64.rpm
Ruby 2.1.1をRPM化¶
注)2.1.0から非互換な修正が誤って入ってしまったので要注意、なバージョン(Railsは非互換に影響受けるそうです)。
SPECファイルの作成¶
- attachment:ruby211.spec
rpmbuild実行¶
rpmbuild実行時のライブラリ依存メッセージを 表示
Requires: に登場するコマンド、ライブラリが属するパッケージを調べ列挙する。yum -provideで調べる。
- coreutils
- db4
- gdbm
- glibc
- libffi
- libyaml
- ncurses-libs
- pkgconfig
- openssl
- readline
- zlib
Ruby 2.1.2をRPM化¶
2.1.1の非互換な修正(Hash#reject)の解消、ほかのアップデート版。
SPECファイルの作成¶
ruby 2.1.1で作成したSPECファイルに、バージョン番号の変更、Changelog追記、および2.1.1のRequiresから得たパッケージの追記をしました。
- attachment:ruby212.spec
rpmbuild実行¶
~$ cp /tmp/ruby-2.1.2.tar.gz rpm/SOURCES/ ~$ cp /tmp/ruby212.spec rpm/SPECS/ ~$ rpmbuild -ba rpm/SPECS/ruby212.spec :
インストールにあたって¶
libyaml¶
今回作成したrubyのRPMパッケージにはlibyamlへの依存がありますが、libyamlはCentOS 6の標準パッケージにはなく、EPELリポジトリを必要とします。
したがって、インストールするにあたってEPELリポジトリをyumで参照するか、RPMファイルを別途ダウンロードしてインストールします。
Ruby 2.1.3をRPM化¶
full GC タイミングの変更によるメモリ使用量抑制、その他多数の不具合修正版。
SPECファイルの作成¶
ruby 2.1.2で作成したSPECファイルに、バージョン番号の変更、Changelog追記をしました。ソースTARボールの形式をbz2に変更しました(ファイルサイズがgzipよりbz2の方が小さいため)。
- attachment:ruby213.spec
rpmbuild実行¶
~$ cp /tmp/ruby-2.1.3.tar.bz2 rpm/SOURCES/ ~$ cp /tmp/ruby213.spec rpm/SPECS/ ~$ rpmbuild -ba rpm/SPECS/ruby213.spec :
Ruby 2.1.4をRPM化¶
セキュリティ脆弱性、その他の不具合修正版。
SPECファイルの作成¶
ruby 2.1.3で作成したSPECファイルに、バージョン番号の変更、Changelog追記をしました。
- attachment:ruby214.spec
rpmbuild実行¶
~$ cp /tmp/ruby-2.1.4.tar.bz2 rpm/SOURCES/ ~$ cp /tmp/ruby214.spec rpm/SPECS/ ~$ rpmbuild -ba rpm/SPECS/ruby214.spec :
Ruby 2.1.5をRPM化¶
REXMLにおけるDoS攻撃可能な脆弱性の修正、その他の不具合修正版。
SPECファイルの作成¶
ruby 2.1.4で作成したSPECファイルに、バージョン番号の変更、Changelog追記をしました。
- attachment:ruby215.spec
rpmbuild実行¶
~$ cp /tmp/ruby-2.1.5.tar.bz2 rpm/SOURCES/ ~$ cp /tmp/ruby215.spec rpm/SPECS/ ~$ rpmbuild -ba rpm/SPECS/ruby215.spec :
SPECファイルの訂正¶
SPECファイルに、Obsoletes: ruby があると、以後rubyパッケージの更新がyumで(yum localで?)できなくなってしまいます。そこで、SPECファイルから Obsolutes: rubyを削除しました。
Ruby 2.1.6をRPM化¶
CVE-2015-1855の脆弱性修正ほか
Ruby 2.2.0をRPM化¶
SymbolオブジェクトのGC、インクリメンタルGC、など。
Ruby 2.2.1をRPM化¶
Symbol GCのメモリリーク修正ほか
Ruby 2.2.2をRPM化¶
CVE-2015-1855の脆弱性修正ほか
Ruby 2.2.3をRPM化¶
CVE-2015-3900の脆弱性修正ほか
Ruby 2.2.4をRPM化¶
CVE-2015-7551の脆弱性修正ほか
Ruby 2.2.5をRPM化¶
Ruby 2.3.1をRPM化¶
Ruby 2.3.3をRPM化¶
問題解決メモ¶
yum localupdate でエラー¶
# yum localupdate ruby-2.2.0-1.el6.x86_64.rpm Loaded plugins: fastestmirror Setting up Local Package Process Examining ruby-2.2.0-1.el6.x86_64.rpm: ruby-2.2.0-1.el6.x86_64 Cannot install package ruby-2.2.0-1.el6.x86_64. It is obsoleted by installed package ruby-2.1.5-1.el6.x86_64 Nothing to do #
となってしまいました。
rpm -U
ではインストールされます。obsoleted関係でなにか不整合があるようです。SPECファイルのobsoleted関係を見ると
Obsoletes: ruby Obsoletes: ruby-libs Obsoletes: ruby-irb Obsoletes: ruby-rdoc Obsoletes: ruby-devel Obsoletes: rubygems
となっています。これは、CentOS 6標準のruby-1.8.7関係パッケージが複数あり、一方このspecファイルで提供するrubyは1つのパッケージ(ruby)であるため、Obsoletesに記載がないと同じ名前のパッケージ(ruby)だけ更新され、それ以外のパッケージが残ってしまうためです。
さて、ここにObsoletes: ruby
があるのが気になります。
試しにCentOS 6標準rubyをインストールして(ruby, ruby-libs, ruby-devel)、それからruby-2.2.0をyum localupdateしてみると次のようになりました。
yum localupdate rpm/RPMS/x86_64/ruby-2.2.0-1.el6.x86_64.rpm Loaded plugins: fastestmirror Setting up Local Package Process Examining rpm/RPMS/x86_64/ruby-2.2.0-1.el6.x86_64.rpm: ruby-2.2.0-1.el6.x86_64 Marking rpm/RPMS/x86_64/ruby-2.2.0-1.el6.x86_64.rpm as an update to ruby-1.8.7.374-3.el6_6.x86_64 Loading mirror speeds from cached hostfile * base: mirror.vodien.com * epel: mirror.premi.st * extras: mirror.vodien.com * updates: mirror.vodien.com Resolving Dependencies --> Running transaction check ---> Package ruby.x86_64 0:1.8.7.374-3.el6_6 will be obsoleted ---> Package ruby.x86_64 0:1.8.7.374-3.el6_6 will be updated ---> Package ruby.x86_64 0:2.2.0-1.el6 will be obsoleting ---> Package ruby-devel.x86_64 0:1.8.7.374-3.el6_6 will be obsoleted ---> Package ruby-libs.x86_64 0:1.8.7.374-3.el6_6 will be obsoleted --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: ruby x86_64 2.2.0-1.el6 /ruby-2.2.0-1.el6.x86_64 34 M replacing ruby.x86_64 1.8.7.374-3.el6_6 replacing ruby-devel.x86_64 1.8.7.374-3.el6_6 replacing ruby-libs.x86_64 1.8.7.374-3.el6_6 Transaction Summary ================================================================================ Install 1 Package(s) Total size: 34 M Is this ok [y/N]:
となります。
上記ログで、
---> Package ruby.x86_64 0:2.2.0-1.el6 will be obsoleting
と、自分自身をobsoletingといっている箇所が気になります。
Obsoletes に自分のパッケージ名を書いてしまうと、いったんそのパッケージをインストールすると以降そのパッケージはバージョンが新しくてもyum localupdateできなくなってしまいました。
どうやら、Obsoletesで指定したパッケージは以降そのマシンには入れられなくなるようです。