Closed25

PipeCD Code Reading: contoller/パッケージ編 [自分用メモ]

ピン留めされたアイテム
t-kikuct-kikuc

結論

  • controller/ パッケージは、デプロイのフロー制御を担う
  • Controllerは、PlannerとSchedulerを起動・管理して、全体的なフロー制御を行う
  • Plannerは、PendingのDeploymentのPipelineを組み立てるやつ
  • Schedulerは、PlannedのDeploymentを、パイプライン終了までフロー管理するやつ
t-kikuct-kikuc

pipedのコードを読んでいく。自分用メモを残す。

最も大事なのは、controller/パッケージ

t-kikuct-kikuc

controller/ パッケージは
・controller.go
・planner.go
・scheduler.go
からなる

t-kikuct-kikuc

controller.goが中核。

  • plannerが、PENDING のDeploymentのパイプラインを決定して、PLANNEDに持っていく
  • schedulerが、PLANNED のパイプラインの実行をスケジューリングする

https://github.com/pipe-cd/pipecd/blob/d7f43699085c9da2ddcf913d8866d881cf8038c3/pkg/app/piped/controller/controller.go#L17-L20

t-kikuct-kikuc

1. Planner

  • PLANNED / RUNNING deploymentがなくなるまで待つ
  • 最も古いPENDINGdeploymentを取得し、そのパイプラインを計画する
  • 最新の成功コミットと比較する
  • 実行されるべきパイプラインを決定する
  • StatusをPLANNEDに更新する

コード量的には planner << controller < scheduler

t-kikuct-kikuc

Pending->Plannedは何をやってるの?

  • 処理本体はここだけ。Kindに応じたplannerを作成してPlanしてる

https://github.com/pipe-cd/pipecd/blob/920620e93ca55a6a400a12afe5cf998451516937/pkg/app/piped/controller/planner.go#L211-L218

  • Kindごとのplannerは planner/ packageにある

planner/ パッケージのPlan()は何をやってるの?

  1. GitRepoから最新のManifestを取得
  2. パイプライン([]PipelineStage)を組み立てる
    • QuickSyncかPipelineSyncかで内部的に分かれる
t-kikuct-kikuc

結論: Plannerとは、PendingのDeploymentのPipelineを組み立てるやつ

t-kikuct-kikuc

2. Scheduler

PLANNED のパイプラインの実行をスケジューリングするやつ。
スケジューリングってなんぞや?どこまでの範囲をやってるんだ?

t-kikuct-kikuc

StageStatus

  • DeploymentStatus: Pipeline全体の状態
  • StageStatus: 各Stageの状態
  1. STAGE_NOT_STARTED_YET
  2. STAGE_RUNNING
  3. STAGE_SUCCESS
  4. STAGE_FAILURE
  5. STAGE_CANCELLED
  6. STAGE_SKIPPED
  7. STAGE_EXITED
t-kikuct-kikuc

schedulerの単位、残存期間

単位: PlannedorRunningのDeployment1つに対して1つ動く

起動元:

https://github.com/pipe-cd/pipecd/blob/920620e93ca55a6a400a12afe5cf998451516937/pkg/app/piped/controller/controller.go#L618

PlannedとRunningのDeploymentを集めてる箇所:

https://github.com/pipe-cd/pipecd/blob/920620e93ca55a6a400a12afe5cf998451516937/pkg/app/piped/controller/controller.go#L573-L576

終了: そのDeploymentが終了したら

  • 「ステージ1つが完了したら」「ステージのやることを決めたら」ではない

  • executeStage()が終わっても、continueして次のStageに行くのみで、returnはしてない

https://github.com/pipe-cd/pipecd/blob/920620e93ca55a6a400a12afe5cf998451516937/pkg/app/piped/controller/scheduler.go#L368-L372

t-kikuct-kikuc

executeStage()はどこまでやってるの?

  • Stageのconfigを読み込んで、Executorに渡す。
    • Stageの処理の中身はExecutorに委譲
    • ExecutorはRegistryからStage名に基づいて取得
t-kikuct-kikuc

結論: Schedulerとは、PlannedのDeploymentを、パイプライン終了まで、フロー管理するやつ

Stageの中身はExecutorが行う

t-kikuct-kikuc

3. Controller

t-kikuct-kikuc

1. Plannerの起動・管理 - syncPlanners()

  1. 完了済のPlanner(donePlanners)のうち、古すぎるやつは削除

https://github.com/pipe-cd/pipecd/blob/920620e93ca55a6a400a12afe5cf998451516937/pkg/app/piped/controller/controller.go#L316-L322

  1. 完了したPlannerを donePlanners に移動する

https://github.com/pipe-cd/pipecd/blob/920620e93ca55a6a400a12afe5cf998451516937/pkg/app/piped/controller/controller.go#L323-L346

  1. PendingのDeployment一覧を取得

    • 同一appに対して複数ある時は、最も古いものを処理する
  2. DeploymentごとにPlannerを作成して、処理させる

t-kikuct-kikuc
t-kikuct-kikuc

結論: Controllerとは、Deploymentsの全体的なフロー制御を常に行うやつ

主務は、PlannerとSchedulerの起動・管理とCommandハンドリング

このスクラップは4日前にクローズされました