GitHub Actionsでkustomizeの結果差分をPRに出す
ArgoCDでk8sクラスタにdeployするmanifestsをGitHubで管理を管理していて、Pull Request作ったときにkustomizeした結果の差分が出ると便利だなぁと思ったのでやってみた。
最終的なYAMLは一番最後にgist埋込しました。

Actionsがこんな感じの差分をPRに書いてくれます。
applicationごとにkustomize表示する
ArgoCDで管理してるとApplicationごとにkustomizeすることになるので、差分もApplicationごとに表示してもらいたいので頑張る。
Applicationの参照すmanifestsを全部取る
Applicationが参照するmanifestsのpathはApplicationの.spec.source.pathに入ってるので、これをyqでよしなに[1]。
find applications -name '*.yml' -or -name '*.yaml' | xargs yq ea -o=json -N '[.spec.source.path]'
yqはGitHub Actionsで叩けるようになってるので、書くのは単純。findやxargsも動いてくれた。また、next stepでJSON Arrayを要求されているのでそのようにする。
動的にmatrixを生成する
これでkustomize適用するroot pathの一覧が手に入ったので、差分表示するActionsを叩く。
前段でJSON Arrayとして取得したApplicationsをfromJSONでmatrixに渡すと、Applicationごとにjobが立ち上がる。
差分をよしなに表示する。
Applicationごとに最新を表示してほしいので、tagでcommentを管理できるやつをつかう。
kustomize結果差分生成Actionを改造
kustomize結果の差分を出すActionをぐぐると出てきたのがこれ。
さっそく動かしてみると動かない。なので、forkして動くように改造。ついでにkustomizeのrevisionもupdateしました。
git config safe.directory する
これやらないと動いてくれない。issue読むとディレクトリのownershipを変えてもいい(それはそう)けど、いちいち気にしたくないのでsafe.directoryにしてしまう。
set-output をやめる
現時点では動いてるけどwarningが出るので消してやる。が、差分は複数行出力するので単純置換だと動かない[2]。\nをescapeする前のraw stringをdelimiterを指定する形で吐き出す。
Discussion