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 にあるログを参照してください。

例: チェンジセット一覧ページ

例: チェンジセット表示

Posted in  | no comments | no trackbacks