feat: chainsawによるk8sマニフェスト動的検証をCIに導入 - #784
Conversation
k8sコンポーネント更新時の動作確認強化のため、Kyverno製E2Eテスト フレームワークchainsawを使ったマニフェスト検証ワークフローを追加。 - .github/workflows/chainsaw.yaml: PR時にargoproj/**の変更コンポーネントを 検出し、対応するchainsawテストをkindクラスター上で実行、結果をPRコメントに投稿 - tests/chainsaw/kube-vip: 標準k8sリソースのserver-side dry-run検証 - tests/chainsaw/argocd: ArgoCD/ESO CRD事前インストール後にdry-run検証 - tests/chainsaw/external-secrets-operator: ESO CRD事前インストール後にdry-run検証 renovateによる自動更新PRもargoproj/**パスフィルタで自動検証対象となる。 Closes BOXP-185 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.2タグが存在しないためCIが失敗していた。正しいバージョンv0.2.15を指定。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Chainsaw Manifest Validation❌ テスト失敗あり テスト対象コンポーネント: |
cosignコマンドが見つからないためverifyが失敗していた。 GHAランナーにcosignは含まれていないためverify: falseで回避。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Chainsaw Manifest Validation✅ 全テスト通過 テスト対象コンポーネント: 📦 argocd✅ PASSED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
server-side dry-runはkindクラスターにargocd namespaceが存在することを前提とするが、 kindの新規クラスターにはないため失敗していた。CRDインストール後にnamespaceを作成する ステップを追加して修正。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Chainsaw Manifest Validation✅ 全テスト通過 テスト対象コンポーネント: 📦 argocd✅ PASSED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
… [BOXP-185] - ESO CRDインストールをhelm show crds→helm template|yq selectに変更(templates/crds/対応) - ArgoCD CRDインストールでも同様に修正 - 各コンポーネント(argocd/eso/kube-vip)にapplication.yaml server-side dry-runステップを追加 - kube-vipにはArgoCD CRDインストールステップも追加 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Chainsaw Manifest Validation✅ 全テスト通過 テスト対象コンポーネント: 📦 argocd✅ PASSED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
teeにパイプしていたため\$?がteeの終了コードを返し、chainsaw失敗時も 成功扱いになる問題を修正。PIPESTATUS[0]でchainsawの終了コードを取得する。
Chainsaw Manifest Validation❌ テスト失敗あり テスト対象コンポーネント: 📦 argocd❌ FAILED テスト出力を展開📦 external-secrets-operator❌ FAILED テスト出力を展開📦 kube-vip❌ FAILED テスト出力を展開 |
ArgoCD CRDはアノテーションが262144バイト(256KB)を超えるため、 kubectl apply(client-side)では失敗する。全コンポーネントの CRDインストールを--server-side --force-conflictsに変更。 PIPESTATUS[0]への修正(前コミット)と合わせてCI通過を確認。
Chainsaw Manifest Validation✅ 全テスト通過 テスト対象コンポーネント: 📦 argocd✅ PASSED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
continue-on-error: trueの追加とcreateCommentのtry-catchによりフォークPRでGITHUB_TOKENが読み取り専用の場合でもジョブ全体が失敗しないよう修正 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Chainsaw Manifest Validation✅ 全テスト通過 テスト対象コンポーネント: 📦 argocd✅ PASSED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
Chainsaw Manifest Validation❌ テスト失敗あり テスト対象コンポーネント: 📦 argocd❌ FAILED テスト出力を展開📦 external-secrets-operator❌ FAILED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
Chainsaw Manifest Validation❌ テスト失敗あり テスト対象コンポーネント: 📦 argocd❌ FAILED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
Chainsaw Manifest Validation❌ テスト失敗あり テスト対象コンポーネント: 📦 argocd❌ FAILED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
boxp
left a comment
There was a problem hiding this comment.
chainsaw testの結果をコメントする時、前のコメントをhideするようにしてほしい
…e namespace継承問題を修正) kustomize v5.7.1ではremote base(github.com/argoproj/argo-cd/manifests/base)の namespace設定がCI環境で正しく継承されないため、明示的にnamespace: argocdを設定する。 本番ArgoCDはApplication.destination.namespaceでも制御されるため影響なし。
ArgoCD Diff ResultAuth path: tailscale アプリケーション: argocd の差分パス: argoproj/argocd ===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-application-controller ======
56a57
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-applicationset-controller ======
56a57
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-dex-server ======
56a57
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-notifications-controller ======
56a57
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-redis ======
49a50
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-server ======
56a57
> namespace: argocd
ℹ️ 上記の差分が見つかりました |
Chainsaw Manifest Validation✅ 全テスト通過 テスト対象コンポーネント: 📦 argocd✅ PASSED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
- chainsaw.yaml自身をpathsトリガーに追加(ワークフローのみ変更するPRでもCIが実行されるよう対応) - kube-vip chainsaw-testのdesiredNumberScheduled検証を強化(0または未設定の場合にexitするよう修正) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ArgoCD Diff ResultAuth path: tailscale アプリケーション: argocd の差分パス: argoproj/argocd ===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-application-controller ======
56a57
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-applicationset-controller ======
56a57
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-dex-server ======
56a57
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-notifications-controller ======
56a57
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-redis ======
49a50
> namespace: argocd
===== rbac.authorization.k8s.io/RoleBinding argocd/argocd-server ======
56a57
> namespace: argocd
ℹ️ 上記の差分が見つかりました |
Chainsaw Manifest Validation✅ 全テスト通過 テスト対象コンポーネント: 📦 argocd✅ PASSED テスト出力を展開📦 external-secrets-operator✅ PASSED テスト出力を展開📦 kube-vip✅ PASSED テスト出力を展開 |
Summary
.github/workflows/chainsaw.yamlを新規追加: PRで変更されたargoproj/コンポーネントを自動検出し、kindクラスター上でchainsawテストを実行してPRにコメントで結果を報告tests/chainsaw/argocd/chainsaw-test.yaml: kindクラスターにArgoCD/ESO CRDをインストール・実際にapplyして全コアDeployment(argocd-server等6つ)+StatefulSetのAvailable状態を待機して動的検証tests/chainsaw/external-secrets-operator/chainsaw-test.yaml: HelmでESOを実際にkindクラスターにインストールし、オペレーターのAvailable待機+ClusterSecretStore作成を動的に検証tests/chainsaw/kube-vip/chainsaw-test.yaml: kustomize buildで生成したDaemonSetを実際にkindクラスターに適用してDaemonSet作成を動的検証argoproj/argocd/kustomization.yaml:namespace: argocdを追加(kustomize v5でのremote base namespace継承問題修正)技術選定
helm/kind-actionkyverno/action-install-chainsawkustomizeazure/setup-kubectlazure/setup-helmactions/github-scriptテスト方針(動的検証)
kustomize build <component>でマニフェストを生成しkubectl apply --server-side --force-conflictsで実際にapplykubectl wait --for=condition=AvailableでDeployment/StatefulSetの実際の起動を待機ArgoCD: 6つのコアDeployment + ApplicationController StatefulSetが実際に起動するまで待機
ESO: HelmでESOをインストールしてオペレーターDeploymentのAvailableを確認 + ClusterSecretStore作成を確認
kube-vip: DaemonSetが実際にkindクラスターに作成されることを確認(VIP管理のためPod自体はkindでReady不可だがmanifest正当性は検証済み)
renovate対応
paths: ['argoproj/**']フィルタにより、renovateが作成する自動更新PRでも本ワークフローが自動実行されます(追加設定不要)。Test plan
argoproj/kube-vip/**変更PRでchainsawテストが実行されることを確認(CI ✅)argoproj/argocd/**変更PRでchainsawテストが実行されることを確認(CI ✅)argoproj/external-secrets-operator/**変更PRでchainsawテストが実行されることを確認(CI ✅)argoproj/**以外の変更ではワークフローが実行されないことを確認(detect jobの出力が空でchainsaw jobがskip)Closes #BOXP-185
🤖 Generated with Claude Code