crossroads_capistrano 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.textile +18 -0
- data/Rakefile +2 -0
- data/crossroads_capistrano.gemspec +20 -0
- data/lib/crossroads_capistrano.rb +17 -0
- data/lib/crossroads_capistrano/delayed_job.rb +21 -0
- data/lib/crossroads_capistrano/log.rb +12 -0
- data/lib/crossroads_capistrano/newrelic.rb +14 -0
- data/lib/crossroads_capistrano/passenger.rb +49 -0
- data/lib/crossroads_capistrano/postgresql.rb +29 -0
- data/lib/crossroads_capistrano/prompt.rb +12 -0
- data/lib/crossroads_capistrano/rvm.rb +17 -0
- data/lib/crossroads_capistrano/stack.rb +57 -0
- data/lib/crossroads_capistrano/whenever.rb +12 -0
- data/lib/crossroads_capistrano/yum.rb +66 -0
- metadata +82 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.textile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
h1. Crossroads Capistrano
|
2
|
+
|
3
|
+
A "Crossroads":http://www.crossroads.org.hk specific set of generic capistrano recipes.
|
4
|
+
|
5
|
+
This gem can be included in all our rails apps that use Capistrano.
|
6
|
+
|
7
|
+
h3. Usage
|
8
|
+
|
9
|
+
Add the following to your project's *Gemfile* :
|
10
|
+
|
11
|
+
bc. gem 'crossroads_capistrano', :git => 'http://github.com/crossroads/crossroads_capistrano.git'
|
12
|
+
|
13
|
+
Add the following to your project's *config/deploy.rb* :
|
14
|
+
|
15
|
+
bc. require 'crossroads_capistrano'
|
16
|
+
CrossroadsCapistrano.load_recipes %w(prompt stack rvm passenger postgresql newrelic log)
|
17
|
+
# or ..
|
18
|
+
CrossroadsCapistrano.load_recipes :all
|
data/Rakefile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "crossroads_capistrano"
|
6
|
+
s.version = "1.1.0"
|
7
|
+
s.platform = Gem::Platform::RUBY
|
8
|
+
s.authors = ["Steve Kenworthy", "Ben Tillman", "Nathan Broadbent"]
|
9
|
+
s.email = ["it_dept@crossroads.org.hk"]
|
10
|
+
s.homepage = "http://www.crossroads.org.hk"
|
11
|
+
s.summary = %q{Crossroads capistrano recipes}
|
12
|
+
s.description = %q{A Crossroads Foundation collection of generic capistrano recipes.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "crossroads_capistrano"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CrossroadsCapistrano
|
2
|
+
@@cap_config = Capistrano::Configuration.instance(:must_exist)
|
3
|
+
class << self
|
4
|
+
def load_recipes(recipes)
|
5
|
+
@@cap_config.load do
|
6
|
+
if recipes == :all
|
7
|
+
# Load all available recipes.
|
8
|
+
Dir.glob(File.join(File.dirname(__FILE__), 'crossroads_capistrano', '*.rb')).each{|f| load f}
|
9
|
+
else
|
10
|
+
# Load each specified recipe.
|
11
|
+
recipes.each {|r| load File.join(File.dirname(__FILE__),'crossroads_capistrano',"#{r}.rb")}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
namespace :delayed_job do
|
2
|
+
desc "Stop the delayed_job process"
|
3
|
+
task :stop, :roles => :app do
|
4
|
+
run "cd #{current_path}; RAILS_ENV=production script/delayed_job stop"
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Start the delayed_job process"
|
8
|
+
task :start, :roles => :app do
|
9
|
+
run "cd #{current_path}; RAILS_ENV=production script/delayed_job start"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Restart the delayed_job process"
|
13
|
+
task :restart, :roles => :app do
|
14
|
+
run "cd #{current_path}; RAILS_ENV=production script/delayed_job restart"
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "delayed_job status"
|
18
|
+
task :status, :roles => :app do
|
19
|
+
run "ps aux | grep 'delayed_job'"
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
namespace :log do
|
2
|
+
|
3
|
+
desc "tail production log files"
|
4
|
+
task :tail, :roles => :app do
|
5
|
+
run "tail -f #{shared_path}/log/production.log" do |channel, stream, data|
|
6
|
+
puts # for an extra line break before the host name
|
7
|
+
puts "#{channel[:host]}: #{data}"
|
8
|
+
break if stream == :err
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
namespace :newrelic do
|
2
|
+
|
3
|
+
task :default do
|
4
|
+
newrelic.yml
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Copy newrelic.yml"
|
8
|
+
task :yml do
|
9
|
+
run "ln -sf #{deploy_to}/shared/config/newrelic.yml #{release_path}/config/newrelic.yml"
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
before "deploy:symlink", "newrelic:yml"
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#
|
2
|
+
# Adds passenger tasks to deploy stack
|
3
|
+
#
|
4
|
+
# Ensure the following variables are set in your deploy.rb
|
5
|
+
# - set :ip_address, "127.0.0.1"
|
6
|
+
# - set :site_domain_name, "www.example.com"
|
7
|
+
# - set :passenger_version, "3.0.0"
|
8
|
+
#
|
9
|
+
# And that the following files exist:
|
10
|
+
#
|
11
|
+
# config/httpd-rails.conf
|
12
|
+
# config/passenger.conf
|
13
|
+
#
|
14
|
+
|
15
|
+
namespace :deploy do
|
16
|
+
|
17
|
+
%w(start stop restart reload).each do |t|
|
18
|
+
desc "#{t.capitalize} passenger using httpd"
|
19
|
+
task "#{t.to_sym}", :roles => :app, :except => { :no_release => true } do
|
20
|
+
run "/etc/init.d/httpd #{t}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
namespace :passenger do
|
27
|
+
|
28
|
+
desc "Install Passenger"
|
29
|
+
task :install, :roles => :web do
|
30
|
+
install_deps
|
31
|
+
|
32
|
+
run "gem install passenger --no-rdoc --no-ri --version #{passenger_version}"
|
33
|
+
run "passenger-install-apache2-module --auto"
|
34
|
+
end
|
35
|
+
|
36
|
+
task :install_deps, :roles => :web do
|
37
|
+
yum.install( {:base => %w(curl-devel httpd-devel apr-devel)}, :stable )
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Apache config files"
|
41
|
+
task :config, :roles => :web do
|
42
|
+
run "sed -e 's,@DEPLOY_TO@,#{deploy_to},g' -e 's,@IP_ADDR@,#{ip_address},g' -e 's,@SERVER_NAME@,#{site_domain_name},g' #{release_path}/config/httpd-rails.conf > /etc/httpd/sites-enabled/010-#{application}-#{stage}.conf"
|
43
|
+
run "sed -e 's,@RVM_RUBY_STRING@,#{rvm_ruby_string},g' -e 's,@PASSENGER_VERSION@,#{passenger_version},g' #{release_path}/config/passenger.conf > /etc/httpd/mods-enabled/passenger.conf"
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
before "deploy:cold", "passenger:install"
|
49
|
+
after "deploy:update_code", "passenger:config"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
namespace :postgresql do
|
2
|
+
|
3
|
+
task :symlink do
|
4
|
+
sudo "ln -sf #{deploy_to}/shared/config/database.yml #{release_path}/config/database.yml"
|
5
|
+
end
|
6
|
+
|
7
|
+
desc "Start PostgreSQL"
|
8
|
+
task :start, :roles => :db do
|
9
|
+
send(run_method, "/etc/init.d/postgresql start")
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Stop PostgreSQL"
|
13
|
+
task :stop, :roles => :db do
|
14
|
+
send(run_method, "/etc/init.d/postgresql stop")
|
15
|
+
end
|
16
|
+
|
17
|
+
desc "Restart PostgreSQL"
|
18
|
+
task :restart, :roles => :db do
|
19
|
+
send(run_method, "/etc/init.d/postgresql restart")
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Reload PostgreSQL"
|
23
|
+
task :reload, :roles => :db do
|
24
|
+
send(run_method, "/etc/init.d/postgresql reload")
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
after "deploy:update_code", "postgresql:symlink"
|
@@ -0,0 +1,12 @@
|
|
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
|
@@ -0,0 +1,17 @@
|
|
1
|
+
namespace :rvm do
|
2
|
+
|
3
|
+
desc "Install rvm"
|
4
|
+
task :install, :roles => :web do
|
5
|
+
install_deps
|
6
|
+
|
7
|
+
#~ run "if ! (which rvm); then curl -L http://bit.ly/rvm-install-system-wide | bash; fi"
|
8
|
+
run "if ! (rvm list | grep #{rvm_ruby_string}); then rvm install #{rvm_ruby_string}; fi"
|
9
|
+
end
|
10
|
+
|
11
|
+
task :install_deps, :roles => :web do
|
12
|
+
yum.install( {:base => %w(curl git gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel)}, :stable )
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
before "deploy:cold", "rvm:install"
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.expand_path('../yum', __FILE__)
|
2
|
+
|
3
|
+
#
|
4
|
+
# Capistrano recipes for cold deployments
|
5
|
+
#
|
6
|
+
# Usage (add the following to your deploy.rb):
|
7
|
+
#
|
8
|
+
# load 'recipes/stack'
|
9
|
+
# set :gems_for_project, ""
|
10
|
+
# ...
|
11
|
+
#
|
12
|
+
# Then just run "cap deploy:cold" and this stack will hook into it
|
13
|
+
#
|
14
|
+
|
15
|
+
namespace :stack do
|
16
|
+
|
17
|
+
# Override this if you don't want particular stack items
|
18
|
+
desc "Setup operating system and rails environment"
|
19
|
+
task :default do
|
20
|
+
yum.update
|
21
|
+
yum.install( {:base => packages_for_project}, :stable ) if packages_for_project
|
22
|
+
gems
|
23
|
+
|
24
|
+
deploy.setup
|
25
|
+
shared.setup
|
26
|
+
end
|
27
|
+
|
28
|
+
desc "Install required gems"
|
29
|
+
task :gems do
|
30
|
+
run "gem install #{gems_for_project} --no-rdoc --no-ri"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
namespace 'shared' do
|
36
|
+
|
37
|
+
desc "Setup shared directory"
|
38
|
+
task :setup do
|
39
|
+
sudo "mkdir -p #{deploy_to}/shared/config"
|
40
|
+
end
|
41
|
+
|
42
|
+
desc "Setting proper permissions on shared directory"
|
43
|
+
task :permissions do
|
44
|
+
run "chown -R apache:apache #{deploy_to}/shared/"
|
45
|
+
#~ run "chmod -R 755 #{deploy_to}/shared/"
|
46
|
+
# during deployments
|
47
|
+
run "if [ -d #{release_path}/ ]; then chown -R apache:apache #{release_path}/; fi"
|
48
|
+
run "if [ -d #{release_path}/ ]; then chmod -R 755 #{release_path}/; fi"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Hooks
|
55
|
+
#
|
56
|
+
before "deploy:cold", "stack"
|
57
|
+
before "deploy:symlink", "shared:permissions"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#
|
2
|
+
# Updates the crontab using wheneverize
|
3
|
+
#
|
4
|
+
|
5
|
+
after "deploy:symlink", "deploy:update_crontab"
|
6
|
+
|
7
|
+
namespace :deploy do
|
8
|
+
desc "Update the crontab file"
|
9
|
+
task :update_crontab, :roles => :db do
|
10
|
+
run "cd #{current_path} && bundle exec whenever --update-crontab #{application}"
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
# = Purpose
|
4
|
+
# yum is a Capistrano plugin module providing a set of methods
|
5
|
+
# that invoke the *yum* package manager (as used in Centos)
|
6
|
+
#
|
7
|
+
# Installs within Capistrano as the plugin _yum_.
|
8
|
+
#
|
9
|
+
# =Usage
|
10
|
+
#
|
11
|
+
# require 'recipes/yum'
|
12
|
+
#
|
13
|
+
# Prefix all calls to the library with <tt>yum.</tt>
|
14
|
+
#
|
15
|
+
module Yum
|
16
|
+
|
17
|
+
# Default yum command - reduces any interactivity to the minimum.
|
18
|
+
YUM_COMMAND="yum -y"
|
19
|
+
|
20
|
+
# Run the yum install program across the package list in 'packages'.
|
21
|
+
# Select those packages referenced by <tt>:base</tt> and the +version+
|
22
|
+
# of the distribution you want to use.
|
23
|
+
def install(packages, version, options={})
|
24
|
+
special_options = options[:repositories].collect { |repository| " --enablerepo=#{repository}"} if (options && options[:repositories].is_a?(Array))
|
25
|
+
send(run_method, %{
|
26
|
+
sh -c "#{YUM_COMMAND} #{special_options.to_s} install #{package_list(packages, version)}"
|
27
|
+
}, options)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Run a yum clean
|
31
|
+
def clean(options={})
|
32
|
+
send(run_method, %{sh -c "#{YUM_COMMAND} -qy clean"}, options)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Run a yum autoclean
|
36
|
+
def autoclean(options={})
|
37
|
+
send(run_method, %{sh -c "#{YUM_COMMAND} -qy autoclean"}, options)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Run a yum distribution upgrade
|
41
|
+
def dist_upgrade(options={})
|
42
|
+
send(run_method, %{sh -c "#{YUM_COMMAND} -qy dist-upgrade"}, options)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Run a yum upgrade. Use dist_upgrade instead if you want to upgrade
|
46
|
+
# the critical base packages.
|
47
|
+
def upgrade(options={})
|
48
|
+
send(run_method, %{sh -c "#{YUM_COMMAND} -qy upgrade"}, options)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Run a yum update.
|
52
|
+
def update(options={})
|
53
|
+
send(run_method, %{sh -c "#{YUM_COMMAND} -qy update"}, options)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# Provides a string containing all the package names in the base
|
59
|
+
#list plus those in +version+.
|
60
|
+
def package_list(packages, version)
|
61
|
+
packages[:base].to_a.join(' ') + ' ' + packages[version].to_a.join(' ')
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
Capistrano.plugin :yum, Yum
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: crossroads_capistrano
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 1.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Steve Kenworthy
|
13
|
+
- Ben Tillman
|
14
|
+
- Nathan Broadbent
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-01-22 00:00:00 +08:00
|
20
|
+
default_executable:
|
21
|
+
dependencies: []
|
22
|
+
|
23
|
+
description: A Crossroads Foundation collection of generic capistrano recipes.
|
24
|
+
email:
|
25
|
+
- it_dept@crossroads.org.hk
|
26
|
+
executables: []
|
27
|
+
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
32
|
+
files:
|
33
|
+
- .gitignore
|
34
|
+
- Gemfile
|
35
|
+
- README.textile
|
36
|
+
- Rakefile
|
37
|
+
- crossroads_capistrano.gemspec
|
38
|
+
- lib/crossroads_capistrano.rb
|
39
|
+
- lib/crossroads_capistrano/delayed_job.rb
|
40
|
+
- lib/crossroads_capistrano/log.rb
|
41
|
+
- lib/crossroads_capistrano/newrelic.rb
|
42
|
+
- lib/crossroads_capistrano/passenger.rb
|
43
|
+
- lib/crossroads_capistrano/postgresql.rb
|
44
|
+
- lib/crossroads_capistrano/prompt.rb
|
45
|
+
- lib/crossroads_capistrano/rvm.rb
|
46
|
+
- lib/crossroads_capistrano/stack.rb
|
47
|
+
- lib/crossroads_capistrano/whenever.rb
|
48
|
+
- lib/crossroads_capistrano/yum.rb
|
49
|
+
has_rdoc: true
|
50
|
+
homepage: http://www.crossroads.org.hk
|
51
|
+
licenses: []
|
52
|
+
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
version: "0"
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project: crossroads_capistrano
|
77
|
+
rubygems_version: 1.3.7
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Crossroads capistrano recipes
|
81
|
+
test_files: []
|
82
|
+
|