🦆

GitHub Actionsでkustomizeの結果差分をPRに出す

2022/12/11に公開

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]'

https://github.com/mikefarah/yq

yqはGitHub Actionsで叩けるようになってるので、書くのは単純。findxargsも動いてくれた。また、next stepでJSON Arrayを要求されているのでそのようにする。

動的にmatrixを生成する

これでkustomize適用するroot pathの一覧が手に入ったので、差分表示するActionsを叩く。

前段でJSON Arrayとして取得したApplicationsをfromJSONでmatrixに渡すと、Applicationごとにjobが立ち上がる。

https://docs.github.com/ja/actions/learn-github-actions/expressions#example-returning-a-json-object

差分をよしなに表示する。

Applicationごとに最新を表示してほしいので、tagでcommentを管理できるやつをつかう。

https://github.com/thollander/actions-comment-pull-request

kustomize結果差分生成Actionを改造

kustomize結果の差分を出すActionをぐぐると出てきたのがこれ。

https://github.com/TakeoffTech/github-action-kustomize-diff

さっそく動かしてみると動かない。なので、forkして動くように改造。ついでにkustomizeのrevisionもupdateしました。

https://github.com/walkure/github-action-kustomize-diff

git config safe.directory する

https://github.com/actions/runner/issues/2033

これやらないと動いてくれない。issue読むとディレクトリのownershipを変えてもいい(それはそう)けど、いちいち気にしたくないのでsafe.directoryにしてしまう。

set-output をやめる

https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/

現時点では動いてるけどwarningが出るので消してやる。が、差分は複数行出力するので単純置換だと動かない[2]\nをescapeする前のraw stringをdelimiterを指定する形で吐き出す。

https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings

できたもの

脚注
  1. Applicationをわたしはapplicationsディレクトリに入れていますが、そうでない場合は変更してください。 ↩︎

  2. 単純置換だと「\n%0Aに置換された長い一行」がoutputとして出てきます。 ↩︎

Discussion