DreamhostにSVN::Coreを入れ、PlaggerでGoogle CodeのSVNコミットログをtwitterに流す

PlaggerにはCustomFeed::SVNLogというモジュールが付属しているので、ありがたく使わせてもらおうと思ったら、perlモジュールのSVN::Coreが足りない、とエラーになった・・・。

% plagger -c ./svn2twitter.yaml
Can't locate SVN/Core.pm in @INC

なのでCPANからSVN::Coreをインストールしようと思ったが、SVN::CoreはCPANには登録されていないそうなので、インストールは少々やっかい
(参考:ぶらぶら日記: SVN::Core をインストールする

さらに僕がPlaggerを動かしているのはDreamhostだったりするので、SVN::Core dreamhostでぐぐったInstalling SVK on Dreamhost - Dev411: The Code Wikiというドキュメントも発見!(英文です)

参考にさせてもらいながら早速作業をしたので、メモ。


まずは大前提として、DreamhostでちゃんとCPANが使えるようになっていること。これはPlaggerを入れた時点でクリアしているはずなんだけど、今一度コチラのページを確認しておくと良いです。
特にPERL5LIBを正しく設定してexportされていること、また$HOME/local/share/perl/ディレクトリが存在していて、ちゃんとPERL5LIBに含まれていることが超重要です。


以下、SVN::Coreを入れるための方法。

(1-1) swigの取得、configure
Dreamhostにはデフォルトで/usr/bin/swigにswigが入っているが、最初っからインストールされている/usr/bin/perlを使うように設定されているっぽい。DreamhostにPlaggerをインストールする時点で$HOME/local/bin/perlに5.8.8を入れているので、そちらを見てくれるようにswigも新規に$HOME/local/にインストールする。

一応、元々入っているswigとバージョンを合わせる為に1.3.24にしてみた。
(最新版は1.3.33)

% wget http://downloads.sourceforge.net/swig/swig-1.3.24.tar.gz
% tar zxf ./swig-1.3.24.tar.gz
% cd ./SWIG-1.3.24
% ./configure --prefix=$HOME/local \
--with-perl5=$HOME/local/bin/perl


(1-2) configure したらインストール
make && make install でオK
ここは特に問題ないはず。$HOME/local/bin/swigができる。

(2-1) 次にsubversionのソースコードをダウンロード
既にサーバーにインストールされているsubversionのバージョンは

svn --version

で調べられる。Dreamhostに入っているのは1.4.2なので、1.4.2のソースをtigris.orgから取得。

% wget http://subversion.tigris.org/downloads/subversion-1.4.2.tar.bz2


(2-2) ソースコードのアーカイブを展開
会社の人で知らなかった人が居てビックリだったんだが、.bz2はtarの-jオプションで一発で展開できまっせ。Linuxコマンドのオプションは可能な限り覚えよう!

% tar xjvf ./subversion-1.4.2.tar.bz2


(2-3) confugureする
こちらの情報によるとaprとかapr-utilをconfigureオプションに指定しないといけないそうなので、locateコマンドとかwichコマンドを駆使してインストールされている場所を探す。探す対象のファイル名は./configure --helpすれば書いてある。(てか、何はともあれ./configure --helpはデフォルトだろ・・・。あ?俺だけ?)

--with-apr=PATH prefix for installed APR, path to APR build tree,
or the full path to apr-config
--with-apr-util=PATH prefix for installed APU, path to APU build tree,
or the full path to apu-config

それからperl自体が$HOME/local/binにインストールしてあるので、--prefixオプションで$HOME/local、それから先ほどインストールした$HOME/local/bin/swigの場所も指定しないといけない。

さらに、SVK インストール方法 : Hasta Pronto.orgにあるようにperlから使うよ、ってオプションを--enable-swig-bindings=perlとして渡してやるのが重要みたいです。

ということで、configureオプションは以下の通り。なげー。

% ./configure --with-apr=/usr/local/dh/apache2/template/bin/apr-config \
--with-apr-util=/usr/local/dh/apache2/template/bin/apu-config \
--prefix=$HOME/local \
--enable-swig-bindings=perl \
--with-swig=$HOME/local/bin/swig \
--without-barkley-db \
--with-ssl --with-zlib

Berkeley DBを使わないことについてWarningがでるけど気にしないで大丈夫。

You don't seem to have Berkeley DB version 4.0.14 or newer
installed and linked to APR-UTIL. We have created Makefiles which
will build without the Berkeley DB back-end; your repositories will
use FSFS as the default back-end. You can find the latest version of
Berkeley DB here:
http://www.sleepycat.com/download/index.shtml


(2-4) ここにあるように、Makefileを修正

これをやらないと絶対にインストールできない。Dreamhost限定での話だとは思いますが・・・。僕みたいにPerl5.8.8を入れている人は末尾の5.8.4を5.8.8に変更すればOKです。


(2-5)make、make install
$home/local/bin以下にインストールされるはず。確認してみよう。

% ls $HOME/local/bin | grep -i 'svn'
svn
svnadmin
svndumpfilter
svnlook
svnserve
svnsync
svnversion

いた。


(3-1) make swig-plする
subversionのインストールまではハッキリいってどうでもよくて、こっからが本題のSVN::Coreを入れるための重要な部分。

make swig-pl

これはちゃんとconfigureできていれば問題無く通る。


(3-2) テストファイルを修正
何でこれが必要かって言うと、次のステップである make check-swig-plでテスト失敗(Fail)するから。
詳細はコチラに記載されてますが、テンポラリディレクトリを$HOME/tmpとか作成してchmod 777 ~/tmpとかしておき、 subversion/bindings/swig/perl/native/t/3client.t の21行目あたりを

#my $testpath = tempdir('svn-perl-test-XXXXXX', TMPDIR => 1);
my $testpath = tempdir('svn-perl-test-XXXXXX', DIR => '/home//tmp/');

と変更すればOKです。


(3-3) make check-swig-plする
上記のテストファイル修正ができていれば、問題なく通るはず。他にエラーがでるようなら、PERL5LIBが正しく設定されていない可能性大なので、もう一度Using CPAN - Dev411: The Code Wikiを良く読むべし。


(3-4) make install-swig-plする
これは説明するまでもないですね。終われば普通にPerlの@INCにSVN::Coreが入ります。


さて、やっとこれで以下の.yamlファイルを実行してもエラーが出なくなりました。

# subversion commit log -> twitter

global:
  assets_path: <PATH_TO_PERL>/Plagger/assets
  timezone: Asia/Tokyo
  log:
    level: debug

plugins:
  - module: CustomFeed::SVNLog
    config:
      target: http://xxxxxxx.xxxxxxxxxxx.com/svn/
      title: commit log
      fetch_items: 5
  - module: Publish::Debug


(4-1) yamlをちまちまと修正
ログの取得方法はPlaggerでSubvesionのコミットログをIRCに通知するを参考にさせてもらいました。Dedupedを使えばいいんですね。これは貴重な情報でした。ありがとうございます!


(4-2) twitter.ttを修正
Publish::Twitterのassetsにあるtwitter.ttをSubversionのコミットログ出力にしか使わない(w)前提で、以下のように修正。

[% IF entry.author %][% entry.author %][% END %],[% IF entry.title %][% entry.title %][% END %] [% IF entry.body %]"[% entry.body_text %]"[% ELSE %]NO LOG[% END %] http://tinyurl.com/*******

変更点は以下の通り。
・コミットした人のユーザー名が表示されるようにした
・リビジョン番号が出るようにした
・ログを入れずにコミットした場合に「NO LOG」と出るようにした
・Permalinkの向き先はどうせ固定(google code hostingのBrowse source)なので、tinyurlで縮めた

どうせならモジュール分けておけば良かったなぁ。。まぁいいや。


(4-3) 動作確認、.yamlを微調整
最終的に.yamlはこんな感じになった。

global:
  assets_path: <PATH_TO_PERL>/Plagger/assets
  plugin_path: <PATH_TO_PERL>/Plagger/Plugin
  timezone: Asia/Tokyo
  log:
    level: error

plugins:
  - module: CustomFeed::SVNLog
    config:
      target: http://******.googlecode.com/svn/trunk/
      link: http://code.google.com/p/*******/source/browse
      title: SVN Commit!
      fetch_items: 10
      reverse: 1
  - module: Filter::BreakEntriesToFeeds
  - module: Filter::Rule
    rule:
      module: Deduped
      path: <FILE_PATH>/var.db
  - module: Publish::Twitter
    config:
      username: <TWITTER_USER>
      password: <TWITTER_PASS>


(5) cronに設定
今のところ1時間に1回。まぁ、それくらいで十分なプロジェクトなはずだけど、もうすこし動きが活発になるようなら間隔を縮め、逆に落ちて来たら半日に1回くらいに落としてもいいかもね。


これで完璧。
コミットログを流す専用のTwitterアカウントを新規に作成して、関連するメンバー全員でそれをfollowすれば便利に使えるよ、っと。