👬

【PipeCD】Piped管理の効率化: launcherの仕組みと使い分け

2025/01/24に公開

PipeCDのPipedのバイナリ/イメージは、pipedlauncherの2種類あります。
本記事では、launcherの仕組みを解説した上で、それぞれのバージョン・設定ファイルの管理方法を比較します。

先にまとめ

  • 「Pipedのバージョン・設定をGitで管理したい」 → piped がおすすめ
  • 「PipedのバージョンをUIで簡単に更新したい」→ launcher がおすすめ

pipedとは

pipedバイナリ/イメージはPipedエージェントの本体であり、デプロイなどの処理を担います。

pipedの構成図
pipedの構成図

後述のlauncherは必須ではなく、基本的に必要な機能はpipedだけで揃っています。

launcherとは

launcherは、Pipedの管理を楽にするための補助的な仕組みです。
launcherはデプロイ関連の処理を担わず、Piped自体のライフサイクルを管理します。

launcherの構成図
launcherの構成図

launcherのメリット

launcherを利用することで、主に2点のメリットがあります。

  • メリット1. PipedのバージョンをUIから手軽に更新できる (Remote Upgrade機能)

    UIからPipedのバージョンを更新すると、launcherが新しいPipedを起動する

  • メリット2. Pipedの設定ファイルが更新された際に、自動でPipedを新規起動できる

launcherの仕組み

launcherは、以下の3処理を繰り返し実行します。

  1. Pipedの設定読込
  2. Pipedの更新判定
  3. 新しいPipedの起動 or 稼働中のPiped継続

インターバルはデフォルトで1分間です。

1. Pipedの設定読込

読込元としては、現在以下の6種類がサポートされています。

  1. 実行時引数(base64 encoded)
  2. ファイル渡し(ローカルファイル)
  3. Gitリポジトリ
  4. Google Cloud Secret Manager
  5. AWS Secrets Manger
  6. AWS SSM Parameter Store

2〜6に関しては、設定ファイルの内容に変更があった場合、launcherは自動で新しいPipedを起動します。

3〜6はホスト外にありますが、launcher初回起動時だけでなくインターバル経過ごとに再度取得しています。

なお、pipedでは「3. Gitリポジトリ」以外の5つがサポートされています。

2. Piped更新判定

「新しいPipedを起動するか?」の判定は、以下2点のOR条件で行われます。

  • UIで指定されたバージョンと、実行中のpipedのバージョンが異なる
  • "1. Pipedの設定読込"で取得した設定が、実行中のpipedの設定と異なる

3. 新しいPipedの起動

新しいバージョンのpipedバイナリをダウンロードし、新しい設定値を利用してPipedを起動します。
古いPipedは、launcherからSIGTERMを送信してgraceful shutdownさせます。

launcherのコード

launcherのコードは1ファイルにまとまっています。上記フローを頭に入れれば、比較的簡単に理解できると思います。

https://github.com/pipe-cd/pipecd/blob/master/pkg/app/launcher/cmd/launcher/launcher.go

launcher利用時の注意点

  • UIからPipedのバージョンを更新しても、launcher自体のバージョンは変わりません
  • launcherに新機能が追加されたときは、launcherをアップデートしないとその機能を使えません
  • Pipedのトラブルシューティングをする際は、基本的に launcherではなくpipedのバージョンをまず参照したほうが良いです。
    • launcherが問題の原因になるのは稀です
    • UIにはpipedのバージョンのみが表示されます
    • launcherのバージョンは、launcherをデプロイしているバイナリやコンテナを直接参照してください

比較: piped vs launcher

piped launcher
Pipedのバージョンアップ方法 バイナリ/イメージのバージョンを変更して再度デプロイ Web UIから
設定ファイルの更新時 再度デプロイ 自動で新規piped起動

使い分けの例:

  • 「PipedのバージョンもGitで管理したい」→ piped
  • 「Pipedのアップデートは手軽に行いたい」→ launcher
  • 「Secret Manager等のPiped設定を更新したら、自動で反映してほしい」 → launcher

個人的には、GitOpsの思想に則ってpipedをGit管理するのが好みです。ただし、Pipedの設定にはクレデンシャルが含まれるため、設定ファイルはSecret Manager等で管理するのが良いと思います。

余談: プラグイン対応後はどうなる? →検討中

PipeCDでは、「デプロイをプラグインで拡張可能にする」構想が絶賛進行中です。詳細はこちら:

https://zenn.dev/cadp/articles/pipecd-plugin-intro

プラグインにもそれぞれバージョンがあり、Pipedの設定ファイルに記載される見込みです。

例)

kind: Piped
spec:
  plugins:
    - name: k8s-plugin
      url: https://github.com/xxx/k8s-plugin:v0.2.0
      ...
    - name: ecs-plugin
      url: https://github.com/yyy/ecs-plugin:v0.1.0
      ...

piped単体で利用する場合は別として、launcherはどうなるのでしょう?

  • UIからPipedのバージョンが変更された時: Pipedと全プラグインを再起動する?
  • 設定ファイル内のプラグインバージョンが変更された時: Pipedと全プラグインを新規起動する?対象のプラグインだけ再起動する?

どれがいいか決定していないので、これから検討していきます。

関連ドキュメント

CyberAgent Developer Productivity室

Discussion