kustomize buildを実行して得たmanifestの差分ををPull Request上で確認する

この記事は GMOペパボエンジニアカレンダー の19日目の記事です。諸事情によりバタバタしてしまい、記事の公開がめちゃくちゃ遅くなりました🙏

adventar.org


普段運用しているKubernetesクラスターでは、デプロイするmanifestは環境毎の差分を管理しやすくするために kustomize を用いています。 共通のmanifestをベースに環境毎にpatchを当てたりすることが多いのですが、これが複雑になってくると、少しの変更でも影響範囲を把握するのが大変だったりするので、毎回手元でkustomize buildを実行して差分を確認するようにしていました。

例えば私の場合だと、

  1. 現在のブランチでkustomize buildを実行して得たmanifestを何かしらのファイルに書き込んでおく。
  2. 指定したブランチ(mainブランチとか)に切り替えて、再度kustomize buildを実行し、1 との差分をdiffコマンド等で確認する。

といったようなことを行なっていました。(もっと良い方法があるかもしれないですが...)

これをPull Request上で確認できるとめちゃくちゃ嬉しいなと思い、何か良い感じのツールが無いか探していたところ git-kustomize-diff というツールがかなり便利そうだったので、今回はGithub ActionsでPull Requestをトリガーに、kustomize buildを実行して得たmanifestの差分をPull Request上で確認できるようにする方法をご紹介します。

github.com

こんな感じでブランチ間の差分をPull Request上で確認することができます。

サンプルPR: Test pull request by rnakamine · Pull Request #2 · rnakamine/sample-git-kustomize-diff · GitHub

diffを取得する

上記でも挙げたように、差分の取得には git-kustomize-diff を使用します。これは、--base(デフォルトはorigin/main), --target(デフォルトはcurrent branch)で指定したそれぞれのブランチでkustomize buildを行い、そのdiffを最終的にはmarkdown形式で標準出力に出してくれます。

$ git-kustomize-diff run --include ".*/overlays/*/"

カレントディレクトリ内の kustomization.yaml (kustomization.yml) に対してkustomize buildが行われます。--includeオプションや--excludeオプションを使用することで、正規表現を用いてkustomize buildの対象を絞り込むことができます。 今回の場合だと、--include ".*/overlays/*/"と指定して、*/overlays/配下のkustomzation.yamlのみkustomize buildを実行するようにしています。

結果をPull Requestにコメントする

Pull Request上へのコメントは ghput を使用します。

github.com

ghput pr-comment コマンドでは、標準入力をPull Requestにコメントしてくれるので、git-kustomize-diffからの出力をそのままパイプで渡してあげることで、Pull Request上で差分を確認することができるようになります。

GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} ghput pr-comment --owner rnakamine --repo sample-git-kustomize-diff --number $NUMBER

ghputの使い方はこちらを参考にさせてもらいました。

k1low.hatenablog.com

Github Actionsで実行する

これらを、Github ActionsでPull Requestをトリガーに実行させるようにしています。ワークフローのファイルはこんな感じになっています。

name: CI
on: pull_request

jobs:
  ci:
    runs-on: ubuntu-latest
    steps:
    - name: checkout
      uses: actions/checkout@v2
      with:
        ref: ${{ github.head_ref }}
        clean: false
        fetch-depth: 0

    - name: setup git-kustomize-diff
      run: |
        curl -sLf https://github.com/dtaniwaki/git-kustomize-diff/releases/download/v0.1.8/git-kustomize-diff_linux_x86_64.tar.gz -o git-kustomize-diff.tar.gz && \
        tar xzf git-kustomize-diff.tar.gz && \
        mv git-kustomize-diff /usr/local/bin && \
        rm git-kustomize-diff.tar.gz 

    - name: setup ghput
      run: |
        curl -sLf https://github.com/k1LoW/ghput/releases/download/v0.12.2/ghput_v0.12.2_linux_amd64.tar.gz -o ghput.tar.gz && \
        tar xzf ghput.tar.gz && \
        mv ghput /usr/local/bin && \
        rm ghput.tar.gz 

    - name: kustomize diff
      run: |
        NUMBER=$(echo $GITHUB_REF | sed -e 's/[^0-9]//g') # Pull Requestの番号を取得する
        git-kustomize-diff run --base origin/$GITHUB_BASE_REF --target origin/$GITHUB_HEAD_REF --include ".*/overlays/*/" | \
        GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} ghput pr-comment --owner rnakamine --repo sample-git-kustomize-diff --number $NUMBER

ワークフローのトリガーにpull_requestイベントを使っているのは、PR番号を取得するためです。(pushイベントだと取得できないはず...)

zenn.dev

感想

git-kustomize-diff を使うことで、環境毎・リソース毎にブランチ間の差分を一発で見れるようになるので、自身での差分の確認も楽になるのですが ghput と組み合わせることにより、GithubのPull Reqeust上でこれらの差分が確認できるようになるので、コードレビューのコストもかなり下げられるのではないかと思いました!