🔍
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ファイルの変更など影響範囲が広い場合に、意図しない変更を事前に発見できて便利です。
Discussion