背景と動機
以前の開発現場では、Visual SourceSafe (VSS) を使用したバージョン管理と、手動でのビルド・デプロイプロセスが主流であった。コードのマージやリリースパッケージの作成はメールベースで行われており、ファイルの欠落やマージの不具合が頻発していた。特に本番環境へのリリース時には人的ミスが致命的な問題を引き起こすリスクが高く、手動プロセスの自動化とバージョン管理システムの刷新(SubNversionへの移行)が急務であった。これにより、ビルドプロセスの効率化とリリース品質の担保を目指し、独自の継続的インテグレーション(CI)ツールを開発するに至った。
開発アプローチ
当初はVSSのAPIを使用した自動化を試みたが、インターフェースの制約が多く実装が困難であったため、Subversion (SVN) への移行を決定した。既存のオープンソースツール(Jenkins等)も検討したが、Javaベースの環境構築やカスタマイズの学習コストを考慮し、チームの主力技術である.NET Frameworkでの自作ツール開発を選択した。これにより、既存のインフラおよび開発スキルとの親和性を高め、柔軟な機能拡張を可能にした。
システム機能
開発されたツールは、主にWeb管理画面とバックグラウンドのコンソールアプリケーションで構成されている。
- ダッシュボード: 全プロジェクトの一覧表示を行い、最新のビルド状況を即座に把握可能である。新規リリースされたプロジェクトがリスト上位に表示される。
- プロジェクト管理: SVNリポジトリのURL設定やプロジェクト固有の情報を管理する。
- リリース管理: テスト環境と本番環境のブランチを明確に分離。テスト完了後にコードをマージし、本番リリースを作成するワークフローをサポートする。
- ログと履歴: ビルド失敗時の詳細ログや、SVNのコミット履歴、担当者情報を閲覧可能。
- 統計レポート: 管理層からの要望に基づき、リリース頻度やコード更新量などの統計情報をSQLベースで出力する機能を実装した。
技術スタック
- .NET Framework 4.0
- ASP.NET MVC 3
- SQL Server 2005
- Razor View Engine
- Dapper (Micro-ORM)
- SharpSvn (SVN Client Library)
- MSBuild
実装の詳細
ビルドスクリプト (MSBuild)
ビルドプロセスでは、MSBuildを使用してソリューションをコンパイルし、必要なアーティファクトを特定のディレクトリに出力する。以下は、カスタムビルドタスクを定義したXMLスクリプトの例である。変数は実行時に動的に置換される。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<BuildLabel>$(BranchName)_Release</BuildLabel>
<WebOutputPath>..\Deploy\WebApp</WebOutputPath>
<SiteOutputPath>..\Deploy\WebSite</SiteOutputPath>
</PropertyGroup>
<ItemGroup>
<DeployFiles Include="web\**\*.dll;web\**\*.aspx;web\**\*.js;web\**\*.css;web\**\*.config;web\**\*.jpg;web\**\*.png" />
</ItemGroup>
<Target Name="ExecuteBuild">
<MSBuild Projects="$(SolutionPath)" Targets="$(BuildCommand)" />
</Target>
</Project>
アーカイブ化処理
ビルド成果物は、OSにインストールされたWinRARをコマンドラインから呼び出して圧縮する。レジストリを参照して実行パスを特定し、プロセスを起動してアーカイブを作成する。
public static class ArchiveHelper
{
public static void CreatePackage(string sourceDirectory, string targetDirectory, string packageFileName, string excludePattern)
{
string executablePath = GetWinRarPath();
if (string.IsNullOrEmpty(executablePath))
{
throw new InvalidOperationException("WinRAR is not installed.");
}
// コマンド引数の構築: a (追加), -r (再帰), -ep1 (ベースパス除外), -y (全てyes)
string arguments = string.Format("a {0} -r -ep1 -y \"{1}\" \"{2}\"", excludePattern, packageFileName, sourceDirectory);
var processStartInfo = new ProcessStartInfo
{
FileName = executablePath,
Arguments = arguments,
CreateNoWindow = true,
UseShellExecute = false,
WindowStyle = ProcessWindowStyle.Hidden,
WorkingDirectory = targetDirectory
};
using (var buildProcess = new Process { StartInfo = processStartInfo })
{
buildProcess.Start();
buildProcess.WaitForExit();
}
}
private static string GetWinRarPath()
{
// レジストリからWinRARのインストールパスを取得するロジックを実装
// 例: Registry.LocalMachine.OpenSubPath(...)
return @"C:\Program Files\WinRAR\WinRAR.exe"; // 簡略化のため
}
}
データベース構成
システム管理のため、以下のような主要なテーブルが定義されている。
CI_Projects: プロジェクト定義情報CI_Releases: リリースバージョンおよびステータス履歴CI_Logs: コミットログおよびビルドログCI_Users: ユーザー認証情報CI_ReviewItems: 要件レビュー管理データ
このツールの導入により、手動作業に起因するリリースミスは大幅に削減され、開発フローの標準化に貢献した。SVNとの連携により、ソースコードの取得からパッケージングまでのプロセスが完全に自動化されている。