relevance_rails 0.1.0 → 0.1.1.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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