Kamal::Secrets に `secrets_path` のデフォルト値を追加
Kamal 2.9.0 以降、Kamal::Secrets.new が secrets_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 で導入された必須キーワードエラーを解消しました。設定の一貫性と後方互換性を担保しつつ、テストで動作を検証しているため、既存デプロイスクリプトは修正不要でそのまま利用可能です。