【上級者向け】MS ProjectのメタデータにGitのコミットハッシュを埋め込むバージョン管理連携
開発現場において、ソースコードはGitで厳格にバージョン管理されているのに、それと対をなすはずのプロジェクトスケジュール(.mppファイル)は「誰が持っているかわからない」「いつの時点の計画か分からない」という状態に陥っていないだろうか。
コードの改修とスケジュールの変更は表裏一体である。しかし、VBAやProjectの標準機能だけでは、ファイル保存時のソースコードの状態(コミットハッシュ)をスケジュール側に紐付けることはできない。
今回は、MS Projectの「カスタムプロジェクトプロパティ」を活用し、ファイル保存の瞬間にローカルリポジトリの最新Gitコミットハッシュを自動埋め込みする、極限まで堅牢なバージョン管理連携システムを構築する。
—
なぜこの連携が必要なのか?(設計思想)
多くの現場では、スケジュールファイルの管理に「파일명_20231015_提出用.mpp」といった属人的な命名規則が使われている。これでは以下の致命的な問題が発生する。
1. コードと計画の乖離: 「このWBSのタスク完了時、どのコミット時点のソースが動いていたのか」を後から追跡できない。
2. 監査・トレーサビリティの欠如: 品質監査や不具合調査の際、当時のスケジュールがどのバージョンに対応するものか特定に時間がかかる。
これを解決するためには、「Projectファイルのメタデータ(カスタムプロパティ)に、Gitのコミットハッシュを強制的に刻印する」仕組みが必要なのだ。
—
堅牢な設計のためのアーキテクチャ
今回の仕組みを実現するにあたり、以下の技術的ハードルをクリアする必要がある。
1. VBAからGitコマンドの実行: VBA単体では外部プロセスの標準出力(コミットハッシュ)を直接取得できないため、WScript.Shell経由で一時ファイルに出力するか、パイプ経由で処理する。
2. イベントフックの罠: Projectの `BeforeSave` イベントを利用するが、無限ループや予期せぬエラーでファイル保存が阻害されないよう、厳格なエラーハンドリングが必須となる。
3. リポジトリ非存在時のフォールバック: 万が一、Git管理外のフォルダでProjectファイルが開かれた場合でも、VBAがクラッシュしない耐性を備えること。
—
プロダクションコード実装
以下のコードを、MS ProjectのThisProjectモジュール、および標準モジュールに実装する。
1. ThisProject モジュール(イベントフック)
ファイル保存時のイベントを捉え、Gitハッシュの書き込み処理を呼び出す。
Option Explicit
‘================================================================
‘ イベントプロシージャ: ファイル保存直前
‘================================================================
Private Sub Project_BeforeSave(ByVal ASAsynch As Boolean, Cancel As Boolean)
On Error GoTo ErrorHandler
Dim gitHash As String
Dim filePath As String
‘ 未保存の新規ファイルの場合はパスが取得できないためスキップ
If ActiveProject.FullName = “” Then Exit Sub
filePath = ActiveProject.Path
‘ Gitの最新コミットハッシュを取得
gitHash = GetLatestGitCommitHash(filePath)
If gitHash <> “” Then
‘ カスタムプロジェクトプロパティにハッシュを書き込む
Call SetCustomProperty(“GitCommitHash”, gitHash)
Call SetCustomProperty(“GitLastSynced”, Format(Now, “yyyy-mm-dd hh:nn:ss”))
‘ 変更をマークせずにプロパティを更新するため、ステータスバーに通知
Application.StatusBar = “Git Commit Hash (” & Left(gitHash, 7) & “) をプロジェクトプロパティに埋め込みました。”
Else
Application.StatusBar = “警告: Gitリポジトリが見つからないため、ハッシュの埋め込みをスキップしました。”
End If
Exit Sub
ErrorHandler:
‘ 保存処理自体をブロックしないよう、エラーはログ出力に留めて黙殺する
MsgBox “Git連携処理でエラーが発生しました: ” & Err.Description, vbExclamation, “Git-Project Sync”
End Sub
2. 標準モジュール(Git操作・プロパティ操作ロジック)
WScript.Shellを用いてGitプロセスを叩き、標準出力を取得するプロフェッショナルな実装だ。
Option Explicit
‘================================================================
‘ Gitの最新ショートコミットハッシュを取得する
‘================================================================
Public Function GetLatestGitCommitHash(ByVal repoPath As String) As String
Dim shell As Object
Dim exec As Object
Dim cmd As String
Dim result As String
On Error GoTo ErrorHandler
Set shell = CreateObject(“WScript.Shell”)
‘ カレントディレクトリをプロジェクトのパスに移動し、git rev-parseを実行
‘ 標準エラー出力を捨てて、正常なハッシュのみを取得
cmd = “cmd.exe /c cd /d “”” & repoPath & “”” & git rev-parse –short HEAD 2>nul”
Set exec = shell.Exec(cmd)
result = exec.StdOut.ReadAll
‘ 改行コード等をトリム
result = Trim(result)
‘ Gitハッシュとしての妥当性チェック(簡易的に文字数等を見る)
If Len(result) >= 7 Then
GetLatestGitCommitHash = result
Else
GetLatestGitCommitHash = “”
End If
Exit Function
ErrorHandler:
GetLatestGitCommitHash = “”
End Function
‘================================================================
‘ カスタムプロジェクトプロパティを設定・更新する
‘================================================================
Public Sub SetCustomProperty(ByVal propName As String, ByVal propValue As String)
On Error GoTo ErrorHandler
Dim cpsp As CustomProperty
Dim found As Boolean
found = False
‘ 既存のカスタムプロパティを走査
For Each cpsp In ActiveProject.CustomProperties
If cpsp.Name = propName Then
cpsp.Value = propValue
found = True
Exit For
End If
Next cpsp
‘ 存在しない場合は新規追加
If Not found Then
ActiveProject.CustomProperties.Add Name:=propName, Value:=propValue
End If
Exit Sub
ErrorHandler:
‘ プロパティ追加失敗時のハンドリング
Debug.Print “Failed to set custom property: ” & propName & ” – ” & Err.Description
End Sub
—
運用上の注意点とアーキテクトからの助言
1. 実行セキュリティの設定:
組織内でこのマクロを配布する場合、デジタル署名を行うか、信頼できる場所(Trusted Locations)にテンプレート(Global.mptまたはエンタープライズテンプレート)を配置する必要がある。マクロが無効化されている環境ではイベントが発火しない点に注意せよ。
2. パフォーマンスへの影響:
`WScript.Shell.Exec` による外部プロセスの呼び出しは、わずか数十ミリ秒のオーバーヘッドを伴う。しかし、`BeforeSave` イベントのタイミングでの実行であれば、人間の知覚速度を完全に下回るため、ユーザビリティを損なうことはない。
3. CI/CDパイプラインとの統合:
このメタデータに埋め込まれたコミットハッシュは、将来的にVSTS/Azure DevOpsやGitHub ActionsからAPI経由で読み取り、「計画とコードのバージョンが一致しているか」を自動検証するCIゲートの入力としても活用できる。
—
結び
業務自動化やツール開発において、「手作業の排除」は基本中の基本だ。しかし、真に高度なエンジニアリングとは、「ツールとインフラ(Git)を有機的に結合させ、人間のうっかりミスが介入する余地を排除する仕組み」を構築することにある。
このコードをあなたのプロジェクトに導入し、バージョン管理の精度を次の次元へと引き上げてほしい。
