Browse Tag: rubygems

rubygems 1.5.0 でミラーをする方法

Rubygems 1.5.0 がリリースされました。メインは、Ruby 1.9.2 サポートとしてのリリースのようですが、最近 REE 1.8.7 を使って generate_index するとエラーが出てしまって、gem のローカルミラーの構築に失敗して困っていました。そこで、思い切って Rubygems 1.5.0 にアップデートしてみました。Rubygems 1.5.0 の変更点は、こちらです。

$ sudo /opt/ruby/bin/gem update –system

そして、1.5.0 にアップデートしたところ、ちゃんと generate_index することができました。

これで問題なしと思ったのですが、Rubygems 1.5.0 から mirror コマンドが削除されてしまいました。。。代わりのものがないかどうか調べてみると、rubygems-mirror がありました。rubygems-mirror は、gem になっていないので、github から落としてくる必要があります。

$ git clone https://github.com/rubygems/rubygems-mirror.git

そして、rake タスクを実行するだけです。

$ cd rubygems-mirror

$ /opt/ruby/bin/rake mirror:update

すると、次のようなエラーが発生していまいました。

rake aborted!
unsupported signal SIGINFO

調べてみると、同様の報告があって、master には取り込まれていないようなので、同じように、次のパッチをあてます。


--- lib/rubygems/mirror/command.rb-org 2011-02-07 12:21:33.000000000 +0900
+++ lib/rubygems/mirror/command.rb 2011-02-07 12:18:14.000000000 +0900
@@ -54,7 +54,7 @@
progress = ui.progress_reporter num_to_fetch,
"Fetching #{num_to_fetch} gems"
- trap(:INFO) { puts "Fetched: #{progress.count}/#{num_to_fetch}" }
+ #trap(:INFO) { puts "Fetched: #{progress.count}/#{num_to_fetch}" }
mirror.update_gems { progress.updated true }
@@ -63,7 +63,7 @@
progress = ui.progress_reporter num_to_delete,
"Deleting #{num_to_delete} gems"
- trap(:INFO) { puts "Fetched: #{progress.count}/#{num_to_delete}" }
+ #trap(:INFO) { puts "Fetched: #{progress.count}/#{num_to_delete}" }
mirror.delete_gems { progress.updated true }
end

とりあえずは、これでちゃんと gem をローカルのサーバへミラーすることができました。

あとは、これを cron に仕込めば、問題なしですね。

# 2011.02.09 追記

次のような cron を、仕込んでみました。generate_index –update オプションを付けると、更新のあった gem だけ差分更新をしてくれるために非常に高速に gem の index を作成することができます。–update すると、数時間くらいかかるの注意してください。

また、自分の gem もまとめて管理しているため、自分の gem は /home/naoya/gems に置いてあるため、mirror してしまうと既存の自分の gem は削除されるため、mirror 後にコピーして、まとめて一つのローカル Rubygems リポジトリを作成しています。

0 4 * * * cd /home/naoya/src/rubygems-mirror && /opt/ruby/bin/rake mirror:update && cp /home/naoya/gems/*.gem /var/www/rubygems/gems/ && /opt/ruby/bin/gem generate_index –update –quiet -d /var/www/rubygems

rubygems その三

rubygems のローカルミラーを gem mirror コマンドで構築したら、実際にローカルミラーを使う方法をまとめておく。

まず、.gemmirrorrc で指定した to のディレクトリを HTTP 経由で公開する必要がある。Apache なら、次のように設定しておけばよい。

 


AliasMatch ^/rubygems(.*)?$ "/var/www/rubygems$1"
<Directory "/var/www/rubygems">
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>

 

この設定だと、http://example.com/rubygems で rubygems のローカルミラーが公開されていることになる。

 

あとは、このローカルミラーを使いたいサーバの root のホームディレクトリに .gemrc に次のように設定しておけばよい。もちろん、gem install コマンドを実行するときに指定しても問題ないが、毎回指定するのはめんどくさいので、この設定がおすすめ。


gem: --no-rdoc --no-ri --no-update-sources --backtrace --source http://example.com/rubygems

他のオプションは、サーバに rubygems をインストールするとき rdoc などは不要なので、ruby-enterprise のインストーラープログラムを参考にして設定した。

 

もちろん、この設定も puppet module にしたので公開しようっと。

rubygems のミラーサイトを作る方法 – 其ノ二

前のエントリで、gem コマンドを使うとミラーサイトが作れる方法を紹介したけれど、今日 rubygems 1.1.1 で試したら、次のようなエラーがでてしまった。


$ gem mirror
fetching: http://gems.rubyforge.org/Marshal.4.8.Z
ERROR: While executing gem ... (TypeError)
invalid Gem::Specification format ["1.2.0", 3, "flow", #, Sat Aug 09 07:00:00 +0900 2008, "A Web Server", #=", #]], @version=nil>, #=", #]], @version=nil>, "ruby", [#=", #]], @version=nil>, @name="rev", @type=:runtime>], "flow", "ry at tiny clouds dot org", ["ry dahl"], "A Web Server", "http://flow.rubyforge.org", false, "ruby"]

これは困ったというわけで、RubyForge Mirrors にある rsync による方法で取得することにした。月間 300GB 帯域に制限されているので、 –bwlimit で帯域を制限しないといけない

とは、いっても rubygems のミラーサイトを作るには、yaml と gem を http で公開しないといけないらしいので、実際に gem mirror でどうやっているか、/usr/lib/ruby/site_ruby/1.8/rubygems/commands/mirror_command.rb のソースコードを読んでみたら、gem を gems というディレクトリに入ればいいみたい。

ここで、もしかして rubygems 1.2.0 ならなおっているのかなとリリースノートを読んでみたら、”Marshal Gem::Specification objects from the future can now be loaded.” というバグフィックスがされている!

ということで、rubygems 1.1.1 では gem mirror を使えないので、1.2.0 にアップデートしてから gem mirror を実行すれば問題ないということで…。

ただし、gem mirror を実行すると、途中で gem がないらしきエラーがでるものがあるけどちゃんと実行できた。容量は、2.7GB 程度使っている。