トップ 最新

ただのにっき

2009-04-19(日) [長年日記]

「パラボラアンテナ」を移設する(またはGitHubのPost-Receive Hooksを使って自動更新)

spc.gr.jpのWikiFarm閉鎖に伴い、パラボラアンテナの行き場を探さなければいけなくなったわけだが(自業自得)、まぁ、tdtds.jpの下でよかろう、と。ただ、Wikiとしてはほとんど機能していなかったので*1、もっと静的なサイトでいいやと思っている。

というわけで、とりあえず閉鎖前に移転しておこうと思い、ダウンロードしてきた静的HTMLをちょっと整形して、移転だけでもやっておく。

1. コンテンツをGitHubで管理する

いずれ軽量CMSを作るか探すかしようと考えてはいるが、まずは静的ファイルだけにして、GitHubで管理しちゃう。プロジェクトを作って、必要なファイルをcommit & push。これをWebサーバ上でcloneすると新しいサイトのできあがり。

2. Post-Receive Hooksを使って自動的に更新する

手元の環境でいじったファイルをpushするだけで、サイトの方が自動的にpullしてくれると嬉しい。これを実現するのがGitHubのPost-Receive Hooks。Github上のリポジトリにpushがあると、指定したURLを叩いて、POSTメソッドを使ってそのpushの内容をJSON形式で教えてくれる。

ヘルプを読むと、「url」にはリポジトリのURLが含まれていそうなので、こんな感じのCGIを書いておく(JSONパーサとかいらんわ):

#!/usr/bin/ruby
require 'cgi'
cgi = CGI::new
payload, = cgi.params['payload']
puts "Content-Type: text/plain\n\n"
if payload =~ %r|"url": "http://github.com/tdtds/(.*?)[/"]| then
   open( "/home/hoge/github-hook/#{$1}", 'w' ) do |f|
      f.write( payload )
   end
end

リクエストのうち「payload」パラメタの内容を見て、urlの中のプロジェクト名のファイル名を作ってpayloadの内容を保存している。内容は別になんでもいいというか、空でもいいけどデバッグのために入れておく。

ここで直接git pullさせてもよかったんだけど、rubyバインディングであるGritにpull操作用のメソッドがない(?)みたいだったし、かといって子プロセスを起動するのも癪に障るので、トリガー用のファイルを作るだけにした。だって、何かの間違いで1秒間に100件とかpushがあったら怖いじゃん。

実際のpullは、都合よく5分に1回起きるcronタスクが設定してあったので(以前作ったJリーグ速報用)、それを使う。上で作ったトリガー用ファイルがあったらgit pullしてから、トリガーを削除する。

準備ができたら、GitHubの設定。プロジェクトのページから、Admin → Service Hooksと選ぶと、Post-Receive URLsという欄が出てくるので、そこに上で作成したCGIのURLを入力する。「Test Hook」というリンクがあるのでクリックすると、試しにリクエストを発行してくれる。「parabola」というファイルができていれば成功である。あとはcronタスクの起動を待って、pull操作が行われたことを確認すればよい。

3. 旧サイトからのリダイレクト

Wiki版の「パラボラアンテナ」は、さすがにライバルが少ないこともあり、そこそこ検索順位も高かったので、そのPageRankを引き継がない手はない。検索エンジンは301リダイレクトをすればPageRankともども引っ越してくれるはずなので、その設定をしておく。

今回、WikiNameだったページ名をすべて小文字化して末尾に「.html」を付加したので、Hikiのindex.cgiの代わりに以下のようなCGIをかましておく。

#!/usr/bin/ruby
q = ENV['QUERY_STRING']
case q
when /^[a-zA-Z0-9]+$/
   q = q.downcase + '.html'
else
   q = ''
end
puts "Status: 301 Moved Permanently"
puts "Location: http://tdtds.jp/parabola/#{q}\n\n"

これで(いちおう)引越し完了。

Tags: git parabola

*1 Wikiが複数のユーザによって頻繁に更新されるのは、コミュニティがある程度大きな場合に限られる。