Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

© 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グループ向けの導⼊⽀援に携わっている。

Slide 4

Slide 4 text

© NTT Communications Corporation All Rights Reserved. 4 NTT Communications CONFIDENTIAL 本題

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

© NTT Communications Corporation All Rights Reserved. 13 NTT Communications CONFIDENTIAL Pipeline as Code 実践紹介

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

© 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

Slide 16

Slide 16 text

© 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

Slide 17

Slide 17 text

© 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

Slide 18

Slide 18 text

© 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) 再利⽤ 更新

Slide 19

Slide 19 text

© 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

Slide 20

Slide 20 text

© 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 共通化

Slide 21

Slide 21 text

© 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

Slide 22

Slide 22 text

© 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 ツールもあります) オープンソースのデータバリデーション⾔語 次のような機能が私たちに適合しそうだったので採⽤しています:

Slide 23

Slide 23 text

© 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

Slide 24

Slide 24 text

© NTT Communications Corporation All Rights Reserved. 24 NTT Communications CONFIDENTIAL まとめ

Slide 25

Slide 25 text

© 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 利⽤)

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

© 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

Slide 28

Slide 28 text

© 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 フリートライアルのご案内

Slide 29

Slide 29 text

© NTT Communications Corporation All Rights Reserved. NTT Communications CONFIDENTIAL ご清聴ありがとうございました

Slide 30

Slide 30 text

© NTT Communications Corporation All Rights Reserved. 30 NTT Communications CONFIDENTIAL 付録

Slide 31

Slide 31 text

© 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 ⽣成