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