Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PipeCD Good First Issues
Search
Kenta Kozuka
July 10, 2023
Technology
0
18
PipeCD Good First Issues
PipeCDについての詳細な説明です
https://pipecd.connpass.com/event/288198/
Kenta Kozuka
July 10, 2023
Tweet
Share
More Decks by Kenta Kozuka
See All by Kenta Kozuka
フィーチャーフラグ&ABテストツールBucketeer開発の経緯 〜社内基盤としてのプロダクト戦略〜
kentakozuka
0
97
事業部を超えた 開発生産性向上に挑戦する
kentakozuka
7
1.4k
1000人を超えるエンジニア組織へのGitHub Copilot導入促進
kentakozuka
0
310
KubeCon 2023 China Recap & ブースを出展してきました
kentakozuka
1
200
サイバーエージェントでCDツールを内製した話
kentakozuka
1
420
PipeCDでGitOpsやってみよう!
kentakozuka
0
660
サイバーエージェントのフィーチャーフラグを活用した高速開発
kentakozuka
0
35
リアルタイムデータ分析基盤をKafka(Strimzi) & Druidで構築し
kentakozuka
0
76
フィーチャーフラグを使用した開発で 迅速かつ安全にリリースする
kentakozuka
0
51
Other Decks in Technology
See All in Technology
OpenAIの蒸留機能(Model Distillation)を使用して運用中のLLMのコストを削減する取り組み
pharma_x_tech
4
560
なぜCodeceptJSを選んだか
goataka
0
160
5分でわかるDuckDB
chanyou0311
10
3.2k
私なりのAIのご紹介 [2024年版]
qt_luigi
1
120
.NET 9 のパフォーマンス改善
nenonaninu
0
990
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
120
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
5
150
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
200
Fanstaの1年を大解剖! 一人SREはどこまでできるのか!?
syossan27
2
170
宇宙ベンチャーにおける最近の情シス取り組みについて
axelmizu
0
110
Qiita埋め込み用スライド
naoki_0531
0
5.1k
ずっと昔に Star をつけたはずの思い出せない GitHub リポジトリを見つけたい!
rokuosan
0
150
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
Designing Experiences People Love
moore
138
23k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
Code Review Best Practice
trishagee
65
17k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Code Reviewing Like a Champion
maltzj
520
39k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Into the Great Unknown - MozCon
thekraken
33
1.5k
Transcript
Kenta Kozuka
@kentakozuka @kenta_kozuka Engineer at CyberAgent / Developer Productivity / #PipeCD
/ #Bucketeer / ✈🎾🏃⛰ こづか けんた(@kentakozuka)
チャンコン カイン(@khanhtc1202) @khanhtc1202 @khanhtc1202 CyberAgent Developer Productivity室 Friendly neighborhood wizard!!!
📸🎧🌉👾🐈🎶🥤♟
今日のスケジュール 1. レクチャー ❏ CD周りの概念 ❏ PipeCDの概要 ❏ アーキテクチャー ❏
ソースコードの詳細な説明 ❏ リリースサイクルやコミュニティへの参加方法 1. good first issuesを見てみよう! 2. issueをアサイン 3. (時間があれば)PRつくろー
Code of Conduct PipeCDはCNCFのCode of Conductに従っています。 みんなが楽しくイベントが終われば最高です😆
長いです。気楽にいきましょう スライド見てもらえば分かると思いますが、量がかなりあります。 適当に休みながら見てください。 途中で休憩入れると思います。
いつでも質問してください 書いていて、説明するのも理解するのも難しいなと思いましたw 説明中にぶった切っていいので、質問してください。 Zoomのチャットでも良いです。 CNCF Slack の #pipecd, #pipecd-jp チャンネルではいつでも質問募集中です!
Non-code contributions コードのコントリビューションは数あるコントリビューションの一つです。 ドキュメント、ブログエントリー、Slackチャンネルでの質問・回答、イベント への参加など、全て平等で重要なコントリビューションです。 是非コミュニティに参加してください! すごく良い記事です👇 https://github.com/readme/featured/open-source-non-code-contributions
9 CI, CD周りの 開発手法の紹介
基本的なCI/CDの役割
gitops 11
GitOpsはCDの1つの手法
GitOpsのメリット • 直接環境にアクセスしなくてよい • 全ての構成変更はGit(PR)を通して行われる • 今Gitで確認できる構成 == 今動いている構成 •
全ての変更は追跡可能
プログレッシブデリバリー • 機能を段階的に公開していく • ユーザーへの影響を細かく制御する • 全てのプロセスを自動化 commit rollout analyze
release deploy rollback
プログレッシブデリバリーのプロセス • トラフィック制御(カナリアデプロイメント) • 分析(カナリア分析) • 自動化されたロールバック
16 PipeCDの概要
17
One CD for All 18 全ての環境 - dev, stg, prod...
全てのオペレーション - scaling, upgrading, config updating, rolling back, infra provisioning... 全てのアプリケーション - infra, kubernetes, serverless... 全てのインフラ - public clouds such as GCP, AWS, Azure, private cloud
マルチプロバイダ & マルチテナント 19 様々なプラットフォーム、アプリケーション、テレメトリーに対応 マルチクラスタ・テナンシーでの運用が可能
Kubernetesエコシステムとのインテグレーション 20
GitOps
シンプルなUIと可視性 22 UIはアプリケーションの状態をリアルタイムで可視化し、 どのタイミングで何が発生したかが明示される
Control Plane & Agentモデル • デプロイはクラスタ内のpiped agentが実行 • アプリケーションのクレデンシャルが外部に漏れるこ とがない
• pipedはステートレスなシングルバイナリなので場所を 選ばず、メンテも簡単
セキュリティ • ビルトインのシークレット管理 • RBAC • SSO
高度な自動化 25 エラーレートに基づく 自動ロールバック 構成変更の自動検知
DevOps指標の可視化
Plan Preview
プログレッシブデリバリー • 機能を段階的に公開していく • ユーザーへの影響を細かく制御する • 全てのプロセスを自動化 commit rollout analyze
release deploy rollback
プログレッシブデリバリーのプロセス • トラフィック制御(カナリアデプロイメント) • 分析(カナリア分析) • 自動化されたロールバック
メトリクスの取得 ユーザーのモニタリングシステムからメトリクスを取得 - Prometheus - Datadog - CloudWatch - NewRelic
- Google Cloud Monitoring
分析
Pipedのリモートアップグレード Piped エージェントのアップグレードはUIで簡単に可能
EventWatcher UPDATE CIからCDへのデリバリープロセスの自動化
Wait-Approval 34 デプロイに必要な承認者を指定する
Deployment chain 35 dev stg prd asia us europe
通知機能 36 • PipeCD内の各イベントを通知 • 現在はSlackに対応
37 実際に見てみよう! pipecd.dev
38 PipeCDの アーキテクチャー
PipeCDの全体アーキテクチャー Control PlaneとAgentの2つ 複数のPipedを管理する 例えば • プラットフォームチームがControl Plane を運用 •
各チームはpiped agentをクラスタ内に配 置するだけ pipedはシングルバイナリなのでどこでもデプロ イ可能 各チームの運用が簡単 大きい組織でスケールする
Control Plane - アーキテクチャー 各種API、UIを提供 5つのコンポーネント • Server - メインコンポーネント
• Ops - サブコンポーネント • Cache - Redis • DataStore - DB • FileStore - S3, GCS, Minio
Control Plane - Server • APIサーバー ◦ gRPC (UI, pipectl)
◦ HTTP • UIを提供
Control Plane - Ops • 主にバッチ処理 ◦ データを収集 ◦ DBのインデックス
• UIもある ◦ Projectの作成 ◦ Static Admin Userの作成
Control Plane - DataStore • データオブジェクトを永続化 • 各オブジェクトについてはあとで
Control Plane - FileStore • ファイル形式のデータを保存する • ログ • コマンドの出力結果
• 各種指標のデータ
コントロールプレーン構成 ー GKE • GKE上にHelmでデプロイ • Data storeはFirestore • File
storeはGCS(Google Cloud Storage) • 管理画面、監視(Grafana)へはIAPを通して アクセス • GithubでOAuthログイン • Github Teamsを使ってRBAC • Slackチャンネルへアラートを通知
コントロールプレーン構成 ー ECS Fargate • GKE上にHelmでデプロイ • Data storeはRDS for
MySQL • File storeはS3 • CacheはElastiCache for Redis • GithubでOAuthログイン • Github Teamsを使ってRBAC • Slackチャンネルへアラートを通知
Piped Agent • 各クラスタ内にデプロイされる • 必ずしもクラスタ内でなくてよい • ステートレス • 実際にアプリケーションをデプロイする
• Gitから構成ファイルを取得する • デプロイに必要なクレデンシャルを持つ
48 質問あれば🙋
49 PipeCDの用語集 📗
用語集 - 1 Control Plane - コントロールプレーン、たまにPipeCDと言ったらControl Planeを指すこともある。 Agent -
Piped agent、piped、単にエージェントとも Application - 1つのapp.pipecd.yamlで管理するアプリやインフラの集合 Application Kind - Applicationの種類。k8s、Terraformとか Platform Provider - Applicationを提供するサービス。今のところApplication Kindと1対1 Deployment - Applicationを環境に適用すること。ApplicationとDeploymentは1対N Stage - Pipelineの中の1つの段階、ステップのこと。例)Quick Sync, Wait, Canary Rollout, Analysis Analysis - Analysis Stageで行う分析のこと Analysis Provider - Analysisのために必要なメトリクスやログを提供するサービス ADA - Automated Deployment Analysis、Analysis Stageで自動的に分析して次のStageに進む機能
用語集 - 2 Plan Preview - Git commitの変更をマージ前にユーザーに通知する機能 Drift -
GitとLive Stateの差異 Drift Detection - Driftを検知すること Sync - GitとLive Stateを同期させること Sync Strategy- Syncの方法、Quick Sync, Pipeline Syncとか Insight - PipeCDで収集・表示しているデプロイ周りの指標とその可視化機能 Event Watcher - CIからPipeCDに通知してGitのファイルを更新し、シームレスにCDの処理につなげる機能 Deployment Chain - DeploymentとDeploymentを鎖のように繋げて実行する機能
52 Data Objects
Data Object • Piped - Piped Agentの情報 • Project -
Projectの情報。Projectはデータの論理グループ。 • Application - Applicationの情報 • Deployment - Deploymentの情報 • API key - 外部からの通信に使用 • Deployment chain - Deployment chainの関係 • Event - EventWatcherで使用される。今日は省きます • Command - 後述 ※ Userという概念はPipeCDにはない
54 Command
Command • PipeCDの各コンポーネント(UI、CLI, pipedなど)から非同期的にアクションが起こる。 ◦ ボタンクリック ◦ pipectl実行 ◦ Githubのプッシュ
◦ etc. • それらをすぐには実行せず、Commandという形でDBに保存する。 • ワーカーが定期的にCommandを取り出し、適切にスケジューリングして実行していく • @kentakozukaはシンプルなイベントドリブン・アーキテクチャーと思っている
Command Commandの種類 • SYNC_APPLICATION - ApplicationをSyncする • UPDATE_APPLICATION_CONFIG - Applicationの構成を更新する(EventWatcher)
• CANCEL_DEPLOYMENT - 実行中のDeploymentをキャンセルする • APPROVE_STAGE - Wait-Approveステージで承認する • BUILD_PLAN_PREVIEW - Plan-Previewを実行する • CHAIN_SYNC_APPLICATION - ApplicationをSyncする(Deployment Chain) • SKIP_STAGE - Deploymentのステージをスキップする • RESTART_PIPED - Piped agentを再起動する https://github.com/pipe-cd/pipecd/blob/master/pkg/model/command.proto
Command Status Commandのステータスを表す • COMMAND_NOT_HANDLED_YET • COMMAND_SUCCEEDED • COMMAND_FAILED •
COMMAND_TIMEOUT https://github.com/pipe-cd/pipecd/blob/master/pkg/model/command.proto
58 Deployment
Deployment Applicationを環境に適用すること。ApplicationとDeploymentは1対N 1つのApplicationを何回もDeployする Sync - GitとLive Stateを同期させること、ほぼDeploymentと同義 Sync Strategy- Syncの方法、2つある
1. Quick Sync - シンプルにConfigを環境に適用する 2. Pipeline Sync - ユーザーが指定した方法で行う 3. (Auto Sync) - PipeCD側のアルゴリズムに従ってQuick SyncかPipeline Syncか判断する
Deployment Pipeline ユーザーが自由に設定できるDeploymentの手順 Stage - Pipelineの中の1つの段階、ステップのこと。例)Wait, Canary Rollout, Analysis Quick
Sync StrategyはQuick Syncという1つのステージのみを持つ
Deployment Status Deploymentの各ステータス PENDING - トリガーするとまずこのステータスになる PLANNED - 実行することが決定して、待っている状態 RUNNING
- 実行中 ROLLING_BACK - ロールバック中 SUCCESS - 問題なく完了した状態 FAILURE - 実行中にエラーが発生して終了した状態 CANCELLED - なにかによってキャンセルされた デプロイメントはPENDINGから始まり、 SUCCESS/FAILURE/CANCELLEDのどれかで終わる
Deployment オブジェクト ApplicationId - ApplicationのID PipedId - Applicationを管理しているPipedのID ProjectId -
Pipedが属しているProjectのID RunningCommitHash - Deploymentに使うGit commit hash GitPath - アプリケーション構成ファイルのパス PlatformProvider - k8s, Terraformなど Trigger - Deployementが誰によって、どのようにトリガーしたのかの情報 Versions - Deploymentで使用するアーティファクトの情報、例えば - Kind: CONTAINER_IMAGE, URL: https://registry.hub.docker.com, Version: ubuntu:20.04 Status - ステータス Stages - Deployment pipelineの各ステージの情報
63 ソースコードの くわしい解説 👀
リポジトリ https://github.com/pipe-cd/pipecd
リポジトリのディレクトリ構成 cmd - 各コンポーネントのエントリーポイント docs - ドキュメント examples - 各フィーチャーを試すための簡単な構成ファイル
hacks - いろんなスクリプト manifests - helm charts pkg - 実際のGoのコード quickstart - Quickstartで必要なコンフィグ test - インテグレーションテストのコード tool - 開発に使うGoのアプリコード web - WebUI CONTRIBUTING.md - コントリビュートについてのあれこれ Makefile - 開発中に使う便利コマンド集
cmd/ • 各コンポーネントのエントリーポイント ◦ launcher ◦ pipecd ◦ pipectl ◦
piped cobraを使ってます
launcher • pipedをUIから更新するリモートアップグレードを行う 詳しくはドキュメント参照
pipectl Command Line Interface • Control Planeと通信してPipeCDの設定を表示・変更可能 • シェルスクリプトと組み合わせて、PipeCDの設定をプログラム可能
69 Deployment Deep Dive
piped - PipeCDの超重要コンポーネント • piped agent • PipeCDのdaemonだからpiped • シングルバイナリ
• Deploymentを行う • 通信は基本全てoutbound ◦ Control PlaneとのgRPC ◦ Git client ◦ 各Application • 実はinboundもある ◦ admin server ▪ health status ▪ running version ▪ go profile ▪ monitoring metrics
pipedの重要人物たち 本当はもっとあります https://github.com/pipe-cd/pipecd/tree/master/pkg/app/piped
Application Live State Store • ApplicationのLive State(現在の状態)を取得してキャッシュとして保持する • 実装はPlatform Providerによって分かれている
https://github.com/pipe-cd/pipecd/blob/master/pkg/app/piped/livestatestore/livestat estore.go
Application Live State Reporter • ApplicationのLive StateをApplication Live State Storeから受け取って、Control
Plane に送る https://github.com/pipe-cd/pipecd/tree/master/pkg/app/piped/livestatereporter
Application Drift Detector • Gitリポジトリから構成ファイルを取得 • Application Live State StoreからApplication
Live Stateを取得 • 両者を比較し、Drift(差異)をApplication.SyncStateというオブジェクトに入れて、 Controle Planeに送る https://github.com/pipe-cd/pipecd/tree/master/pkg/app/piped/driftdetector
Deployment Trigger デプロイメントをトリガーする 定期実行とオンデマンドの2つの処理がある https://github.com/pipe-cd/pipecd/tree/master/pkg/app/piped/trigger
Deployment Trigger 定期実行 - Control PlaneからApplicationを取得して必要であればDeploymentをトリガーする オンデマンド - Control PlaneからCommandを取得してDeploymentをトリガーする
Deployment Controller Control PlaneからDeploymentを取得し、適切にスケジューリングしつつApplicationをデプロ イする賢いやつ。例えるなら監督みたい? https://github.com/pipe-cd/pipecd/tree/master/pkg/app/piped/controller
Deployment Controllerの内部 Controller - PlannersとSchedulersを内部に持ち、うまく協調させながらDeploymentを行う Planner - Deploymentをどのように実行するか決定する。 - 要はSync
Strategyを決定する Scheduler - Deploymentを実行する https://github.com/pipe-cd/pipecd/blob/8ea515a42e7c129bf2bfd32396db5960b0283a 06/pkg/app/piped/controller/controller.go#L107
Deployment Controllerが定期的に実行するもの - syncPlanners() - syncSchedulers() - checkCommands() https://github.com/pipe-cd/pipecd/blob/8ea515a42e7c129bf2bfd32396db5960b0283a 06/pkg/app/piped/controller/controller.go#L231-L236
syncPlanners() 1. PENDING ステータスのDeploymentを取得する 2. Deployment1つにつき、1つのPlannerを作成 3. goroutineでplanner.Run() https://github.com/pipe-cd/pipecd/blob/8ea515a42e7c129bf2bfd32396db5960b0283a 06/pkg/app/piped/controller/controller.go#L291
planner.Run() - 各Platform ProviderのPlannerを呼び出す - Sync Strategyを決定する - Deployment Statusを
PLANNED に変更する https://github.com/pipe-cd/pipecd/blob/8ea515a42e7c129bf2bfd32396db5960b0283a 06/pkg/app/piped/controller/controller.go#L499C23-L499C23
syncSchedulers() - Statusが PLANNED と RUNNING のDeploymentを取得 - Deployment1つにつき、1つのSchedulerを作成 -
schedule毎に作業ディレクトリを作って、goroutineでscheduler.Run() FAQ - Q: なぜRUNNINGも取得している? A: Pipedがdeploymentの実行中に再起動になった可能性もある
scheduler.Run() - 必要であればDeploymentステータスを RUNNING に変更 - 全ての完了していないStageをひとつずつ実行していく(code) - executeState() -
実行詳細は Platform Provider によって異なる - 最終的にステータスを SUCCESS, FAILURE, CANCELLED のどれかに変更して終了
checkCommands() code 実行されていないCommandを取得 必要ならばPlannerやSchedulerにGo channelを通してDeploymentをキャンセルする。
85 Let’s take a 5min break
86 How to Start Contributing
How to Start Contributing to PipeCD Contributing to PipeCDを読んでみよう!
88 Good First Issues
PipeCD’s Good First Issues 最初にやるのにちょうどよいIssueにつけるラベル • Let’s browse PipeCD’s good
first issues!
90 Let’s Create a PR!
pipe-cd/pipe @pipecd_dev https://pipecd.dev/ We always welcome your contributions!