yq とは
yq はgoで書かれている軽量でポータブルなコマンドライン YAML、JSON、XML プロセッサです。yq は jq に似た構文を使用しますが、json、xml、properties、csv、tsv と同様に yaml ファイルを処理します。 記事の執筆時点の2023 年01月17日時点でv4.30.8 がリリースされています。
yq
yq のv4 はv3 とはかなり異なっています。v3 で端的に書けていたものが、v4 ではより表現力のある構文言語となった結果としてちょっと冗長になったように思えるんですけどjq っぽいので慣れてしまえばよいものだとおもいます 。
yq 使ってみる
今回の目的はapplication/deployment.yaml のimageの値をnginx:1.14.2
をnginx:1.23.3
に書き換えたいと思います。yaml をCIで変更するなんてなんぼでもやってますからね。Path などの概念については説明を省略します。普通にシェル芸としてやっていくときには1日1問、半年以内に習得 シェル・ワンライナー160本ノックなどを参考にすると良い。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 # 書き換えたいんじゃ ports: - containerPort: 80
yq(v4) 使ってみる
yq(v4) でread
yq '.spec.template.spec.containers[0].image' deployment.yaml nginx:1.14.2
yq(v4) でwrite
yq -i '.spec.template.spec.containers[0].image = "nginx:1.23.3"' deployment.yaml
確認します。
yq '.spec.template.spec.containers[0].image' deployment.yaml nginx:1.23.3
で目的達成しました簡単!
yq(v3) との違い
yq(v3) にはwrite
やread
などのサブコマンドが撤廃されたので準拠した書き方を覚える必要があると思います。
yq(v4) での変数利用
yq(v4)ではstrenv(<env>)
を利用することで変数を利用することができる
IMAGE=nginx yq -i '.spec.template.spec.containers[0].image = strenv(IMAGE)' deployment.yaml
確認します。
yq '.spec.template.spec.containers[0].image' deployment.yaml nginx
ヤッタネ!!
左辺にはこちら代入できないみたいなのでそのときには作成してからyq に読むこませると良いみたい(他にいい方法があれば教えてほしいです)。
YQ_INPLACE=".${EXE_APP}.image.tag = \"${TAG_HASH}\"" yq -i "${YQ_INPLACE}" "$CHANGE_FILE"
おわり
v3 -> v4 には変更点がいくつかあります。皆さんもCIで使っている時は気をつけましょう。
あとはCI で書き換えで使っている時は-v
を使っておきましょう。