Rakeに入門

やれば簡単そうだけど、いままでやってなかったRakeについて調べた。
練習としてsubversionリポジトリからコードをチェックアウトして、シンボリックリンクを張りなおすというcapistranoっぽい作業を自動化する。

やりたいこと

ファイル構成はこんな感じ

--Rakefike
 +current   -> /releases/2010051101 (releasesの最新にシンボリックリンク)
 +-releases
  +2010051101
  +2010051102
  +2010051103

以下のような作業を自動化するのが目標

mkdir releases/2010052501
svn checkout svn://example.com/project/trunk releases/2010052501
ln -s releases/2010052501 current

まず外枠をつくる

$ nano Rakefile

で、なにもしないRakefileをつくる

task :default => "deploy"

desc "プロジェクトをデプロイする"
task :deploy

desc "コード群をチェックアウトする"
task :checkout

desc "currentへのシンボリックリンクを付け替える"
task :switch

正しく定義されているか実行してみる。(-tは実行順序を確認するためのオプション)

$ rake -t
(in /home/toyoshi/rake)
** Invoke default (first_time)
** Invoke deploy (first_time)
** Execute deploy
** Execute default

defaultタスクは実行するタスクを指定しないときに実行されるタスク名なので最初に呼ばれる
今回はdefaultに=>でdeployを依存タスクとして指定しているので先にdeployが実行される。

deskというのはオプションのコマンドである。あとで「どんなタスクがあるんだっけ?」って時に-Tオプションで見れる
以下のような感じ

$ rake -T
(in /home/toyoshi/rake)
rake checkout  # コード群をチェックアウトする
rake deploy    # プロジェクトをデプロイする
rake switch    # currentへのシンボリックリンクを付け替える

さらにdeployからcheckoutとswitchを呼ぶように依存関係を追加すると、以下のようになる

task :default => "deploy"

desc "プロジェクトをデプロイする"
task :deploy => [:checkout, :switch]

desc "コード群をチェックアウトする"
task :checkout

desc "currentへのシンボリックリンクを付け替える"
task :switch

これを実行してみると

$ rake -t
(in /home/toyoshi/rake)
** Invoke default (first_time)
** Invoke deploy (first_time)
** Invoke checkout (first_time)
** Execute checkout
** Invoke switch (first_time)
** Execute switch
** Execute deploy
** Execute default

deployの前にswitchとcheckoutタスクが実行されるようになった。

完成させる

あとは直感的にコマンドを並べるだけだ。
rakeではfileutilsモジュールが使えるので便利。

DIR_NAME = "releases/" + Time.now.strftime("%Y%m%d%H%M%S")

task :default => "deploy"

desc "プロジェクトをデプロイする"
task :deploy => [:checkout, :switch]

desc "コード群をチェックアウトする"
task :checkout do
  mkdir_p DIR_NAME
  sh "svn co http://example.com/svn/trunk #{DIR_NAME}"
end

desc "currentへのシンボリックリンクを付け替える"
task :switch do
  symlink(DIR_NAME, "current")
end

実行する

$ rake -t
(in /home/toyoshi/rake)
** Invoke default (first_time)
** Invoke deploy (first_time)
** Invoke checkout (first_time)
** Execute checkout
mkdir -p releases20100525093633
svn co http://example.com/svn/trunk releases/20100525093633
A    releases20100525093633/tasks
A    releases20100525093633/tasks/empty
A    releases20100525093633/templates
A    releases20100525093633/templates/empty
リビジョン 15 をチェックアウトしました。
** Invoke switch (first_time)
** Execute switch
ln -s releases20100525093633 current
** Execute deploy
** Execute default

ファイル構成

$ ls -la
Rakefile
current -> releases/20100525092712
releases
--20100525092556
--20100525092628
--20100525092712
--20100525093633

まとめ

よくわからないと思っていたけど、基本的にはコマンドを並べるだけで使える。
その他にもRubyクックブックではドキュメントの自動生成や、ファイルのクリーンアップ、ビルド、統計の取得などの例が紹介されていた。
特に今回使わなかったfileタスクというやつは、ファイルを生成するときに依存関係をみて自動でファイル生成が必要かどうかを判断してくれたりして
効率的なビルドや生成ができるような仕組みになっている。

とりあえず僕のレベルではコマンドラインオプションの処理などを自分でかかなくて良いというだけでも十分に使う価値があるように思いました。

参考サイト

Rake(実用的な例をあげて簡潔にまとめられており、とても分かりやすいです)

Rubyクックブック ―エキスパートのための応用レシピ集

Rubyクックブック ―エキスパートのための応用レシピ集