crossroads_capistrano 1.4.0 → 1.4.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "crossroads_capistrano"
6
- s.version = "1.4.0"
6
+ s.version = "1.4.5"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Steve Kenworthy", "Ben Tillman", "Nathan Broadbent"]
9
9
  s.email = ["it_dept@crossroads.org.hk"]
@@ -8,9 +8,9 @@ if defined?(Capistrano::Configuration) && Capistrano::Configuration.instance
8
8
  Capistrano::Configuration.instance(:must_exist).load do
9
9
  set :rails_root, Dir.pwd # For tasks that need the root directory
10
10
 
11
- # Load defaults unless explicitly told not to.
12
- unless $no_default
13
- load File.join(File.dirname(__FILE__), "crossroads_capistrano/recipes/defaults.rb")
11
+ # Load base defaults unless explicitly told not to.
12
+ unless $no_base
13
+ load File.join(File.dirname(__FILE__), "crossroads_capistrano/recipes/base.rb")
14
14
  end
15
15
 
16
16
  def load_crossroads_recipes(recipes)
@@ -0,0 +1,57 @@
1
+ #
2
+ # These base defaults are always loaded unless otherwise specified.
3
+ #
4
+
5
+ # Recipes
6
+ # ---------------------------------------------------------
7
+ load File.join(File.dirname(__FILE__), "helper_methods.rb")
8
+ load File.join(File.dirname(__FILE__), "config.rb")
9
+
10
+
11
+ # Settings
12
+ # ---------------------------------------------------------
13
+ set :default_stage, "preview"
14
+ set :rails_env, "production"
15
+
16
+ set :scm, :git
17
+ set :branch, "master"
18
+ set :deploy_via, :remote_cache
19
+ set :keep_releases, 3
20
+
21
+ set :bundle_without, [:cucumber, :development, :test]
22
+
23
+ set :httpd_user, "apache"
24
+ set :httpd_group, "apache"
25
+ set :http_port, "80"
26
+ set :https_port, "443"
27
+
28
+ default_run_options[:pty] = true
29
+
30
+ def needs_netrc?; repository.include?("svn.globalhand.org"); end
31
+ def needs_ssh_key?; repository.include?("github.com"); end
32
+
33
+
34
+ # Hooks
35
+ # ---------------------------------------------------------
36
+ before "deploy:symlink", "deploy:symlink_config"
37
+ after "deploy:restart", "deploy:cleanup"
38
+
39
+
40
+ # Misc. Tasks
41
+ # ---------------------------------------------------------
42
+ namespace :deploy do
43
+ desc "Symlink Shared config files into release path."
44
+ task :symlink_config do
45
+ run "ln -sf #{shared_path}/config/*.yml #{release_path}/config/"
46
+ end
47
+ desc "Check for project dependencies"
48
+ task :check_dependencies, :roles => :db, :only => { :primary => true } do
49
+ sudo "cd #{current_path} && RAILS_ENV=production rake check_dependencies"
50
+ end
51
+ end
52
+
53
+
54
+ # Capistrano Fixes
55
+ # ---------------------------------------------------------
56
+ set(:current_release) { File.join(releases_path, releases.last.to_s) }
57
+
@@ -0,0 +1,50 @@
1
+ namespace :config do
2
+ desc "Prompt for values for all '*.yml.example' and '*.yml.<<stage>>.example' files, and upload to shared/config"
3
+ task :setup do
4
+ puts "\n ** Setting up shared/config files ('*.yml.example')."
5
+ puts " - In order to skip a file, you just need to leave any prompt blank."
6
+ puts " - You will need to edit the '.yml.example' files to change any hard-coded values."
7
+
8
+ (Dir.glob("config/*.yml.example") +
9
+ Dir.glob("config/*.yml.#{stage}.example")).each do |config_file|
10
+ unless config_file.include?("database.yml")
11
+ skip_file = false
12
+ filename = File.basename(config_file).gsub(/.example$/,'')
13
+ puts "\n ** == Configuring #{filename} ...\n\n"
14
+ config = File.open(config_file).read
15
+ # Substitute <%=...%> with evaluated expression. (Very simple ERB)
16
+ config.gsub!(/<%=(.+)%>/) do |string|
17
+ eval($1)
18
+ end
19
+ # Substitute {{...}} with user input.
20
+ config.gsub!(/\{\{(.+)\}\}/) do |string|
21
+ prompt = $1
22
+ # Keep passwords hidden.
23
+ if prompt.downcase.include?('password')
24
+ answer = Capistrano::CLI.password_prompt(" #{prompt}: ").strip
25
+ else
26
+ answer = Capistrano::CLI.ui.ask(" #{prompt}: ").strip
27
+ end
28
+ if answer == ""
29
+ skip_file = true
30
+ break
31
+ end
32
+ answer
33
+ end
34
+ if skip_file
35
+ puts "*** ! Skipping #{filename} !"
36
+ else
37
+ put config, "#{shared_path}/config/#{filename}"
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ desc "Pull server config to local machine (excld. database.yml)"
44
+ task :pull do
45
+ system("mv -f config/database.yml config/database.yml.backup")
46
+ get_with_status "#{shared_path}/config/", ".", :via => :scp, :hosts => first_db_host, :recursive => true
47
+ system("rm -f config/database.yml && mv -f config/database.yml.backup config/database.yml")
48
+ end
49
+ end
50
+
@@ -0,0 +1,46 @@
1
+ #
2
+ # Capistrano Helper Methods
3
+ #
4
+
5
+ # Returns the first host with the 'db' role. (useful for :pull commands)
6
+ def first_db_host
7
+ @db_host ||= find_servers(:roles => :db).map(&:to_s).first
8
+ end
9
+
10
+ # Adds file status to 'get' commands
11
+ def get_with_status(file, dest, options={})
12
+ last = nil
13
+ get file, dest, options do |channel, name, received, total|
14
+ print "\r #{name}: #{(Float(received)/total*100).to_i}%"
15
+ print "\n" if received == total
16
+ end
17
+ end
18
+
19
+ # Test for presence of file on remote server.
20
+ def remote_file_exists?(full_path)
21
+ capture("if [ -e #{full_path} ]; then echo 'true'; fi").strip == 'true'
22
+ end
23
+
24
+ # Replaces strings in a file, i.e. @SOME_STRING@ is replaced with 'replacement'
25
+ def sed(file, args, char="@")
26
+ sudo "sed -i #{file} " << args.map{|k,v|"-e 's%#{char}#{k}#{char}%#{v}%g'"}.join(" ")
27
+ end
28
+
29
+ # Helper function which prompts for user input.
30
+ # If user enters nothing, variable is set to the default.
31
+ def prompt_with_default(prompt, var, default=nil)
32
+ set(var) do
33
+ # Append default in brackets to prompt if default is not blank.
34
+ if default != "" && !default.nil?
35
+ prompt << " [#{default}]"
36
+ end
37
+ # Keep passwords hidden.
38
+ if prompt.downcase.include?('password')
39
+ Capistrano::CLI.password_prompt(" #{prompt}: ")
40
+ else
41
+ Capistrano::CLI.ui.ask(" #{prompt}: ")
42
+ end
43
+ end
44
+ set var, default if eval("#{var.to_s}.empty?")
45
+ end
46
+
@@ -19,11 +19,11 @@ password: #{ldap_bind_password}
19
19
  EOF
20
20
 
21
21
  put ldap_yml, "/tmp/ldap.yml"
22
- sudo "mv /tmp/ldap.yml #{deploy_to}/shared/config/ldap.yml"
22
+ sudo "mv /tmp/ldap.yml #{shared_path}/config/ldap.yml"
23
23
  end
24
24
 
25
25
  task :symlink do
26
- sudo "ln -sf #{deploy_to}/shared/config/ldap.yml #{release_path}/config/ldap.yml"
26
+ sudo "ln -sf #{shared_path}/config/ldap.yml #{release_path}/config/ldap.yml"
27
27
  end
28
28
 
29
29
  end
@@ -22,9 +22,7 @@ namespace :log do
22
22
  run "gzip -c #{shared_path}/log/production.log > #{shared_path}/log/production.log.gz"
23
23
  `rm -f /tmp/production.log.gz`
24
24
  puts "Downloading #{shared_path}/log/production.log...\n"
25
- download("#{shared_path}/log/production.log.gz", "/tmp/production.log.gz", :via => :scp) do |channel, name, received, total|
26
- print "\r #{name}: #{(Float(received)/total*100).to_i}% complete..."
27
- end
25
+ get_with_status "#{shared_path}/log/production.log.gz", "/tmp/production.log.gz", :via => :scp
28
26
  run "rm -f #{shared_path}/log/production.log.gz"
29
27
  `gzip -fd /tmp/production.log.gz`
30
28
  puts "File can be accessed at /tmp/production.log"
@@ -0,0 +1,45 @@
1
+ namespace :db do
2
+ namespace :config do
3
+ desc "Create shared/config/database.yml"
4
+ task :setup do
5
+ puts "\n ** == Configuring config/database.yml (mysql) ...\n\n"
6
+ prompt_with_default("Database name", :db_name, "#{application}_#{stage}")
7
+ prompt_with_default("Database username", :db_username, "#{application}_#{stage}")
8
+ prompt_with_default("Database password", :db_password)
9
+ prompt_with_default("Database host", :db_host, "localhost")
10
+ prompt_with_default("Database port", :db_port, "3306")
11
+ database_yml = <<-EOF
12
+ production:
13
+ adapter: mysql
14
+ encoding: utf8
15
+ database: #{db_name}
16
+ username: #{db_username}
17
+ password: #{db_password}
18
+ host: #{db_host}
19
+ port: #{db_port}
20
+ pool: 10
21
+ timeout: 5
22
+ EOF
23
+ put database_yml, "#{shared_path}/config/database.yml"
24
+ end
25
+ end
26
+
27
+ desc "Download production database to local machine"
28
+ task :pull do
29
+ prompt_with_default("Database name", :database_name, "#{application}_#{stage}")
30
+ prompt_with_default("Local role", :local_role, "root")
31
+ prompt_with_default("Overwrite local development db? (y/n)", :overwrite, "y")
32
+
33
+ # Dump database
34
+ sudo "mysqldump #{database_name} > /tmp/db_dump.sql", :hosts => first_db_host
35
+ # Download dumped database
36
+ get_with_status "/tmp/db_dump.sql", "tmp/#{application}_#{stage}_dump.sql", :via => :scp, :hosts => first_db_host
37
+ # Delete dumped database from server
38
+ sudo "rm -rf /tmp/dump.sql", :hosts => first_db_host
39
+ if overwrite.to_s.downcase[0,1] == "y"
40
+ # Import data
41
+ system "mysql -u #{local_role} #{application}_development < tmp/#{application}_#{stage}_dump.sql"
42
+ end
43
+ end
44
+ end
45
+
@@ -5,7 +5,7 @@ namespace :newrelic do
5
5
 
6
6
  desc "Copy newrelic.yml"
7
7
  task :yml do
8
- run "ln -sf #{deploy_to}/shared/config/newrelic.yml #{release_path}/config/newrelic.yml"
8
+ run "ln -sf #{shared_path}/config/newrelic.yml #{release_path}/config/newrelic.yml"
9
9
  end
10
10
  end
11
11
 
@@ -19,6 +19,15 @@ namespace :deploy do
19
19
  sudo "/etc/init.d/httpd #{t}"
20
20
  end
21
21
  end
22
+
23
+ desc "Apache permissions (for passenger)"
24
+ task :apache_permissions do
25
+ unless $apache_permissions
26
+ sudo "chown -R #{httpd_user}:#{httpd_group} #{current_path}/"
27
+ sudo "chown -R #{httpd_user}:#{httpd_group} #{shared_path}/"
28
+ $apache_permissions = true
29
+ end
30
+ end
22
31
  end
23
32
 
24
33
  namespace :passenger do
@@ -26,7 +35,7 @@ namespace :passenger do
26
35
  task :install, :roles => :web do
27
36
  install_deps
28
37
  run "if ! (gem list | grep passenger | grep #{passenger_version}); then gem install passenger --no-rdoc --no-ri --version #{passenger_version} && passenger-install-apache2-module --auto; fi"
29
- sudo "rvm wrapper #{rvm_ruby_string} passenger" if defined?(:rvm_ruby_string) # sets up wrapper for passenger so it can find bundler etc...
38
+ sudo "rvm wrapper #{rvm_ruby_string} passenger" if respond_to?(:rvm_ruby_string) # sets up wrapper for passenger so it can find bundler etc...
30
39
  end
31
40
 
32
41
  task :install_deps, :roles => :web do
@@ -37,30 +46,38 @@ namespace :passenger do
37
46
  desc "Apache config files: uses special variables @DEPLOY_TO@ @IP_ADDR@ @SERVER_NAME@ @PASSENGER_ROOT@ @RUBY_ROOT@"
38
47
  task :config, :roles => :web do
39
48
  # You can set the following paths from your deploy.rb file, if needed.
40
- unless defined?(httpd_site_conf_path)
49
+ unless respond_to?(:httpd_site_conf_path)
41
50
  httpd_site_conf_path = "/etc/httpd/sites-enabled/010-#{application}-#{stage}.conf"
42
51
  end
43
- unless defined?(passenger_conf_path)
52
+ unless respond_to?(:passenger_conf_path)
44
53
  passenger_conf_path = "/etc/httpd/mods-enabled/passenger.conf"
45
54
  end
46
55
 
47
56
  if respond_to?(:rvm_ruby_string) # Deploying with RVM
48
- ruby_root = "/usr/local/rvm/wrappers/#{rvm_ruby_string}/ruby"
57
+ ruby_root = "/usr/local/rvm/wrappers/#{rvm_ruby_string}/ruby"
49
58
  passenger_root = "/usr/local/rvm/gems/#{rvm_ruby_string}/gems/passenger-#{passenger_version}"
50
59
  else # System Ruby
51
- ruby_root = capture("which ruby")
52
- passenger_root = capture("pass_path=`gem which phusion_passenger` && echo ${pass_path%/lib/phusion_passenger.rb}")
60
+ ruby_root = capture("which ruby").strip
61
+ gem_path = capture("ruby -r rubygems -e 'p Gem.path.detect{|p|p.include? \"/usr\"}'").strip.gsub('"','')
62
+ passenger_root = "#{gem_path}/gems/passenger-#{passenger_version}"
53
63
  end
54
- sed_args = "-e 's%@PASSENGER_ROOT@%#{passenger_root.strip}%g' -e 's%@RUBY_ROOT@%#{ruby_root.strip}%g'"
55
64
  # httpd conf
56
65
  sudo "cp -f #{release_path}/config/httpd-rails.conf #{httpd_site_conf_path}"
57
- sudo "sed -i -e 's%@DEPLOY_TO@%#{deploy_to}%g' -e 's%@IP_ADDR@%#{ip_address}%g' -e 's%@SERVER_NAME@%#{site_domain_name}%g' #{httpd_site_conf_path}"
66
+ sed httpd_site_conf_path, {"DEPLOY_TO" => deploy_to,
67
+ "IP_ADDR" => ip_address,
68
+ "SERVER_NAME" => site_domain_name,
69
+ "SITE_DOMAIN_NAME" => site_domain_name,
70
+ "HTTP_PORT" => http_port,
71
+ "HTTPS_PORT" => https_port}
58
72
  # passenger conf
59
73
  sudo "cp -f #{release_path}/config/passenger.conf #{passenger_conf_path}"
60
- sudo "sed -i #{sed_args} #{passenger_conf_path}"
74
+ sed passenger_conf_path, {"PASSENGER_ROOT" => passenger_root,
75
+ "RUBY_ROOT" => ruby_root}
61
76
  end
62
77
  end
63
78
 
64
79
  before "deploy:cold", "passenger:install"
65
80
  after "deploy:update_code", "passenger:config"
81
+ before "deploy:start", "deploy:apache_permissions"
82
+ before "deploy:restart", "deploy:apache_permissions"
66
83
 
@@ -1,6 +1,48 @@
1
- namespace :postgresql do
2
- task :symlink do
3
- sudo "ln -sf #{deploy_to}/shared/config/database.yml #{release_path}/config/database.yml"
1
+ namespace :db do
2
+ namespace :config do
3
+ desc "Create shared/config/database.yml"
4
+ task :setup do
5
+ puts "\n ** == Configuring config/database.yml (postgres) ...\n\n"
6
+ prompt_with_default("Database name", :db_name, "#{application}_#{stage}")
7
+ prompt_with_default("Database username", :db_username, application)
8
+ prompt_with_default("Database password", :db_password)
9
+ prompt_with_default("Database host", :db_host, "localhost")
10
+ prompt_with_default("Database port", :db_port, "5432")
11
+ database_yml = <<-EOF
12
+ production:
13
+ adapter: postgresql
14
+ host: #{db_host}
15
+ port: #{db_port}
16
+ database: #{db_name}
17
+ username: #{db_username}
18
+ password: #{db_password}
19
+ schema_search_path: public
20
+ encoding: utf8
21
+ template: template0
22
+ EOF
23
+ put database_yml, "#{shared_path}/config/database.yml"
24
+ end
25
+ end
26
+
27
+ desc "Download production database to local machine"
28
+ task :pull do
29
+ prompt_with_default("Database name", :dbname, "#{application}_#{stage}")
30
+ prompt_with_default("Database user", :username, "postgres")
31
+ prompt_with_default("Local role", :local_role, "postgres")
32
+ prompt_with_default("Overwrite local development db? (y/n)", :overwrite, "y")
33
+
34
+ # Dump database
35
+ sudo "pg_dump -U #{username} #{dbname} > /tmp/dump.sql", :hosts => first_db_host
36
+ # Download dumped database
37
+ get_with_status "/tmp/db_dump.sql", "tmp/#{application}_#{stage}_dump.sql", :via => :scp, :hosts => first_db_host
38
+ # Delete dumped database from server
39
+ sudo "rm -rf /tmp/db_dump.sql", :hosts => first_db_host
40
+ # Replace server db role with local role
41
+ system("sed -i s/#{application}/#{local_role}/g tmp/#{application}_#{stage}_dump.sql")
42
+ if overwrite.to_s.downcase[0,1] == "y"
43
+ # Import data
44
+ system("psql -d #{application}_development < tmp/#{application}_#{stage}_dump.sql")
45
+ end
4
46
  end
5
47
 
6
48
  desc "Start PostgreSQL"
@@ -24,27 +66,3 @@ namespace :postgresql do
24
66
  end
25
67
  end
26
68
 
27
- namespace :db do
28
- desc "Download production database to local machine"
29
- task :pull do
30
- prompt_with_default("Database", :dbname, "#{application}_#{default_stage}")
31
- prompt_with_default("Database user", :username, "postgres")
32
- prompt_with_default("Local role", :local_role, "postgres")
33
- prompt_with_default("Overwrite local db? (y/n)", :overwrite, "y")
34
- host = find_servers(:roles => :db).map(&:to_s).first
35
- run "pg_dump -U #{username} #{dbname} > /tmp/dump.sql", :hosts => host
36
- get "/tmp/dump.sql", "tmp/dump.sql", :via => :scp, :hosts => host do |channel, name, received, total|
37
- print "\r#{name}: #{(Float(received)/total*100).to_i}% complete"
38
- end
39
- run "rm -rf /tmp/dump.sql", :hosts => host
40
- `sed -i s/stockit/#{local_role}/g tmp/dump.sql`
41
- # Import data.
42
- if overwrite.to_s.downcase[0,1] == "y"
43
- `psql -d stockit_development < tmp/dump.sql`
44
- end
45
- end
46
- end
47
-
48
-
49
- after "deploy:update_code", "postgresql:symlink"
50
-
@@ -5,7 +5,7 @@ namespace :rvm do
5
5
  desc "Install rvm"
6
6
  task :install, :roles => :web do
7
7
  install_deps
8
- sudo "if ! (which rvm); then bash < <( curl http://rvm.beginrescueend.com/releases/rvm-install-head ); fi", :shell => 'sh'
8
+ sudo "if ! (which rvm); then bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) ); fi", :shell => 'sh'
9
9
  sudo "if ! (rvm list | grep #{rvm_ruby_string}); then rvm install #{rvm_ruby_string}; fi", :shell => 'sh'
10
10
  end
11
11
 
@@ -1,46 +1,88 @@
1
- require File.expand_path('../yum', __FILE__)
1
+ load File.join(File.dirname(__FILE__), 'yum.rb')
2
2
 
3
- # Installs minimal system software stack. Runs before "cap deploy:cold"
3
+ # Installs minimal system software stack. Runs before deploy:cold
4
+
5
+ before "deploy:cold", "stack:setup"
4
6
 
5
7
  namespace :stack do
6
8
  desc "Setup operating system and rails environment"
7
- task :default do
9
+ task :setup do
8
10
  yum.update
9
- yum.install( {:base => packages_for_project}, :stable ) if defined?(packages_for_project)
10
- install.bundler
11
+ yum.install({:base => yum_packages}, :stable ) if respond_to?(:yum_packages)
12
+ gemrc.setup
13
+ bundler.setup
11
14
  deploy.setup
12
15
  shared.setup
16
+ config.setup
17
+ db.config.setup if respond_to?(:db)
13
18
  shared.permissions
19
+ netrc.setup if needs_netrc?
20
+ ssh_key.setup if needs_ssh_key?
14
21
  end
15
- namespace :install do
22
+
23
+ namespace :bundler do
16
24
  desc "Install Bundler"
17
- task :bundler do
18
- run "gem install bundler --no-rdoc --no-ri"
25
+ task :setup do
26
+ run "gem install bundler"
19
27
  end
20
28
  end
21
29
  end
22
30
 
23
- namespace 'shared' do
31
+ namespace :shared do
24
32
  # This task can be extended by the application via an :after hook.
25
33
  desc "Setup shared directory"
26
34
  task :setup do
27
- sudo "mkdir -p #{deploy_to}/shared/config"
35
+ sudo "mkdir -p #{shared_path}/config"
28
36
  end
29
37
 
30
38
  desc "Set permissions on shared directory"
31
39
  task :permissions do
32
- sudo "chown -R #{httpd_user}:#{httpd_group} #{deploy_to}/shared/"
33
- sudo "chmod -R 755 #{deploy_to}/shared/"
40
+ sudo "chown -R #{httpd_user}:#{httpd_group} #{shared_path}/"
41
+ sudo "chmod -R 755 #{shared_path}/"
42
+ end
43
+ end
44
+
45
+ namespace :gemrc do
46
+ desc "Setup ~/.gemrc file to avoid rdoc and ri generation"
47
+ task :setup do
48
+ puts "\n ** == Configuring ~/.gemrc ...\n\n"
49
+ home_dir = capture("#{sudo} echo ~").strip
50
+ put "gem: --no-ri --no-rdoc", "#{home_dir}/.gemrc"
34
51
  end
35
52
  end
36
53
 
37
- namespace :deploy do
38
- desc "Check for project dependencies"
39
- task :check_dependencies, :roles => :db, :only => { :primary => true } do
40
- sudo "cd #{current_path} && RAILS_ENV=production rake check_dependencies"
54
+ namespace :netrc do
55
+ desc "Setup ~/.netrc file for internal git https auth"
56
+ task :setup do
57
+ if capture("ls ~/.netrc").strip == ""
58
+ puts "\n ** == Configuring ~/.netrc ..."
59
+ puts " ** (Enter 's' to skip this file.)\n\n"
60
+ prompt_with_default("Netrc Machine", :netrc_machine, "svn.globalhand.org")
61
+ if netrc_machine == "s"
62
+ puts "\n ** ! Skipping ~/.netrc\n\n"
63
+ else
64
+ prompt_with_default("Netrc Login", :netrc_login, "")
65
+ prompt_with_default("Netrc Password", :netrc_password, "")
66
+ netrc = <<-EOF
67
+ machine #{netrc_machine}
68
+ login #{netrc_login}
69
+ password #{netrc_password}
70
+ EOF
71
+ home_dir = capture("#{sudo} echo ~").strip
72
+ put netrc, "#{home_dir}/.netrc"
73
+ end
74
+ else
75
+ puts "\n ** == ~/.netrc already exists!\n\n"
76
+ end
41
77
  end
42
78
  end
43
79
 
44
- before "deploy:cold", "stack"
45
- after "deploy:check", "deploy:check_dependencies"
80
+ namespace :ssh_key do
81
+ desc "Generate ssh key for adding to GitHub public keys, etc."
82
+ task :setup do
83
+ puts "\n If capistrano stops here then paste the following key into GitHub and"
84
+ puts " run \"cap deploy:cold\" again\n\n"
85
+ run " if ! (ls $HOME/.ssh/id_rsa); then (ssh-keygen -N '' -t rsa -q -f $HOME/.ssh/id_rsa && cat $HOME/.ssh/id_rsa.pub) && exit 1; fi"
86
+ end
87
+ end
46
88
 
@@ -2,7 +2,7 @@ namespace :ts do
2
2
 
3
3
  desc "Links the sphinx database files by inserting magic code"
4
4
  task :symlink do
5
- run "sed -i 's,@DEPLOY_TO@,#{deploy_to},g' #{release_path}/script/link_sphinx.rb"
5
+ sed "#{release_path}/script/link_sphinx.rb", {"DEPLOY_TO" => "shared"}
6
6
  run "#{release_path}/script/runner -e production #{release_path}/script/link_sphinx.rb"
7
7
  end
8
8
 
@@ -19,7 +19,7 @@ namespace :ts do
19
19
  desc "Start sphinx"
20
20
  task :start do
21
21
  run "cd #{current_path} && RAILS_ENV=production rake ts:start"
22
- run "chown #{httpd_user}:#{httpd_group} #{deploy_to}/shared/log/searchd.production.pid"
22
+ run "chown #{httpd_user}:#{httpd_group} #{shared_path}/log/searchd.production.pid"
23
23
  end
24
24
 
25
25
  desc "Restart sphinx"
@@ -31,7 +31,7 @@ namespace :ts do
31
31
  desc "Stop sphinx, delete index files, reindex, and restart sphinx (last resort)"
32
32
  task :recover do
33
33
  stop
34
- run "cd #{deploy_to}/shared/db/sphinx/ && rm -rf production"
34
+ run "cd #{shared_path}/db/sphinx/ && rm -rf production"
35
35
  run "cd #{current_path} && RAILS_ENV=production rake ts:in"
36
36
  start
37
37
  end
@@ -42,7 +42,7 @@ are stale and need removing with ts:recover. Run this command a few times over a
42
42
  a minute to determine if the files disappear - indicating a successfully completed rotation \
43
43
  and no need for recovery."""
44
44
  task :recovery_required? do
45
- run "if [ x`find #{deploy_to}/shared/db/sphinx/production/ -name \*.new.\* | wc -l` == x\"0\" ]; then echo \"Sphinx indexes look intact. Run ts:in to regenerate.\"; else echo \"Sphinx index files *may* be stale. Wait 1 minute and run this command again. Consider running ts:recover if this message appears again\"; fi"
45
+ run "if [ x`find #{shared_path}/db/sphinx/production/ -name \*.new.\* | wc -l` == x\"0\" ]; then echo \"Sphinx indexes look intact. Run ts:in to regenerate.\"; else echo \"Sphinx index files *may* be stale. Wait 1 minute and run this command again. Consider running ts:recover if this message appears again\"; fi"
46
46
  end
47
47
 
48
48
  end
@@ -14,14 +14,6 @@ namespace :deploy do
14
14
  sudo "chown -R #{user} #{deploy_to}"
15
15
  $apache_permissions = false
16
16
  end
17
- desc "Apache permissions (for passenger)"
18
- task :apache_permissions do
19
- unless $apache_permissions
20
- sudo "chown -R #{httpd_user}:#{httpd_group} #{current_path}/"
21
- sudo "chown -R #{httpd_user}:#{httpd_group} #{deploy_to}/shared/"
22
- $apache_permissions = true
23
- end
24
- end
25
17
 
26
18
  desc "Set permissions on releases directory so old releases can be removed"
27
19
  task :release_permissions do
@@ -36,6 +28,5 @@ end
36
28
  after t, "deploy:apache_permissions"
37
29
  end
38
30
 
39
- before "deploy:restart", "deploy:apache_permissions"
40
31
  before "deploy:cleanup", "deploy:release_permissions"
41
32
 
@@ -9,3 +9,5 @@ namespace :deploy do
9
9
  end
10
10
  end
11
11
 
12
+ after "deploy:symlink", "deploy:update_crontab"
13
+
@@ -6,14 +6,9 @@ require 'capistrano'
6
6
  #
7
7
  # Installs within Capistrano as the plugin _yum_.
8
8
  #
9
- # =Usage
10
- #
11
- # require 'recipes/yum'
12
- #
13
9
  # Prefix all calls to the library with <tt>yum.</tt>
14
10
  #
15
11
  module Yum
16
-
17
12
  # Default yum command - reduces any interactivity to the minimum.
18
13
  YUM_COMMAND="yum -y"
19
14
 
@@ -64,3 +59,12 @@ private
64
59
  end
65
60
 
66
61
  Capistrano.plugin :yum, Yum
62
+
63
+ desc "Takes a list of yum packages and determines if they need updating. This is useful for determining whether to apply security updates."
64
+ task :list_installed_yum_packages do
65
+ prompt_with_default("Enter comma seperated list of yum pacakges (e.g. qspice, lftp).\nIf you leave this blank then it will list all installed packages:", :packages, "")
66
+ packages.gsub!(/,\s*/, "\\|")
67
+ sudo "yum -C list | grep '#{packages}' | grep installed"
68
+ puts "The packages listed above are installed on the system"
69
+ end
70
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crossroads_capistrano
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.4.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-05-20 00:00:00.000000000 +08:00
14
+ date: 2011-05-25 00:00:00.000000000 +08:00
15
15
  default_executable:
16
16
  dependencies: []
17
17
  description: A Crossroads Foundation collection of generic capistrano recipes.
@@ -27,22 +27,23 @@ files:
27
27
  - Rakefile
28
28
  - crossroads_capistrano.gemspec
29
29
  - lib/crossroads_capistrano.rb
30
+ - lib/crossroads_capistrano/recipes/base.rb
30
31
  - lib/crossroads_capistrano/recipes/cache.rb
31
- - lib/crossroads_capistrano/recipes/defaults.rb
32
+ - lib/crossroads_capistrano/recipes/config.rb
32
33
  - lib/crossroads_capistrano/recipes/delayed_job.rb
33
- - lib/crossroads_capistrano/recipes/deploy_permissions.rb
34
+ - lib/crossroads_capistrano/recipes/helper_methods.rb
34
35
  - lib/crossroads_capistrano/recipes/hoptoad.rb
35
36
  - lib/crossroads_capistrano/recipes/ldap.rb
36
37
  - lib/crossroads_capistrano/recipes/log.rb
38
+ - lib/crossroads_capistrano/recipes/mysql.rb
37
39
  - lib/crossroads_capistrano/recipes/newrelic.rb
38
40
  - lib/crossroads_capistrano/recipes/passenger.rb
39
41
  - lib/crossroads_capistrano/recipes/postgresql.rb
40
- - lib/crossroads_capistrano/recipes/prompt.rb
41
42
  - lib/crossroads_capistrano/recipes/revisions.rb
42
43
  - lib/crossroads_capistrano/recipes/rvm.rb
43
- - lib/crossroads_capistrano/recipes/shared_config.rb
44
44
  - lib/crossroads_capistrano/recipes/stack.rb
45
45
  - lib/crossroads_capistrano/recipes/thinking_sphinx.rb
46
+ - lib/crossroads_capistrano/recipes/user_permissions.rb
46
47
  - lib/crossroads_capistrano/recipes/whenever.rb
47
48
  - lib/crossroads_capistrano/recipes/yum.rb
48
49
  has_rdoc: true
@@ -1,27 +0,0 @@
1
- # These default recipes are always loaded unless otherwise specified
2
-
3
- # Default recipes
4
- # ---------------------------------------------------------
5
- load File.join(File.dirname(__FILE__), "prompt.rb")
6
-
7
-
8
- # Default settings
9
- # ---------------------------------------------------------
10
- set :default_stage, "preview"
11
-
12
- set :scm, :git
13
- set :deploy_via, :remote_cache
14
- set :keep_releases, 3
15
-
16
- set :bundle_without, [:cucumber, :development, :test]
17
-
18
- set :httpd_user, "apache"
19
- set :httpd_group, "apache"
20
-
21
- default_run_options[:pty] = true
22
-
23
-
24
- # Default hooks
25
- # ---------------------------------------------------------
26
- after "deploy:restart", "deploy:cleanup"
27
-
@@ -1,12 +0,0 @@
1
- # Helper function which prompts for user input, if none selected the returned
2
- # variable is set to the default.
3
- # 'prompt' -> user prompt
4
- # 'var' -> variable
5
- # 'default' -> default value set if no user input is received.
6
-
7
- def prompt_with_default(prompt, var, default)
8
- set(var) do
9
- Capistrano::CLI.ui.ask "#{prompt} [#{default}]: "
10
- end
11
- set var, default if eval("#{var.to_s}.empty?")
12
- end
@@ -1,9 +0,0 @@
1
- namespace :deploy do
2
- desc "Symlink Shared config files into release path."
3
- task :symlink_config do
4
- run "ln -sf #{shared_path}/config/*.yml #{release_path}/config/"
5
- end
6
- end
7
-
8
- before "deploy:symlink", "deploy:symlink_config"
9
-