対象: root/programs/CS(C# 側)
配置: root/programs
本書は、リリース時に何を・どの順で確認し、どこまでを機械が行い、どこからを人が行うかを 1 枚にまとめたもの。
一次情報は本書ではない。 迷ったら次を見ること。
内容 一次情報 ビルド構成・バージョン管理 CS/Frameworks/ANALYSIS.md7 章全ビルドの実行と判定 BUILDING.md単体テストの実行と判定 TESTING.mdサンプルの疎通確認 SMOKETEST.mdNuGet パッケージ化・公開の手順 CS/NuGet/_手順の説明.txt
| # | フェーズ | 手段 | 実施者 |
|---|---|---|---|
| 0 | 準備 | 手作業 | 人(エージェントは充足状況の確認・報告まで) |
| 1 | 検証(ビルド・単体テスト・疎通) | 1_BuildAll.ps1 / 2_RunAllTests.ps1 / 3_SmokeTest.ps1 |
エージェント可 |
| 2 | 検証(UI 系・ツール) | 手作業(GUI 操作) | 人(自動化は見送り。7 節) |
| 3 | パッケージ化 | CS\0_Release4Nuget.bat → _NuGetPack.bat |
エージェント可(指示があれば) |
| 4 | 公開 | _NuGetPush.bat + Wiki 手順 |
人のみ |
| 5 | 後始末 | 手作業 | 人(エージェントは差分の報告まで) |
取り消しにくい・外部に出る・システム設定を変えるものは人が行う。
この線引きは AGENTS.md(git 操作をしない/公開リポジトリへの投稿は承認を得てから)と同じ考え方。
| 人が行うフェーズ | 人が行う理由 |
|---|---|
| 0 準備 | Start-Service aspnet_state はシステム設定の変更。DB の初期化も同様。エージェントは不足を検知して対処方法とともに報告するに留める |
| 2 検証(UI 系) | GUI 操作のため |
| 4 公開 | _NuGetPush.bat は外部公開で取り消しが困難。かつ API キーを扱う |
| 5 後始末 | revert の確定はワーキング ツリーの検収と同じ扱い |
フェーズ 1 をエージェントが実行してよいのは、失敗しても被害が無く、結果がワーキング ツリーに残るだけだから。
フェーズ 3 は成果物をローカルに作るだけだが、CS\z_Common.bat の DEBUG_TYPE 変更を伴い、
フェーズ 4 と地続きのため、指示があったときだけ実行する。
フェーズ 1 は 3 本を順に実行するだけで済む。
cd root\programs
.\1_BuildAll.ps1 # 全ビルド.\2_RunAllTests.ps1 # 単体テスト.\3_SmokeTest.ps1 # サンプルの疎通クリーン ビルドから通しで 約 9.5 分。
2_RunAllTests.ps1 と 3_SmokeTest.ps1 は終了コードだけで合否が分かるが、
1_BuildAll.ps1 は既知の署名エラーで 1 になるため、内容の確認が要る(3 節)。
- Visual Studio を閉じた
…
1_DeleteDir.batが.vsを削除するため - SQL Server の Northwind に接続できる
- Northwind が初期状態(
Shippers3 件 /Orders830 件)
… 汚れている場合の戻し方はTESTING.md「テスト データの戻し方」 -
Orders2テーブルが存在する … Northwind 標準ではない。無ければ
CS\Samples\Bat_sample\RerunnableBatch_sample\CREATE ORDERS2.sqlを実行 - サービスが開始されている(
Start-Service、aspnet_state、要管理者権限)- Start-Service … アプリが 使うデータストア(Dockerコンテナ)を起動、初期化する。
- aspnet_state … net48 の Web アプリが使うASP.NET 状態サービスを起動する。
- IIS Express がインストールされている
-
CS/Frameworks/Infrastructure/Directory.Build.propsのOpenTouryoVersionを更新した … SDK 形式アセンブリ 7 個と NuGet パッケージの唯一の定義箇所 - net48(旧形式 csproj)の
Properties\AssemblyInfo.csを更新した …Directory.Build.propsが効かないため別管理 -
Business系は 1.0.0 のままであることを確認した … Public / Framework / Public.Security の 3.0.0 とは意図的に別系統 - nuspec の
<dependencies>が csproj のPackageReferenceと一致している … 依存を増減したら nuspec 側も合わせる。相互依存の版は$version$で自動追随
Directory.Build.propsの XML コメントに--(ハイフン 2 個)を書くと MSBuild がプロジェクトの読み込みに失敗する。区切り線に使わないこと。
| スクリプト | 見るもの | 期待値 | 文書 |
|---|---|---|---|
1_BuildAll.ps1 |
ビルドが通るか | エラー 0 件 | BUILDING.md |
2_RunAllTests.ps1 |
出力が前回と同じか | HEAD の Result*.txt |
TESTING.md |
3_SmokeTest.ps1 |
起動して想定どおり動くか | 定義側の判定条件 | SMOKETEST.md |
-
1_BuildAll.ps1のエラーが「既知の 1 件」だけである …-SkipCleanは使わない。前回の成果物が残っていると通ったように見える -
2_RunAllTests.ps1が終了コード 0(6 ケース) -
3_SmokeTest.ps1が終了コード 0(18 件)
1_BuildAll.ps1は現状ここで終了コード 1 になる。WSClnt_sample (net48)の ClickOnce 署名エラー(MSB3482)が残るため。 終了コードだけで判断せず、エラー一覧が下記 1 件だけであることを確認すること(4 節)。[WSClnt_sample (net48)] ... error MSB3482: 署名中にエラーが発生しました: ... WSClientWinCone_sample.exe の署名に失敗しました。 SignTool Error: No certificates were found that met all the given criteria.証明書をストアに入れた環境では 0 になる。
所要時間の実測(クリーン ビルドから通しで 約 9.5 分)。
| スクリプト | 所要 |
|---|---|
1_BuildAll.ps1(31 ステップ) |
5.8 分 |
2_RunAllTests.ps1(6 ケース) |
1.3 分 |
3_SmokeTest.ps1(18 件) |
2.4 分 |
1_BuildAll.ps1 → 2_RunAllTests.ps1 → 3_SmokeTest.ps1 の順で行う。
1_BuildAll.ps1 はクリーンを行い、4_Build_CopyAssemblies.bat がテストとサンプルの
参照先(Build_net48 / Build_netcore100)を更新するため、
逆順では古いアセンブリを見ることになる。
| スクリプト | NG の意味 |
|---|---|
1_BuildAll.ps1 |
コンパイル エラー、または restore の失敗 |
2_RunAllTests.ps1 |
退行/期待結果の陳腐化/テスト データの汚染のいずれか |
3_SmokeTest.ps1 |
起動時の失敗(構成・ネイティブ DLL・前提サービス)が多い |
2_RunAllTests.ps1 の「実測のみ/期待のみ」に件数の差が出た場合は、
まずテスト データの汚染を疑う(TESTING.md 5 節)。
2_RunAllTests.ps1 はワーキング ツリーの Result*.txt を書き換える(従来のバッチ運用と同じ)。
この生 diff を目視してはいけない。 実行日時が全行に入るため、 内容が同じでもほぼ全行が差分になる。実測では 6 ファイルで約 2,458 行。
-[2025/11/18 15:19:08,286],[INFO ],[1],,,,----->>,...
+[2026/08/01 22:40:19,772],[INFO ],[1],,,,----->>,...判定は 2_RunAllTests.ps1 の「正規化後の差分」で行う。 それが 0 なら内容は同じ。
生 diff を読むのは、正規化後に差分が出たときだけでよい。
- 正規化後の差分が 0 であることを確認した
-
Result*.txtをコミットするかどうかを判断した … 内容が変わっていないならコミットしなくてよい(日時だけの差分が積み上がるため)。 仕様変更で内容が変わった場合は、新しい基準としてコミットする
自動化から外した対象。起動して主要な画面が出ることを確認する。
| 区分 | net48 | net10.0 |
|---|---|---|
| 2 層 C/S | 2CSClientWin_sample2CSClientWPF_sampleAsyncEvent_sampleCustCtrl_sampleGenDaoAndBatUpd_sampleTimeStamp_sample |
2CSClientWin_sample2CSClientWPF_sampleCustCtrl_sampleGenDaoAndBatUpd_sampleTimeStamp_sample |
| WS クライアント | WSClientWin_sampleWSClientWPF_sampleWSClientWin2_sampleWSClientWinCone_sample |
WSClientWin_sampleWSClientWPF_sampleWSClientWin2_sample |
- 2 層 C/S 系(net48 6 本 / net10.0 5 本)が起動し、CRUD 画面が操作できる
- WS クライアント系(net48 4 本 / net10.0 3 本)が起動する
WS クライアントの疎通には別リポジトリが要る。 呼び先の Web サービスは
OpenTouryoProject/ResourceServerTemplatesへ移設済みで、本リポジトリだけでは接続先が無い。
| ツール | 確認内容 |
|---|---|
DaoGen_Tool(墨壺) |
GUI 起動のみ。CUI(/HELP /CUI /MODE ...)は 3_SmokeTest.ps1 が網羅済み |
DPQuery_Tool |
GUI 起動 |
EncAndDecUtil |
GUI 起動(CUI 版は 2_RunAllTests.ps1 が網羅済み) |
-
DaoGen_Toolが GUI で起動し、D 層定義・SQL が生成できる … 生成ロジック自体は CUI 側で自動確認済み。ここで見るのは GUI が動くこと -
DPQuery_Toolが GUI で起動する -
EncAndDecUtilが GUI で起動する
-
WSClientWinCone_sampleの ClickOnce 署名エラー(MSB3482)を確認した … 拇印で証明書ストアを検索するため、当該証明書が無い環境ではビルドできない。 環境依存でありコード側の不具合ではない(BUILDING.md4 節)
手順の一次情報は CS/NuGet/_手順の説明.txt。
ここに書き写すと二重管理になるため、要点と抜けやすい点だけを挙げる。
-
CS\z_Common.batのDEBUG_TYPEをfull→portableに変更した -
CS\0_Release4Nuget.batを実行した …1_DeleteDir→2_Build_NuGet_net48→1_DeleteDir→2_Build_NuGet_netcore100→4_Build_CopyAssembliesのみ。サンプルはビルドしない -
CS\NuGet\_NuGetPack.batでパッケージ化した -
CS\NuGet\out\sp\_NuGetPush.batに API キーを設定し、push した … 最新はsp(シンボル付き)のみでよい - Wiki の手順(NuGet 利用リポジトリの参照貼り直し)を実施した
revert を忘れやすい。 特に API キーはリポジトリに残してはならない。
-
CS\z_Common.batのDEBUG_TYPEをfullに戻した -
CS\NuGet\out\sp\_NuGetPush.batをプレースホルダに戻した … コミットされている状態はnuget.exe SetApiKey [ApiKey]。実キーを残さない -
git statusに意図しない変更が残っていない … 特にResult*.txt(2_RunAllTests.ps1が再生成する)とCS\Frameworks\Tests\EncAndDecUtilCUI\*.cer/*.pfx(Git 管理外の作業用コピー)
| 対象 | 自動化 | 理由 |
|---|---|---|
| 全ビルド(31 ステップ) | 済 | 既存バッチを呼ぶだけで済む |
| 単体テスト(6 ケース) | 済 | 期待結果ファイルが既にあり、正規化で機械比較できる |
| バッチ・CLI サンプル(9 件) | 済 | プロセス実行のみ。DB 疎通まで確認できる |
DaoGen_Tool の CUI(6 件) |
済 | #508 で CUI 化。DB → 定義 CSV → Dao・SQL まで通せる |
| Web アプリ(3 件) | 済 | ログインまで通せば認証・セッションまで確認できる |
| UI 系サンプル(18 本) | 見送り | UI Automation が必要。画面定義の変更で壊れやすく維持費が高い。 通す B 層/D 層は Web 系・バッチ系と重複し、回帰検出力の増分が小さい |
| GUI ツール(3 本) | 見送り | 同上。DaoGen_Tool は生成ロジックを CUI 側で確認済みのため、手作業で見るのは GUI が起動することだけでよい |
| Web サービス | 不可 | 本リポジトリにホストが無い(別リポジトリへ移設済み) |
自動化した対象が「起動する」ことは、手作業側の確認範囲を狭める。
DaoGen_Tool は CUI で生成ロジックまで確認できるようになったため、
GUI 側で見るのは画面が動くことだけになった。
-
AGENTS.mdのポリシー遵守(git 操作をしない) … 検証でResult*.txtが書き換わるが、コミットの要否とタイミングは人が判断する - 検証は
1_BuildAll.ps1→2_RunAllTests.ps1→3_SmokeTest.ps1の順(3 節) -
1_BuildAll.ps1に-SkipCleanを付けない(リリース判定では前回成果物を残さない) - NG を「既知」で片付けない。 既知として扱ってよいのは
WSClientWinCone_sampleの署名エラーと NuGet 脆弱性警告のみ(4 節・BUILDING.md3 節) -
2_RunAllTests.ps1の NG は、退行/期待結果の陳腐化/テスト データの汚染を切り分けてから報告 - 前提サービス・DB の状態を勝手に変えない。 不足は対処方法とともに報告する
(
3_SmokeTest.ps1がaspnet_stateを自動起動しないのと同じ理由) - フェーズ 1(検証)は自分で実行してよい。 フェーズ 0・2・4・5 は人が行う(1 節)
- 公開(
_NuGetPush.bat)は実行しない。 外部公開で取り消しが困難、かつ API キーを扱う。 パッケージ化(フェーズ 3)は指示があったときだけ - Issue のクローズ・ラベル変更は人が行う。エージェントは提案に留める
- 後始末(6 節)の revert 漏れが無いか
git statusで確認して報告