サンプルフックのシェバンをポータブルに変更
Kamal のサンプルフックスクリプトの shebang を #!/bin/sh から #!/usr/bin/env sh に置き換えることで、/bin/sh が存在しない環境でもスクリプトが実行できるようになりました。
背景
一部のシステム(NixOS や特定の BSD 系)では /bin/sh がデフォルトで提供されておらず、従来の shebang ではフックが起動できませんでした。この制限は実運用でのデプロイ自動化に支障を来す可能性があります。
この PR は、サンプルフックが既に Ruby 用に #!/usr/bin/env ruby 形式を採用していることに倣い、シェルスクリプトでも同様のポータビリティを確保することを目的としています。
技術的な変更
対象ファイルは lib/kamal/cli/templates/sample_hooks/ 配下の全 7 件です。各ファイルの先頭行を次のように置換しました。
変更前:
#!/bin/sh
変更後:
#!/usr/bin/env sh
他のサンプルフック(post-app-boot.sample, post-deploy.sample, post-proxy-reboot.sample, pre-app-boot.sample, pre-build.sample, pre-proxy-reboot.sample)も同様に 1 行目を置換しています。機能ロジック自体は変更されておらず、実行メッセージはそのまま保持されています。
置換に伴うロジック変更はなく、単純なテキスト差分であるため、既存のフック利用者への互換性リスクは最小限です。
設計判断
ポータブル shebang の採用 という方針は、Kamal の他言語サンプルでも一貫している点から、設定の統一性とユーザビリティ向上を意図した設計判断といえます。#!/usr/bin/env sh は実行時に $PATH から sh を探索するため、環境依存のパス指定を排除します。
この変更は、追加の条件分岐や設定項目を導入せず、単に文字列を書き換えるだけなので、コードベースへの負荷は極めて低く、保守コストも増加しません。代替案として新しいテンプレートキーを導入する議論もありましたが、既存ファイルの直接置換が最もシンプルで後方互換性を保ちやすいと判断されました。
まとめ
Kamal のサンプルフックで shebang を #!/usr/bin/env sh に統一したことにより、/bin/sh が存在しない環境でもスクリプトが正しく実行できるようになり、デプロイ自動化のポータビリティが向上しました。変更はテキスト置換のみで、既存機能への影響はなく、設計上の一貫性も保たれています。