GitからLighthouseにチェンジセットを送る
Posted by yatsu Fri, 10 Oct 2008 08:09:11 GMT
GitからLighthouseにチェンジセットを自動で送る方法を探してみたのですが、ちょうどよいものが見つけられなかったので、自分でちょっとしたpost-receiveスクリプトを書いてみました。
例として、以下のような環境を用意します。
% mkdir project
% cd project
% git init
% touch README
% git add README
% git commit -m "Initial commit."
% cd ..
% git clone --bare project
これによって project.git ディレクトリができます。
作業レポジトリは project とし、そこから project.git に対して git push したときにチェンジセットがLighthouseに送られるように設定します。
まず、lighthouse-apiを project.git ディレクトリに置きます。
% cd project.git
% git clone git://github.com/Caged/lighthouse-api.git
RubyGemsでGritをインストールします。
% gem install grit
project.git/hooks ディレクトリに以下の post-receive を作ります。
#!/usr/bin/env ruby
require 'rubygems'
require 'grit'
require File.dirname(__FILE__) + '/../lighthouse-api/lib/lighthouse-api'
# ---
account = 'foo'
permalink = 'project'
tokens = {
'foo@example.com' => '03129063afbb21293e71d873dea6362b67fdf81f'
}
# ---
logger = Logger.new(File.dirname(__FILE__) + '/logs/post-receive.log')
logger.level = Logger::INFO
begin
rev_old, rev_new, ref = STDIN.read.chomp.split(/ /)
logger.info "[receive] #{rev_old} #{rev_new} #{ref}"
repo = Grit::Repo.new(File.dirname(__FILE__) + '/..')
commits = repo.commits("#{rev_old}..#{rev_new}")
Lighthouse.account = account
Lighthouse.token = tokens[commits.first.committer.email]
project = Lighthouse::Project.find(:first, :params => { :permalink => permalink })
commits.reverse.each do |commit|
logger.info "[post] #{commit.id}"
diff = repo.git.diff({ :name_status => true }, rev_old, commit.id)
changeset = Lighthouse::Changeset.new(
:project_id => project.id,
:revision => commit.id,
:title => "Changeset [#{commit.id}] by #{commit.committer.name}",
:body => commit.message,
:changes => diff.map {|l| l.split(/\t/) }.to_yaml,
:changed_at => commit.committed_date
)
changeset.save
logger.debug "[data] #{changeset.inspect}"
rev_old = commit.id
end
rescue => e
logger.error "[error] #{e.message}"
end
このスクリプトのaccount, permalink, tokensを実際の値に置き換えます。
- accountは、LighthouseのURLが http://foo.lighthouseapp.com/ の場合、「foo」
- permalinkは、Lightouseの「Edit project」のページで設定したPermalink
- tokensは、Lighthouseのアカウントごとに生成したトークン
トークンの生成方法はLighthouseのサイトで探してください。
このスクリプトが実行されると、git config user.email で表示されるメールアドレスからトークンを引くので、git config user.email が正しく設定されていることを確認してください。
このスクリプトを実行可能にします。
% chmod +x hooks/post-receive
ログのためのディレクトリを作ります。
% mkdir hooks/logs
以上で設定は完了です。
project ディレクトリから commit, push を行い、動作を確認します。
projectディレクトリに移り、originを設定します。
% cd ../project
% git remote add origin ../project.git
READMEを書き換え、commit し、push します。
% git commit -a -m "Modified README."
% git push
これでLighthouseにチェンジセットが送られます。 もし送られない場合は、project.git/hooks/logs/post-receive.log にあるログを参照してください。


