リポジトリの作成を自動化したい

過去の日記[id:sikakura:20101124]で、rksyngさんにコメントいただいた内容をまとめておきたいと思います。
リポジトリの自動作成については、http://www.redmine.org/wiki/1/Automating_repository_creationに情報が
あるので、基本的にこの手順に従うのですが、私の環境ではうまく動作しなかった&もう少し詳細な手順がほしい
ということでまとめてみます。


概要レベルの手順は以下の通りです。

  1. Redmineに管理者でログインして、管理>設定>リポジトリで、リポジトリ管理用のWebサービスを有効にします。
  2. http.confの内容を編集し、/sysに対するアクセス権を設定します。
  3. コマンドラインからreposman.rbを実行します。
  4. reposman.rbを定期的に実行するように設定します。


1の手順では、リポジトリ管理用のWebサービスの有効化とAPIキーの設定ですが、以下の図の赤く囲まれた部分を設定します。

チェックボックスにチェックを入れ、APIキーを入力します。ここで入力したAPIキーは、手順の3番で使用します。

2の手順では、Webサービスを利用可能にするために、/sysに対する権限付与を行います。
具体的には、



Order deny,allow
Allow from 192.168.0.1
Deny from all

というようにhttp.confに記載します。IPアドレスは適宜変更してください。

3の手順では、reposman.rbを実行します。
私の環境では、Gドライブ直下にBitNamiでRedmineをインストールしていますので、
G:\BitNami\apps\redmine\extra\svn\reposman.rbにありました。
以下のようにコマンドプロンプトから実行します。
私が躓いた箇所としては、--redmine-hostに指定するのが本当にホスト名ではなく、Redmineにブラウザからアクセスする際のURLを指定するという部分でした。

ruby reposman.rb --svn-dir=G:\BitNami\repo --redmine-host=http://192.168.0.1:9999/redmine --key=HaLV7axxA5V4

上のように実行すればOKなはずですが、以下のようなエラーがでます。


unable to create G:\BitNami\repo\test1 : undefined method `uid' for nil:NilClass
どうやらtest1というプロジェクト用のリポジトリ作成の時点でエラーが発生しているようです。
uidというメソッドが無いためにエラーが発生していると思われます。
reposman.rbを眺めてみると、208行目〜220行目には、以下のように書かれています。

def set_owner_and_rights(project, repos_path, &block)
  if RUBY_PLATFORM =~ /mswin/
    yield if block_given?
  else
    uid, gid = Etc.getpwnam($svn_owner).uid, ($use_groupid ? Etc.getgrnam(project.identifier).gid : Etc.getgrnam($svn_group).gid)
    right = project.is_public ? 0775 : 0770
    yield if block_given?
    Find.find(repos_path) do |f|
      File.chmod right, f
      File.chown uid, gid, f
    end
  end
end

なんとなく、if文がWindows用、else文がそれ以外用といった感じです。
RUBY_PLATFORMでWindowsプラットフォームの判定がうまくいってないようです。
以前のコメントでの対応では、else文をコメントアウトして対応したのですが、
今回はif文を書き換えてみます。
変更前

  if RUBY_PLATFORM =~ /mswin/
    yield if block_given?
  else

変更後

  if RUBY_PLATFORM =~ /(:?mswin|mingw)/
    yield if block_given?
  else

私の環境ではRUBY_PLATFORMは、i386-mingw32と返ってきましたので、上のように対応してみました。
これで動作するはずです。
ちなみに、svnadminコマンドにパスが通ってないとまたエラーになりますので、ご注意を。
4の手順では、3のコマンドプロンプトで実行した内容をバッチファイルにして、Windowsのタスクで実行させます。


リポジトリの作成は大して大変ではありませんが、サーバの管理を開放せずに、
それぞれのリーダがプロジェクトを作成する環境では必要かなと思いました。