🔍

GitHub ActionsでKustomizeでビルドするマニフェストの差分をコメントする

に公開

はじめに

KustomizeでKubernetesマニフェストを管理していると、構成が複雑化するにつれてKustomizeファイルの変更によって最終的にビルドされるマニフェストの差分の判断が難しくなります。特にbaseやcomponentsなどを変更したときは、影響範囲が大きいためレビューとして生成されるマニフェストまで確認しておきたいです。
今回はGitHub Actionsを使ってKustomizeファイルの変更によるマニフェストの差分をPRにコメントする方法を調べてみました。

使用するAction

いくつか3rdパーティーのActionがありましたが、以下のActionが便利そうだったので使ってみます。

ワークフローの設定

PRが作成・更新された際に、自動的にKustomizeのdiffを生成するワークフローを設定します。

ワークフローファイルの作成

.github/workflows/kustomize-diff.yaml を作成し、以下の内容を記述します:

name: kustomize-diff
on:
  pull_request:
    paths:
      - 'k8s/**'
      - '.github/workflows/kustomize-diff.yaml'
jobs:
  kustomize-diff:
    permissions:
      pull-requests: write
      contents: write
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
        with:
          fetch-depth: 0
      - id: kustomize-diff
        uses: swade1987/github-action-kustomize-diff@v0.4.0
        with:
          root_dir: "./k8s"
          max_depth: "5"
      - id: comment
        uses: actions/github-script@v8.0.0
        env:
          OUTPUT: ${{ steps.kustomize-diff.outputs.diff }}
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const rawOutput = process.env.OUTPUT;
            const noDiffMessage = "No differences found between";

            const formattedOutput = rawOutput.includes(noDiffMessage)
              ? `### ${rawOutput}`
              : `### Kustomize Changes\n<details><summary>Show Diff</summary>\n\n\`\`\`diff\n${rawOutput}\n\`\`\`\n</details>`;

            await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: formattedOutput
            })

実際の動作例

設定したワークフローの動作を確認のため、試しに、base/kustomization.yaml にlabelを新規追加してPRを作成してみます。

labels:
- includeSelectors: true
  pairs:
    environment: base
    team: devops # 新しく追加

PRを作成すると、GitHub Actionsが自動的に実行され、以下のようにマニフェストの差分がコメントとして投稿されました。

diff --git a/tmp/tmp.EAPMEO/base/overlays_dev.yaml b/tmp/tmp.EAPMEO/merged/overlays_dev.yaml
index 5fa91b2..4db124c 100644
--- a/tmp/tmp.EAPMEO/base/overlays_dev.yaml
+++ b/tmp/tmp.EAPMEO/merged/overlays_dev.yaml
@@ -5,6 +5,7 @@ metadata:
   labels:
     app: sample-app
     environment: dev
+    team: devops
   name: dev-base-sample-app-sa-app
   namespace: sample-app-dev
 ---
@@ -17,6 +18,7 @@ metadata:
   labels:
     app: sample-app
     environment: dev
+    team: devops
   name: dev-base-app-secrets-app
   namespace: sample-app-dev
 type: Opaque
@@ -27,6 +29,7 @@ metadata:
   labels:
     app: sample-app
     environment: dev
+    team: devops
   name: dev-base-sample-app-service-app
   namespace: sample-app-dev
 spec:
@@ -37,6 +40,7 @@ spec:
   selector:
     app: sample-app
     environment: dev
+    team: devops
   type: ClusterIP
 ---
 apiVersion: apps/v1
@@ -45,6 +49,7 @@ metadata:
   labels:
     app: sample-app
     environment: dev
+    team: devops
   name: dev-base-sample-app-app
   namespace: sample-app-dev
 spec:
@@ -53,11 +58,13 @@ spec:
     matchLabels:
       app: sample-app
       environment: dev
+      team: devops
   template:
     metadata:
       labels:
         app: sample-app
         environment: dev
+        team: devops
     spec:
       containers:
       - env:
@@ -118,6 +125,7 @@ metadata:
   labels:
     app: sample-app
     environment: dev
+    team: devops
   name: dev-base-sample-app-hpa-app
   namespace: sample-app-dev
 spec:
(..省略..)

まとめ

このワークフローを導入することで、Kustomizeの変更が最終的なマニフェストにどう影響するかがレビュー時に確認できるようになりました。特にbaseファイルの変更など影響範囲が広い場合に、意図しない変更を事前に発見できて便利です。

GitHubで編集を提案

Discussion