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

継続的デリバリーを支えるPipeline as Code という取り組み

継続的デリバリーを支えるPipeline as Code という取り組み

Developers Summit 2024での発表資料です。
https://event.shoeisha.jp/devsumi/20240215/session/4848

ソフトウェアの継続的デリバリーもしくは継続的デプロイを実施している、そのような組織・チームはたくさんあるのではないでしょうか。では、継続的デリバリーを実施するためのパイプライン自体の管理・品質に意識を向けたことはあるでしょうか。継続的デリバリーを実現するためには安定して動作するパイプライン自体が必要不可欠です。本セッションでは私たちがパイプラインの管理・品質のために3年前から実践してきたPipeline as Codeという取り組みについて具体例を交えて紹介したいと思います。

Qmonus Value Stream

February 19, 2024
Tweet

Other Decks in Technology

Transcript

  1. © NTT Communications Corporation All Rights Reserved. NTT Communications CONFIDENTIAL

    継続的デリバリーを支える Pipeline as Code という取り組み 2024/02/16 杉野博徳 NTTコミュニケーションズ
  2. © NTT Communications Corporation All Rights Reserved. 2 NTT Communications

    CONFIDENTIAL 本発表で伝えたいこと CI/CD パイプライン自体もソフトウェアの一部として継続的にメンテナンス する必要があり、それを実現するのが Pipeline as Code という取り組み である 私たちのチームが Pipeline as Code という取り組みを通してこの3年間で CI/CD パイプラインをどのようにメンテナンスしてきたか 主に採用した手法 • テスト • 再利用可能なパッケージの構築
  3. © NTT Communications Corporation All Rights Reserved. 3 NTT Communications

    CONFIDENTIAL 自己紹介 杉野 博徳 NTTコミュニケーションズ ソフトウェアエンジニア https://github.com/ginoh • 2009年にヤフー株式会社 (現 LINEヤフー株式会社)に新卒入社し、フロントエンド・バックエン ドの開発・運用を経験。 2015年頃からはエンジニア向けツールや CI/CD プラットフォーム開発 に携わる。 • 2020年からはNTTコミュニケーションズに入社し、内製の DevOps Platform (Value Stream)の 開発・運用およびNTTグループ向けの導入支援に携わっている。
  4. © NTT Communications Corporation All Rights Reserved. 5 NTT Communications

    CONFIDENTIAL 継続的デリバリーとは • コード変更をトリガーとしていつでも本番環境へのリリースが可能な状態まで のプロセスを自動化 • 自動化されたプロセスの固まりをパイプラインと呼んでいる • 本発表ではデリバリー/デプロイメントは厳密な区別はしていない Deploy (Staging) Deploy (Production) Commit Build Test Merge 継続的インテグレーション 継続的デリバリー 継続的デプロイメント
  5. © NTT Communications Corporation All Rights Reserved. 6 NTT Communications

    CONFIDENTIAL パイプラインについて思い浮かべてみてください • 誰が・いつ・どのように変更を加えたかを管理していますか? • パイプライン が期待通りに動作することをきちんと確認していますか? • パイプラインを一度作成した後は見直しや更新をせずに同じ設定のまま使い 続けていませんか?
  6. © NTT Communications Corporation All Rights Reserved. 7 NTT Communications

    CONFIDENTIAL 例: バージョン管理をしていないと。。 • パイプラインの作成に再現性を持たせられない • 問題が発生した際に変更内容や履歴が把握できない Pipeline (new) Deploy Pipeline (old) Deploy Pipeline (old) Pipeline (old) ・ ・ ・ Update Deploy Deploy ・ ・ ・ 以前の内容がもうわ からない 何の変更が原因だっ たんだろう?
  7. © NTT Communications Corporation All Rights Reserved. 8 NTT Communications

    CONFIDENTIAL 例: アップデート前の確認が不十分だと。。 • バグ混入によるアプリケーションのアップデートをブロック • 時には環境を破壊することもある Pipeline (new) Pipeline 環境が壊れて開発ができな い。。 production staging Pipeline (old) Update bug App Broken リリースできない。。
  8. © NTT Communications Corporation All Rights Reserved. 9 NTT Communications

    CONFIDENTIAL 例:ずっと塩漬け状態にしていると。。 • 突然パイプラインが動かなくなる可能性がある ◦ 利用アプリケーション・デプロイ先環境のバージョン、etc… • 変更しようとしたら芋づる式に追加変更点が発生し作業量が増える • パイプライン中に脆弱性が存在しているかもしれない 何も変えてないのに。。 Pipeline 脆弱性 パイプライン中の脆弱性を 起点に問題が起きた。。 Ver. Up Pipeline Old New Step Step Step
  9. © NTT Communications Corporation All Rights Reserved. 10 NTT Communications

    CONFIDENTIAL CI/CD パイプラインについて考慮するべきこと • バージョニング 再現性の確保や変更点の把握ができるように • 導入前の動作検証 動作不良・環境破壊などを起こさないように • 陳腐化防止 突然の動作不良や脆弱性にさらされないように          考慮できていないと 継続的デリバリーの阻害 すなわち ユーザーへの継続的な価値提供の阻害
  10. © NTT Communications Corporation All Rights Reserved. 11 NTT Communications

    CONFIDENTIAL 考慮するべきといいましたが、実のところ アプリケーション開発ではすでにやっていませんか? • バージョニング • 導入前の動作検証 • 陳腐化防止 つまり、 パイプラインもソフトウェアと同じように管理して行くことが望ましい
  11. © NTT Communications Corporation All Rights Reserved. 12 NTT Communications

    CONFIDENTIAL パイプラインをコードで管理していく (Pipeline as Code) 私たちはパイプライン管理に関して次のように考えました • パイプラインをコード化・リポジトリ管理を行うことで、 (バージョニング) • パイプラインの変更と共に end-to-end テストを実施可能にし、 (導入前の動作検証) • またバージョン追従などの条件を含めた定期的なテスト実行を行えるようにす る (陳腐化防止) Pipeline as Code を実践することで望ましいパイプライン管理を実現する
  12. © NTT Communications Corporation All Rights Reserved. 14 NTT Communications

    CONFIDENTIAL 私たちのチームのロール SRE (役割のうちの一つ)として • 複数のアプリケーション開発チームのサポート • パイプラインの実装 SRE (We) App Developers Pipeline App Developers Pipeline App Developers Pipeline
  13. © NTT Communications Corporation All Rights Reserved. 15 NTT Communications

    CONFIDENTIAL これまで実践してきたこと 1. Pipeline as Code 実装 • Code review • Testing in staging 2. パイプライン e2e テスト • Continuous integration 3. パイプラインの標準化 • Development standard • Runbook 4. コンポーザブル パイプライン • Package • Unit testing 5. パイプラインパッケージ テスト • Integration testing
  14. © NTT Communications Corporation All Rights Reserved. 16 NTT Communications

    CONFIDENTIAL Step#1: Pipeline as Code 実装(Tektonによるコード化) • Tekton は CI/CDパイラインを構築する Cloud Native なソリューション (OSS) • kubernetesカスタムリソースとしてクラスタ上で実行される • Pipeline: CI/CDワークフロー中のオペレーションを定義 • PipelineRun: パイプラインの実行 Build Deploy See https://tekton.dev/docs/concepts/concept-model/ for the details Pipeline Task Task PipelineRun#1 PipelineRun#2
  15. © NTT Communications Corporation All Rights Reserved. 17 NTT Communications

    CONFIDENTIAL Step#1: Pipeline as Code 実装(Tektonによるコード化) CI/CD ワークフローをコードとしてリポジトリ管理することでバージョニングを行い、 トレーサビリティやロールバックの容易性を確保するのが狙い apiVersion: tekton.dev/v1beta1 kind: Pipeline metadata: name: hello spec: params: - name: username type: string tasks: - name: hello taskRef: name: hello params: - name: username value: $(params.username) Pipeline PipelineRun#1 Source code of Tekton Pipeline (Single source of truth) Pipeline code kubectl apply
  16. © NTT Communications Corporation All Rights Reserved. 18 NTT Communications

    CONFIDENTIAL Pipeline Step#1: Pipeline as Code を利用した初期開発フロー 最低限の Pipeline as Code 実装 • パイプラインの更新をコードレビューの形で検査 • コードの再利用で異なる環境間で同一の動作を保証 Staging PipelineRun Production PipelineRun Pipeline code (current) Pull Request/Code Review Git Repository Pipeline code (new) 再利用 更新
  17. © NTT Communications Corporation All Rights Reserved. 19 NTT Communications

    CONFIDENTIAL Step#2: パイプライン の end-to-end テスト導入 パイプラインの e2e シナリオテストを CI として導入 • パイプラインの e2e テスト環境を構築 (自動構築ではない) • テストをパスしたときのみコードのマージを可能にした Staging PipelineRun Production PipelineRun Testing PipelineRun テスト専用 実行環境 Pipeline code (current) Git Repository Pipeline code (new) Pull Requestを起点に更新 テストがパスしたらマージ Pipeline Pipeline
  18. © NTT Communications Corporation All Rights Reserved. 20 NTT Communications

    CONFIDENTIAL Step#3: パイプラインの標準化 標準化を推進することで安定性や変更容易性の向上を図る • 各種マイクロサービス共通で利用可能なパイプライン開発標準を策定 • 運用フロー(定期的なVerUpなど)や手順書の確立 Pipeline Code Git Repository Staging PipelineRun Production PipelineRun Staging PipelineRun Production PipelineRun Pipeline SRE (We) 更新 開発標準 運用フロー・手順書 App#A App#Z 共通化
  19. © NTT Communications Corporation All Rights Reserved. 21 NTT Communications

    CONFIDENTIAL Step#4: コンポーザブルパイプライン パイプラインの共通部品をパッケージ化し組み合わせて構築可能にする • 各種個別要件への対応しやすさと安定性・変更容易性を両立 • CUE 言語 で実装したパッケージからパイプラインを生成 Pipeline#A Staging PipelineRun Pipeline  packages Git Repository パイプライン生成 Pipeline#B Staging PipelineRun App#A App#Z App#Z team App#A team SRE build deploy test build deploy Blue/Green See https://github.com/qmonus/official-cloud-native-adapters for the details
  20. © NTT Communications Corporation All Rights Reserved. 22 NTT Communications

    CONFIDENTIAL CUE 言語の簡単な紹介 // Data Alice: age: 20 // Type People: age: int // Constraint Member: age: > 18 // Validate Alice & People & Member Types are Values • Types are Values ◦ シンプルに制約が記述可能 • Powerful data unification ◦ 複数のデータ構造を直感的に結合できる • Programmable ◦ パッケージが作成できる (Kustomize やその他Templating ツールもあります) オープンソースのデータバリデーション言語 次のような機能が私たちに適合しそうだったので採用しています:
  21. © NTT Communications Corporation All Rights Reserved. 23 NTT Communications

    CONFIDENTIAL これまで実践してきたこと (再掲) 1. Pipeline as Code 実装 • Code review • Testing in staging 2. パイプライン e2e テスト • Continuous integration 3. パイプラインの標準化 • Development standard • Runbook 4. コンポーザブル パイプライン • Package • Unit testing 5. パイプラインパッケージ テスト • Integration testing
  22. © NTT Communications Corporation All Rights Reserved. 25 NTT Communications

    CONFIDENTIAL まとめ CI/CD パイプライン自体もソフトウェアの一部として継続的にメンテナンス する必要があり、それを実現するのが Pipeline as Code という取り組み である 私たちのチームが Pipeline as Code という取り組みを通してこの3年間で CI/CD パイプラインをどのようにメンテナンスしてきたか また、取り組みの結果以下のような機能の組み込みを安定して行うことが できています。 • Secret管理サービス機能を利用した機密情報管理 (GCP Secret Manager など) • Blue/Green デプロイ機能のインテグレーション (Argo Rollouts 利用)
  23. © NTT Communications Corporation All Rights Reserved. 26 NTT Communications

    CONFIDENTIAL プロダクト紹介    ・       ・   
  24. © NTT Communications Corporation All Rights Reserved. 27 NTT Communications

    CONFIDENTIAL Qmonus Value Stream • クラウドアーキテクチャを構成する「インフラストラクチャ構成」とそれをデプロイする「ワークフロー」を再利 用な形でパッケージ化して提供 • 利用したいパッケージを選び・環境パラメータを設定するだけで、試験環境から本番環境とそれらを構築す るパイプラインを素早く構成 AKS Container API Backend Custom Kubernetes Monitoring Datadog API Monitoring Google App Engine API Backend AWS ECS API Backend Kubernetes Blue Green Deployment Development Staging Production 再利用可能なパッケージを選択 Qmonus® Value Stream
  25. © NTT Communications Corporation All Rights Reserved. 28 NTT Communications

    CONFIDENTIAL フリートライアルにご協力いただける方を募集しています 一般市場向け提供前のDevOpsプラットフォームサービス「Qmonus Value Stream」を無料でお使いいただき、フィードバック提供 
 および改善活動にご協力いただける方を募集しています。 (弊社DevOpsエンジニアによる無料サポート付き) 対象者 内製開発でアジャイルに取り組むプロダクトチームかつ、
 サービスのフィードバック(Teams会議を想定)にご協力いただける方
 募集要項 利用期間 1か月間
 利用条件 ・お申込み時に「Qmonusサービス無償トライアル利用規約」に同意いただけること
 ・サービスのフィードバック(Teams会議を想定)にご協力いただけること
 お申込みはこちら Qmonus Value Stream サービス紹介サイト https://www.valuestream.qmonus.net/?source=introduction
 Qmonus Value Stream フリートライアル申込みフォーム https://forms.office.com/r/nnVb0dPbH1
 Qmonus Value Stream フリートライアルのご案内
  26. © NTT Communications Corporation All Rights Reserved. NTT Communications CONFIDENTIAL

    ご清聴ありがとうございました アンケートにご協力ください。 高機能Tシャツを差し上げます。
  27. © NTT Communications Corporation All Rights Reserved. 30 NTT Communications

    CONFIDENTIAL 付録    ・       ・   
  28. © NTT Communications Corporation All Rights Reserved. 31 NTT Communications

    CONFIDENTIAL Step#5: パッケージを利用した結合テスト Go言語 でパッケージの結合テストを行う仕組みを実装 Pipeline Package v1.26 Pipeline/ PipelineRun func TestDeployK8sCluster(t *testing.T) { target := "example.com" cases := []struct{ k8sAPIverson string host string } { {k8sApiVersion: "1.26", host: target}, {k8sApiVersion: "1.27", host: target}, } pi, _ := generatePipeline() for i, tc := range cases { t.Run(i, func(t *testing.T) { run, _ := runPipeline(t, pi, tc) assert.True(t, isSuccessful(run)) assert.True(t, isPodRunning(tc.host)) }) } } Test 対象 Test 毎に 環境構築 疑似コード Pipeline/ PipelineRun v1.27 Testing multiple API versions • 並列・定期実行 • 複雑な条件設定 • 環境の自動構築 Kubernetes clusters 生成