pre-connectフックでsecretsが利用可能に

basecamp/kamal

Kamalでは、pre-connectフックでsecretsを参照できるようになりました。これにより、接続先のAPIキーや認証情報をsecretsから取得して使用することが可能になります。

背景

Kamalの4つの主要フック(pre-connectpre-buildpre-deploypost-deploy)のうち、pre-deploypost-deployのみがsecretsをロードしていました。#924でsecretsの仕組みが導入された際、フックごとのsecretsロード対応に一貫性がない状態でした。

pre-connectフックは接続前処理を実行するタイミングであり、外部サービスへの接続時にAPIキーや認証トークンが必要になるケースが想定されます。しかし、このタイミングでsecretsが利用できないため、機密情報をフック内で直接記述するか、別の方法で管理する必要がありました。

技術的な変更

lib/kamal/cli/base.rbpre_connect_if_requiredメソッドが変更され、run_hook呼び出しにsecrets: trueパラメータが追加されました。

変更前:

def pre_connect_if_required
  if !KAMAL.connected?
    run_hook "pre-connect" unless options[:skip_hooks]
    KAMAL.connected = true
  end
end

変更後:

def pre_connect_if_required
  if !KAMAL.connected?
    run_hook "pre-connect", secrets: true unless options[:skip_hooks]
    KAMAL.connected = true
  end
end

この変更により、pre-connectフック内で.kamal/secretsまたは.kamal/secrets.<destination>に定義されたsecretsを環境変数として参照できます。フックスクリプトは以下のように記述できます:

#!/bin/bash
curl -H "Authorization: Bearer $API_TOKEN" https://api.example.com/notify

設計判断

4つの主要フック全体で一貫したsecretsの取り扱いを実現する方針が採用されました。

PR内の議論では、フックドキュメントにsecretsのロード有無が明示されていない点が指摘されています。#924でsecretsの仕組みが導入された際、pre-deploypost-deployのみがsecretsをロードする実装になっていましたが、本PRはその設計の一貫性を改善しています。

pre-connectpre-buildよりも前に実行されるフックであり、接続確立時に機密情報が必要になるユースケースを想定した判断です。secrets: trueパラメータの追加のみで実現しており、既存のrun_hookメカニズムを変更していません。

まとめ

本PRは、pre-connectフックにsecrets: trueパラメータを追加することで、接続前処理でのsecretsアクセスを可能にしました。これにより、Kamalの4つの主要フックすべてでsecretsが利用可能となり、フック間の一貫性が向上しています。外部サービスへの接続時に必要な認証情報を安全に管理できるようになり、フックスクリプトの実装選択肢が広がります。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

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

品質レビュー結果

Review Status:
リトライ後承認
Review Count:
2回 (改善を経て承認)
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

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

「総論→各論→結論」の構成が明確です。リード文、背景、技術的な変更、設計判断、まとめの各要素が適切に配置されています。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(```ruby:path/to/file```)およびGitHubのPR番号リンク([#924](URL))が正しく使用されています。

対象読者への適合性 ✓ PASS

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

Kamalのフックやsecretsに関する知識を前提としており、専門知識を持つエンジニアという対象読者に適した内容です。

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

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

各セクションが総論→各論の構成になっており、各段落はトピックセンテンスで始まっています。1段落1トピックの原則も守られており、可読性が高いです。

Diff内容との照合 ✓ PASS

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

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

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「pre-connectフック」「secrets」などの技術用語が、PRの文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

「`secrets: true`パラメータを追加することでsecretsが利用可能になる」という説明は、Diffの内容と論理的に整合しており、技術的に正確です。

事実の突合 ✓ PASS

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

記事内のすべての主張(フック間の不整合、#924でのsecrets導入の経緯など)は、PRのDescriptionで裏付けられています。ハルシネーションは見られません。

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

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

PR番号(#1772, #924)やその他の固有名詞(ファイルパス、メソッド名)はすべて正確です。

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

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

記事のタイトル「pre-connectフックでsecretsが利用可能に」は、PRのタイトル「Load secrets for pre-connect」の内容を的確に要約しています。

外部知識の正確性 ✓ PASS

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

PRで言及されていない外部知識(バージョンサポート状況、リリース日程など)の追加はなく、すべての情報が提供された情報源に基づいています。

時間表現の正確性 ✓ PASS

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

PR内の「currently」という表現を、変更前の状態を指す「〜していました」と文脈に沿って正確に記述しており、時間表現に歪曲はありません。