immudbの継続的インテグレーション実践: 自動テストとコード品質チェック

CIフロー概要

immudbの継続的インテグレーションはMakefileを基盤としており、コード生成からテスト実行までのライフサイクルを網羅しています。主なCI目標にはコード品質の確保、機能の検証、パフォーマンスのモニタリング、多環境への対応が含まれます。プロジェクトではMakefileで統一されたビルドエントリポイントを定義し、開発者は単純なコマンドで一連のテストフローをトリガーできます。

主要なCI目標

  • コード品質の確保: 静的解析、ユニットテスト、カバレッジチェックを通じてコードの信頼性を保証
  • 機能検証: 各環境でのコア機能の正しさを自動テストで検証
  • パフォーマンスモニタリング: システムのスループットや応答時間を継続的に追跡し、パフォーマンスの退化を早期に検出
  • セキュリティコンプライアンス: FIPSモードの構築をサポートし、セキュリティ敏感なシナリオに対応

自動テスト体系

immudbはユニットテストからエンドツーエンドテストまで、多層的な自動テスト体系を構築しています。

ユニットテストと統合テスト

`make verify`コマンドでユニットテストと統合テストを実行し、Goのネイティブテストフレームワークで全テストケースを実行します。Makefileにはコード静的チェックとテスト実行の二段階が定義されています。
# Makefile内のテストコマンド
verify:
    $(GO) tool vet ./...
    LOG_LEVEL=error $(GO) test -v -failfast ./... ${GO_TEST_FLAGS}
主なテストモジュールには以下があります。
  • コアストレージエンジンテスト: embedded/store/immustore_test.go
  • クライアントプロトコルテスト: pkg/client/client_test.go
  • SQLパーサーテスト: embedded/sql/parser_test.go

エンドツーエンドテスト

test/e2eディレクトリに配置されたPythonスクリプトでマルチコンテナ環境を構成し、分散環境でのシステム動作を検証します。テストフローには以下が含まれます。
  1. テストイメージのビルド
  2. レプリケーションテストで主従同期の検証
  3. データトリムテストで履歴データ処理の検証
runtests.pyはテストケース管理、結果収集、InfluxDBへのメトリクス送信を実装しています。

自動テストツールチェーン

tools/autotestディレクトリには以下のような自動テストツールが提供されています。
  • 自動ログインテスト: login.expectとadminlogin.expectで認証フローを検証
  • 環境変数管理: envpasswd.shでテスト環境設定を処理
  • 統合テストスイート: autotest.shで複数データベースインスタンスの読み書き検証を自動化
Makefileにはテスト依存関係のチェックと実行エントリポイントが定義されています。
# tools/autotest/Makefile
all: requirements test1 test2

requirements:
    @expect -v >/dev/null 2>&1 || (echo "expectをインストールしてください"; return 1)

コード品質監視

immudbは静的解析、カバレッジチェック、サードパーティツールの統合を通じて多層的なコード品質保障メカニズムを構築しています。

コードカバレッジ分析

go-accツールを使用してテストカバレッジレポートを生成し、Makefileのcoverageターゲットで実現しています。
coverage:
    go-acc ./... --covermode=atomic --ignore=test,immuclient,...
    cat coverage.txt | grep -v "schema" > coverage.out
    $(GO) tool cover -func coverage.out
coverage.outファイルではテストコードや自動生成ファイルを除外し、コアビジネスロジックのカバレッジを反映しています。codecov.ymlにはプラットフォーム固有コードを除外するフィルタリングルールが設定されています。

SonarQube静的解析

sonar-project.propertiesでSonarQube解析ルールを設定し、以下のような設定が含まれます。
sonar.projectKey=codenotary_immudb
sonar.sources=.
sonar.exclusions=**/*_test.go,**/*schema.pb*
sonar.tests=.
sonar.test.inclusions=**/*_test.go
sonar.go.coverage.reportPaths=coverage.out
SonarQubeはコードの複雑度分析、潜在バグの検出、コード規約のチェックを通じてチームが気づきにくい品質問題を発見します。

継続的な品質監視

grafana-dashboard.jsonで定義されたGrafanaダッシュボードを通じてキー指標を可視化しています。CIフローで収集されたパフォーマンスデータはInfluxDBに送信され、長期的なトレンド分析とパフォーマンス退化の検出をサポートします。

パフォーマンステスト実践

パフォーマンステストはimmudbのCIフローにおいて重要な部分であり、システムの高性能性をイテレーション中に保証するために自動化されたベンチマークテストが実施されます。

パフォーマンステストフレームワーク

test/performance-test-suiteディレクトリには以下をサポートする完全なパフォーマンステストフレームワークが提供されています。
  • 複数シナリオのベンチマークテスト(KV操作、トランザクション処理、SQLクエリ)
  • システムリソース監視(CPU、メモリ、IO)
  • テスト結果のJSONシリアライズ
フレームワークのコアコンポーネントには以下が含まれます。
  • ベンチマークテスト実行器: pkg/runner/runner.go
  • パフォーマンスデータ収集: pkg/benchmarks/hwstats.go
  • テストケース定義: cmd/perf-test/main.go

主要なパフォーマンス指標

パフォーマンステストでは以下の核心指標に注目しています。
  • スループット: 秒あたりのキー値ペア操作数(KV/s)とトランザクション数(TX/s)
  • レイテンシー: P50/P95/P99応答時間分布
  • リソース利用率: CPU利用率、メモリ使用量、ディスクIO
テスト結果はInfluxDBに保存され、Grafanaパネルで過去のトレンドを確認できます。以下はスループットのモニタリンググラフです。

パフォーマンス退化検出

CIフローで実行されるパフォーマンステストは過去のデータと比較し、顕著なパフォーマンス退化が検出された場合はアラームを発します。テストレポートには詳細なパフォーマンスデータが含まれており、開発者がパフォーマンスボトルネックを特定するのに役立ちます。例えば、クエリパフォーマンス比較グラフは以下の通りです。

セキュリティコンプライアンステスト

immudbはセキュリティコンプライアンスに特に注目し、FIPSモードのサポートとセキュリティ関連テストを通じて、システムがセンシティブな環境でも信頼性高く動作することを確保しています。

FIPSモード検証

Makefileで`make test/fips`コマンドを実行してDocker環境でFIPSモードを検証します。
test/fips:
    $(DOCKER) build -t fips:test-build -f build/fips/Dockerfile.build .
    $(DOCKER) run --rm fips:test-build -c "GO_TEST_FLAGS='-tags fips' make test"
FIPSモードにおける主要なテストには暗号アルゴリズムの正しさ検証とセキュリティ設定のチェックが含まれます。

データ一貫性検証

immudbのコア特性であるデータの改ざん防止を、一貫性証明メカニズムを通じて保証しています。テストスイートにはデータ変更履歴の正しさを検証する専用の一貫性検証ケースが含まれており、embedded/store/verification_test.goに実装されています。

タグ: Go Makefile SonarQube Docker grafana

8月6日 18:26 投稿