.NET環境におけるSVN連続インテグレーションツールの構築と実装

背景と動機

以前の開発現場では、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との連携により、ソースコードの取得からパッケージングまでのプロセスが完全に自動化されている。

8月12日 06:15 投稿