会社で BTS として Bugzilla を使っているんだけど、修正したあとに手作業で Web インターフェースから書き込むのが面倒になってきたので、自動化してみた。
コミットしたとき (Git の場合は push したとき) に、コミットメッセージからバグ番号を読み取って、対応するバグにメッセージを書き込みつつ、FIXED にすればよい。
情報がなくて困ったのが、バグにコメントを書いたり、FIXED にする方法。この部分の処理を抜き出してみた。
#!/usr/bin/perl -I/path/to/bugzilla -I/path/to/bugzilla/lib
use strict;
use Bugzilla;
use Bugzilla::User;
use Bugzilla::Status;
use Bugzilla::Bug;
use utf8;
&update_bug(1, "ほげほげ");
# API document: http://www.bugzilla.org/docs/4.2/en/html/api/
sub update_bug {
my ($bug_id, $text) = @_;
# open bug
my $bug = Bugzilla::Bug->new($bug_id);
die $bug->error if defined $bug->error;
# get user
my $user = Bugzilla::User->new({name => 'admin@example.com'});
die 'user not found!!!!' unless defined $user;
# login
Bugzilla->set_user($user);
# comment to the bug
$bug->add_comment($text);
# FIXED
$bug->set_bug_status(Bugzilla::Status->new({name => 'RESOLVED'}),
{resolution => 'FIXED'});
# save to database
$bug->update();
}
Bugzilla 4.2.5 で動作を確認している。
あとは、Git なら post-receive
フックで、コミットログを解析して、この関数を呼ぶようにすればよい。
注意点:
- Bugzilla がインストールされているサーバー上で動くことを前提としている。同一サーバーならパスワードなしで、特定のユーザーに su できるようだ。
Bugzilla::Bug
はドキュメント化されていないので、バージョンアップしたら使えなくなる可能性がある。同じような機能のBugzilla::WebService::Bug
はドキュメントがあるんだけど、使おうとしたらTest/Taint.pm
が必要だとか言われて面倒になったのでやめた。