$30 off During Our Annual Pro Sale. View Details »

継続的デリバリーを支える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 (Productio n) 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) Updat e 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. 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
  24. © 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 フリートライアルのご案内
  25. © 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 ⽣成