Kamal::Secrets に `secrets_path` のデフォルト値を追加

basecamp/kamal

Kamal 2.9.0 以降、Kamal::Secrets.newsecrets_path を必須引数として要求し、引数未指定で呼び出すと missing keyword: :secrets_path エラーが発生していました。本 PR はその引数に .kamal/secrets というデフォルトを設定し、既存の設定と同一の挙動を保証します。

背景

Kamal::Secrets はデプロイ設定ファイル内でシークレットを取得するために利用されますが、v2.9.0 で initialize のシグネチャが secrets_path: の必須キーワードに変更されたため、引数を省略した既存の使用例が例外を投げるようになりました。開発者はデプロイ YAML に埋め込む Kamal::Secrets.new["KEY"] をそのまま使い続けたいという期待があり、エラーは互換性の破壊と受け取られました。PR の目的は、Kamal::Configuration が提供する既定パスと同一に secrets_path のデフォルトを再導入し、エラーを回避することです。

技術的な変更

lib/kamal/secrets.rb のコンストラクタシグネチャが次のように変更されました。

-  def initialize(destination: nil, secrets_path:)
+  def initialize(destination: nil, secrets_path: ".kamal/secrets")

この1行の追加により、Kamal::Secrets.new が引数なしで呼び出された場合でも @secrets_path".kamal/secrets" が設定されます。既存の destination 引数は変更せず、ミューテックス等の他のインスタンス変数は従来通り初期化されます。テストコードも同様に拡張され、デフォルトパスが正しく適用されることを検証しています。

+  test "default secrets_path" do
+    with_test_secrets("secrets" => "SECRET=ABC") do
+      assert_equal "ABC", Kamal::Secrets.new["SECRET"]
+    end
+  end

テストは with_test_secrets ヘルパーで一時的なシークレットファイルを作成し、Kamal::Secrets.new がデフォルトパスを参照して期待通りの値を返すことを確認します。これにより、変更が機能的に正しいだけでなく、既存コードへの回帰がないことが自動的に保証されます。

設計判断

secrets_path のデフォルト値Kamal::Configuration と同一に設定する方針が採用されました。代替案としては新しい設定キー(例: custom_secrets_path)を導入する案も検討されましたが、既存の設定体系に統一感を持たせ、後方互換性を最小限の変更で確保できる点が評価されました。デフォルトをコード側に埋め込むことで、ユーザーは明示的にパスを指定しなくても安全に Kamal::Secrets を利用でき、設定ミスによるエラー発生リスクが低減します。

まとめ

本 PR は Kamal::Secrets の初期化時に secrets_path のデフォルトを .kamal/secrets に設定し、v2.9.0 で導入された必須キーワードエラーを解消しました。設定の一貫性と後方互換性を担保しつつ、テストで動作を検証しているため、既存デプロイスクリプトは修正不要でそのまま利用可能です。

記事メタデータ

Generated by:
gpt-oss-120b for DiffDaily
LLM Trace:
c0d5e185

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
gpt-oss-120b for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文・背景・技術的変更・設計判断・まとめの全要素が揃っており、総論→各論→結論の流れが明確です。

カスタムMarkdown構文 ⚠ WARNING

シンタックスハイライト・GitHubリンク記法の正確性

コードブロックのファイル名付きハイライトは正しい形式です。PRリンクが `[PR #1795](URL)` となっており、要件の `[#1795](URL)` とは若干異なるため警告としました。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

専門エンジニア向けの記述で、余計な初心者向け解説はありません。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論・各論・結論の構成を保ち、段落はトピックセンテンスで始まり、1段落1トピック、長さも適切です。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事中のコードブロックは提供されたDiffと完全に一致しており、ファイル名・変更内容も正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

用語はPRで使用されているものと一致し、誤用はありません。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

技術的な説明はDiffとPRの内容に基づき正確です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

全ての主張がPR情報およびDiffで裏付けられており、推測や捏造はありません。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号やデフォルトパスの文字列など、数値・固有名詞は正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事タイトルはPRタイトルの意味を日本語で適切に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

バージョンサポートやリリース情報などの外部知識は含まれていません。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

時間表現の歪曲はなく、PRの記述と一致しています。