🍣

PipeCDD で EventWatcher の replacement でエスケープ処理する

2024/09/21に公開

はじめに

PipeCD というデプロイツールの EventWatcher という機能についてです。

https://pipecd.dev/

PipeCD には EventWatcher という機能により、マニフェストの変更を検知してデプロイをトリガーできます。
これにより CI での変更内容を CD 側に通知できます。

https://pipecd.dev/docs-v0.48.x/user-guide/event-watcher/

PipeCD のアプリケーションのマニフェストを置換するために spec.eventWatcher[].handler.config.replacements[] でどのファイルのどのフィールドを置換するかを指定できます。

使用例としては以下のように、 Deployment の image の値を更新する際などに使用します。

apiVersion: pipecd.dev/v1beta1
kind: KubernetesApp
spec:
  name: helloworld
  eventWatcher:
    - matcher:
        name: helloworld-image-update
      handler:
        type: GIT_UPDATE
        config:
          replacements:
            - file: deployment.yaml
              yamlField: $.spec.template.spec.containers[0].image

課題

今回問題になったのは Datadog 用にデプロイごとでバージョンを更新するために以下のように Deployment を更新する場合です。
yamlField./ を含むパスをそのまま指定するとエラーが発生します。

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: xxx
  name: xxx
  labels:
    tags.datadoghq.com/env: dev
    tags.datadoghq.com/service: xxx
-   tags.datadoghq.com/version: v0.0.0
+   tags.datadoghq.com/version: v0.0.1

解決策

yamlField./ を含むパスを指定する場合は以下のように記述する必要があります。
' で囲むだけでエスケープ処理を行うことができます。

yamlField: $.metadata.labels.'tags.datadoghq.com/version'

Discussion