0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

パイプラインアーキテクチャでのドメイン駆動の考え方の適用

Posted at

前置き

CI/CDパイプラインアーキテクチャにおいて、

後からプロセスの追加や削除、実行順序の入れ替え

などをする際に、オブジェクト指向の設計原則の考え方が有機的に活かせるのではないでしょうか。

パイプラインアーキテクチャ自体が、固定化してしまうと、せっかくシステムアーキテクチャそのものが柔軟であっても、パイプラインがボトルネックになってしまいます。

パイプラインアーキテクチャにおけるOOPの適用

パイプライン中の各プロセス(ジョブやステップ)も、オブジェクト指向の「オブジェクト」とまったく同じように、内部に「属性データ(State)」をカプセル化して保有します。

たとえば、非機能要件の適応度関数として

「API呼び出しの際のネットワークレイテンシーが、10.0秒以内であること」

といった、「10.0秒」のような閾値が、パイプライン中のプロセスがカプセル化内部で持つ属性データという立ち位置になります。

パイプラインにおける「属性」と「振る舞い」

オブジェクト指向の考え方とパイプラインのプロセスを対比させると、この関係が明確になります。

スクリーンショット 2025-10-20 170912.png

なぜこのカプセル化が重要なのか

カプセル化とOCP(オープンクローズド原則)を満たしていないと、

「後から閾値のみを変えたくなった際に、変更が容易」

という状態を作り出せません。

❌ 悪い設計(カプセル化なし=ハードコーディング)

スクリプト(振る舞い)の中に、属性データ(閾値)がハードコードされています。

run_performance_test.sh の中身

image.png

仮にあとから閾値を「8.0秒」に変更したくなった場合、スクリプトという
振る舞い自体を修正しなければなりません。 これは明らかにOCPに違反します。

✅ 良い設計(カプセル化あり=パラメータ化)

スクリプト(振る舞い)は、属性データを 外部から注入される「変数」 として扱います。

パイプライン定義 (YAML)

image.png

run_performance_test.sh の中身

image.png

メリット:変更しやすい

閾値を「8.0秒」に変更したくなった場合、スクリプト(振る舞い)は一切修正せず、パイプライン定義(属性)のvariables:を変更するだけで済みます。

パイプラインプロセスが持つ「属性データ」の例

「適応度関数の閾値」以外にも、プロセスが内部的にカプセル化すべき「属性データ」は多数存在します。代表的な例をいくつか下に書いておきます。

・環境名:DEPLOY_TARGET: "staging"

・リソース定義: DOCKER_IMAGE_TAG: "v1.2.3", MEMORY_LIMIT: "2Gi"

・機能フラグ(トグル): RUN_CHAOS_TEST: "false", ENABLE_SECURITY_SCAN: "true"

・シークレット参照名:DATABASE_SECRET_NAME: "prod/db/credentials"

・タイムアウト値:JOB_TIMEOUT: "30m"

これらの「属性」をスクリプト(振る舞い)から分離・カプセル化することこそが、パイプラインアーキテクチャを柔軟で、変更に強く、再利用可能なものにするための鍵です。

ここのまとめ

もし属性値がスクリプト内にハードコーディングされていたら、

「閾値を変えたい」というだけの 低リスクな「設定変更」 のために、高リスクな「コード変更」(スクリプトの修正と、その動作保証)を行わなければなりません。

属性とスクリプトを分離しているからこそ、

スクリプト(振る舞い)は「修正に対して閉じ」(= 変更が不要に)なり、
属性(パラメータ)は「変更に対して開く」

という、オープンクローズド原則の理想的な状態を実現できているのです。

パイプラインアーキテクチャの戦略的設計マトリクス

DDDが「コアドメイン」「支援サブドメイン」「汎用サブドメイン」を分類して設計リソースを集中させるように、以下の2軸マトリクスは、

「パイプラインのどの部分に、どのオブジェクト指向(OOP)設計原則を優先的に適用すべきか」

を完璧に浮き彫りにします。

image.png

🎯 象限1:高頻度な変更 + 高い複雑さ(コアパイプライン)

概要

まさにパイプラインアーキテクチャにおける「コアドメイン」です。

複雑なデプロイロジック(例: Blue/Greenデプロイ、カナリアリリース)、サービス間の複雑なE2Eテスト、適応度関数の実行など。

適用すべき原則:すべてのOOP設計原則が必須

OCP:変更が頻繁なため、拡張性を担保しないと即座に破綻します。

SRP:複雑なため、責務を小さく分割しないと誰も触れなくなります。

カプセル化:複雑な内部ロジックを隠蔽し、呼び出し側はシンプルに扱えるようにします。

🏛️ 象限2:低頻度な変更 + 高い複雑さ(汎用プラットフォーム)

概要

ここは「汎用サブドメイン」です。
一度作ったらめったに変わらないが、非常に複雑で重要なプロセスの部分。
(例:docker buildをラップする共通スクリプト、会社標準のセキュリティスキャン、プラットフォームパイプラインの中核部分)

適用すべき原則:SRPとカプセル化が最重要

OCPは(変更が少ないため)優先度が下がります。

重要なのは、この複雑なロジックを完璧な「ブラックボックス」(カプセル化)にし、誰もが安全に呼び出せる安定したインターフェースを提供することです。

なので、SRPは守りつつも、ある程度まとまった単位で管理しましょう。

⚙️ 象限3: 高頻度な変更 + 低い複雑さ(支援プロセス)

概要

「支援サブドメイン」です。

スクリプト自体は単純(例: 特定の環境に変数をデプロイするだけ)だが、
その 「属性値」(例: 閾値、バージョン番号、デプロイ先)が頻繁に変わります。

適用すべき原則

まさに上記で議論した

カプセル化(属性と振る舞いの分離)とDRYが最重要です。

スクリプト(振る舞い)をハードコードせず、変更されやすい「属性値」をパラメータとして外部から注入できるようにします。

🗑️ 象限4: 低頻度な変更 + 低い複雑さ(雑務プロセス)

概要

たまに手動で実行するような、単純で変更も少ないスクリプト。(例: echo "Hello World")

適用すべき原則:YAGNIが最優先

ここにOOP原則を適用しようとするのは、「早すぎる抽象化」 であり、不要な複雑さを生むだけです。

ここのまとめ

このマトリクスは、

「どのプロセスにYAGNIを適用し、どのプロセスにOCPを適用すべきか」

を判断するための強力な戦略的ツールです。

リソースは有限であるため、象限1(コア・パイプライン)と象限3(支援プロセス)に設計努力を集中させ、象限4は意図的に「放置」するという、賢明な意思決定が可能になります。

DDDモデルとパイプラインの一貫性

ドメインモデリングにより、どのコンポーネントが、特に不確実さが高くて、適応度関数も種類が増減したり、閾値が変わりやすいという特性と、パイプラインアーキテクチャへのDDDの適用が一致するように設計されていたら、非常に運用しやすくないでしょうか?

その設計アプローチは、DDDとパイプラインアーキテクチャという2つの強力な概念を、完全に一貫させた「望ましい設計」そのものになります。

逆に、なんでここ一貫させないんだ?
どう考えても、アジリティ遅くなるでしょうに、、、

1. DDDが「不確実性の中心」を特定する 🎯

ドメインモデリング(戦略的設計)の最大の価値は、「どこがビジネスのコアドメインか」を特定することです。

コアドメイン = 最も不確実性が高く、最も変更が頻繁な領域

このコアドメインは、競合他社に勝つための差別化要因であるため、ビジネス要件は常に進化し続けます。

2. コアドメインの特性 = 適応度関数の特性 📈

コアドメインの特性は、そのままそれを検証する「適応度関数」の特性に反映されます。

ビジネスルールが頻繁に変わる → 適応度関数の種類が増減する

市場環境(例:許容レイテンシ)が変わる → 適応度関数の閾値が変わりやすい

3. パイプラインアーキテクチャが不確実性に対応する 🧩

ここで、上記で解説してきたパイプラインへのDDD/OOPの適用が活きてきます。

課題

最も変更が激しい「コアドメイン」の適応度関数を、もし リジッド(硬直的) なパイプラインで管理したらどうなるか?

答え

パイプライン自体が変更のボトルネックとなり、アジリティが遅くなります。

適応度関数を1つ追加する(=ビジネスルールを1つ変更する)たびに、巨大なJenkinsfileを「修正」するという高リスクな作業が発生します。

デプロイなどの自動化のために構築したパイプライン自体が、自分たちのビジネスのアジリティを下げるなんて、、、非常に嘆かわしいです。

解決策

DDDによって特定された 「不確実性の高いコアドメイン」 に対応するCI/CDパイプラインこそ、最もOOP原則を適用すべき領域(=上記のコアパイプライン

である、と設計時点で判断します。

具体的な設計

そのパイプラインは、OCP(オープンクローズド原則) に従い、適応度関数の追加・削除を「拡張」として容易に行えるようにモジュール化します。

さらにカプセル化を徹底し、閾値などの「属性」の変更が、スクリプト(振る舞い)に影響しないように設計します。

ここのまとめ

ここで紹介した手法は、

「DDDで特定したビジネスの“変動性”に、プロセス(CI/CDパイプライン)の“柔軟性”を一致させる」

という、究極の適応型アーキテクチャです。

これにより、ビジネスで最も重要な「コアドメイン」の変更を、パイプラインが妨げるのではなく、むしろ安全かつ高速に「加速」させるという、理想的な関係性を築くことができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?