relevance_rails 0.1.0 → 0.1.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ *v0.1.1.alpha*
2
+
3
+ * Ruby manager agnostic - can use rvm, system ruby or rbenv
4
+ * new APP --relevance-dev for simple QA development
5
+ * Fix sudo on deploy user
6
+ * provision rvmrc mirrors app's rvmrc
7
+ * existing app users have a deploy that just works
8
+ * fail fast in more places
9
+ * stop and destroy provisioned instances from commandline
10
+
1
11
  *v0.1.0*
2
12
 
3
13
  * Provisioning can be done on existing apps
data/README.md CHANGED
@@ -34,11 +34,19 @@ After a `bundle install`, pull in our chef recipes into provision/:
34
34
 
35
35
  ```sh
36
36
  # defaults to mysql
37
- $ rails g provision_config app_name
37
+ $ rails g provision_config
38
38
  # if using postgresql
39
- $ rails g provision_config app_name postgresql
39
+ $ rails g provision_config postgresql
40
40
  ```
41
41
 
42
+ Configuring bundled ssh keys
43
+ ----------------------------
44
+
45
+ By default, relevance_rails bundles all your keys from `ssh-add -L` with your instance. For bundling
46
+ additional keys, you can create a ~/.relevance_rails/keys_git_url file and point it to a git repo that
47
+ has additional keys. Keys in that git repo should exist as top level *.pub files. You *MUST* have at
48
+ least one key to provision.
49
+
42
50
  Provisioning on EC2
43
51
  -------------------
44
52
 
@@ -66,11 +74,7 @@ server:
66
74
  Now just provision your instance:
67
75
 
68
76
  ```sh
69
- $ rake provision:ec2 NAME=qa
70
- ...
71
- Server IP: 1.1.1.1
72
- # Pass IP from previous command as second argument
73
- $ rails g deployment qa 1.1.1.1
77
+ $ rake provision:ec2_and_generate NAME=qa
74
78
  $ cap qa deploy:setup deploy
75
79
  ```
76
80
 
@@ -91,9 +95,11 @@ Vagrant instance should be up at 172.25.5.5.
91
95
  Supported Ruby Versions
92
96
  -----------------------
93
97
 
94
- Currently both Ruby 1.9.x and REE 1.8.7 are supported via RVM. relevance_rails
98
+ Currently both Ruby 1.9.x and REE 1.8.7 are supported. relevance_rails
95
99
  configures your Rails app (and Chef provisioning scripts) to require the version
96
- of Ruby you used to invoke the relevance_rails executable.
100
+ of Ruby you used to invoke the relevance_rails executable. If relevance_rails is run
101
+ in a non-rvm environment, all installation occurs in the current gem environment. If in rvm,
102
+ the app is installed into its own rvm gemset.
97
103
 
98
104
  Supported Databases
99
105
  -------------------
@@ -105,17 +111,11 @@ standard `--database=postgresql` Rails option, relevance_rails will use PostgreS
105
111
  Maintainer Notes
106
112
  ----------------
107
113
 
108
- When QAing or doing local development of this gem, the gem must be built and installed locally.
109
-
110
- In order to test deployment, use the example below to package the relevance_rails gem:
114
+ When QAing or doing local development of this gem, the gem must be built locally and creating
115
+ an app needs an additional flag.
111
116
 
112
- # Given a relevance_rails app "app" lives in "~/src/app"
113
- # And the relevance_rails source lives in "~/src/relevance_rails"
114
- ~/src/relevance_rails $ gem build relevance_rails.gemspec
115
- ~/src/relevance_rails $ cd ~/src/app
116
- ~/src/app $ gem install ../relevance_rails/relevance_rails-0.0.7.gem
117
- ~/src/app $ bundle package
118
- ~/src/app $ git commit -m "Package gems" vendor/cache
117
+ $ gem build relevance_rails.gemspec && gem install relevance_rails-VERSION.gem
118
+ $ relevance_rails new APP --relevance-dev
119
119
 
120
120
  Caveats
121
121
  -------
@@ -5,6 +5,7 @@ class DeploymentGenerator < Rails::Generators::NamedBase
5
5
  def write_stage_file
6
6
  create_file "config/deploy/#{name}.rb", <<-DEPLOY_STAGE
7
7
  set :user, 'deploy'
8
+ set :use_sudo, false
8
9
 
9
10
  role :web, "#{hostname}"
10
11
  role :app, "#{hostname}"
@@ -20,6 +21,7 @@ role :db, "#{hostname}", :primary => true
20
21
  else
21
22
  stages = eval($1)
22
23
  stages << name
24
+ stages.uniq!
23
25
  stage_array_contents = stages.map{|stage| "\"#{stage}\""}.join(', ')
24
26
  new_contents << "set :stages, [#{stage_array_contents}]\n"
25
27
  end
@@ -11,7 +11,9 @@ STR
11
11
  %h1 WELCOME HOME
12
12
  STR
13
13
  create_file "app/views/relevance_rails/db.html.haml", <<-STR
14
- %h1.database= ActiveRecord::Base.connection.current_database
14
+ = conn = ActiveRecord::Base.connection
15
+ = results = conn.execute("select 4200+42 as advanced_math")
16
+ %h1.advanced_math= results.first["advanced_math"]
15
17
  STR
16
18
  end
17
19
 
@@ -1,7 +1,8 @@
1
1
  require 'relevance_rails'
2
2
  require 'rails/generators'
3
3
 
4
- class ProvisionConfigGenerator < Rails::Generators::NamedBase
4
+ class ProvisionConfigGenerator < Rails::Generators::Base
5
+ include RelevanceRails::GeneratorOverrides
5
6
 
6
7
  desc "This generator configures the provision sub-directory with appropriate files."
7
8
 
@@ -11,6 +12,27 @@ class ProvisionConfigGenerator < Rails::Generators::NamedBase
11
12
 
12
13
  attr_reader :authorized_keys
13
14
 
15
+ # This generator may not receive a working directory;
16
+ # and we pull data by shelling out to RVM about the ruby
17
+ # version. This sets the directory explicitly beforehand.
18
+ def change_directory
19
+ Dir.chdir(destination_root)
20
+ end
21
+
22
+ def check_authorized_keys
23
+ if (@authorized_keys = fetch_keys).empty?
24
+ abort "No ssh keys were found! Check ssh-add -L and your keys_git_url config."
25
+ end
26
+ end
27
+
28
+ def create_capistrano_files
29
+ backup_copy_file 'Capfile', 'Capfile'
30
+ backup_template 'deploy.rb.erb', 'config/deploy.rb'
31
+ backup_copy_file 'recipes_deploy.rb', 'config/deploy/recipes/deploy.rb'
32
+ backup_copy_file 'vagrant.rb', 'config/deploy/vagrant.rb'
33
+ git :commit => '-m "Add Capistrano files"'
34
+ end
35
+
14
36
  def fetch_elzar
15
37
  git :remote => 'add -f elzar git://github.com/relevance/elzar.git'
16
38
  git :merge => '-s ours --no-commit elzar/master'
@@ -20,9 +42,6 @@ class ProvisionConfigGenerator < Rails::Generators::NamedBase
20
42
  end
21
43
 
22
44
  def create_authorized_key_data_bag
23
- if (@authorized_keys = fetch_keys).empty?
24
- abort "No ssh keys were found! Check ssh-add -L and your keys_git_url config."
25
- end
26
45
  @authorized_keys.map! {|key| "\"#{key}\""}
27
46
  template('authorized_keys.json.erb', 'provision/data_bags/deploy/authorized_keys.json', {:force => true})
28
47
  end
@@ -31,14 +50,20 @@ class ProvisionConfigGenerator < Rails::Generators::NamedBase
31
50
  path = File.expand_path('provision/dna.json', destination_root)
32
51
  json = JSON.parse File.binread(path)
33
52
  json['rails_app']['name'] = name
34
- # This generator may not receive a working directory;
35
- # and we pull data by shelling out to RVM about the ruby
36
- # version. This sets the directory explicitly beforehand.
37
- Dir.chdir(destination_root)
38
53
  RelevanceRails::ChefDNA.gene_splice(json,database)
39
54
  create_file('provision/dna.json', JSON.generate(json), {:force => true})
40
55
  end
41
56
 
57
+ def create_rvmrc
58
+ if File.exists?(rvmrc = Rails.root.join('.rvmrc'))
59
+ create_file('provision/.rvmrc', File.read(rvmrc), :force => true)
60
+ git :add => 'provision/.rvmrc'
61
+ else
62
+ remove_file 'provision/.rvmrc'
63
+ git :rm => 'provision/.rvmrc'
64
+ end
65
+ end
66
+
42
67
  def commit_changes
43
68
  git :add => 'provision/data_bags/deploy/authorized_keys.json'
44
69
  git :add => 'provision/Vagrantfile'
@@ -48,6 +73,32 @@ class ProvisionConfigGenerator < Rails::Generators::NamedBase
48
73
 
49
74
  private
50
75
 
76
+ def name
77
+ Rails.application.class.name.split('::').first.underscore
78
+ end
79
+
80
+ def backup_copy_file(source, destination)
81
+ backup_manip_file(source, destination, :copy_file)
82
+ end
83
+
84
+ def backup_template(source, destination)
85
+ backup_manip_file(source, destination, :template)
86
+ end
87
+
88
+ def backup_manip_file(source, destination, operation)
89
+ if File.exists?(destination)
90
+ backup_file = "#{destination}.bak"
91
+ say_status :backup, "#{destination} to #{backup_file}"
92
+ git :mv => "#{destination} #{backup_file}"
93
+ end
94
+
95
+ send(operation, source, destination)
96
+ # git wasn't picking up current directory
97
+ change_directory
98
+ git :add => destination
99
+ end
100
+
101
+
51
102
  def fetch_keys
52
103
  local_keys = `ssh-add -L`.split("\n")
53
104
  local_keys = [] unless $?.success?
@@ -2,16 +2,17 @@ require 'bundler/capistrano'
2
2
  require 'capistrano_colors'
3
3
 
4
4
  set :application, "<%= name %>"
5
- set :repository, "."
6
- set :deploy_via, :copy
7
5
 
8
6
  set :scm, :git
7
+ set :repository, "."
9
8
 
10
9
  set :deploy_to, "/var/www/apps/#{ application }"
10
+ set :deploy_via, :copy
11
+ set :copy_exclude, '.git/*'
12
+
11
13
  default_run_options[:pty] = true
12
14
  set :ssh_options, { :paranoid => false, :forward_agent => true }
13
15
 
14
- set :copy_exclude, '.git/*'
15
16
 
16
17
  set :stages, %w(vagrant)
17
18
  set :default_stage, 'vagrant'
@@ -1,4 +1,5 @@
1
1
  set :user, 'deploy'
2
+ set :use_sudo, false
2
3
 
3
4
  role :web, "172.25.5.5"
4
5
  role :app, "172.25.5.5"
@@ -21,7 +21,9 @@ class RelevanceFileGenerator < Rails::Generators::NamedBase
21
21
  end
22
22
 
23
23
  def create_rvmrc
24
- create_file ".rvmrc", "rvm use #{RelevanceRails.rvm_version}@#{name}"
24
+ if ENV['rvm_path']
25
+ create_file ".rvmrc", "rvm use #{RelevanceRails.ruby_version}@#{name}"
26
+ end
25
27
  end
26
28
 
27
29
  def create_rspec
@@ -32,14 +34,6 @@ class RelevanceFileGenerator < Rails::Generators::NamedBase
32
34
  copy_file 'spec_helper.rb', 'spec/spec_helper.rb'
33
35
  end
34
36
 
35
- def copy_capfile
36
- copy_file 'Capfile', 'Capfile'
37
- end
38
-
39
- def create_deploy
40
- template 'deploy.rb.erb', 'config/deploy.rb'
41
- end
42
-
43
37
  def create_database_example_yml
44
38
  if database == 'mysql'
45
39
  template 'database.example.yml.mysql.erb', 'config/database.example.yml'
@@ -50,14 +44,6 @@ class RelevanceFileGenerator < Rails::Generators::NamedBase
50
44
  end
51
45
  end
52
46
 
53
- def copy_deploy_recipes
54
- copy_file 'recipes_deploy.rb', 'config/deploy/recipes/deploy.rb'
55
- end
56
-
57
- def copy_vagrant_stage
58
- copy_file 'vagrant.rb', 'config/deploy/vagrant.rb'
59
- end
60
-
61
47
  def fix_session_store
62
48
  gsub_file 'config/initializers/session_store.rb', 'key:', ':key =>'
63
49
  end
@@ -15,14 +15,16 @@ module RelevanceRails::ChefDNA
15
15
  end
16
16
 
17
17
  def self.set_ruby(json)
18
- if RelevanceRails.rvm_version =~ /^ree-(.*)/i
18
+ if RelevanceRails.ruby_version =~ /^ree-(.*)/i
19
19
  json['ruby_enterprise']['version'] = $1
20
20
  json['ruby_enterprise']['url'] = "http://rubyenterpriseedition.googlecode.com/files/ruby-enterprise-#{$1}"
21
21
  appstack_index = json['run_list'].find_index {|e| e[/^role\[.*_appstack\]$/] }
22
22
  json['run_list'][appstack_index] = 'role[enterprise_appstack]'
23
- elsif RelevanceRails.rvm_version =~ /^ruby-(.*)/i
24
- json['ruby']['version'] = $1
25
- json['ruby']['url'] = "http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-#{$1}.tar.gz"
23
+ elsif RelevanceRails.ruby_version =~ /^ruby-(.*)/i
24
+ full_version = $1
25
+ json['ruby']['version'] = full_version
26
+ major_version = full_version[/(\d\.\d).*/, 1]
27
+ json['ruby']['url'] = "http://ftp.ruby-lang.org/pub/ruby/#{major_version}/ruby-#{full_version}.tar.gz"
26
28
  appstack_index = json['run_list'].find_index {|e| e[/^role\[.*_appstack\]$/] }
27
29
  json['run_list'][appstack_index] = 'role[ruby_appstack]'
28
30
  else
@@ -0,0 +1,13 @@
1
+ module RelevanceRails
2
+ module GeneratorOverrides
3
+ def git(commands={})
4
+ super
5
+ if !$?.success?
6
+ command_string = commands.is_a?(Symbol) ? "git #{commands}" :
7
+ commands.map {|cmd, options| "git #{cmd} #{options}" }.join("; ")
8
+ msg = "Generator failed with command(s): #{command_string}"
9
+ abort "\n#{'*' * msg.size}\n#{msg}\n#{'*' * msg.size}"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,40 +1,97 @@
1
1
  require 'fog'
2
+ require 'thor'
3
+ require 'timeout'
2
4
 
3
5
  module RelevanceRails
4
6
  module Provision
5
7
  def self.create_ec2(name = nil)
6
8
  abort "Please provide a $NAME" unless name
7
- provision_ec2_instances(name)
9
+ server = provision_ec2_instances(name)
10
+ wait_for_ssh server
11
+ run_commands server
12
+ end
13
+
14
+ def self.stop_ec2
15
+ return unless ENV["FORCE"] == "true" || Thor::Shell::Basic.new.yes?("Are you sure you want to shut down EC2 instance #{instance_id}?")
16
+ puts "Shutting down EC2 instance #{instance_id}..."
17
+ server = fog_connection.servers.get(instance_id)
18
+ server.stop
19
+ server.wait_for { state == "stopped" }
20
+ puts "Done!"
21
+ end
22
+
23
+ def self.destroy_ec2
24
+ return unless ENV["FORCE"] == "true" || Thor::Shell::Basic.new.yes?("Are you sure you want to destroy EC2 instance #{instance_id}?")
25
+ puts "Destroying EC2 instance #{instance_id}..."
26
+ server = fog_connection.servers.get(instance_id)
27
+ server.destroy
28
+ server.wait_for { state == "terminated" }
29
+ puts "Removing config/ec2_instance.txt..."
30
+ File.delete('config/ec2_instance.txt')
31
+ puts "Done!"
32
+ end
33
+
34
+ def self.current_dns
35
+ server = fog_connection.servers.get(instance_id)
36
+ puts server.reload.dns_name
8
37
  end
9
38
 
10
39
  private
40
+
41
+ def self.instance_id
42
+ @instance_id ||= File.read('config/ec2_instance.txt').chomp
43
+ end
44
+
45
+ def self.config
46
+ @config ||= YAML::load(File.read(File.expand_path("~/.relevance_rails/aws_config.yml")))
47
+ end
48
+
49
+ def self.fog_connection
50
+ @fog_connection ||= Fog::Compute.new(config['aws_credentials'].merge(:provider => 'AWS'))
51
+ end
52
+
11
53
  def self.provision_ec2_instances(name)
12
- config = YAML::load(File.read(File.expand_path("~/.relevance_rails/aws_config.yml")))
13
- fog = Fog::Compute.new(config['aws_credentials'].merge(:provider => 'AWS'))
14
- server = fog.servers.create(config['server']['creation_config'])
15
- fog.tags.create(:key => 'Name',
54
+ puts "Provisioning an instance..."
55
+ server = fog_connection.servers.create(config['server']['creation_config'])
56
+ fog_connection.tags.create(:key => 'Name',
16
57
  :value => "#{Rails.application.class.parent_name} #{name}",
17
58
  :resource_id => server.id)
18
59
  server.private_key = config['server']['private_key']
19
- wait_for_ssh server
20
- jobs = []
60
+
61
+ File.open("config/ec2_instance.txt", "w") do |f|
62
+ f.puts(server.id)
63
+ end
64
+
65
+ puts "Provisioned!"
66
+ server
67
+ end
68
+
69
+ def self.run_commands(server)
21
70
  puts "Updating apt cache..."
22
- jobs += server.ssh('sudo apt-get update')
71
+ run_command(server, 'sudo apt-get update')
23
72
  puts "Installing ruby..."
24
- jobs += server.ssh('sudo apt-get -y install ruby')
73
+ run_command(server, 'sudo apt-get -y install ruby')
25
74
  puts "Installing rubygems..."
26
- jobs += server.ssh('sudo apt-get -y install rubygems1.8')
75
+ run_command(server, 'sudo apt-get -y install rubygems1.8')
27
76
  puts "Installing chef..."
28
- jobs += server.ssh('sudo gem install chef --no-ri --no-rdoc --version 0.10.8')
77
+ run_command(server, 'sudo gem install chef --no-ri --no-rdoc --version 0.10.8')
29
78
  puts "Copying chef resources from provision directory.."
30
79
  server.scp("#{Rails.root.join('provision')}/", '/tmp/chef-solo', :recursive => true)
31
80
  puts "Converging server, this may take a while (10-20 minutes)"
32
- jobs += server.ssh('cd /tmp/chef-solo && sudo /var/lib/gems/1.8/bin/chef-solo -c solo.rb -j dna.json')
33
- print_errors(jobs)
81
+ run_command(server, 'cd /tmp/chef-solo && sudo /var/lib/gems/1.8/bin/chef-solo -c solo.rb -j dna.json')
82
+
83
+ puts "Server Instance: #{server.id}"
34
84
  puts "Server IP: #{server.public_ip_address}"
85
+ server
86
+ end
87
+
88
+ def self.run_command(server, command)
89
+ jobs = server.ssh(command)
90
+ exit 1 unless jobs_succeeded?(jobs)
35
91
  end
36
92
 
37
93
  def self.wait_for_ssh(server)
94
+ puts "Waiting for ssh connectivity..."
38
95
  server.wait_for { ready? }
39
96
  succeeded = false
40
97
  attempts = 0
@@ -42,27 +99,29 @@ module RelevanceRails
42
99
  until succeeded || attempts > 4
43
100
  sleep 10
44
101
  begin
45
- server.ssh('ls')
102
+ # Should be checked for compatability across rubies
103
+ Timeout.timeout(60) { server.ssh('ls') }
46
104
  succeeded = true
47
- rescue Errno::ECONNREFUSED => e
48
- puts "Connection #{attempts} refused, retrying..."
105
+ rescue Errno::ECONNREFUSED, Timeout::Error => e
106
+ puts "Connecting to Amazon refused. Attempt #{attempts+1}..."
49
107
  attempts += 1
50
108
  last_error = e
51
109
  end
52
110
  end
53
111
  raise last_error unless succeeded
54
- puts "Server up and listening for SSH..."
112
+ puts "Server up and listening for SSH!"
55
113
  end
56
114
 
57
- def self.print_errors(jobs)
58
- return if jobs.all? { |job| job.status == 0 }
115
+ def self.jobs_succeeded?(jobs)
116
+ return true if jobs.all? { |job| job.status == 0 }
59
117
  jobs.each do |job|
60
118
  puts "----------------------"
61
- puts "Running #{job.command}"
119
+ puts "Command '#{job.command}'"
62
120
  puts "STDOUT: #{job.stdout}"
63
121
  puts "STDERR: #{job.stderr}"
64
122
  puts "----------------------"
65
123
  end
124
+ false
66
125
  end
67
126
 
68
127
  end
@@ -1,11 +1,6 @@
1
1
  require 'relevance_rails'
2
2
  require 'json'
3
3
 
4
- def rvm_run(command)
5
- say_status :rvm_run, command
6
- RelevanceRails.rvm_run(command)
7
- end
8
-
9
4
  db = ['postgresql','mysql'].include?(options[:database]) ? options[:database] : 'mysql'
10
5
 
11
6
  remove_file 'README.rdoc'
@@ -19,13 +14,17 @@ remove_file 'app/views/layouts/application.html.erb'
19
14
 
20
15
  generate(:relevance_file, app_name, db)
21
16
 
22
- run "rvm gemset create #{app_name}"
23
- rvm_run "gem install bundler"
24
- rvm_run "bundle install"
17
+ inside destination_root do
18
+ run "gem install bundler"
19
+ run "bundle install"
20
+ end
25
21
 
26
22
  git :init
27
23
  append_file ".gitignore", "config/database.yml\n"
28
24
  run 'cp config/database.example.yml config/database.yml'
29
25
  git :add => "."
30
26
  git :commit => "-a -m 'Initial commit'"
31
- generate(:provision_config, app_name, db)
27
+
28
+ inside destination_root do
29
+ generate(:provision_config, db)
30
+ end
@@ -5,14 +5,45 @@ module RelevanceRails
5
5
  def self.start(argv=ARGV)
6
6
  if argv.delete '--version'
7
7
  puts "RelevanceRails #{RelevanceRails::VERSION}"
8
- else
8
+ elsif argv[0] == 'new'
9
9
  add_default_options! argv
10
- exec 'rails', *argv
10
+ if ENV['rvm_path'].nil?
11
+ exec 'rails', *argv
12
+ else
13
+ app_name = argv[1]
14
+ env = setup_rvm app_name
15
+
16
+ new_rvm_string = "#{env.environment_name.split('@')[0]}@#{app_name}"
17
+ install_relevance_rails argv, new_rvm_string, env.environment_name
18
+ exec new_rvm_string,'-S','rails', *argv
19
+ end
11
20
  end
12
21
  end
13
22
 
14
23
  private
15
24
 
25
+ def self.setup_rvm(app_name)
26
+ $LOAD_PATH.unshift "#{ENV['rvm_path']}/lib"
27
+ require 'rvm'
28
+
29
+ env = RVM::Environment.current
30
+ env.gemset_create(app_name)
31
+ env
32
+ end
33
+
34
+ def self.install_relevance_rails(argv, new_rvm_string, current_gemset)
35
+ child_env = RVM::Environment.new(new_rvm_string)
36
+ puts "Installing relevance_rails into the app's gemset..."
37
+
38
+ result = if argv.delete '--relevance-dev'
39
+ rubygem = "#{ENV['rvm_path']}/gems/#{current_gemset}/cache/relevance_rails-#{RelevanceRails::VERSION}.gem"
40
+ child_env.run('gem', 'install', rubygem)
41
+ else
42
+ child_env.run('gem', 'install', 'relevance_rails', '-v', RelevanceRails::VERSION)
43
+ end
44
+ abort "Unable to install relevance_rails into the new gemset" if result.exit_status != 0
45
+ end
46
+
16
47
  def self.add_default_options!(argv)
17
48
  unless argv.any? =~ /^-d$/
18
49
  template = File.join(File.dirname(__FILE__), "relevance_rails_template.rb")
@@ -1,3 +1,3 @@
1
1
  module RelevanceRails
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1.alpha"
3
3
  end
@@ -2,30 +2,16 @@ require "relevance_rails/version"
2
2
  require "relevance_rails/public_key_fetcher"
3
3
  require "relevance_rails/chef_dna"
4
4
  require 'relevance_rails/railtie' if defined? Rails
5
+ require 'relevance_rails/generator_overrides'
5
6
 
6
7
  module RelevanceRails
7
- def self.rvm_gemset
8
- @rvm_gemset ||= rvm_current.split('@')[1] || 'global'
9
- end
10
-
11
- def self.rvm_version
12
- @rvm_version ||= rvm_current.split('@')[0] || 'ruby-1.9.3-p0'
13
- end
14
-
15
- def self.rvm_current
16
- @rvm_current ||= rvm_exec('rvm current').chomp
17
- end
18
-
19
- # rvm_current SHOULD be in $PATH and execute ruby for the
20
- # correct version and gemset
21
- def self.rvm_run(command)
22
- ret = `#{rvm_current} -S #{command}`
23
- unless $?.success?
24
- abort "\n Command '#{command}' failed with:\n#{ret}"
8
+ def self.ruby_version
9
+ @ruby_version ||= begin
10
+ if RUBY_DESCRIPTION[/Ruby Enterprise Edition (\d{4}\.\d\d)/, 1]
11
+ "ree-#{RUBY_VERSION}-#{$1}"
12
+ else
13
+ "ruby-#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
14
+ end
25
15
  end
26
16
  end
27
-
28
- def self.rvm_exec(command)
29
- `bash -c 'source ~/.rvm/scripts/rvm > /dev/null && #{command}'`
30
- end
31
17
  end
@@ -1,8 +1,29 @@
1
1
  require 'relevance_rails/provision'
2
2
 
3
3
  namespace :provision do
4
+ desc 'Provision a deployable EC2 instance and generate Capistrano config'
5
+ task :ec2_and_generate do
6
+ server = RelevanceRails::Provision.create_ec2(ENV['NAME'])
7
+ system('rails', 'generate', 'deployment', ENV['NAME'], server.public_ip_address)
8
+ end
9
+
4
10
  desc 'Provision a deployable EC2 instance'
5
11
  task :ec2 do
6
12
  RelevanceRails::Provision.create_ec2(ENV['NAME'])
7
13
  end
14
+
15
+ desc 'Stop your previously-provisioned EC2 instance'
16
+ task :stop do
17
+ RelevanceRails::Provision.stop_ec2
18
+ end
19
+
20
+ desc 'Destroy your previously-provisioned EC2 instance'
21
+ task :destroy do
22
+ RelevanceRails::Provision.destroy_ec2
23
+ end
24
+
25
+ desc 'Return the current public DNS name for your previously-provisioned EC2 instance'
26
+ task :current_dns do
27
+ RelevanceRails::Provision.current_dns
28
+ end
8
29
  end
@@ -23,8 +23,9 @@ Gem::Specification.new do |s|
23
23
  s.executables = ['relevance_rails']
24
24
 
25
25
  # specify any dependencies here; for example:
26
- s.add_runtime_dependency "rails", "~> 3.2"
26
+ s.add_runtime_dependency 'rails', '~> 3.2'
27
27
  s.add_runtime_dependency 'fog', '~> 1.3.0'
28
+ s.add_runtime_dependency 'thor', '~> 0.14.6'
28
29
  s.add_development_dependency 'pry'
29
30
  s.add_development_dependency 'capybara'
30
31
  s.add_development_dependency 'rspec'
data/script/ci CHANGED
@@ -1,40 +1,66 @@
1
- #!/bin/bash -v
1
+ #!/bin/bash
2
+
3
+ # Function to sanity-check generators since Rails 3.x does not
4
+ # give a non-zero exist code if generators fail
5
+ function files_must_exist {
6
+ for checked_file in "$@"; do
7
+ if [ ! -e "$checked_file" ]; then
8
+ echo "'$checked_file' didn't exist!"
9
+ exit 1
10
+ fi
11
+ done
12
+ }
13
+
14
+ # Function to sanity-check generators since Rails 3.x does not
15
+ # give a non-zero exist code if generators fail
16
+ function files_must_NOT_exist {
17
+ for checked_file in "$@"; do
18
+ if [ -e "$checked_file" ]; then
19
+ echo "'$checked_file' still exists!"
20
+ exit 1
21
+ fi
22
+ done
23
+ }
2
24
 
3
25
  RAILS_APP="app_for_ci"
4
26
  TARGET_HOST="placeholder.example.com"
5
27
 
28
+ # Setup RVM
6
29
  source "$HOME/.rvm/scripts/rvm"
7
30
  rvm use "ruby-1.9.2@relevance_rails"
31
+ echo "RVM is now using:` rvm current`"
32
+
33
+ # exit if any statement fails;
34
+ # must be set AFTER loading RVM
35
+ set -e
8
36
 
9
37
  gem install bundler
10
38
  bundle install
11
39
  bundle exec rake spec
12
40
 
13
- # exit if any statement fails; must be set AFTER loading RVM
14
- set -e
15
-
16
41
  echo "Building new relevance_rails gem..."
17
42
  rm -Rf relevance_rails-*.gem
18
- gem build --verbose relevance_rails.gemspec
43
+ gem build --verbose relevance_rails.gemspec
19
44
  echo "Done"
20
45
 
21
- # NOTE: Manual install of just-built gem to workaround bundler wanting
22
- # it to live on rubygems.org.
46
+ # NOTE: Manual install of just-built gem to workaround bundler wanting
47
+ # it to live on rubygems.org.
23
48
  # NOTE: RVM 1.x doesn't work with "set -e", so you have to unset/set it.
24
49
  set +e
25
50
  rvm --force gemset delete $RAILS_APP
26
51
  rvm gemset create $RAILS_APP
27
52
  rvm gemset use $RAILS_APP
53
+ echo "RVM is now using:` rvm current`"
28
54
  set -e
29
55
 
30
- if [ `gem list relevance_rails --installed` = "true" ]; then
56
+ if $(gem list relevance_rails --installed); then
31
57
  echo "Removing old relevance_rails gem..."
32
- gem uninstall --verbose --all --executables relevance_rails
58
+ gem uninstall --verbose --all --executables relevance_rails
33
59
  echo "Done"
34
60
  fi
35
61
 
36
62
  echo "Installing relevance_rails gem into $RAILS_APP gemset..."
37
- gem install relevance_rails-*.gem
63
+ gem install relevance_rails-*.gem
38
64
  echo "Done."
39
65
 
40
66
  rm -Rf ./$RAILS_APP
@@ -42,16 +68,21 @@ relevance_rails new $RAILS_APP --database=postgresql
42
68
 
43
69
  # NOTE: this does NOT change the RVM gemset; we set it manually above
44
70
  builtin cd $RAILS_APP
71
+ echo "RVM is now using:` rvm current`"
45
72
 
46
- echo "Generating relevance_rails deployment scripts..."
47
- ./script/rails generate deployment staging $TARGET_HOST
48
- git add .
49
- git commit -m "Generated relevance_rails deployment scripts."
50
- echo "Done."
73
+ files_must_NOT_exist public/index.html
74
+ files_must_exist config/database.yml provision/dna.json config/deploy.rb config/deploy/recipes/deploy.rb
51
75
 
52
76
  echo "Generating relevance_rails fixtures..."
53
77
  ./script/rails generate fixtures
54
78
  git add .
55
79
  git commit -m "Generated relevance_rails fixtures."
80
+ files_must_exist app/assets/javascripts/relevance_rails.js.coffee app/assets/stylesheets/relevance_rails.css.scss
56
81
  echo "Done."
57
82
 
83
+ echo "Generating relevance_rails deployment scripts..."
84
+ ./script/rails generate deployment staging $TARGET_HOST
85
+ git add .
86
+ git commit -m "Generated relevance_rails deployment scripts for $TARGET_HOST."
87
+ files_must_exist config/deploy/staging.rb
88
+ echo "Done."
data/script/ci_nightly ADDED
@@ -0,0 +1,79 @@
1
+ #!/bin/bash
2
+
3
+ # Set the DISPLAY variable if not already set
4
+ : ${DISPLAY:=":1"}
5
+ # Allows firefox to use display
6
+ export DISPLAY
7
+
8
+ RAILS_APP="app_for_ci"
9
+ EC2_MEMENTO_FILE="config/ec2_instance.txt"
10
+
11
+ function stop_server_and_exit {
12
+ if [ -f $EC2_MEMENTO_FILE ]; then
13
+ echo "Stopping newly-created server..."
14
+ bundle exec rake provision:stop FORCE=true --trace
15
+ echo "Done."
16
+ fi
17
+
18
+ echo "BUILD FAILED"
19
+ exit 1
20
+ }
21
+
22
+ echo "RVM is now using:` rvm current`"
23
+
24
+ set -e
25
+ ./script/ci
26
+ set +e
27
+
28
+ source "$HOME/.rvm/scripts/rvm"
29
+ rvm use "ruby-1.9.2@$RAILS_APP"
30
+ echo "RVM is now using:` rvm current`"
31
+
32
+ builtin cd $RAILS_APP
33
+
34
+ echo "Provisioning an EC2 instance..."
35
+ rm -f $EC2_MEMENTO_FILE
36
+ server_name="Nightly Build Testing - `date "+%Y-%m-%d %H:%M:%S"` "
37
+ bundle exec rake --trace provision:ec2 NAME="$server_name"
38
+ [ $? -ne 0 ] && stop_server_and_exit
39
+ echo "Done!"
40
+
41
+ echo "Determine the EC2 instance's DNS name..."
42
+ TARGET_HOST=`bundle exec rake provision:current_dns`
43
+ [ $? -ne 0 ] && stop_server_and_exit
44
+ echo "Done."
45
+
46
+ echo "Generating relevance_rails deployment scripts..."
47
+ ./script/rails generate deployment staging $TARGET_HOST --force
48
+ [ $? -ne 0 ] && stop_server_and_exit
49
+ git add .
50
+ git commit -m "Generated relevance_rails deployment scripts for $TARGET_HOST."
51
+ [ $? -ne 0 ] && stop_server_and_exit
52
+ echo "Done."
53
+
54
+ echo "Capistrano: setup..."
55
+ bundle exec cap staging deploy:setup
56
+ [ $? -ne 0 ] && stop_server_and_exit
57
+ echo "Done."
58
+
59
+ echo "Capistrano: deploying..."
60
+ bundle exec cap staging deploy:cold
61
+ [ $? -ne 0 ] && stop_server_and_exit
62
+ echo "Done."
63
+
64
+ builtin cd -
65
+ rvm gemset use relevance_rails
66
+ echo "RVM is now using:` rvm current`"
67
+
68
+ echo "Running the acceptance tests against our newly-created server..."
69
+ ACCEPTANCE_HOST=$TARGET_HOST rake acceptance --trace
70
+ [ $? -ne 0 ] && stop_server_and_exit
71
+ echo "Done."
72
+
73
+ builtin cd $RAILS_APP
74
+ rvm gemset use $RAILS_APP
75
+
76
+ echo "Terminating our newly-created server..."
77
+ bundle exec rake provision:destroy FORCE=true --trace
78
+ echo "Done!"
79
+
@@ -1,25 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'App is alive', :js => true, :acceptance => true do
4
- it 'verifies coffeescript served up as js' do
5
- visit '/assets/relevance_rails.js'
6
- page.should have_content "console.log('Hello from Relevance, Inc!');"
7
- end
8
-
9
4
  it "verifies haml is served up" do
10
5
  visit '/relevance_rails'
11
6
  page.should have_content 'WELCOME HOME'
12
7
  end
13
8
 
9
+ it 'verifies coffeescript served up as js' do
10
+ visit '/assets/application.js'
11
+ page.should have_content 'console.log("Hello from Relevance, Inc!")'
12
+ end
13
+
14
14
  it "verifies scss is served up as css" do
15
- visit '/assets/relevance_rails.css'
16
- page.should have_content "background-color: blue;"
15
+ visit '/assets/application.css'
16
+ page.should have_content "background-color:blue"
17
17
  end
18
18
 
19
19
  it "verifies a working database connection" do
20
20
  visit '/relevance_rails/db'
21
- within ('h1.database') do
22
- page.should have_content '_development'
21
+ within ('h1.advanced_math') do
22
+ page.should have_content '4242'
23
23
  end
24
24
  end
25
25
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'generators/provision_config/provision_config_generator'
3
3
 
4
4
  describe ProvisionConfigGenerator do
5
- context '#create_authorized_key_data_bag' do
5
+ context '#check_authorized_keys' do
6
6
  subject { ProvisionConfigGenerator.new(['name']) }
7
7
 
8
8
  it "aborts if no ssh-keys are found" do
@@ -14,14 +14,13 @@ describe ProvisionConfigGenerator do
14
14
  RelevanceRails::PublicKeyFetcher.should_receive(:public_keys).and_return([])
15
15
 
16
16
  should_abort_with(/^No ssh keys were found!/) do
17
- subject.create_authorized_key_data_bag
17
+ subject.check_authorized_keys
18
18
  end
19
19
  end
20
20
 
21
21
  it "doesn't abort if ssh-keys are found" do
22
22
  subject.should_receive(:fetch_keys).and_return(['ssh-rsa ZZZZ'])
23
- subject.should_receive(:template)
24
- expect { subject.create_authorized_key_data_bag }.to_not raise_error
23
+ expect { subject.check_authorized_keys }.to_not raise_error
25
24
  end
26
25
  end
27
26
  end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+ require 'relevance_rails/provision'
3
+
4
+ describe RelevanceRails::Provision do
5
+ describe '.run_commands' do
6
+ it "fails fast if a command fails" do
7
+ job = mock(:status => 1, :stdout => '', :stderr => 'FAIL WHALE', :command => 'exit 1')
8
+ server = mock(:ssh => [job])
9
+ capture_stdout do
10
+ expect do
11
+ RelevanceRails::Provision.run_commands server
12
+ end.to raise_error SystemExit
13
+ end.should =~ /STDERR: FAIL WHALE/
14
+ end
15
+ end
16
+ end
@@ -13,9 +13,13 @@ describe RelevanceRails::Runner do
13
13
  end
14
14
 
15
15
  it "new calls exec" do
16
- RelevanceRails::Runner.should_receive(:exec).with('rails', 'new', 'the_app', '-m',
16
+ RelevanceRails::Runner.should_receive(:exec).with(anything,
17
+ '-S', 'rails', 'new', 'the_app', '-m',
17
18
  File.expand_path(File.dirname(__FILE__) +
18
19
  "/../../lib/relevance_rails/relevance_rails_template.rb"))
20
+ RelevanceRails::Runner.should_receive(:install_relevance_rails)
21
+ env = mock :environment_name => '1.9.3@default'
22
+ RelevanceRails::Runner.should_receive(:setup_rvm).and_return(env)
19
23
  start('new', 'the_app')
20
24
  end
21
25
  end
data/spec/spec_helper.rb CHANGED
@@ -55,5 +55,4 @@ end
55
55
 
56
56
  Capybara.current_driver = :selenium
57
57
  Capybara.run_server = false
58
- #Capybara.app_host = 'http://' + (ENV["ACCEPTANCE_HOST"] || 'localhost:3000')
59
- Capybara.app_host = ENV["ACCEPTANCE_HOST"] || 'http://localhost:3000'
58
+ Capybara.app_host = 'http://' + (ENV["ACCEPTANCE_HOST"] || 'localhost:3000')
data/techdebt.md CHANGED
@@ -6,8 +6,13 @@
6
6
  ** cleaner rvm version detection - intermittenly picks up no version
7
7
  ** intermittent mysql::server failures (mysql server not up yet) on `vagrant up`. Attempt fix in site_cookbooks
8
8
  ** intermittent setup failure - apt-get update fails with 404s or ruby not found
9
+ ** when generating an app with --database=postgresql, provision_config
10
+ generator intermittently fails at the beginning with different gem not found
11
+ errors. Generating the app more than once or inspecting the problem solves it
12
+ ** provision_config generator intermittently can't detect current working directory which breaks
13
+ git commands. Current solution of sprinkling Dir.chdir is a bandaid at best.
9
14
 
10
- * deployment generator
15
+ * Provisioning an instance
11
16
  ** Don't hardcode path to chef binstub, caused by ubuntu installing weirdness
12
17
  ** Make the deployment generator idempotent
13
18
  ** Better error handling when the aws.yml is not present
metadata CHANGED
@@ -1,122 +1,137 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: relevance_rails
3
- version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease:
6
- segments:
7
- - 0
8
- - 1
9
- - 0
10
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1.alpha
5
+ prerelease: 6
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Alex Redington
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-04-06 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-04-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: rails
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
18
+ requirements:
26
19
  - - ~>
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 3
31
- - 2
32
- version: "3.2"
20
+ - !ruby/object:Gem::Version
21
+ version: '3.2'
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.2'
30
+ - !ruby/object:Gem::Dependency
36
31
  name: fog
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 1.3.0
38
+ type: :runtime
37
39
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
39
41
  none: false
40
- requirements:
42
+ requirements:
41
43
  - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 27
44
- segments:
45
- - 1
46
- - 3
47
- - 0
44
+ - !ruby/object:Gem::Version
48
45
  version: 1.3.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: thor
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 0.14.6
49
54
  type: :runtime
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: pry
53
55
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.14.6
62
+ - !ruby/object:Gem::Dependency
63
+ name: pry
64
+ requirement: !ruby/object:Gem::Requirement
55
65
  none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
63
70
  type: :development
64
- version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
66
- name: capybara
67
71
  prerelease: false
68
- requirement: &id004 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
69
73
  none: false
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- hash: 3
74
- segments:
75
- - 0
76
- version: "0"
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: capybara
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
77
86
  type: :development
78
- version_requirements: *id004
79
- - !ruby/object:Gem::Dependency
80
- name: rspec
81
87
  prerelease: false
82
- requirement: &id005 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rspec
96
+ requirement: !ruby/object:Gem::Requirement
83
97
  none: false
84
- requirements:
85
- - - ">="
86
- - !ruby/object:Gem::Version
87
- hash: 3
88
- segments:
89
- - 0
90
- version: "0"
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
91
102
  type: :development
92
- version_requirements: *id005
93
- - !ruby/object:Gem::Dependency
94
- name: rake
95
103
  prerelease: false
96
- requirement: &id006 !ruby/object:Gem::Requirement
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rake
112
+ requirement: !ruby/object:Gem::Requirement
97
113
  none: false
98
- requirements:
114
+ requirements:
99
115
  - - ~>
100
- - !ruby/object:Gem::Version
101
- hash: 11
102
- segments:
103
- - 0
104
- - 9
105
- - 2
106
- - 2
116
+ - !ruby/object:Gem::Version
107
117
  version: 0.9.2.2
108
118
  type: :development
109
- version_requirements: *id006
110
- description: A Rails 3 wrapper which forces template use and includes a plethora of generators for standard Relevance bits.
111
- email:
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.9.2.2
126
+ description: A Rails 3 wrapper which forces template use and includes a plethora of
127
+ generators for standard Relevance bits.
128
+ email:
112
129
  - alex.redington@thinkrelevance.com
113
- executables:
130
+ executables:
114
131
  - relevance_rails
115
132
  extensions: []
116
-
117
133
  extra_rdoc_files: []
118
-
119
- files:
134
+ files:
120
135
  - .gitignore
121
136
  - .rvmrc
122
137
  - .travis.yml
@@ -129,20 +144,21 @@ files:
129
144
  - lib/generators/deployment/deployment_generator.rb
130
145
  - lib/generators/fixtures/fixtures_generator.rb
131
146
  - lib/generators/provision_config/provision_config_generator.rb
147
+ - lib/generators/provision_config/templates/Capfile
132
148
  - lib/generators/provision_config/templates/authorized_keys.json.erb
149
+ - lib/generators/provision_config/templates/deploy.rb.erb
150
+ - lib/generators/provision_config/templates/recipes_deploy.rb
151
+ - lib/generators/provision_config/templates/vagrant.rb
133
152
  - lib/generators/relevance_file/relevance_file_generator.rb
134
- - lib/generators/relevance_file/templates/Capfile
135
153
  - lib/generators/relevance_file/templates/Gemfile.erb
136
154
  - lib/generators/relevance_file/templates/README.markdown.erb
137
155
  - lib/generators/relevance_file/templates/application.html.haml.erb
138
156
  - lib/generators/relevance_file/templates/database.example.yml.mysql.erb
139
157
  - lib/generators/relevance_file/templates/database.example.yml.postgresql.erb
140
- - lib/generators/relevance_file/templates/deploy.rb.erb
141
- - lib/generators/relevance_file/templates/recipes_deploy.rb
142
158
  - lib/generators/relevance_file/templates/spec_helper.rb
143
- - lib/generators/relevance_file/templates/vagrant.rb
144
159
  - lib/relevance_rails.rb
145
160
  - lib/relevance_rails/chef_dna.rb
161
+ - lib/relevance_rails/generator_overrides.rb
146
162
  - lib/relevance_rails/provision.rb
147
163
  - lib/relevance_rails/public_key_fetcher.rb
148
164
  - lib/relevance_rails/railtie.rb
@@ -152,48 +168,35 @@ files:
152
168
  - lib/tasks/provision.rake
153
169
  - relevance_rails.gemspec
154
170
  - script/ci
171
+ - script/ci_nightly
155
172
  - spec/acceptance_spec.rb
156
173
  - spec/lib/provision_config_generator_spec.rb
157
- - spec/lib/relevance_rails_spec.rb
174
+ - spec/lib/provision_spec.rb
158
175
  - spec/lib/runner_spec.rb
159
176
  - spec/spec_helper.rb
160
177
  - techdebt.md
161
- homepage: ""
178
+ homepage: ''
162
179
  licenses: []
163
-
164
180
  post_install_message:
165
181
  rdoc_options: []
166
-
167
- require_paths:
182
+ require_paths:
168
183
  - lib
169
- required_ruby_version: !ruby/object:Gem::Requirement
184
+ required_ruby_version: !ruby/object:Gem::Requirement
170
185
  none: false
171
- requirements:
172
- - - ">="
173
- - !ruby/object:Gem::Version
174
- hash: 3
175
- segments:
176
- - 0
177
- version: "0"
178
- required_rubygems_version: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ required_rubygems_version: !ruby/object:Gem::Requirement
179
191
  none: false
180
- requirements:
181
- - - ">="
182
- - !ruby/object:Gem::Version
183
- hash: 3
184
- segments:
185
- - 0
186
- version: "0"
192
+ requirements:
193
+ - - ! '>'
194
+ - !ruby/object:Gem::Version
195
+ version: 1.3.1
187
196
  requirements: []
188
-
189
197
  rubyforge_project: relevance_rails
190
198
  rubygems_version: 1.8.21
191
199
  signing_key:
192
200
  specification_version: 3
193
201
  summary: Rails 3 Relevance style, with all infrastructure bits automated away.
194
- test_files:
195
- - spec/acceptance_spec.rb
196
- - spec/lib/provision_config_generator_spec.rb
197
- - spec/lib/relevance_rails_spec.rb
198
- - spec/lib/runner_spec.rb
199
- - spec/spec_helper.rb
202
+ test_files: []
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe RelevanceRails do
4
- context '.rvm_run' do
5
- it 'aborts when the command fails' do
6
- should_abort_with(/Command '.+' failed with/) do
7
- subject.rvm_run('-e "exit 1"')
8
- end
9
- end
10
-
11
- it 'succeeds when the command passes' do
12
- expect { subject.rvm_run('-e "exit 0"') }.to_not raise_error
13
- end
14
- end
15
- end