この記事は GMOペパボエンジニアカレンダー の19日目の記事です。諸事情によりバタバタしてしまい、記事の公開がめちゃくちゃ遅くなりました🙏
普段運用しているKubernetesクラスターでは、デプロイするmanifestは環境毎の差分を管理しやすくするために kustomize を用いています。 共通のmanifestをベースに環境毎にpatchを当てたりすることが多いのですが、これが複雑になってくると、少しの変更でも影響範囲を把握するのが大変だったりするので、毎回手元でkustomize buildを実行して差分を確認するようにしていました。
例えば私の場合だと、
- 現在のブランチでkustomize buildを実行して得たmanifestを何かしらのファイルに書き込んでおく。
- 指定したブランチ(mainブランチとか)に切り替えて、再度kustomize buildを実行し、1 との差分をdiffコマンド等で確認する。
といったようなことを行なっていました。(もっと良い方法があるかもしれないですが...)
これをPull Request上で確認できるとめちゃくちゃ嬉しいなと思い、何か良い感じのツールが無いか探していたところ git-kustomize-diff というツールがかなり便利そうだったので、今回はGithub ActionsでPull Requestをトリガーに、kustomize buildを実行して得たmanifestの差分をPull Request上で確認できるようにする方法をご紹介します。
こんな感じでブランチ間の差分を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 を使用します。
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の使い方はこちらを参考にさせてもらいました。
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イベントだと取得できないはず...)
感想
git-kustomize-diff を使うことで、環境毎・リソース毎にブランチ間の差分を一発で見れるようになるので、自身での差分の確認も楽になるのですが ghput と組み合わせることにより、GithubのPull Reqeust上でこれらの差分が確認できるようになるので、コードレビューのコストもかなり下げられるのではないかと思いました!