It’s not that hard and your efforts will be rewarded.
Here are my arguments for learning packaging
What’s running on your system now?
When you’re running hundreds of servers you need a programatic way of auditing what is running on your system. Compiling from source will not give this to you for every single package on your system. Git is wonderful as a source code management system but did a4f85e72894895a8269d65cb3fa2ab012804d3ef come before or after aa7c72e6a15ae37db7beb6450f4db3d30069a7dd and what developer or product manager would be able to give you a git hash as to the version they want running on production? Even with tags going back and forth is hard.
Are all of your dependencies met and consistent?
What if some dependency of a dependency is updated causing a bug? Deploying from source code and running bundler to handle dependencies means you might have different gem versions running between the time you brought up the original server to when you added a new node into the cluster. It happens and it is very time consuming to troubleshoot.
How long does it take you to deploy an application?
Takes me 20 seconds to release across a 100 node cluster. It can take up to 10 minutes to download and install all of the dependencies on my old system and then there are plenty of failures due to network issues or rate-limiting from the upstream server. Internal and external customers don’t do delayed gratification.
Can I give a gem version to a developer and be sure they’re running what’s on production so they can troubleshoot?
I’m still waiting for a good argument against packaging.
Before building the gem, I take another step and use
bundle install --deployment
this downloads all of the gems and compiles all of the extensions necessary to run the gem in the vendor directory. Now when you start your application with
bundle exec START_COMMND
it will use only those gems in the vendor folder. You can view the full Rakefile here