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

PipeCD Good First Issues

PipeCD Good First Issues

PipeCDについての詳細な説明です
https://pipecd.connpass.com/event/288198/

Kenta Kozuka

July 10, 2023
Tweet

More Decks by Kenta Kozuka

Other Decks in Technology

Transcript

  1. @kentakozuka @kenta_kozuka Engineer at CyberAgent / Developer Productivity / #PipeCD

    / #Bucketeer / ✈🎾🏃⛰ こづか けんた(@kentakozuka)
  2. 今日のスケジュール 1. レクチャー ❏ CD周りの概念 ❏ PipeCDの概要 ❏ アーキテクチャー ❏

    ソースコードの詳細な説明 ❏ リリースサイクルやコミュニティへの参加方法 1. good first issuesを見てみよう! 2. issueをアサイン 3. (時間があれば)PRつくろー
  3. 17

  4. 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
  5. PipeCDの全体アーキテクチャー Control PlaneとAgentの2つ 複数のPipedを管理する 例えば • プラットフォームチームがControl Plane を運用 •

    各チームはpiped agentをクラスタ内に配 置するだけ pipedはシングルバイナリなのでどこでもデプロ イ可能 各チームの運用が簡単 大きい組織でスケールする
  6. Control Plane - アーキテクチャー 各種API、UIを提供 5つのコンポーネント • Server - メインコンポーネント

    • Ops - サブコンポーネント • Cache - Redis • DataStore - DB • FileStore - S3, GCS, Minio
  7. Control Plane - Ops • 主にバッチ処理 ◦ データを収集 ◦ DBのインデックス

    • UIもある ◦ Projectの作成 ◦ Static Admin Userの作成
  8. コントロールプレーン構成 ー GKE • GKE上にHelmでデプロイ • Data storeはFirestore • File

    storeはGCS(Google Cloud Storage) • 管理画面、監視(Grafana)へはIAPを通して アクセス • GithubでOAuthログイン • Github Teamsを使ってRBAC • Slackチャンネルへアラートを通知
  9. コントロールプレーン構成 ー ECS Fargate • GKE上にHelmでデプロイ • Data storeはRDS for

    MySQL • File storeはS3 • CacheはElastiCache for Redis • GithubでOAuthログイン • Github Teamsを使ってRBAC • Slackチャンネルへアラートを通知
  10. 用語集 - 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に進む機能
  11. 用語集 - 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を鎖のように繋げて実行する機能
  12. Data Object • Piped - Piped Agentの情報 • Project -

    Projectの情報。Projectはデータの論理グループ。 • Application - Applicationの情報 • Deployment - Deploymentの情報 • API key - 外部からの通信に使用 • Deployment chain - Deployment chainの関係 • Event - EventWatcherで使用される。今日は省きます • Command - 後述 ※ Userという概念はPipeCDにはない
  13. Command • PipeCDの各コンポーネント(UI、CLI, pipedなど)から非同期的にアクションが起こる。 ◦ ボタンクリック ◦ pipectl実行 ◦ Githubのプッシュ

    ◦ etc. • それらをすぐには実行せず、Commandという形でDBに保存する。 • ワーカーが定期的にCommandを取り出し、適切にスケジューリングして実行していく • @kentakozukaはシンプルなイベントドリブン・アーキテクチャーと思っている
  14. 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
  15. 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
  16. 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か判断する
  17. Deployment Status Deploymentの各ステータス PENDING - トリガーするとまずこのステータスになる PLANNED - 実行することが決定して、待っている状態 RUNNING

    - 実行中 ROLLING_BACK - ロールバック中 SUCCESS - 問題なく完了した状態 FAILURE - 実行中にエラーが発生して終了した状態 CANCELLED - なにかによってキャンセルされた デプロイメントはPENDINGから始まり、 SUCCESS/FAILURE/CANCELLEDのどれかで終わる
  18. 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の各ステージの情報
  19. リポジトリのディレクトリ構成 cmd - 各コンポーネントのエントリーポイント docs - ドキュメント examples - 各フィーチャーを試すための簡単な構成ファイル

    hacks - いろんなスクリプト manifests - helm charts pkg - 実際のGoのコード quickstart - Quickstartで必要なコンフィグ test - インテグレーションテストのコード tool - 開発に使うGoのアプリコード web - WebUI CONTRIBUTING.md - コントリビュートについてのあれこれ Makefile - 開発中に使う便利コマンド集
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. syncSchedulers() - Statusが PLANNED と RUNNING のDeploymentを取得 - Deployment1つにつき、1つのSchedulerを作成 -

    schedule毎に作業ディレクトリを作って、goroutineでscheduler.Run() FAQ - Q: なぜRUNNINGも取得している? A: Pipedがdeploymentの実行中に再起動になった可能性もある
  26. scheduler.Run() - 必要であればDeploymentステータスを RUNNING に変更 - 全ての完了していないStageをひとつずつ実行していく(code) - executeState() -

    実行詳細は Platform Provider によって異なる - 最終的にステータスを SUCCESS, FAILURE, CANCELLED のどれかに変更して終了