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?

CI/CDにおけるイベント駆動(Pub/Subモデル)

Posted at

前置き

CI/CDパイプライン中に組み込まれたテストでも、

・毎回実行するもの

・特定のイベントトリガーが走った時のみ実行

とで分かれると思います。

この後者の何かしらのイベントが走った時というのは、イベント駆動アーキテクチャの考えが適用できます。

このアプローチは、

「すべてのテストを毎回実行する」という非効率なモノリシック・パイプライン

から、

「必要なテストを、必要な時にだけ実行する」 という疎結合 & 効率的

なパイプラインアーキテクチャへと進化させる鍵となります。

この設計では、CI/CDツール(Jenkins, GitLab CI, GitHub Actionsなど)が 「イベントブローカー」 のように振る舞います。

1. イベントの発行 (Publish)

開発者のアクションやシステムの状態が 「イベント」 として発行されます。

code_committed_to_feature_branch (フィーチャーブランチへのコミット)

pull_request_opened (プルリクエストの作成)

pull_request_merged_to_main (mainブランチへのマージ)

tag_pushed (v1.2.0) (リリースタグの発行)

nightly_schedule (夜間スケジュールの発動)

external_api_contract_changed (外部APIの契約変更通知)

2. イベントの購読 (Subscribe) と実行

パイプライン内の各テストプロセス(ジョブ)は、「消費者(Consumer)」として、
自分が関心のあるイベントだけを 「購読(Subscribe)」 します。

①. 毎回実行するテスト (例:ユニットテスト、Lint)

・購読するイベント:code_committed_to_feature_branch

・目的:開発者への最速のフィードバック。

②. 特定のイベントで実行するテスト

例:統合テスト、コントラクトテスト

・購読するイベント:pull_request_opened

・目的:マージ前に、ブランチ間の結合性を検証する。

例:E2Eテスト、負荷テスト、カオス実験

・購読するイベント:nightly_schedule (夜間)

・目的:リソースを大量に消費する重いテストは、開発者の邪魔にならない夜間に実行。

例:本番デプロイプロセス

・購読するイベント:tag_pushed

・目的:リリースタSタグが打たれた時だけ、本番環境へのデプロイを実行する。

このアーキテクチャのメリット (ECRS)

このイベント駆動型アプローチは、ECRS原則を適用した結果とも言えます。

E (Eliminate - 排除)

開発者の 「待ち時間」を排除 します。

コミットのたびにE2Eテスト(例:40分)の完了を待つ必要がなくなり、ユニットテスト(例:2分)の結果だけを高速に受け取れます。

R (Reorder - 順序変更)

重いテスト(E2E)を、開発者のクリティカルパス(コミット→フィードバック)の
「外」(例:夜間)に順序変更(移動)しています。

これにより、開発者の生産性(リードタイム)と、システム全体の品質保証を両立させることが可能になります。

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?