Gem file with git remote failing on heroku push - ruby-on-rails

I have the following line in my gemfile:
gem 'client_side_validations', :git => "git#github.com:Dakuan/client_side_validations.git", :branch => "master", ref: '2245b4174ffd4b400d999cb5a2b6dccc0289eb67'
The repo it's pointing at is public and I can run bundle install / update locally just fine. When I try to push to Heroku I get the following error:
Fetching git#github.com:Dakuan/client_side_validations.git
Host key verification failed.
fatal: The remote end hung up unexpectedly
Git error: command `git clone 'git#github.com:Dakuan/client_side_validations.git' "/tmp/build_1xa9f06n4k1cu/vendor/bundle/ruby/1.9.1/cache/bundler/git/client_side_validations-56a04875baabb67b5f8c192c6c6743df476fd90f" --bare --no-hardlinks` in directory /tmp/build_1xa9f06n4k1cu has failed.
!
! Failed to install gems via Bundler.
!
! Heroku push rejected, failed to compile Ruby/rails app
Anyone got any ideas about what's going on here?

Use this GitHub URL instead: git://github.com/Dakuan/client_side_validations.git
The git#github.com:… URL is the writable SSH version, which requires authentication with an SSH key connected to a GitHub account that has write access to the repository.
The git://github.com/… URL is the public, read-only version.
Since the gem you're using is in a public GitHub repository, you can also use this shorthand in your Gemfile:
gem 'client_side_validations', :github => 'Dakuan/client_side_validations'
See the Bundler Git documentation for more information.

A late second answer, as I ran into some confusing output from Heroku's build logs which stumped me for a while.
If you have multiple Github hosted gems in your Gemfile, and one of them is inaccessible (in my case, I had accidentally pointed to a private repo of mine), the build logs throw an error like Username not found or Repository not found for all the Github hosted gems - even those that are available.

Related

Installing a gem using a commit's hash

I have really simple Gemfile:
source 'https://rubygems.org'
gem 'stripe-ruby-mock',
github: 'mnin/stripe-ruby-mock',
require: 'stripe_mock',
ref: 'b6446fb5ae2b14b6703554cbea4ebd466e4f3c47'
When I run bundle command to install this gem I get this error:
root#6bcff6bf3997:/app# bundle
The git source `git://github.com/mnin/stripe-ruby-mock.git` uses the `git` protocol, which transmits data without encryption. Disable this warning with `bundle config git.allow_insecure true`, or switch to the `https` protocol to keep your data secure.
Fetching git://github.com/mnin/stripe-ruby-mock.git
fatal: Could not parse object 'b6446fb5ae2b14b6703554cbea4ebd466e4f3c47'.
Revision b6446fb5ae2b14b6703554cbea4ebd466e4f3c47 does not exist in the repository git://github.com/mnin/stripe-ruby-mock.git. Maybe you misspelled it?
But I can visit the commit's page on Github using this link https://github.com/mnin/stripe-ruby-mock/commit/b6446fb5ae2b14b6703554cbea4ebd466e4f3c47.
So how can I the gem using this commit's hash?
That commit is not reachable from any branch or tag. For that reason, when you clone the repo from GitHub (which Bundler does under the hood), your local copy will not have that commit.
Thus, you can't use it.
On GitHub, you can see that this commit is not reachable as it doesn't list any branch or tag that contains it:
Compare that to the parent commit, which lists as being reachable from master:
Note that orphaned commits would get garbage collected by Git eventually. GitHub though doesn't do that as there might be references to particular commits.
Try not to use forked gem if possible. But if you need to lock a forked version, make sure you own the fork. Fork the forked branch, merge it to your own repo's main branch, and then just use that repo in your gemfile.

Rails - AWS (Elastic Beanstalk) deployment, Error Command 'git clone'

Trying to bundle install a gem from github (The author has not updated the gem on rubygems.org for whatever reason...) in AWS Elastic Beanstalk but I receive the following error:
Command failed on instance. R
(TRUNCATED)...nd `git clone "https://github.com/Diego81/omnicontacts.git"
Here's the code in my gemfile
gem 'omnicontacts', git: "https://github.com/Diego81/omnicontacts.git"
Other things i've tried...
gem 'omnicontacts', git: "git://github.com/Diego81/omnicontacts.git"
gem 'omnicontacts', github: "Diego81/omnicontacts"
Still the same error with everything I've tried. I've also tried this with other gems and I receive the same error. I should also note, this works perfectly on my local machine, it seems to be an issue with Elastic Beanstalk.
Ok I solved this by installing git on my EC2 instance. Just ssh into your instance and run the following:
sudo yum install git
and that should fix the problem.
I prefer this answer which adds Git to .ebextensions. That way if I have e.g. a production server and a staging server, I don't have to separately SSH into both, I can just deploy to each and Git will be installed automatically.
The ebextensions approach also seems more durable. If for some reason I need to spin up a new server instance in the future, I'd rather have the configuration saved as code than have to remember what the configuration is supposed to be and then manually implement the configuration.
I was able to get what I needed by creating a file called .ebextensions/ruby.config with the following content:
packages:
yum:
git: []

bundle install leads to git clone error. Not sure what this response means

Getting a strange error on bundle install..
bundle install
Fetching gem metadata from http://rubygems.org/.....
Fetching gem metadata from http://rubygems.org/..
Fetching git://github.com/maccman/gdata.git
fatal: The remote end hung up unexpectedly
Git error: command `git clone 'git://github.com/maccman/gdata.git' "/Users/elephanttrip/.rvm/gems/ruby-1.9.2-p318#shasta/cache/bundler/git/gdata-811f852468ac76e0019108d8c5320da12b6683d4" --bare --no-hardlinks` in directory /Users/elephanttrip/Sites/shasta has failed.
This wasn't happening until I installed the mysql2 gem and mysql with brew.
Any ideas what this error means?
UPDATE
Also none of the folders it is trying to clone this to exist. It's probably something to do with my bundle paths and juggling .rvm
The problem is not on your end. Trying:
git clone 'git://github.com/maccman/gdata.git' "foobar" --bare --no-hardlinks
Fails on my machine with the same error.
Interestingly a non-bare clone seems to work as expected.
resolution: Clone from the https interface: https://github.com/maccman/gdata.git instead.
In your Terminal write bundle config github.https true
In your Terminal write bundle install
Add your SSH key to the github.
Or as #brice mentioned, you need to add your team to the repo.

Trouble pushing basic Ruby on Rails app to Heroku

I was working through the first chapter of the Rails Tutorial. I pushed first_app to heroku. At first I was getting the sqlite3 error (I think). But, I edited the gemfile and pushed it up to heroku again. But, I don't get the same page as on: http://railstutorial.org/ruby-on-rails-tutorial-book#sec:1.4.3 (I think it's supposed to look like Figure 1.11 in section 1.4.3)
Instead, I get this: http://blooming-samurai-546.heroku.com/
It just says:
Heroku | Welcome to your new app!
Refer to the documentation if you need help deploying.
I did something wrong right? Any ideas what?
In your git console try:
git add .
git commit -am "Initial commit"
git push heroku
It looks like you pushed to heroku with nothing so it created an empty directory.
I had this same issue and was very frustrated by it. What solved the issue for me was moving
gem 'sqlite3'
into the block following
group :development, :test
in the Gemfile.
After that, no longer saw these kinds of messages:
remote: ! Failed to install gems via Bundler.
remote: ! Detected sqlite3 gem which is not supported on Heroku:
...
remote: ! Push rejected, failed to compile Ruby app.
in terminal after typing git push heroku or git push heroku master
Hope this helps.
Can’t argue with success.
However, before pushing the master with $ git push heroku master some folks may need to run the following command:
$ git remote add heroku git#heroku.com:your-heroku-url-goes-here.git
as discussed in the “Git Remotes and Heroku” section currently at:
http://devcenter.heroku.com/articles/git

Rails vendor plugin failure in production environment

I expect this to be a n00b problem.
I'm attempting to use heroku with my rails app. Everything works fine in development (local machine), but when I push to heroku I get the following:
==> dyno-1931938.log (crash) <==
/home/slugs/258915_4fd8878_0dbe-1413ed77-735c-469d-924e-619b28cdcbac/mnt/.bundle/gems/ruby/1.8/gems/activerecord-3.0.0/lib/active_record/base.rb:1016:in `method_missing': undefined local variable or method `acts_as_paranoid' for #<Class:0x2b469869b658> (NameError)
from /disk1/home/slugs/258915_4fd8878_0dbe-1413ed77-735c-469d-924e-619b28cdcbac/mnt/app/models/my_model.rb:17
lines 16 and 17 of my_model.rb are:
class Contact < ActiveRecord::Base
acts_as_paranoid
'acts_as_paranoid' is a vendor plugin that was installed locally via:
$git clone https://github.com/goncalossilva/rails3_acts_as_paranoid.git
What am I doing wrong that heroku is ignoring the plugin?
UPDATE:
I cloned the repo from heroku, and the directory for the plugin exists, but is empty. My other plugins (i.e. ssl_requirement) have the expect lib/ and init.rb. Obviously the code needs to be there to work. What now?
Cloning the source retrieves the code from github, but it doesn't install the gem into your app. Normally you'd install the gem on your local machine like this:
gem install acts_as_paranoid
or
sudo gem install acts_as_paranoid
Then tell Heroku about the gem by adding this to your .gems file:
acts_as_paranoid
or better yet, specify the version that you expect, too (otherwise Heroku will grab the latest every time you push up new code to your app, which could cause unexpected breakage):
acts_as_paranoid --version x.y.z
And make sure your config/environment.rb has an entry for the gem so its absence will be detected at launch instead of later:
config.gem 'acts_as_paranoid', :version => 'x.y.z'
PS: All of the above will be somewhat different if you're using Rails 3 and/or Bundler to manage your gems.
It turns out vendor/plugins/my_plugin_directory had fallen out of the git tree. I resolved the problem by:
$cd rails_root_directory
$git fsck
$git rm --cached vendor/plugins/my_plugin_directory
$git add vendor/plugins/my_plugin_directory/*
$git commit -am "my_plugin added to repository"
$git push heroku master
and all is right now.

Resources