Subversion リポジトリを更新してビルドを実行する Rakefile 書いてみた

RubyRails アプリ開発だけに使うのはもったいない。刺身タンポポ作業は Ruby でスクリプト書いてどんどん自動化しないと。

というわけで、RubySubversionリポジトリを更新して、プロジェクトをビルドする作業を自動化してみた。Rake ファイルだけど。

# coding: utf-8
#
# リポジトリを管理するための Rakefile
# リポジトリの更新とビルドを自動化。
# 使い方:
#   rake -f ./manage_repository.rb all:update all:build
#

MSBUILD = '"C:/windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe"'
BASE_DIR = "C:/Users/<username>/Documents/Visual Studio 2010/Projects"

# ビルド対象のプロジェクト情報
PROJECTS = [
  {:name => "foo", :dir_name => "Foo", :sln_name => "Foo.sln"},
  {:name => "bar", :dir_name => "Bar", :sln_name => "Bar.sln", :platform => "Mixed Platforms"},
]

# TortoiseSVNコマンドラインで実行してリポジトリを更新
def svn_update(path)
  sh "TortoiseProc.exe /command:update /path:\"#{path}\" /closeonend:1"
end

# プラットフォームを指定して MSBuild を実行
def msbuild(path, platform)
  platform ||= "Any CPU"
  sh "#{MSBUILD} \"#{path}\" /p:Configuration=Release /p:Platform=\"#{platform}\" /t:Rebuild"
end

PROJECTS.each do |info|
  namespace info[:name] do
    project_dir = File.join(BASE_DIR, info[:dir_name])

    desc "update #{info[:name]} repository"
    task :update do
      svn_update project_dir
    end

    desc "build #{info[:name]}"
    task :build do
      msbuild File.join(project_dir, info[:sln_name]), info[:platform]
    end
  end
end

namespace :all do
  desc "update all repositories"
  task :update => PROJECTS.map{|info| "#{info[:name]}:update"}

  desc "build all repositories"
  task :build => PROJECTS.map{|info| "#{info[:name]}:build"}
end

これをログイン後に実行するよう、Windows のタスクスケジューラーに登録してみた。

Tortoise Proc を使っているのは、会社で許可されてる Subversion クライアントが Tortoise SVN だけだから。自動で閉じるようにしているとはいえ、ダイアログが出るのがうざったいんだけど、仕方ない。