Closed25
PipeCD Code Reading: contoller/パッケージ編 [自分用メモ]
ピン留めされたアイテム
結論
- controller/ パッケージは、デプロイのフロー制御を担う
- Controllerは、PlannerとSchedulerを起動・管理して、全体的なフロー制御を行う
- Plannerは、PendingのDeploymentのPipelineを組み立てるやつ
- Schedulerは、PlannedのDeploymentを、パイプライン終了までフロー管理するやつ
pipedのコードを読んでいく。自分用メモを残す。
最も大事なのは、controller/パッケージ
controller/ パッケージは
・controller.go
・planner.go
・scheduler.go
からなる
controller.goが中核。
-
planner
が、PENDING
のDeploymentのパイプラインを決定して、PLANNEDに持っていく -
scheduler
が、PLANNED
のパイプラインの実行をスケジューリングする
1. Planner
-
PLANNED
/RUNNING
deploymentがなくなるまで待つ - 最も古い
PENDING
deploymentを取得し、そのパイプラインを計画する - 最新の成功コミットと比較する
- 実行されるべきパイプラインを決定する
- Statusを
PLANNED
に更新する
コード量的には planner << controller < scheduler
本質的な処理はこのRun()関数のみ。
plannerの単位
- 1plannerで1deployment(pending)を処理する
Pending->Plannedは何をやってるの?
- 処理本体はここだけ。Kindに応じたplannerを作成してPlanしてる
- Kindごとのplannerは
planner/
packageにある
planner/ パッケージのPlan()は何をやってるの?
- GitRepoから最新のManifestを取得
-
パイプライン(
[]PipelineStage
)を組み立てる- QuickSyncかPipelineSyncかで内部的に分かれる
結論: Plannerとは、PendingのDeploymentのPipelineを組み立てるやつ
2. Scheduler
PLANNED のパイプラインの実行をスケジューリングするやつ。
スケジューリングってなんぞや?どこまでの範囲をやってるんだ?
scheduller.goの主な関数
- Run(): EntryPoint。色々やってそう
- executeStage(): executorを見つけて、Stageのデプロイ処理を委譲する
StageStatus
- DeploymentStatus: Pipeline全体の状態
- StageStatus: 各Stageの状態
STAGE_NOT_STARTED_YET
STAGE_RUNNING
STAGE_SUCCESS
STAGE_FAILURE
STAGE_CANCELLED
STAGE_SKIPPED
STAGE_EXITED
schedulerの単位、残存期間
Planned
orRunning
のDeployment1つに対して1つ動く
単位: 起動元:
PlannedとRunningのDeploymentを集めてる箇所:
終了: そのDeploymentが終了したら
-
「ステージ1つが完了したら」「ステージのやることを決めたら」ではない
-
executeStage()
が終わっても、continueして次のStageに行くのみで、returnはしてない
executeStage()
はどこまでやってるの?
- Stageのconfigを読み込んで、Executorに渡す。
- Stageの処理の中身はExecutorに委譲
- ExecutorはRegistryからStage名に基づいて取得
補足)ExecutorのRegistry
- SingletonのRegistryが使われてる (
DefaultRegistry
) -
init()
で各Stage一覧が登録されている
結論: Schedulerとは、PlannedのDeploymentを、パイプライン終了まで、フロー管理するやつ
Stageの中身はExecutorが行う
3. Controller
主な役割
- Plannerの起動・管理
- Schedulerの起動・管理
- Deploymentコマンドを常にチェック
- ※ Deployment以外のコマンドは、別のPackageがチェックする(PlanPreviewとか)
ライフサイクル
Controller はPipedが動く限り常に稼働している。
Pipedと1:1の関係。
syncPlanners()
1. Plannerの起動・管理 - - 完了済のPlanner(
donePlanners
)のうち、古すぎるやつは削除
- 完了したPlannerを
donePlanners
に移動する
-
PendingのDeployment一覧を取得
- 同一appに対して複数ある時は、最も古いものを処理する
-
DeploymentごとにPlannerを作成して、処理させる
syncSchedulers()
2. Schedulerの起動・管理 - - 完了済のscheduler(doneSchedulers)のうち、古すぎるやつは削除
- 完了したschedulerを
doneSchedulers
に移動する
-
Planned
/Running
のDeployment一覧を取得する
- Deployment一つ一つに対して、Schedulerを起動する
c.schedulersにも追加する
結論: Controllerとは、Deploymentsの全体的なフロー制御を常に行うやつ
主務は、PlannerとSchedulerの起動・管理とCommandハンドリング
注意:
pipedv1では少し動きが変わるかも。
このスクラップは4日前にクローズされました