Techioz Blog

Ruby と Rails のアップデート後に Heroku のスラッグ サイズ制限に遭遇する

概要

Ruby と Rails を次のマイナー リリース (Ruby と Rails それぞれ 3.2.2 から 3.3.0、7.0.8 から 7.1.2) に更新する作業を行っていますが、Heroics のスラッグ サイズ制限に遭遇しています。圧縮後の 520MB は明らかに制限を超えています。

私のアプリは Google Text to Speech gem を利用していますが、これは明らかに grpc gem に依存しており、多くのスペースを占有しているようです。

それ以外の場合、他に問題の原因がわかりません。 Ruby 3.3.0 にアップデートする前は、スラッグ警告は発生しませんでした。とりあえずRuby 3.2.2にダウングレードしたほうがいいでしょうか?

解決策

Ruby 3.2.2 と Ruby 3.3.0 の比較はできませんが、それを聞くのは憂慮すべきことです (そして、アップグレードを延期する理由になる可能性もあります)。

今後この質問を見つける人のために、私は積極的な .slugignore ファイルと [Heraku Post-Build Clean Buildpack|https://elements.heroku.com/buildpacks] を使用して Heroku のスラッグ サイズを減らすことに多くの成功を収めてきました。 /lostmyname/heroku-buildpack-post-build-clean]

heroku buildpacks:add --index integer_index_based_on_how_many_buildpacks_you_have https://github.com/Lostmyname/heroku-buildpack-post-build-clean.git

次の .slug-post-clean ファイルを使用

node_modules
tmp/cache
tmp/cache/webpacker

そしてこのような .slugignore ファイル

*.psd
*.pdf
/test
/spec

問題に応じて、他にも役立つコマンドがいくつかあります。

heroku config:set BUNDLE_WITHOUT=“開発:docker:test”

heroku ビルド:キャッシュ:パージ

[Thoughtbot|https://thoughtbot.com/blog/how-to-reduce-a-large-heroku-compiled-slug-size] に従って、追加のマイルを獲得できる可能性がある Heroku リポジトリ プラグインをインストールすることもできます。

heroku plugins:install heroku-repo

次に、次を実行します。

heroku repo:gc --app your-app-name
heroku repo:purge_cache --app your-app-name

Heroku では、大きな PDF、PSD、または画像ファイルもプロジェクトから削除することをお勧めします (大きな画像は間違いなくスラッグ サイズを増大させる可能性があります)。

また、この [ブログポスト|https://blog.saeloun.com/2020/05/04/how-to-reduce-heroku-slug-size] で概説されているアプローチが、次のようなカスタム アセット クリーン タスクを追加するのに役立つこともわかりました。以下の例では、コンパイル後、スラッグが生成される直前に、node_modules フォルダーを削除します。

# cat lib/tasks/assets.rake
# Adapted from https://github.com/heroku/heroku-buildpack-ruby/issues/792

namespace :assets do
  desc "Remove 'node_modules' folder"
  task rm_node_modules: :environment do
    Rails.logger.info "Removing node_modules folder"
    FileUtils.remove_dir("node_modules", true)
  end
end

skip_clean = %w(no false n f).include?(ENV["WEBPACKER_PRECOMPILE"])

unless skip_clean
  if Rake::Task.task_defined?("assets:clean")
    Rake::Task["assets:clean"].enhance do
      Rake::Task["assets:rm_node_modules"].invoke
    end
  else
    Rake::Task.define_task("assets:clean" => "assets:rm_node_modules")
  end
end

頑張ってナメクジを潰してください (また、Patrick のように最近 Ruby 3.2.2 から Ruby 3.3.0 にアップグレードした場合は、ダウングレードして問題が解決するかどうかを確認するだけでも価値があるようです)。

ナメクジに塩をかけてください!