プロジェクト

全般

プロフィール

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.1.1をRPM化

注)2.1.0から非互換な修正が誤って入ってしまったので要注意、なバージョン(Railsは非互換に影響受けるそうです)。

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から得たパッケージの追記をしました。

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の方が小さいため)。

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追記をしました。

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追記をしました。

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で指定したパッケージは以降そのマシンには入れられなくなるようです。

クリップボードから画像を追加 (サイズの上限: 1 GB)