net-httpを本番依存関係に追加
Rails Buildkite ConfigにおいてPR情報の取得処理が失敗していた問題が、net-httpをproductionの依存関係に追加することで解決されました。これは依存関係の分類ミスによる実行時エラーを修正する変更です。
背景
FetchPrクラスがPRのタイトルやファイル情報を取得する際にNet::HTTPを使用していましたが、net-http gemが明示的に依存関係として宣言されていませんでした。以前はbuildkitの推移的依存関係としてnet-httpが利用可能でしたが、#172で報告されているように、buildkitがdevelopmentグループに移動されたことで本番環境では利用できなくなりました。
この変更により、以下のエラーが発生していました:
Failed to fetch PR title: uninitialized constant Buildkite::Config::FetchPr::Net
Failed to fetch PR files: uninitialized constant Buildkite::Config::FetchPr::Net
推移的依存関係への暗黙的な依存は、依存元のgemのグループ分類が変更された際にこのような問題を引き起こします。
技術的な変更
Gemfileにnet-httpがproductionの依存関係として追加されました。
変更内容:
gem "buildkite-builder"
gem "benchmark" # https://github.com/Gusto/buildkite-builder/pull/145
gem "logger"
+gem "net-http"
group :development do
gem "buildkit"
lib/buildkite/config/fetch_pr.rbにはrequire "net/http"が追加され、依存関係が明示的に宣言されました:
require "json"
+require "net/http"
require "uri"
module Buildkite::Config
この変更により、FetchPrクラスはbuildkitの有無に関わらずNet::HTTPを利用できるようになります。Gemfile.lockにも対応するエントリが追加され、バージョンがロックされました。
設計判断
明示的な依存関係宣言の原則に従った修正が行われました。
推移的依存関係に依存する実装は、依存元のgemのバージョンアップやグループ分類の変更によって容易に破綻します。本PRではnet-httpを直接依存関係に追加することで、buildkitの配置に関わらずFetchPrクラスが正常に動作することを保証しています。
この修正は依存関係の最小化原則に沿った判断であり、buildkitをdevelopmentグループに配置する決定を維持しながら、必要な機能のみを本番環境に含めています。
本PRは、推移的依存関係への暗黙的な依存を明示的な依存関係宣言に変更することで、依存関係の管理をより堅牢にした変更です。buildkitのグループ分類変更による影響を受けないよう、net-httpを直接依存関係に追加し、コードレベルでもrequire文を明示することで、依存関係の透明性を高めています。