Helm Chart Release / release-chart (push) Successful in 5s
「Registry 発行済み」と「タグ/リリース作成」が同一フラグに束ねられていたため、 タグ push だけ失敗しても回復できなかった。各成果物を個別に冪等チェックし、 不足分だけを作る構造に変更。途中失敗しても次の push で自己修復する。 タグ有無は git ls-remote でリモート基準に確認。
138 lines
9.4 KiB
Markdown
138 lines
9.4 KiB
Markdown
# CLAUDE.md — secret-manager Helm Chart
|
||
|
||
> **共通ルール(要約)** — 詳細は `P:\Claude\CLAUDE.md`(全体共通)と `P:\Claude\HelmChart\CLAUDE.md`(Helm チャート共通: リリースフロー・ワークフロー・Gitea Secrets)を参照。
|
||
> 作業前に pull / 機能変更時は README 更新 / 作業単位ごとに commit → push まで / コミットに AI クレジットを付けない / pull で入った変更を revert しない / Helm はローカル実行不可(Python のみ可)。
|
||
|
||
## リポジトリ概要
|
||
|
||
クラスター内の複数プロジェクトで横断的に使う「認証情報」を 1 つの Helm チャートで
|
||
一元管理する。外部メールの SMTP/IMAP 設定・API キー・汎用資格情報を定義し、
|
||
指定した複数ネームスペースへ同一の Kubernetes Secret として配布する。
|
||
|
||
**設計目標**: 認証情報の変更が発生したら、このチャートの values を更新して
|
||
`helm upgrade` するだけで、クラスター上の全プロジェクトに反映される。
|
||
|
||
- **Gitea リポジトリ**: `ssh://git@192.168.9.65/helmchart/secret-manager`
|
||
- **Helm リポジトリ**: `https://git.cafepieters.com/api/packages/helmchart/helm`
|
||
|
||
## バージョン方針(組織ルールの例外)
|
||
|
||
- このチャートには「主アプリ」となる外部プロダクトが存在しない(チャート自身がアプリ)。
|
||
そのため `Chart.yaml` の `version` / `appVersion` は **チャート独自に SemVer で採番**する。
|
||
(組織ルール「主アプリのバージョンと同一」は適用対象外)
|
||
- 破壊的変更 = メジャー、機能追加 = マイナー、修正 = パッチ。
|
||
|
||
## リリースフロー(組織ルールとの差分)
|
||
|
||
新バージョンを出す手順は「`Chart.yaml` の `version` / `appVersion` を上げて `main` に push」だけ。
|
||
以降は CI が処理する。
|
||
|
||
### `.gitea/workflows/helm-release.yaml`(push トリガ)
|
||
- `main` への push(`Chart.yaml` / `values.yaml` / `values.schema.json` / `templates/**` 変更時)
|
||
および手動実行で発火。
|
||
- `helm lint --strict` → **現在の `version` が Package Registry に未公開のときだけ**
|
||
リリースする(`helm search repo --version` で存在確認)。
|
||
- 他リポジトリの「毎 push で無条件公開」する共通版とは意図的に異なる。README・examples
|
||
だけの変更で push してもリリースは発生しない。
|
||
- リリース内容 = Package Registry 発行 + Git タグ `v<version>` + Gitea リリース(`.tgz` 添付)。
|
||
タグ・リリースは既存なら skip(冪等)。
|
||
|
||
### `.gitea/workflows/image-update-and-release.yaml` は持たない(組織ルールの例外)
|
||
- 組織共通の「各リポジトリ共通の2本」構成の例外。このチャートは Secret を生成するだけで
|
||
**追従対象の上流イメージが存在しない**ため、週次の自動更新ワークフロー自体を置かない。
|
||
- バージョンは常に手動で `Chart.yaml` の `version` / `appVersion` を更新して判断する。
|
||
- 将来サブチャート等の追従対象ができた場合は、このワークフローを新設して対応する。
|
||
|
||
### 手動リリース(臨時)
|
||
- 改修作業で臨時リリースが必要なら `version` 末尾にアルファベットを付与(例: `0.2.0` → `0.2.0-a`)。
|
||
|
||
## アーキテクチャ要点
|
||
|
||
- `templates/_helpers.tpl` の `secret-manager.secret` が中核。
|
||
1 論理 Secret を受け取り、実効ネームスペースごとに複製した Secret マニフェストを出力する。
|
||
- 配布先の決定順:
|
||
1. エントリの `namespacesOverride`(非空ならそれを使用)
|
||
2. `distribution.reflector.enabled` が true → リリース先ネームスペースのみに作成し reflector アノテーション付与
|
||
3. それ以外 → `distribution.namespaces` (+ `includeReleaseNamespace`) を重複排除した一覧
|
||
- Helm はリリースマニフェストに含まれる別ネームスペースの Secret も追跡するため、
|
||
`namespaces` からネームスペースを外して `helm upgrade` するとそのコピーは削除される。
|
||
- 資格情報は `stringData` で書き込む(テンプレート側で全値を文字列へ強制)。
|
||
- 平文の資格情報を含む values(`secrets.values.yaml` 等)は `.gitignore` 済み。絶対にコミットしない。
|
||
|
||
## チャート改修履歴
|
||
|
||
### helm-release.yaml のリリース判定を3系統に分離 + v0.1.0 タグ補完(2026-09-08)
|
||
|
||
**症状**: Git タグ `v0.1.0` がリモートに存在しなかった(Registry には
|
||
`secret-manager-0.1.0.tgz` は発行済み)。
|
||
|
||
**原因**: 初回リリース(run #1 / `f374cd2`)時点の `helm-release.yaml` は
|
||
共通版のコピー(タグ作成ステップ無し)だった。タグ作成ステップを持つ現行版に
|
||
差し替えたのは run #2 だが、その時点で `0.1.0` は既に Registry 登録済みのため
|
||
`release_needed=false` となり、タグ作成を含む全ステップがスキップされていた。
|
||
= 「Registry 発行済み」と「タグ/リリース作成」が同一フラグに束ねられており、
|
||
一方だけ欠けた状態を回復できない構造だった。
|
||
|
||
**修正内容**:
|
||
- `helm-release.yaml` の判定を `registry_needed` / `tag_needed` / `release_needed`
|
||
の3独立フラグに分離。各成果物を個別に冪等チェックし、不足分だけを作る。
|
||
途中のステップだけ失敗しても次の push で自己修復する。
|
||
- タグ有無は `git ls-remote --tags` でリモート基準に確認。
|
||
- 欠けていた `v0.1.0` タグを `f374cd2`(Registry の 0.1.0 tgz と同じツリー)に
|
||
対して手動で作成・push(過去分の履歴補完。Gitea リリースは 0.1.0 が既知不具合
|
||
バージョンのため作らない)。
|
||
|
||
**対象ファイル**: `.gitea/workflows/helm-release.yaml`, `README.md`, `CLAUDE.md`
|
||
(+ リモートタグ `v0.1.0` を追加)
|
||
|
||
### values.schema.json の $schema 行を削除(2026-09-08, v0.1.1)
|
||
|
||
**症状**: 一部のデプロイ環境(新しめの JSON Schema バリデータを内蔵する Helm / Argo CD /
|
||
Flux 等)で `An error occurred: no schema with key or ref "https://json-schema.org/draft-07/schema#"`
|
||
が出てデプロイできない。
|
||
|
||
**原因**: `values.schema.json` の `"$schema": "https://json-schema.org/draft-07/schema#"` を
|
||
メタスキーマとして解決しようとし、オフライン環境で失敗していた。`santhosh-tekuri/jsonschema`
|
||
系のバリデータは `https://` 版の draft-07 メタスキーマ URL をバンドルしていない。
|
||
|
||
**修正内容**: `$schema` 行を削除。Helm は `$schema` を必須としておらず、本スキーマは
|
||
ドラフト非依存のキーワード(`type` / `properties` / `required` / `enum` / `additionalProperties` /
|
||
`minLength` / `minimum` / `maximum` / `minProperties` / 単一スキーマの `items`)しか使って
|
||
いないため、`helm lint --strict` の検証(未知キーの検出など)は従来どおり機能する。
|
||
|
||
**修正リリース**: `0.1.0` は登録済みのため(同一バージョンは再発行されない)、`0.1.1` として発行。
|
||
|
||
**対象ファイル**: `values.schema.json`, `Chart.yaml`, `README.md`, `CLAUDE.md`
|
||
|
||
### 週次ワークフローの削除(2026-09-05)
|
||
|
||
`image-update-and-release.yaml`(週次セーフティネット)を削除。追従すべき上流イメージが
|
||
無いチャートに「更新チェック」ワークフローを持たせる意味が無いと判断。リリースは
|
||
`helm-release.yaml`(push トリガ・未公開バージョンのみリリース)の1本のみに一本化。
|
||
組織共通の「各リポジトリ共通の2本」構成の例外として本ファイルに明記。
|
||
|
||
**対象ファイル**: `.gitea/workflows/image-update-and-release.yaml`(削除), `README.md`, `CLAUDE.md`
|
||
|
||
### 自動更新・リリースワークフローの整備(2026-09-03, v0.1.0)
|
||
|
||
`.gitea/workflows/` を 2 本体制に。`helm-release.yaml` を「無条件公開」から
|
||
「未公開バージョンのみリリース」に変更(`helm search repo --version` で存在確認し、
|
||
未公開時のみ Package Registry 発行 + Git タグ + Gitea リリース)。`paths` フィルタで
|
||
`Chart.yaml`/`values.yaml`/`values.schema.json`/`templates/**` の変更時のみ発火。
|
||
`image-update-and-release.yaml` を新設(週次)。上流イメージが無いチャートのため
|
||
バージョン自動採番はせず、push 側の取りこぼし対策(未公開バージョンの週次リリース)
|
||
として動作。将来の追従対象追加用コメントブロックを同梱。
|
||
|
||
**対象ファイル**: `.gitea/workflows/helm-release.yaml`,
|
||
`.gitea/workflows/image-update-and-release.yaml`, `README.md`, `CLAUDE.md`
|
||
|
||
### 初版設計・実装(2026-08-31, v0.1.0)
|
||
|
||
空リポジトリから初期実装。`distribution`(namespaces 複製 / reflector / reloader)、
|
||
`common`(namePrefix・labels・annotations・immutable)、`mail.providers`(SMTP/IMAP/POP3 +
|
||
`smtp.env` + 任意の `msmtprc`)、`api.credentials`、`generic.secrets`(任意 type)を実装。
|
||
`values.schema.json`、`examples/`、`.gitea/workflows/helm-release.yaml` を追加。
|
||
|
||
**対象ファイル**: `Chart.yaml`, `values.yaml`, `values.schema.json`, `templates/*`,
|
||
`examples/*`, `.gitea/workflows/helm-release.yaml`, `README.md`, `.gitignore`, `CLAUDE.md`
|