TECHSCORE BLOG

クラウドCRMを提供するシナジーマーケティングのエンジニアブログです。

YAMLの差分が確認しやすいdyffの紹介

YAMLの編集内容を比較する場合、旧来のGNU diffでは作業が行いにくい場合があります。今回紹介するdyffを使えば、diffでは対応できないケースでも比較が行え、作業が容易になります。

河野 健太朗(カワノ ケンタロウ)
腰痛がひどく運動不足が捗っています。


diffでダメなケース

1. 書式は変わるが値は変わらない

フォーマッタやコード生成のツールなどを利用した場合に、YAMLの値としては同じでもテキストの記述としては変更されていることがあります。

  • 変更前
# line.yaml
on:
  issues:
    types:
      - opened
      - labeled
  • 変更後
# bracket.yaml
on:
  issues:
    types: [opened, labeled]

こちらの2つをdiffで比較すると異なったものとして扱われます。diffとしては正しい挙動ですが、比較対象として無視したいこともあります。

$ diff -u line.yaml bracket.yaml
(snip)
-    types:
-      - opened
-      - labeled
+    types: [opened, labeled]

2. 差分があるがdiffでは見にくい

次にCI/CDのツールでジョブの間に別のジョブを挿入するみたいなケースでは、変更箇所の比較がやや複雑になります。

  • 変更前
# before.yaml
jobs:
  build:
    requires: [~commit]
    template: build
  deploy:
    requires: [build]
    template: deploy
  • 変更後
# after.yaml
jobs:
  build:
    requires: [~commit]
    template: build
  before_deploy:
    requires: [build]
    template: before_deploy
  deploy:
    requires: [before_deploy]
    template: deploy

これをdiffで比較すると以下のようになります。

$ diff -u before.yaml after.yaml
(snip)
   build:
     requires: [~commit]
     template: build
-  deploy:
+  before_deploy:
     requires: [build]
+    template: before_deploy
+  deploy:
+    requires: [before_deploy]
     template: deploy

行ごとに比較するとマーカーの示すとおりです。しかしYAMLとして before_deploy が挿入されたということは、ぱっと見では理解することはできないです。

こうした時にdyffが役に立ちます。

dyffを使うと

dyff はOSSのツールでYAMLの比較に特化しています。読みはdiff(ディフ)と同じだと思います。

早速上記のケースをdyffで比較してみましょう。dyffにはいくつかのサブコマンドがあり比較する場合にはbetweenを使用します。

1. 書式は変わるが値は変わらない

diffでは差分が出力されますが無視してほしいケースです。

$ dyff between line.yaml bracket.yaml
     _        __  __
   _| |_   _ / _|/ _|  between line.yaml
 / _' | | | | |_| |_       and bracket.yaml
| (_| | |_| |  _|  _|
 \__,_|\__, |_| |_|   returned no differences
        |___/

2つのファイルには差分がないと表示されています。YAML上の値が変わらないのでちゃんと変更がないと判断されていますね。

2. 差分があるがdiffでは見にくい

diffでは変更の確認が行いづらかったケースです。

$ dyff between before.yaml after.yaml
     _        __  __
   _| |_   _ / _|/ _|  between before.yaml
 / _' | | | | |_| |_       and after.yaml
| (_| | |_| |  _|  _|
 \__,_|\__, |_| |_|   returned two differences
        |___/

jobs
  + one map entry added:
    before_deploy:
    │ requires:
    │ - build
    │ template: before_deploy

jobs.deploy.requires.0
  ± value change
    - build
    + before_deploy

jobs に1つマップが追加されたこと、deployの中の requires の0番目が変更されたこと、が示されています。こちらもきちんとYAMLで意味のある変更箇所として識別されており、比較結果を理解するにはわかりやすく十分な情報ですね。

ところで、自己主張が強いツールのようで、アスキーアートの dyff の部分を消すことは現状できなさそうです。

おわりに

現状はdiffで比較しつつ「よくわからん!」となったときにdyffを使用するという使い方をしています。先の例のように論理的な違いがないとわかっていてもつい実際の変更箇所を確認したくなったりするからです。

そのような使い方でも変更箇所が理解しやすくなるのは間違いないので、是非お試しください。

シナジーマーケティング株式会社では一緒に働く仲間を募集しています。