Upgrade to Pro — share decks privately, control downloads, hide ads and more …

認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例

Avatar for taiki45 taiki45
September 26, 2026

認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例

Avatar for taiki45

taiki45

September 26, 2026

More Decks by taiki45

Other Decks in Technology

Transcript

  1. PRプレビューとは • 解決したい問題 ◦ Pull Requestのレビュー量増加問題 ◦ フィードバックサイクルのシフトレフト ◦ 開発者の多様化

    • ユーザージャーニー ◦ PR作成と同時にプレビュー作成 ◦ プレビュー毎の専⽤URLからアクセス ◦ PRマージでプレビュー削除 ―3
  2. enechainでの現況 • あるプロダクトチームが先⾏して開発 ◦ 社内での価値検証が済んでいてプラットフォーム機能としてニーズが⾼かった • 全社で利⽤できるプラットフォーム機能として開発‧運⽤中 ◦ 2⽉に設計開始、3⽉末から導⼊開始 ◦

    社内の最も開発が活発なプロダクト‧最も複雑な構成のプロダクトでも導⼊済み ◦ 実際に社内で積極的に使われている ◦ 技術的な詳細はTech Blog記事へ ▪ https://techblog.enechain.com/entry/intro-prothea ―4
  3. 概要 Dev Cluster GitHub Clone Manifest Repo prothea webhookserver controller

    Webhook Product Repo PR Create Watch Read Product Namespace Push Product Developer Preview Request Reconcile Preview Configuration Preview Environment ― 13
  4. プレビューリソースの作成 Dev Cluster GitHub Clone Manifest Repo prothea webhookserver controller

    Webhook Product Repo PR Create Watch Read Product Namespace Push Product Developer Preview Request Reconcile Preview Configuration Preview Environment ― 14
  5. プレビュー環境の設定 Dev Cluster GitHub Clone Manifest Repo prothea webhookserver controller

    Webhook Product Repo PR Create Watch Read Product Namespace Push Product Developer Preview Request Reconcile Preview Configuration Preview Environment ― 16
  6. プレビュー構成の導出 Dev Cluster GitHub Clone Manifest Repo prothea webhookserver controller

    Create / Read Webhook Product Repo PR Create Watch Read Derived Preview Configuration Product Namespace Push Product Developer Preview Request Reconcile Preview Configuration Preview Environment ― 18
  7. 導出した結果を⾒せるリソース • 複製するアプリケーションの⼀覧 ◦ Deployment、Service、アプリのコンテナ名、取り除くPodラベルなど • プレビューへのアクセス経路 ◦ ドメイン名、Gateway /

    IngressとそのHTTPRoute ◦ プレビューURLの元 ◦ プレビュー⽤の共有インフラの設定 ◦ 詳細は後述 • 共有インフラのセットアップ結果 プロダクト開発者‧プラットフォーム運⽤者⽤の中間情報 ― 19
  8. プラットフォームのインタフェース • なるべくプラットフォームでカバーする ◦ 🙅 ドキュメントやCLI⽣成を利⽤して細かい設定を開発者が書く‧確認する ◦ 🙅 プラットフォームがなにをする‧したのかがわからない ◦

    🙅 異常ケースではプラットフォームのログを読ませる • シンプルな規約に収める • 設定変更でなにが変わるのか‧なにが起きるのかを予⾒させる ◦ CIでのシフトレフト • ⽇常的に使わない部分は隠して段階的インタフェースを⽤意する ◦ 今回だとカスタムリソースとして⾒せる ― 20
  9. プレビュー環境への⼊⼝ Dev Cluster GitHub Clone Manifest Repo prothea webhookserver controller

    Webhook Create Product Repo PR Watch Read Product Namespace Preview Request Push Product Developer Open URL Reconcile Preview Configuration Preview Environment ― 22
  10. ベース環境とは独⽴したルーティング経路 Product Namespace Base Environment example.com Browser GKE Gateway /

    Ingress pr-123.example.com preview-gateway PR-123 Preview *.example.com PR-456 Preview pr-456.example.com ― 23
  11. サービス間の通信 Default HTTPRoute Default HTTPRoute Base Backend API Base Core

    API Per-Preview HTTPRoute Per-Preview HTTPRoute Preview Backend API Preview Core API Inject preview-id header Gateway HTTP Request with preview-id header pr-123.example.com BFF Browser With GAMMA (Gateway API for Service Mesh) HTTP Request with preview-id header ― 25
  12. Cross-Origin Resource Sharing • プレビュー環境ではドメイン名が変わることは本来プラットフォームの関⼼事 ◦ preview-gatewayでpreflightに応答したい ◦ アプリケーションには変更を⼊れないようにしたい •

    合理的に引き受けられない場合はアプリケーション側に戻す選択もある ◦ credentialなリクエストでの任意ヘッダー許可がIstioでできない問題 ◦ アプリケーション側では1⾏の変更で済む ― 28
  13. より良い開発者体験 • ノイズにならないUIを作る ◦ 今回だとGitHub Deployments API • 開発者のミスをケアする ◦

    起動しないコンテナなど ◦ 異常系で丁寧にフィードバックを返す • ⼀段奥に調査⽤の情報を整理して置く ◦ 今回だとCRDとそのStatus ― 30
  14. より良い開発者体験のために • 複雑性を引き受けられるプラットフォームの技術選定 ◦ 複雑なことをシンプルに実現する必要がある • Platform as Productの実践 ◦

    開発者の⾏動を観察‧計測‧分析する ▪ ◦ 「顧客はほしいものがわからない」原則 ドッグフーディング ― 31