🎉

tfcmt がコメントの更新をサポート

2022/04/15に公開

Terraform の CI/CD を改善する tfcmt というツールを開発しています。

https://github.com/suzuki-shunsuke/tfcmt

https://zenn.dev/shunsuke_suzuki/articles/improve-terraform-cicd-with-tfcmt

tfcmt v3.2.0 から tfcmt plan のコメントを新たに作成する代わりに既存のコメントを更新することができるようになりました。

https://github.com/suzuki-shunsuke/tfcmt/releases/tag/v3.2.0

ただし、 v3.2.0 には bug があるので v3.2.1 以降を使ってください。

従来は github-comment によって古いコメントを非表示することを推奨していましたが、
コメントを更新することによってよりコメント欄をキレイに保つことが出来ます。
また、従来のやり方だと CI を rerun して新しいコメントを追加した場合に、古いコメントを非表示にするのが難しかったのですが、
コメントを更新するとそのような問題は起こらなくなります。

コメントを更新すると古い結果を確認しづらくなるというのはありますが、あまり古い結果を確認したいこともないでしょう。

使い方

使い方は簡単で、単に -patch option を追加するだけです。

$ tfcmt plan -patch -- terraform plan -no-color

あるいは設定ファイル tfcmt.yamlplan_patch: true を指定する事もできます。

plan_patch: true

両方指定された場合はコマンドラインオプションのほうが優先されるので、設定ファイルで true になってるけど false にしたい場合は、 -patch=false を指定してください。

ロジックの簡単な説明

tfcmt v3.2.0 における patch オプションの挙動を簡単に説明します。

  1. コメントのリストを取得
  2. 更新対象のコメントを探索
  3. 対象が見つからない場合、新しいコメントを作成する
  4. 対象が見つかった場合、コメントを更新する

tfcmt はコメントに以下のようなメタデータを埋め込みます(HTML コメントで埋め込まれているため、通常見えません)。

<!-- github-comment: {"Command":"plan","JobName":"build","PRNumber":158,"Program":"tfcmt","SHA1":"a92fb1cbe843eaca58390bf8f69f0bad3ce3d125","Target":"foo","Vars":{},"WorkflowName":"screen shot"} -->

このメタデータを元に以下の条件を満たすコメントを探索します。

  • メタデータがコメントに含まれている
  • Program が tfcmt
  • Command が plan
  • Target が tfcmt -var target:{} で指定したものと同じ(target を指定していない場合は、空文字か Target が存在しない)
  • 非表示になっていない

複数のコメントが条件を満たす場合、最後に作成されたコメントを対象にします。

なお、 Pull Request へのコメントではなく Commit へのコメントの場合、 patch は無視され、コメントが新規作成されます。
自分のユースケースの場合、 plan は Pull Request に対してしか実行しないので、 commit に plan の結果をコメントするということがなく、特に必要としていませんし、
どうあるのが望ましいのかよくわからないので無視するようにしています。

github-comment hide との併用時の注意点

tfcmt と github-comment hide を併用している場合、 patch option を有効にする際に、 tfcmt plan のコメントが github-comment hide によって非表示にされてしまわないように注意をしないといけません。
対応方法としてはいくつかあります。

  1. github-comment hide による非表示をやめる
  2. tfcmt のコメントを、 github-comment hide の対象外にする (github-comment hide の非表示にするコメントの条件の修正)
  3. tfcmt を実行した後に github-comment hide が実行されるようにする

2 に関して補足すると、 github-comment の設定で次のような条件を指定すればいいでしょう。

https://suzuki-shunsuke.github.io/github-comment/hide

hide:
  default: |
    Comment.HasMeta && Comment.Meta.SHA1 != Commit.SHA1 && ! Comment.Meta.Program == "tfcmt"

ユースケースに合わせて適切な対応方法を選択してください。

Discussion