テックカリキュラム

CI/CD・DevSecOps・安全なリリース戦略

CI/CD・DevSecOps・安全なリリース戦略

本章では、VB.NET業務システムを安全かつ継続的にリリースするための、 CI/CD、DevSecOps、ビルド自動化、テスト自動化、リリース戦略、ロールバック設計について学習します。

Chapter 18では、可観測性、監視、ログ、メトリクス、SREについて扱いました。 しかし、どれだけ監視を整備しても、リリース作業そのものが手作業だらけであれば、 人的ミス、手順漏れ、環境差異、切り戻し失敗などのリスクは残り続けます。

企業システムでは、リリース作業が以下のような状態になっていることがあります。

  • 担当者のPCでビルドしている
  • 手作業でexeやdllをコピーしている
  • 本番環境だけ設定ファイルが違う
  • リリース手順書が古い
  • 誰が何をリリースしたか追跡できない
  • 障害時にすぐ戻せない
  • テスト実行が人任せになっている

この状態では、コードそのものが正しくても、リリース作業で障害を起こす可能性があります。

本章のゴールは、VB.NET業務システムにおいて、ビルド、テスト、静的解析、脆弱性チェック、成果物管理、デプロイ、リリース判定、ロールバックまでを体系的に設計し、 安全に変更を本番環境へ届けられるDevOps基盤を構築できるようになることです。


1. CI/CDとは

CI/CDとは、アプリケーションのビルド、テスト、リリース、デプロイを自動化し、 変更を安全かつ継続的に本番環境へ届けるための考え方です。

用語意味主な目的
CIContinuous Integration継続的インテグレーション
CDContinuous Delivery / Deployment継続的デリバリー / デプロイ

CIで行うこと

  • ソースコード取得
  • 依存ライブラリ復元
  • ビルド
  • 単体テスト
  • 静的解析
  • 成果物作成

CDで行うこと

  • 成果物の保存
  • 環境別設定の適用
  • 検証環境へのデプロイ
  • 受入テスト
  • 本番デプロイ
  • ロールバック

CI/CDの目的は、単にリリースを速くすることではありません。 変更を小さく、頻繁に、安全に届けることで、障害リスクを下げることが本質です。


2. 手作業リリースの問題

多くのレガシーVB.NETシステムでは、リリース作業が手順書ベースで行われています。

よくある手作業リリース

1. 開発者PCでReleaseビルドする
2. binフォルダからexeとdllを探す
3. zip化する
4. 共有フォルダへ置く
5. 本番サーバーへリモートログインする
6. 既存ファイルをバックアップする
7. 新しいファイルをコピーする
8. 設定ファイルを書き換える
9. IISまたはWindowsサービスを再起動する
10. 動作確認する

この方式では、担当者の経験や注意力に依存します。

手作業リリースのリスク

  • コピー漏れ
  • 古いdllの混入
  • 設定ファイルの上書き
  • 環境差異
  • リリース対象間違い
  • バックアップ漏れ
  • 切り戻し不能
  • 作業証跡が残らない

手作業リリースを完全になくせない場合でも、 ビルド、テスト、成果物作成、チェックリスト、リリース記録から段階的に自動化することが重要です。


3. CI/CDパイプラインの全体像

CI/CDパイプラインは、ソースコードの変更から本番リリースまでの一連の流れです。

基本フロー

Developer
   ↓
Git Push
   ↓
CI Trigger
   ↓
Restore Packages
   ↓
Build
   ↓
Unit Test
   ↓
Static Analysis
   ↓
Security Scan
   ↓
Package
   ↓
Artifact Store
   ↓
Deploy to Test
   ↓
Acceptance Test
   ↓
Deploy to Production

VB.NET業務システムでの対象

  • Windows Formsアプリ
  • WPFアプリ
  • ASP.NET / ASP.NET Core API
  • Windowsサービス
  • バッチアプリ
  • クラスライブラリ
  • DBマイグレーション
  • 設定ファイル

CI/CDはWebアプリだけのものではありません。 VB.NETのデスクトップアプリ、バッチ、Windowsサービスでも、ビルドとテストの自動化は非常に有効です。


4. ソース管理戦略

CI/CDの前提は、すべての変更がソース管理されていることです。

管理すべきもの

  • VB.NETソースコード
  • プロジェクトファイル
  • ソリューションファイル
  • SQLスクリプト
  • マイグレーションファイル
  • 設定テンプレート
  • ビルドスクリプト
  • CI/CD定義ファイル
  • テストコード

管理してはいけないもの

  • binフォルダ
  • objフォルダ
  • 個人PC固有の設定
  • 本番パスワード
  • API Key
  • 一時ファイル
  • ログファイル

.gitignoreの例

bin/
obj/
.vs/
*.user
*.suo
*.log
TestResults/
packages/
.env

リポジトリを見れば、誰でも同じ成果物を再現できる状態にすることが重要です。


5. ブランチ戦略

チーム開発では、ブランチ戦略を決めておく必要があります。

代表的な戦略

戦略特徴向いているケース
Git Flowdevelop、release、hotfixなどを使うリリース周期が長い業務システム
GitHub Flowmainと短命ブランチ中心頻繁にリリースするWebサービス
Trunk-Based Developmentmainへ小さく統合するCI/CDが整備されたチーム

業務システムでよくある構成

main
  本番リリース済みコード

develop
  次回リリース候補

feature/*
  機能開発

release/*
  リリース準備

hotfix/*
  本番障害対応

重要なのは、ブランチの数ではなく、どのブランチがどの環境へデプロイされるのかを明確にすることです。

避けたい状態

  • どのブランチが本番相当か分からない
  • 長期間マージされないfeatureブランチがある
  • 本番修正がdevelopへ反映されていない
  • リリース直前に大量マージする
  • 手元の未コミット差分からリリースする

6. ビルド自動化

CIの最初の基本は、開発者PCではなくCIサーバー上でビルドできることです。

ビルド自動化の目的

  • 誰が実行しても同じ成果物を作る
  • ビルド漏れを防ぐ
  • 依存関係の不整合を検知する
  • リリース可能な成果物を保存する
  • 手元PC依存をなくす

MSBuildの例

msbuild MyApplication.sln /p:Configuration=Release /p:Platform="Any CPU"

dotnet CLIの例

dotnet restore

dotnet build MyApplication.sln --configuration Release

dotnet test MyApplication.Tests.vbproj --configuration Release

.NET Framework系の古いVB.NETプロジェクトではMSBuildを使うことが多く、 .NET Core / .NET 5以降のプロジェクトではdotnet CLIを利用できます。

ビルドで検出したい問題

  • コンパイルエラー
  • 参照dll不足
  • NuGet復元失敗
  • Option Strict違反
  • 警告の増加
  • テスト失敗

7. テスト自動化

CI/CDでは、リリース前に自動テストを実行することが重要です。

自動化すべきテスト

  • 単体テスト
  • 結合テスト
  • APIテスト
  • DBマイグレーションテスト
  • 回帰テスト
  • 重要業務シナリオテスト

VB.NETの単体テスト例

<TestClass>
Public Class OrderCalculatorTests

    <TestMethod>
    Public Sub CalculateTotal_WithTax_ReturnsExpectedAmount()

        Dim calculator As New OrderCalculator()

        Dim result =
            calculator.CalculateTotal(1000D, 0.1D)

        Assert.AreEqual(1100D, result)

    End Sub

End Class

CIでテストを実行する例

dotnet test MyApplication.Tests.vbproj --configuration Release

最初からすべてを自動テスト化する必要はありません。 金額計算、税計算、ステータス遷移、権限判定など、壊れると影響が大きい処理から優先的に自動化します。


8. 品質ゲート

品質ゲートとは、一定の品質条件を満たさない変更を次の工程へ進めない仕組みです。

品質ゲートの例

  • ビルドが成功している
  • 単体テストがすべて成功している
  • 重大な静的解析エラーがない
  • 高リスク脆弱性がない
  • コードレビューが完了している
  • DBマイグレーションが成功している

悪い例

テストが落ちているが、急ぎなので本番反映する。

このような例外対応を繰り返すと、CI/CDは形だけになります。 本当に緊急の場合を除き、品質ゲートを破らない文化が重要です。

Pull Requestで確認すること

  • CIが成功しているか
  • テストが追加されているか
  • 既存仕様を壊していないか
  • ログや監視が必要な変更か
  • DB変更があるか
  • セキュリティ影響があるか

9. 静的解析

静的解析は、コードを実行せずに品質や潜在的な問題を検出する仕組みです。

検出できる問題

  • 未使用変数
  • 到達不能コード
  • 複雑すぎるメソッド
  • 例外握りつぶし
  • SQLインジェクションリスク
  • Null参照リスク
  • 命名規則違反
  • 重複コード

例外握りつぶしの悪い例

Try
    ExecuteImportantProcess()
Catch ex As Exception
End Try

このようなコードは、障害を隠してしまいます。 静的解析やコードレビューで検出すべき対象です。

改善例

Try
    ExecuteImportantProcess()

Catch ex As Exception

    Logger.Error(
        "重要処理で例外が発生しました。",
        ex)

    Throw

End Try

静的解析は、レビュー担当者の負担を減らし、機械的に検出できる問題を自動でチェックするために有効です。


10. DevSecOpsとは

DevSecOpsとは、開発と運用の流れの中にセキュリティを組み込み、 リリース直前ではなく開発初期から継続的にセキュリティを確認する考え方です。

従来のように「開発が終わってからセキュリティ診断する」だけでは、 問題が見つかったときの修正コストが大きくなります。

DevSecOpsで行うこと

  • 依存ライブラリの脆弱性チェック
  • ソースコードのセキュリティ解析
  • Secret漏えい検知
  • コンテナイメージスキャン
  • 権限設定チェック
  • IaC設定チェック
  • 監査ログ確認

セキュリティは専門部署だけの作業ではなく、開発パイプラインの一部として継続的に確認します。


11. Secret管理

CI/CDで非常に重要なのがSecret管理です。

Secretの例

  • DB接続文字列
  • API Key
  • Client Secret
  • 署名鍵
  • 証明書パスワード
  • 本番環境の認証情報

やってはいけない例

Private Const ConnectionString As String =
    "Server=prod-db;Database=Main;User ID=admin;Password=P@ssw0rd"

Secretをソースコードへ直接書いてはいけません。 また、CI/CD定義ファイルに平文で書くことも避けます。

望ましい管理方法

  • CI/CDツールのSecret機能を使う
  • 環境変数として渡す
  • Key VaultやSecret Managerを利用する
  • 本番Secretへアクセスできる権限を限定する
  • Secretのローテーション手順を用意する

環境変数から取得する例

Dim connectionString As String =
    Environment.GetEnvironmentVariable(
        "APP_CONNECTION_STRING")

設定値とSecretをコードから分離することで、環境ごとの差し替えやSecret更新を安全に行いやすくなります。


12. 依存ライブラリ管理

VB.NETシステムでは、NuGetパッケージや外部dllを利用します。 これらの依存関係もCI/CDで管理する必要があります。

管理すべき項目

  • ライブラリ名
  • バージョン
  • ライセンス
  • 脆弱性情報
  • サポート状況
  • 更新履歴

リスク

  • 古いライブラリに脆弱性がある
  • サポート終了ライブラリを使い続ける
  • ライセンス違反になる
  • バージョン更新で互換性が壊れる
  • 開発環境とCI環境で参照dllが違う

NuGet復元

nuget restore MyApplication.sln

外部dllを手動でプロジェクトへコピーする方式は、環境差異の原因になりやすいです。 可能な限りNuGetや内部パッケージ管理へ移行します。


13. 成果物管理

ビルドした成果物は、どのソースコードから作られたものか追跡できる必要があります。

成果物に含める情報

  • アプリケーション名
  • バージョン番号
  • ビルド番号
  • コミットID
  • ビルド日時
  • 環境

成果物名の例

OrderSystem_1.8.0_build20261007_8f3a91c.zip

バージョン情報クラス例

Public Class BuildInfo

    Public Shared ReadOnly Property Version As String
        Get
            Return "1.8.0"
        End Get
    End Property

    Public Shared ReadOnly Property CommitId As String
        Get
            Return "8f3a91c"
        End Get
    End Property

End Class

障害発生時に、本番環境でどのバージョンが動いているのか分からない状態は危険です。 画面、API、ログ、監視からバージョンを確認できるようにします。


14. 環境管理

CI/CDでは、開発、検証、本番など複数環境を扱います。

代表的な環境

環境用途
Development開発者の作業環境
Test結合テスト環境
Staging本番相当の最終確認環境
Production本番環境

環境差異で起きる問題

  • 検証環境では成功するが本番では失敗する
  • DBスキーマが違う
  • 設定値が違う
  • 外部API接続先が違う
  • 権限が違う
  • ファイルパスが違う

環境別設定の例

appsettings.Development.json
appsettings.Test.json
appsettings.Staging.json
appsettings.Production.json

.NET Framework系のapp.configやweb.configでも、 設定変換やテンプレート化を利用して環境差異を管理できます。


15. DBマイグレーション

業務システムでは、アプリケーションだけでなくDB変更もリリース対象です。

DB変更の例

  • テーブル追加
  • カラム追加
  • インデックス追加
  • 制約追加
  • マスタデータ投入
  • ストアドプロシージャ変更
  • ビュー変更

危険なDBリリース

本番DBへ手作業でSQLを実行する。
実行履歴は残していない。
戻しSQLも用意していない。

DB変更はアプリケーション以上に切り戻しが難しい場合があります。 そのため、SQLスクリプトの管理、適用順序、事前検証、バックアップ、戻し方を明確にします。

マイグレーション管理テーブル例

SchemaVersions

Version
ScriptName
AppliedAt
AppliedBy
Checksum

SQLスクリプト命名例

V001_CreateOrdersTable.sql
V002_AddOrderStatusColumn.sql
V003_CreateIndex_Orders_CustomerId.sql
V004_InsertInitialOrderStatusMaster.sql

どのSQLがどの環境に適用済みかを管理することで、 環境差異や実行漏れを防ぎやすくなります。


16. DB変更と後方互換性

安全なリリースでは、アプリケーションとDBを同時に完全一致させるのではなく、 段階的に互換性を保ちながら変更する考え方が重要です。

危険な変更

  • 既存カラムを即削除する
  • カラム名を即変更する
  • NOT NULLカラムを初期値なしで追加する
  • 既存APIのレスポンス項目を削除する

安全な変更手順例

1. 新カラムをNULL許容で追加する
2. アプリケーションを新旧両方に対応させる
3. 既存データを移行する
4. 新カラムを利用するアプリへ切り替える
5. 十分な期間後に旧カラムを削除する

DB変更は、アプリケーションのリリースと密接に関係します。 Blue-Green DeploymentやRolling Deploymentを行う場合は、新旧バージョンが一時的に同じDBへアクセスする可能性を考慮します。


17. デプロイ方式

デプロイ方式には複数の種類があります。 業務要件、システム構成、停止許容時間に応じて選択します。

方式特徴向いているケース
In-Place既存環境へ上書き小規模、停止許容あり
Blue-Green新旧環境を切り替える切り戻しを速くしたい
Rolling複数台を順番に更新複数サーバー構成
Canary一部ユーザーへ先行公開リスクを小さく検証したい

古いVB.NETデスクトップアプリではClickOnceや配布ツールを利用する場合もあります。 Web APIやWindowsサービスでは、Blue-GreenやRollingの考え方を適用しやすいです。


18. Blue-Green Deployment

Blue-Green Deploymentは、本番相当の環境を2つ用意し、片方を稼働中、もう片方を新バージョンとして準備する方式です。

現在稼働中

User
 ↓
Blue Environment
 ↓
Database

新バージョン準備

Green Environment
 ↓
Database

Green環境で動作確認が完了したら、ルーティングをBlueからGreenへ切り替えます。

メリット

  • 切り替えが速い
  • 問題発生時に戻しやすい
  • 本番相当環境で事前確認できる

注意点

  • 環境を2つ維持するコストがある
  • DB変更の互換性が必要
  • ファイル保存先やセッション管理に注意する
  • 切り替え後の監視が重要

Blue-Greenはアプリケーションの切り戻しには強いですが、 DB破壊的変更を含む場合は簡単には戻せません。 DB変更設計とセットで考える必要があります。


19. Canary Release

Canary Releaseは、新バージョンを一部のユーザーや一部のリクエストだけに公開し、 問題がないことを確認してから段階的に拡大する方式です。

Version 1
  95%

Version 2
  5%

段階例

Step 1: 1%に公開

Step 2: 5%に拡大

Step 3: 25%に拡大

Step 4: 50%に拡大

Step 5: 100%に切り替え

監視する指標

  • エラー率
  • 応答時間
  • 注文成功率
  • 例外件数
  • 外部API失敗率
  • ユーザー問い合わせ件数

Canary Releaseでは、段階拡大の判断基準を事前に決めておきます。 感覚ではなく、メトリクスに基づいて拡大または停止を判断します。


20. Feature Flag

Feature Flagは、コードをリリースしておきながら、機能の有効・無効を設定で切り替える仕組みです。

用途

  • 新機能を一部ユーザーだけに公開する
  • 問題発生時に機能だけ停止する
  • 開発中機能をmainブランチへ統合しやすくする
  • A/Bテストを行う

簡易実装例

Public Class FeatureFlags

    Public Property NewOrderScreenEnabled As Boolean

    Public Property AsyncInvoiceEnabled As Boolean

End Class
If _featureFlags.NewOrderScreenEnabled Then
    ShowNewOrderScreen()
Else
    ShowLegacyOrderScreen()
End If

Feature Flagの注意点

  • Flagが増えすぎると複雑になる
  • 使い終わったFlagを削除する
  • Flagの組み合わせテストが必要になる
  • 本番設定ミスが障害につながる

Feature Flagは便利ですが、永続的な分岐を増やす道具ではありません。 役目を終えたFlagは削除する運用が必要です。


21. ロールバック戦略

リリースでは、問題が発生したときにどう戻すかを事前に決めておく必要があります。

ロールバック対象

  • アプリケーション
  • 設定ファイル
  • DBスキーマ
  • マスタデータ
  • バッチ
  • 外部連携設定

アプリケーションのロールバック

現在バージョン:1.8.0

問題発生

前バージョン:1.7.3へ戻す

アプリケーションだけなら、前の成果物へ戻すことで復旧できる場合があります。

DB変更がある場合

DBスキーマ変更やデータ移行を伴う場合、単純なロールバックは難しくなります。

対応方針

  • 破壊的変更を避ける
  • 前バージョンも動くDB構造にする
  • 戻しSQLを用意する
  • データバックアップを取得する
  • ロールフォワードも検討する

リリース計画には、成功手順だけでなく、失敗時の戻し手順も含める必要があります。


22. ロールフォワード

ロールフォワードとは、前のバージョンへ戻すのではなく、 修正版を追加リリースして復旧する方法です。

ロールフォワードが向いているケース

  • DB変更を戻すのが危険
  • データ移行が既に進んでいる
  • 問題箇所が限定的
  • 短時間で修正パッチを出せる

判断例

アプリケーションだけの不具合
  → ロールバックしやすい

DBデータ変換後の不具合
  → ロールフォワードを検討

一部機能だけの不具合
  → Feature Flagで無効化

ロールバックとロールフォワードのどちらを選ぶかは、 事前に判断基準を決めておくと障害時に迷いにくくなります。


23. Windowsサービスのリリース

VB.NETで作られたWindowsサービスや常駐バッチは、リリース時に停止・更新・起動が必要です。

基本手順

1. サービス停止
2. プロセス停止確認
3. 既存ファイル退避
4. 新ファイル配置
5. 設定確認
6. サービス起動
7. ログ確認
8. ヘルスチェック

PowerShell例

Stop-Service -Name "OrderWorker"

Copy-Item ".\publish\*" "C:\Apps\OrderWorker" -Recurse -Force

Start-Service -Name "OrderWorker"

Get-Service -Name "OrderWorker"

注意点

  • 処理中ジョブをどう扱うか
  • 二重起動を防ぐ
  • 停止に時間がかかる場合を考慮する
  • 未処理Queueを失わないようにする
  • 起動後にConsumerが正常に処理しているか確認する

Windowsサービスのリリースでは、単にプロセスを再起動するだけでなく、 実行中処理やQueue状態まで含めて設計します。


24. デスクトップアプリの配布

VB.NETのWindows FormsやWPFでは、クライアントPCへの配布が課題になります。

配布方法の例

  • 手動コピー
  • 共有フォルダ配布
  • ClickOnce
  • MSIインストーラー
  • 社内配布ツール
  • VDI / リモートアプリ

配布で考慮すること

  • 全端末が同じバージョンか
  • 更新失敗時に起動できるか
  • 古いバージョンの利用を防げるか
  • 必要な.NET Runtimeが入っているか
  • ローカル設定をどう保持するか
  • ロールバックできるか

バージョンチェック例

Public Function IsSupportedVersion(
    currentVersion As Version,
    minimumVersion As Version) As Boolean

    Return currentVersion >= minimumVersion

End Function

業務上、古いクライアントがDBやAPIへ接続し続けると問題になる場合があります。 最低利用可能バージョンをサーバー側で管理する設計も有効です。


25. リリースノート

リリースノートは、今回のリリース内容を関係者へ共有するための文書です。

含める内容

  • リリース日
  • バージョン番号
  • 新機能
  • 修正内容
  • 既知の問題
  • DB変更
  • 設定変更
  • 影響範囲
  • 確認観点
  • ロールバック方針

リリースノート例

Version:
  1.8.0

Release Date:
  2026/10/07

Changes:
  - 注文検索画面の性能改善
  - 請求バッチのリトライ処理追加
  - 在庫API連携ログにCorrelation IDを追加

DB Changes:
  - OrdersテーブルにIndexを追加

Risk:
  - 注文検索処理に影響

Rollback:
  - アプリケーションは1.7.3へ戻し可能
  - DB Index追加は残置可能

リリースノートがあると、運用、QA、業務担当者、問い合わせ対応者が変更内容を把握しやすくなります。


26. リリース判定会

大規模な業務システムでは、本番リリース前にリリース判定を行うことがあります。

確認項目

  • 対象機能の開発が完了しているか
  • テストが完了しているか
  • 重大障害が残っていないか
  • 性能確認が完了しているか
  • セキュリティ確認が完了しているか
  • DB変更が確認済みか
  • リリース手順が整備されているか
  • ロールバック手順があるか
  • 運用担当者へ共有済みか

判定結果

判定意味
Goリリース実施
Conditional Go条件付きで実施
No Goリリース延期

リリース判定は、形式的な会議にするのではなく、 リスクを共有し、実施可否を判断する場として機能させる必要があります。


27. リリース後監視

リリースは、デプロイが終わったら完了ではありません。 リリース後にシステムが正常に動作していることを監視する必要があります。

監視項目

  • エラー率
  • 応答時間
  • CPU / メモリ
  • DB負荷
  • Queue滞留
  • バッチ実行状況
  • ログの異常増加
  • 問い合わせ件数

リリース直後の確認例

リリース後15分:
  Error Rate確認

リリース後30分:
  API Latency確認

リリース後1時間:
  Queue滞留確認

翌営業日:
  業務影響・問い合わせ確認

Canary ReleaseやBlue-Green Deploymentでも、切り替え後の監視が重要です。 問題が見つかった場合は、事前に決めた基準に従ってロールバックまたはロールフォワードを判断します。


28. CI/CD定義の例

以下は、VB.NETプロジェクトに対するCI/CD定義の概念例です。 実際の記法は利用するCI/CDツールによって異なります。

pipeline:

  trigger:
    branches:
      - develop
      - main

  stages:

    - restore:
        command: dotnet restore

    - build:
        command: dotnet build --configuration Release

    - test:
        command: dotnet test --configuration Release

    - static_analysis:
        command: run-code-analysis

    - security_scan:
        command: scan-dependencies

    - package:
        command: create-artifact

    - deploy_test:
        condition: branch == develop

    - deploy_production:
        condition: branch == main
        approval: required

重要なのは、ツールの種類ではなく、パイプライン上で何を検証し、どの条件を満たしたら次へ進めるかを明確にすることです。


29. 実務でありがちな失敗

開発者PCでビルドしたものを本番へ出す

開発者PCには、CI環境や本番環境に存在しないdll、設定、環境変数がある可能性があります。 成果物はCI環境で作成します。

テストが落ちているのにリリースする

テスト失敗を無視する運用が続くと、CIの信頼性が失われます。 失敗したテストは、修正するか、不要なら削除・見直しを行います。

DB変更を手作業で実行する

手作業SQLは実行漏れ、順序ミス、環境差異の原因になります。 SQLスクリプトを管理し、適用履歴を残します。

Secretをリポジトリへ入れる

一度コミットされたSecretは履歴に残ります。 検知した場合は削除だけでなく、Secretのローテーションも必要です。

ロールバック手順がない

問題が起きてから戻し方を考えると、復旧が遅れます。 リリース前に戻し方を確認します。

Feature Flagを放置する

使い終わったFlagを残すと、コードの分岐が増え続け、テストが複雑になります。 期限を決めて削除します。

リリース後監視をしない

デプロイが成功しても、業務処理が正常とは限りません。 リリース後はエラー率、応答時間、Queue、DB、業務指標を確認します。


30. 演習課題

演習1:CIパイプラインを設計する

VB.NETの業務アプリについて、restore、build、test、static analysis、packageまでのCIパイプラインを設計してください。

演習2:品質ゲートを定義する

Pull Requestをmainへマージするために必要な条件を定義してください。 ビルド、テスト、レビュー、脆弱性、DB変更の観点を含めてください。

演習3:Secret管理を改善する

ソースコードにDB接続文字列が直接書かれている既存システムを想定し、 環境変数またはSecret管理サービスへ移行する手順を作成してください。

演習4:DBマイグレーションを設計する

Ordersテーブルへ新しいStatus列を追加する場合の、安全なDB変更手順を設計してください。 既存アプリとの後方互換性も考慮してください。

演習5:Blue-Green Deploymentを設計する

ASP.NET APIで構築された受注システムについて、 Blue-Green Deploymentによるリリース手順と切り戻し手順を設計してください。

演習6:Feature Flagを設計する

新しい注文登録画面を一部ユーザーだけに公開するためのFeature Flagを設計してください。 有効化条件、無効化手順、削除タイミングも含めてください。

演習7:Windowsサービスのリリース手順を作る

Queueを処理するWindowsサービスについて、 安全な停止、成果物配置、起動、ヘルスチェック、失敗時の戻し手順を作成してください。

演習8:リリースノートを作成する

注文検索高速化、請求バッチ修正、DBインデックス追加を含むリリースについて、 業務担当者と運用担当者向けのリリースノートを作成してください。

演習9:リリース後監視を設計する

本番リリース後1時間で確認すべきメトリクス、ログ、業務指標を整理してください。 問題が発生した場合の判断基準も定義してください。


31. まとめ

本章では、VB.NET業務システムにおけるCI/CD、DevSecOps、安全なリリース戦略について学習しました。

CI/CDの目的は、単にリリースを速くすることではありません。 ビルド、テスト、静的解析、セキュリティチェック、成果物管理、デプロイ、ロールバックを標準化し、 人的ミスを減らしながら安全に変更を本番環境へ届けることです。

CIでは、開発者PCではなくCI環境でビルドし、単体テストや静的解析を自動実行します。 これにより、環境差異やビルド漏れを早い段階で検知できます。

CDでは、成果物を管理し、検証環境、本番環境へ一貫した手順でデプロイします。 手作業コピーや担当者依存のリリースから脱却し、誰が実行しても同じ結果になる仕組みを目指します。

DevSecOpsでは、セキュリティをリリース直前の確認事項ではなく、開発パイプラインの一部として扱います。 Secret漏えい、依存ライブラリの脆弱性、権限設定、静的解析などを継続的に確認することが重要です。

DB変更は、アプリケーションリリース以上に慎重な設計が必要です。 SQLスクリプトを管理し、適用履歴を記録し、後方互換性を意識して段階的に変更します。 破壊的変更を避けることが、安全なリリースの鍵になります。

リリース方式には、In-Place、Blue-Green、Rolling、Canaryなどがあります。 システム構成、停止許容時間、利用者影響、DB変更の有無に応じて適切な方式を選択します。

Feature Flagを利用すると、コードのリリースと機能公開を分離できます。 問題発生時には機能だけを無効化できるため、リスクを下げられます。 ただし、不要になったFlagを放置すると複雑性が増すため、削除運用も必要です。

ロールバック戦略では、アプリケーション、DB、設定、外部連携を含めて戻し方を事前に決めます。 DB変更を伴う場合は単純なロールバックが難しいため、ロールフォワードやFeature Flagによる停止も検討します。

また、リリースはデプロイ完了で終わりではありません。 リリース後のエラー率、応答時間、Queue滞留、DB負荷、業務指標を監視し、 問題があれば早期に検知して対応できる体制が必要です。

本章のゴールは、VB.NET業務システムを「手作業で壊さないようにリリースする状態」から、 「自動化されたパイプラインで検証し、安全に継続的にリリースできる状態」へ引き上げることです。 CI/CDとDevSecOpsを導入することで、開発速度と安定性を両立し、長期運用に耐えるエンタープライズシステムを実現できます。