Skip to content

feat: --environments フラグで書き込み先環境を絞り込み可能に#43

Merged
polidog merged 2 commits into
mainfrom
feat/42
Jul 3, 2026
Merged

feat: --environments フラグで書き込み先環境を絞り込み可能に#43
polidog merged 2 commits into
mainfrom
feat/42

Conversation

@polidog

@polidog polidog commented Jul 3, 2026

Copy link
Copy Markdown
Member

タスク

env-sync.yaml の environments を「対象になりうる環境の宣言」と位置づけ、実際にどの環境へ書き込むかを CLI フラグで絞り込めるようにする。

  • --environments(カンマ区切り、例: --environments staging,preview)を追加
  • フラグ指定時、各変数の書き込み先は「定義ファイルで宣言された environments ∩ フラグ指定値」の積集合
  • 積集合が空になった変数はスキップ(エラーにせず stderr に警告)
  • フラグ未指定時は従来通り宣言された全環境に書き込む(完全な後方互換)
  • バリデーション: production / preview / development + 定義ファイル内の Custom Environment 名を許容、不正値はエラー終了
  • prune との整合: --environments 指定時、削除判定も指定環境の範囲内に限定
  • 追加メッセージは internal/i18n(en/ja)に登録
  • README.md / README.ja.md にフラグの説明とユースケースを追記

ユースケース例:

env-sync --env .env.production --def env-sync.yaml --environments production
env-sync --env .env.staging    --def env-sync.yaml --environments staging,preview

完了条件

  • --environments フラグが追加され、カンマ区切りで複数環境を指定できる
  • フラグ指定時、書き込み先が「変数ごとの宣言 environments ∩ 指定値」の積集合に限定される
  • 積集合が空の変数は書き込みされずスキップされる(コマンドは正常終了する)
  • フラグ未指定時の挙動が既存と完全に一致する(後方互換)
  • 不正な環境名を指定するとエラーメッセージを出して終了する
  • --environments 指定時、prune が指定環境以外の変数を削除しない
  • 追加メッセージが i18n(en/ja)両カタログに存在する
  • go test ./... が全て通る
  • README.md / README.ja.md に --environments の説明が追記されている

実装のポイント

  • 積集合レイヤー: internal/sync/entry.goFilterEntriesByEnvironmentsResolveEntries 直後に適用)。environments 未宣言の変数はフラグ指定時「宣言なし」としてスキップ(Vercel の暗黙 [production, preview] デフォルトによるフラグ外書き込みを防止)
  • Vercel prune: レコードの全環境(target + customEnvironmentIds)が指定範囲内に収まる場合のみ削除。Custom Environment は slug→ID を API 解決(read-only GET、dry-run でも実行しプレビューと実実行を一致させる)。解決失敗時は保持の安全側
  • GitHub prune: フラグ指定時は repo レベルスコープを除外し、指定 named environment のみスキャン
  • DefinedKeys は非フィルタ: スキップされた変数が prune で誤削除されないよう、保持判定には定義ファイルの全キーを渡す
  • GCP: 環境=ラベルのみのため prune 挙動は不変。積集合で environment ラベル値が変わる副作用は README に明記

動作確認

  • lint / build 通過(gofmt / go vet / go build)
  • 設計・計画適合レビュー通過(2 ラウンド・Critical なし・LGTM)
  • 自動テスト生成: スキップ(test scope=unit のため。implementer の TDD による単体テストで担保)
  • コード品質チェック通過(Critical なし)
  • 受け入れテスト通過(積集合 / 空スキップ / 後方互換 / 不正値エラー / prune スコープ限定 / --help 表示、go test ./... および go test -race ./... 全 green)

品質チェック結果

🟡 Warning(レビューで検出→修正済み)

  • Vercel dry-run 時に prune プレビューが実実行と食い違う問題 → slug→ID 取得条件から !opts.DryRun を除去して解消
  • --environments バリデーションの自動テスト欠如 → ユニットテスト 4 件 + バイナリ統合テスト 1 件を追加して解消

🟡 Warning(設計判断として許容・README に明記)

  • GCP は Entry.Environments をラベルとして使うため、積集合でラベル値が変わる副作用がある(書き込み先の分岐は無い)

🔵 Info

  • GitHub prune はスコープ導出(tasks 由来)、Vercel prune はレコード判定という非対称があるが、どちらも過剰削除しない安全側で既存設計と整合

パフォーマンス診断

🔵 Info (1件)

  • vercelEnvWithinFiltercomputeVercelPrune のループ内でフィルタセットのマップを毎回再構築する。リモート変数は通常 100 件未満で実害なし(改善するならフィルタセット構築のループ外への括り出し)

良い点: vercelFetchCustomEnvironments の API 呼び出しは「prune 有効かつフラグに Custom 環境名を含む場合」のみに限定。N+1 的な API パターンの新規追加なし。

🤖 Generated with Claude Code

https://claude.ai/code/session_01VLKa78rpZRLCUrEiv2uAMw

env-sync.yaml の environments を「対象になりうる環境の宣言」と位置づけ、
実際の書き込み先を --environments(カンマ区切り)との積集合に限定する。

- 積集合が空の変数はスキップ(正常終了・stderr に警告)
- 未指定時は完全な後方互換
- 不正な環境名(標準3種 + 定義内 Custom Environment 名以外)はエラー終了
- prune の削除判定も指定環境の範囲内に限定
  - Vercel: レコードの全環境(Target + customEnvironmentIds)が指定範囲内のときのみ削除
  - GitHub: repo レベルスコープを除外し指定 named environment のみスキャン
- i18n(en/ja)・README.md / README.ja.md 追記

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLKa78rpZRLCUrEiv2uAMw

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

env-sync.yamlenvironments を「宣言(対象になりうる環境)」として扱い、実際の書き込み・prune 対象を CLI の --environments フラグで絞り込めるようにする変更です。フィルタ時は「変数ごとの宣言 environments ∩ フラグ指定値」の積集合に限定し、空になる変数は警告してスキップします。

Changes:

  • --environments(カンマ区切り)を追加し、エントリの書き込み先環境を積集合でフィルタ
  • prune の削除スコープを --environments 指定時に限定(Vercel: レコード単位で範囲内のみ削除 / GitHub: repo レベルを除外し指定 named env のみスキャン)
  • i18n(en/ja)・README(en/ja)・サンプル定義コメント・テストを追加更新

Reviewed changes

Copilot reviewed 17 out of 17 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
README.md --environments の目的・挙動・ユースケースを追記し、オプション一覧に追加
README.ja.md 同上(日本語)
internal/sync/entry.go FilterEntriesByEnvironments を追加し、宣言 environments とフラグ値の積集合でエントリを絞り込み
internal/sync/entry_test.go FilterEntriesByEnvironments のユニットテストを追加
internal/provider/vercel/vercel.go Vercel prune に --environments フィルタを反映(Custom Env slug→ID 解決も追加)
internal/provider/vercel/prune_test.go Vercel prune のフィルタ挙動(標準/Custom/後方互換)テストを追加
internal/provider/provider.go provider.OptionsEnvironments []string を追加
internal/provider/github/github.go GitHub prune のスコープ導出を --environments 対応(repo レベル除外・指定 env のみ)
internal/provider/github/prune_test.go GitHub pruneScopes の --environments 対応テストを追加
internal/i18n/keys.go --environments バリデーションエラー/スキップ警告のメッセージキーを追加
internal/i18n/catalog_ja.go 新規メッセージ(ja)を追加し usage に --environments を追記
internal/i18n/catalog_en.go 新規メッセージ(en)を追加し usage に --environments を追記
internal/config/config.go --environments のフラグ解析(カンマ分割)を追加
internal/config/config_test.go --environments のフラグ解析テストを追加
env-sync.yaml --environments の説明コメントを追記
cmd/env-sync/main.go --environments の許容値バリデーション、エントリの環境フィルタ適用、スキップ警告出力を追加
cmd/env-sync/main_test.go --help--environments が含まれること、許容環境名収集と不正値エラーのテストを追加

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread internal/config/config.go
Comment on lines +132 to 136
case arg == "--environments" || arg == "-environments":
opts.Environments = splitEnvironments(next())
case strings.HasPrefix(arg, "--environments="):
opts.Environments = splitEnvironments(strings.TrimPrefix(arg, "--environments="))
case arg == "--vercel-project" || arg == "-vercel-project":
Comment thread env-sync.yaml Outdated
- `--environments=` や `--environments ,` のように空・空白のみの値を渡した場合、
  splitEnvironments() が空スライスを返してフィルタ無効扱い(全環境書き込み)になる問題を修正。
  フラグが指定されてパース結果が空ならエラー終了させ、意図せぬスコープ拡大を防ぐ。
- env-sync.yaml のコメント「重複が無い変数はスキップ」を
  「積集合が空の変数はスキップ」に修正("重複" は誤解を招く表現のため)。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@polidog polidog mentioned this pull request Jul 3, 2026
Closed
@polidog polidog merged commit 6385e3f into main Jul 3, 2026
1 check passed
@polidog polidog deleted the feat/42 branch July 3, 2026 10:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants