🍣
PipeCDD で EventWatcher の replacement でエスケープ処理する
はじめに
PipeCD というデプロイツールの EventWatcher という機能についてです。
PipeCD には EventWatcher という機能により、マニフェストの変更を検知してデプロイをトリガーできます。
これにより CI での変更内容を CD 側に通知できます。
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