背景
AWS lambdaにRubyスクリプトを配置するデプロイパッケージを作るとき、Rubyスクリプトが依存するgemファイルをzipファイルに含めるため、bundle install --deployment
のように、--deployment
オプションを指定していました。
--deployment
オプションを指定するとgemはvendor/bundle
ディレクトリにインストールされます。
次のコマンドで、vendor
ディレクトリをデプロイパッケージに含めます。
zip deploy_package lambda_function.rb -FSr vendor
--deployment
オプションを使っているのは、AWSのデプロイスクリプトのサンプルにbundle install --deployment
が使われていた時があり、その名残です。現在ではbundle install --path vendor/bundle
が使われています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/ruby-package.html
bundle install --path vendor/bundle
を使っていれば、この先を読む必要はありません。
物語
PCにインストールしているbundlerのバージョンを2.1.4に上げました。
bundler 2.1.4では--deployment
オプションは非推奨になりました。
代わりにbundle config deployment true
コマンドで設定を変更します。
https://github.com/rubygems/bundler/pull/7519
CI環境で使うデプロイスクリプトもbundle config deployment true
に修正しました。デプロイが失敗するようになりました。
gemがvender/bundle
ディレクトリにインストールされなくなったようです。
原因
CI環境ではRuby 2.7を使っています。
Ruby 2.7に同梱されているbundlerのバージョンは2.1.2でした。
bundler 2.1.2 では bundle config deployment true
を設定しても、gemのインストール先が変わりません。
対策
bundle config set path 'vendor/bundle'
を設定して、gemのインストール先を vender/bundle
にしました。
これでbundler 2.1.2でも2.1.4でもgemはvendor/bundle
ディレクトリにインストールされます。
その後
CI環境でbundler 2.1.4を使うようになり、1ヶ月半くらいでbundle config deployment true
に戻しました。
--path
オプションも非推奨なので、bundle install --path vendor/bundle
にはしませんでした。