2008年 01月 05日

Ruby で ShipIt のようなことをやる gem shipit

昨日のアイデアのまま gem にしてみました。(自動化したくなったのでとりあえず gem として使えるようにしたかった)

名前に悩んで (rake-shipit) とか、むしろオリジナルの ShipIt から離れているから名前違うほうがいいのかとか (やってることはおなじはずだけど) 考えたのだけど、名前変えるのがいろいろ面倒になった。

.shipit とか使わずに Rake のタスクにしたのは、普通 Rake でリリースタスクを書いて rake release とかでリリースしていると思うので、そのへんを変えたくなかったのと、DSL みたいなのですむならそれにこしたことないなぁと思ったからです。

今のところかなりオレオレ専用な部分が多いので (cutagem つかえばいいとおもうよ!)、使いながらなおしたい。

Rake::ShipitTask.new do |s|
	s.Step.new {
		system("svn", "up")
	}.and {}
	s.Ask
	s.Task :rubyforge
	s.Step.new {
		raise "svn2cl.sh is not found" unless system("svn2cl.sh", "--version")
	}.and {
		system("svn2cl.sh --break-before-msg=2 --group-by-day  --include-rev --separate-daylogs")
	}
	s.ChangeVersion __FILE__, "VERS"
	s.Commit
	s.Task :clean, :package
	s.RubyForge
	s.Tag
	s.Twitter
end

ちゃっちゃと gem にするだけしとこう、とか思って作業をはじめたのだけど、結局いろいろデバッグしたりする必要があった……

gem spec に指定する version をうまく更新できなくて、実はまったくうまくいってないみたいだ (たまたま最初の二回うまくいっただけ……)
ChangeVersion と Rakefile がかなり相性悪い…… (内部でやってるから)

さらに GemPackageTask が spec をたんにわたすわけじゃなくて version を (コピーとして) わたすからどうにもできない……
ChangeVersion が走ったら rakefile よみなおす、みたいなことしないとだめだ……

Rake タスクを実行するとき rake コマンドを叩きなおすようにした (いままでは invoke で内部実行してた)。
ひどすぎるバグだったのでリリースした (リリースするのたのしくなるけど、一日何回もリリースするのってアレですよね……)