初めてのpsake ~PowerShelを使ったビルドツール~

0.前置き

初めてAdvent Calenderに挑戦しています。
私の担当は、「PowerShell Advent Calendar 2011」の14日目です。
Webアプリケーション開発の効率化のためによくPowerShellを利用しますが、ブログで取り扱うのは初めてです。

今回のテーマは「psake」(日本の酒と同じ読み方)です。
psakeはPowerShellを使ったビルドツールです。
.NETの開発では、ビルドツールにMsBuildやNAntを利用することがありますが、psakeも同じ用途です。
では、さっそく。

1. psakeとは

psakeとは、PowerShellで書かれたビルドツールです。
アングルブラケット地獄に陥ることなく、PowerShellの機能をふんだんに使えるビルドスクリプトが書けます。
ソースコードと実行モジュールはGitHub上にホストされています。こちら。
NuGet経由で手に入れることも可能です。こちら。

2. 実際にビルドスクリプトを書いてみる

psakeで作るスクリプトは、タスクと、その依存関係を示すコードからなります。
例えばビルドをするスクリプト(タスクのことです)は以下のよう。

task Build{
    Write-Host -ForegroundColor Green "Building"
    exec { msbuild  Sample.csproj } "Error Building" | out-null
}

コンポーネントテストをするスクリプトは以下のよう。

task Test{
    Write-Host -ForegroundColor Green "Testing"
    exec { mstest /testcontainer:Sample.dll } "Error Testing" | out-null
}

そして、これらの実行順序を考慮して、依存関係を示すスクリプトがこんな感じ。

task Full -depends Build, Test

タスクに相当するものとして、一時領域のクリーンアップや、ビルド、コンポーネントテスト、メトリクス取得、テストカバレッジ取得、配置パッケージ作成、などなどが考えられるでしょうか。

3. ビルドしてみる

では、実際にビルドしてみます。
上述したコードをbuild.ps1に格納していると仮定します。

.\psake.ps1 -buildFile "build.ps1" -taskList "Full" -framework "4.0"

psakeの本体は、psake.psm1ですが、いちいちモジュールを読み込むのは面倒だということで
あらかじめヘルパーとして、psake.ps1が用意されています。
普段利用するときは、psake.ps1経由が良いと思います。
引数として渡しているものは、

-buildFile タスクが記述されているPSファイル
-taskList 実行するタスク
-buildFile ビルドに利用する.NET Frameworkのバージョン(何も指定しないと3.5でビルドされる)

です。

GitHubに、ASP.NET Webフォームのサンプルアプリをビルドスクリプトをセットにした、お試しpsakeセットを置きました。
こちらをご参照ください。

4. おわりに

気になるpsakeの採用実績(?)ですが、ちょっと調べました。

プロジェクト名 概要 URL
AutoMapper 規約ベースのマッピングツール https://github.com/AutoMapper/AutoMapper
Soma ORマッパー http://soma.codeplex.com/
Json.NET .NETのJSONフレームワーク http://json.codeplex.com/
Glimpse クライアントからサーバーサイドをデバックできるツール https://github.com/Glimpse/Glimpse

今は自分が担当するプロジェクトにて、psakeで書いたビルドスクリプトをJenkinsに実行させています。
他のビルドツールと比較し、PowerShellで書けるpsakeのほうが管理しやすいです。
PowerShellの恩恵を受けられるのはやはり大きいです。
(PowerShell自体の機能が多いですし、Windowsに標準で入ってきますし。)

今日はこんなところです。
明日は、@RyosukeUemotoさんにバトンタッチです。

広告

ASP.NET開発における開発環境の一例

0.前置き

いったい世の中では、どんな開発環境の中で開発しているんだろうってっことが気になります。
個々のプロダクトや技術の話は耳にしますが、それをどう組み合わせているかっていうものはなかなか目にしません。
しかもいまや、継続的ペケペケがはやっているし、分散SCMもはやり始めている。
まもなく世の中の開発環境は初心者にとって、混沌なものに見えてしまうのではと懸念します。
というわけで、今の時点で、自分の中でもしっかり整理し、将来に活かしたいわけです。

1.私の場合

私が何を開発しているかというと、ASP.NET Webフォームを用いたイントラ用のWebアプリケーションです。
さっそくですが開発環境はこんな感じです。
(画像が大きいので、サムネイルにしています。大きくするにはクリックしてください。)

簡単な解説を加えます。

構成管理ツール
Subversionを使っています。
Gitとかまだ良く分かりません…。

CIサーバー
Jenkinsです。定期的にSVNをポーリングしています。
変更があった際には、svn updateを行い、ビルド、コンポーネントテスト、テストカバレッジ計測を行います。

ITS用サーバー
ITSにはRedmineを使っています。
タスクレベルの詳細なスケジュール管理、バグの管理、コードレビューの管理、プロダクトバージョンの管理を行っています。
重要なプラグインとして、コードレビュー用のプラグインを利用しています。
タスクを管理しているため、PM上、とても大切です。

テスト管理用サーバー
TestLinkを利用。
テストケースの管理、実施履歴の管理、テストケースから算出できるメトリクスの管理はこちら。
残念ながら、バグ起票をRedmineと連携できていません。

テスト用サーバー
開発中のアプリのデプロイ先です。
ここで統合テストを実施します。
特筆すべきは、Web Deploy Agentをインストールしていることです。
このツールのおかげで、Visual Studioの「発行」機能を使えば、ボタン一発で、
DBの初期化からWebアプリのデプロイまで行えます。
すごく手軽で、デプロイの障壁がなくなりました。
MSの物江さんのブログ:Visual Studio 2010 [発行]機能で配置可能とするためのサーバー設定

開発者端末
Visual Studio 2010 Proに、開発生産性をあげるために多くのアドオンを入れています。
あと自動UIテストを実施するためのSeleniumもここにいます。
残念ながら、これはIDE。つまりFirefoxのアドオンです。早くサーバー側にもって行きたいですね。
Source Monitorで簡易的なコードメトリクスをとっています。

2.改善点

改善点はたくさんあります。代表的なものを列挙します。

  • TestLinkとRedmineをつなげる。Redmineでバグの起票をシームレスにTestLinkから実施したい。
  • Jenkinsからテスト用サーバーに対して、継続的デプロイを提供したい。
  • JenkinsのCIにSeleniumを利用した自動UIテストを取り入れたい。

などなど。
第一の仕事がアプリ作りだから、いまや、開発環境の改善に手間をかけられないのは、少し惜しいです。

3.最後に

私が考える理想形はこうだ!っていうのを、おいおい別のポストでまとめてみたいです。
それをTFSなりのMS系プロダクトで固めたらどうなるか、比較してみたいですね。