capper 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/capper.gemspec CHANGED
@@ -2,14 +2,14 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "capper"
5
- s.version = "0.7.3"
5
+ s.version = "0.8.0"
6
6
  s.platform = Gem::Platform::RUBY
7
7
  s.licenses = ["MIT"]
8
8
  s.authors = ["Benedikt Böhm"]
9
9
  s.email = ["bb@xnull.de"]
10
- s.homepage = "http://github.com/hollow/capper"
11
- s.summary = %q{Capistrano is a collection of opinionated Capistrano recipes}
12
- s.description = %q{Capistrano is a collection of opinionated Capistrano recipes}
10
+ s.homepage = "http://github.com/zenops/capper"
11
+ s.summary = %q{Capper is a collection of opinionated Capistrano recipes}
12
+ s.description = %q{Capper is a collection of opinionated Capistrano recipes}
13
13
 
14
14
  s.add_dependency "erubis"
15
15
  s.add_dependency "capistrano"
data/lib/capper.rb ADDED
@@ -0,0 +1,16 @@
1
+ # mixin various helpers
2
+ require 'capper/utils/templates'
3
+ include Capper::Utils::Templates
4
+
5
+ require 'capper/utils/multistage'
6
+ include Capper::Utils::Multistage
7
+
8
+ require 'capper/utils/monit'
9
+ include Capper::Utils::Monit
10
+
11
+ # make sure capper recipes can be found by load() too
12
+ Capistrano::Configuration.instance(true).load do
13
+ load_paths << File.expand_path(File.dirname(__FILE__))
14
+ load 'deploy'
15
+ load 'capper/base'
16
+ end
data/lib/capper/base.rb CHANGED
@@ -1,94 +1,79 @@
1
- require 'capistrano'
2
-
3
- unless Capistrano::Configuration.respond_to?(:instance)
4
- abort "capper requires Capistrano 2"
5
- end
6
-
7
- # mixin various helpers
1
+ # add custom color scheme
8
2
  require 'capistrano_colors/configuration'
9
3
  require 'capistrano_colors/logger'
10
4
 
11
- require 'capper/utils/load'
12
-
13
- require 'capper/utils/templates'
14
- include Capper::Utils::Templates
15
-
16
- require 'capper/utils/multistage'
17
- include Capper::Utils::Multistage
18
-
19
- require 'capper/utils/monit'
20
- include Capper::Utils::Monit
21
-
22
- # define a bunch of defaults that make sense
23
- Capper.load do
24
- # do not trace by default
25
- logger.level = Capistrano::Logger::DEBUG
26
-
27
- # add custom color scheme
28
- colorize([
29
- { :match => /executing `.*/, :color => :yellow, :level => 2, :prio => -10, :attribute => :bright, :prepend => "== Currently " },
30
- { :match => /executing ".*/, :color => :magenta, :level => 2, :prio => -20 },
31
- { :match => /sftp upload complete/, :color => :hide, :level => 2, :prio => -20 },
32
-
33
- { :match => /sftp upload/, :color => :hide, :level => 1, :prio => -10 },
34
- { :match => /^transaction:.*/, :color => :blue, :level => 1, :prio => -10, :attribute => :bright },
35
- { :match => /.*out\] (fatal:|ERROR:).*/, :color => :red, :level => 1, :prio => -10 },
36
- { :match => /Permission denied/, :color => :red, :level => 1, :prio => -20 },
37
- { :match => /sh: .+: command not found/, :color => :magenta, :level => 1, :prio => -30 },
38
-
39
- { :match => /^err ::/, :color => :red, :level => 0, :prio => -10 },
40
- { :match => /.*/, :color => :blue, :level => 0, :prio => -20, :attribute => :bright },
41
- ])
42
-
43
- # apps should not require root access
44
- set(:use_sudo, false)
45
- set(:group_writable, false)
46
-
47
- # default app layout
48
- _cset(:user) { application }
49
-
50
- _cset(:base_path) { "/var/app" }
51
- set(:deploy_to) { "#{base_path}/#{application}" }
52
-
53
- _cset(:bin_path) { File.join(deploy_to, "bin") }
54
- _cset(:pid_path) { File.join(shared_path, "pids") }
55
- _cset(:config_path) { File.join(shared_path, "config") }
56
-
57
- # set proper unicode locale, so gemspecs with unicode chars will not crash
58
- # bundler. see https://github.com/capistrano/capistrano/issues/70
59
- _cset(:default_environment, { 'LANG' => 'en_US.UTF-8' })
60
-
61
- # overwrite deploy:setup to get rid of the annoying chmod g+w which makes ssh
62
- # logins impossible
63
- namespace :deploy do
64
- desc <<-DESC
65
- Prepares one or more servers for deployment. Before you can use any \
66
- of the Capistrano deployment tasks with your project, you will need to \
67
- make sure all of your servers have been prepared with `cap deploy:setup'. When \
68
- you add a new server to your cluster, you can easily run the setup task \
69
- on just that server by specifying the HOSTS environment variable:
70
-
71
- $ cap HOSTS=new.server.com deploy:setup
72
-
73
- It is safe to run this task on servers that have already been set up; it \
74
- will not destroy any deployed revisions or data.
75
- DESC
76
- task :setup, :except => { :no_release => true } do
77
- shared = %w(system log pids) | shared_children
78
- dirs = [releases_path, shared_path]
79
- dirs += shared.map { |d| File.join(shared_path, d) }
80
- run "mkdir -p #{dirs.join(' ')}"
81
- end
5
+ colorize([
6
+ { :match => /executing `multistage.*/, :color => :hide, :level => 2, :prio => 0 },
7
+ { :match => /executing `.*/, :color => :yellow, :level => 2, :prio => -10, :attribute => :bright, :prepend => "== Currently " },
8
+ { :match => /executing ".*/, :color => :magenta, :level => 2, :prio => -20 },
9
+ { :match => /sftp upload complete/, :color => :hide, :level => 2, :prio => -20 },
10
+
11
+ { :match => /sftp upload/, :color => :hide, :level => 1, :prio => -10 },
12
+ { :match => /^transaction:.*/, :color => :blue, :level => 1, :prio => -10, :attribute => :bright },
13
+ { :match => /.*out\] (fatal:|ERROR:).*/, :color => :red, :level => 1, :prio => -10 },
14
+ { :match => /Permission denied/, :color => :red, :level => 1, :prio => -20 },
15
+ { :match => /sh: .+: command not found/, :color => :magenta, :level => 1, :prio => -30 },
16
+
17
+ { :match => /^err ::/, :color => :red, :level => 0, :prio => -10 },
18
+ { :match => /.*/, :color => :blue, :level => 0, :prio => -20, :attribute => :bright },
19
+ ])
20
+
21
+ # do not trace by default
22
+ logger.level = Capistrano::Logger::DEBUG
23
+
24
+ # default app layout
25
+ _cset(:user) { application }
26
+
27
+ _cset(:base_path) { "/var/app" }
28
+ set(:deploy_to) { "#{base_path}/#{application}" }
29
+
30
+ _cset(:bin_path) { File.join(deploy_to, "bin") }
31
+ _cset(:pid_path) { File.join(shared_path, "pids") }
32
+ _cset(:config_path) { File.join(shared_path, "config") }
33
+
34
+ # apps should not require root access
35
+ set(:use_sudo, false)
36
+ set(:group_writable, false)
37
+
38
+ # set proper unicode locale, so gemspecs with unicode chars will not crash
39
+ # bundler. see https://github.com/capistrano/capistrano/issues/70
40
+ _cset(:default_environment, { 'LANG' => 'en_US.UTF-8' })
41
+
42
+ # set a global (empty) prefix for ruby applications so that
43
+ # other recipes (bundler) can override it (with bundle exec)
44
+ _cset(:ruby_exec_prefix, "")
45
+ set(:rake) { "#{ruby_exec_prefix} rake" }
46
+
47
+ # cleanup by default
48
+ after "deploy:update", "deploy:cleanup"
49
+ after "deploy:update_code", "deploy:symlink_shared"
50
+
51
+ # overwrite deploy:setup to get rid of the annoying chmod g+w which makes ssh
52
+ # logins impossible
53
+ namespace :deploy do
54
+ desc <<-DESC
55
+ Prepares one or more servers for deployment. Before you can use any \
56
+ of the Capistrano deployment tasks with your project, you will need to \
57
+ make sure all of your servers have been prepared with `cap deploy:setup'. When \
58
+ you add a new server to your cluster, you can easily run the setup task \
59
+ on just that server by specifying the HOSTS environment variable:
60
+
61
+ $ cap HOSTS=new.server.com deploy:setup
62
+
63
+ It is safe to run this task on servers that have already been set up; it \
64
+ will not destroy any deployed revisions or data.
65
+ DESC
66
+ task :setup, :except => { :no_release => true } do
67
+ shared = %w(system log pids) | shared_children
68
+ dirs = [releases_path, shared_path]
69
+ dirs += shared.map { |d| File.join(shared_path, d) }
70
+ run "mkdir -p #{dirs.join(' ')}"
71
+ end
82
72
 
83
- desc "Create symlinks from shared to current"
84
- task :symlink_shared, :roles => :app, :except => { :no_release => true } do
85
- fetch(:symlinks, {}).each do |source, dest|
86
- run "rm -rf #{release_path}/#{dest} && ln -nfs #{shared_path}/#{source} #{release_path}/#{dest}"
87
- end
73
+ desc "Create symlinks from shared to current"
74
+ task :symlink_shared, :roles => :app, :except => { :no_release => true } do
75
+ fetch(:symlinks, {}).each do |source, dest|
76
+ run "rm -rf #{release_path}/#{dest} && ln -nfs #{shared_path}/#{source} #{release_path}/#{dest}"
88
77
  end
89
78
  end
90
-
91
- # cleanup by default
92
- after "deploy:update", "deploy:cleanup"
93
- after "deploy:update_code", "deploy:symlink_shared"
94
79
  end
@@ -1,29 +1,29 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
2
1
  require 'bundler/capistrano'
3
2
 
4
- # bundler requires rvm
5
- require "capper/rvm"
3
+ # use bundle exec for all ruby programs
4
+ set(:ruby_exec_prefix, "bundle exec")
6
5
 
7
- Capper.load do
8
- # always execute rake with bundler to make sure we use the right version
9
- set(:rake, "bundle exec rake")
6
+ # do not install a global bundle if rvm has been enabled
7
+ # instead, use the gemset selected by rvm_ruby_string
8
+ set(:bundle_dir) do
9
+ begin
10
+ File.join(shared_path, 'bundle', rvm_ruby_string)
11
+ rescue NoMethodError
12
+ File.join(shared_path, 'bundle')
13
+ end
14
+ end
10
15
 
11
- # do not install a global bundle
12
- # instead, use the gemset selected by rvm_ruby_string
13
- set(:bundle_dir) { File.join(shared_path, 'bundle', rvm_ruby_string) }
16
+ # freeze bundler version
17
+ _cset(:bundler_version, "1.0.17")
14
18
 
15
- # freeze bundler version
16
- _cset(:bundler_version, "1.0.17")
19
+ before "bundle:install", "bundle:setup"
17
20
 
18
- namespace :bundle do
19
- desc "Setup bundler"
20
- task :setup, :except => {:no_release => true} do
21
- run "if ! gem query -i -n ^bundler$ -v #{bundler_version} >/dev/null; then " +
22
- "gem install bundler -v #{bundler_version}; " +
23
- "fi"
24
- run "mkdir -p #{bundle_dir}"
25
- end
21
+ namespace :bundle do
22
+ desc "Setup bundler"
23
+ task :setup, :except => {:no_release => true} do
24
+ run "if ! gem query -i -n ^bundler$ -v #{bundler_version} >/dev/null; then " +
25
+ "gem install bundler -v #{bundler_version}; " +
26
+ "fi"
27
+ run "mkdir -p #{bundle_dir}"
26
28
  end
27
-
28
- before "bundle:install", "bundle:setup"
29
29
  end
data/lib/capper/config.rb CHANGED
@@ -1,26 +1,24 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ _cset(:config_repo, nil)
2
2
 
3
- Capper.load do
4
- _cset(:config_repo, nil)
3
+ after "deploy:setup", "config:setup"
4
+ after "deploy:update_code", "config:deploy"
5
5
 
6
- after "deploy:setup" do
6
+ namespace :config do
7
+ desc "Setup configuration repository if any"
8
+ task :setup, :roles => :app, :except => { :no_release => true } do
7
9
  unless config_repo.nil?
8
10
  run "rm -rf #{config_path} && git clone -q #{config_repo} #{config_path}"
9
11
  end
10
12
  end
11
13
 
12
- namespace :config do
13
- desc "Setup configuration files from config repo"
14
- task :setup, :roles => :app, :except => { :no_release => true } do
15
- unless config_repo.nil?
16
- run "cd #{config_path} && git pull -q"
17
- end
14
+ desc "Deploy config files from shared/config to current release"
15
+ task :deploy, :roles => :app, :except => { :no_release => true } do
16
+ unless config_repo.nil?
17
+ run "cd #{config_path} && git pull -q"
18
+ end
18
19
 
19
- fetch(:config_files, []).each do |f|
20
- run "cp #{config_path}/#{f} #{release_path}/config/"
21
- end
20
+ fetch(:config_files, []).each do |f|
21
+ run "cp #{config_path}/#{f} #{release_path}/config/"
22
22
  end
23
23
  end
24
-
25
- after "deploy:update_code", "config:setup"
26
24
  end
@@ -1,45 +1,40 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ load 'capper/monit'
2
2
 
3
- require 'capper/bundler'
4
- require 'capper/monit'
3
+ # configuration variables
4
+ _cset(:delayed_job_workers, {})
5
5
 
6
- Capper.load do
7
- # configuration variables
8
- _cset(:delayed_job_workers, {})
6
+ # these cannot be overriden
7
+ set(:delayed_job_script) { File.join(bin_path, "delayed_job") }
9
8
 
10
- # these cannot be overriden
11
- set(:delayed_job_script) { File.join(bin_path, "delayed_job") }
9
+ after "deploy:update_code", "delayed_job:setup"
10
+ after "deploy:restart", "delayed_job:restart"
12
11
 
13
- monit_config "delayed_job", <<EOF, :roles => :worker
12
+ monit_config "delayed_job", <<EOF, :roles => :worker
14
13
  <% delayed_job_workers.each do |name, range| %>
15
14
  check process delayed_job_<%= name %>
16
- with pidfile <%= pid_path %>/delayed_job.<%= name %>.pid
15
+ with pidfile <%= pid_path %>/delayed_job.<%= name %>.pid
17
16
  <% if range.nil? %>
18
- start program = "<%= delayed_job_script %> start <%= name %>"
19
- stop program = "<%= delayed_job_script %> stop <%= name %>"
17
+ start program = "<%= delayed_job_script %> start <%= name %>"
18
+ stop program = "<%= delayed_job_script %> stop <%= name %>"
20
19
  <% else %>
21
- start program = "<%= delayed_job_script %> start <%= name %> <%= range.begin %> <%= range.end %>"
22
- stop program = "<%= delayed_job_script %> stop <%= name %> <%= range.begin %> <%= range.end %>"
20
+ start program = "<%= delayed_job_script %> start <%= name %> <%= range.begin %> <%= range.end %>"
21
+ stop program = "<%= delayed_job_script %> stop <%= name %> <%= range.begin %> <%= range.end %>"
23
22
  <% end %>
24
- group delayed_job
23
+ group delayed_job
25
24
 
26
25
  <% end %>
27
26
  EOF
28
27
 
29
- namespace :delayed_job do
30
- desc "Generate DelayedJob configuration files"
31
- task :setup, :except => { :no_release => true } do
32
- upload_template_file("delayed_job.sh",
33
- delayed_job_script,
34
- :mode => "0755")
35
- end
36
-
37
- desc "Restart DelayedJob workers"
38
- task :restart, :roles => :worker, :except => { :no_release => true } do
39
- run "monit -g delayed_job restart all"
40
- end
28
+ namespace :delayed_job do
29
+ desc "Generate DelayedJob configuration files"
30
+ task :setup, :roles => :worker, :except => { :no_release => true } do
31
+ upload_template_file("delayed_job.sh",
32
+ delayed_job_script,
33
+ :mode => "0755")
41
34
  end
42
35
 
43
- after "deploy:update_code", "delayed_job:setup"
44
- after "deploy:restart", "delayed_job:restart"
36
+ desc "Restart DelayedJob workers"
37
+ task :restart, :roles => :worker, :except => { :no_release => true } do
38
+ run "monit -g delayed_job restart all"
39
+ end
45
40
  end
data/lib/capper/gem.rb CHANGED
@@ -1,10 +1,8 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ before "deploy:setup", "gemrc:setup"
2
2
 
3
- Capper.load do
4
- namespace :gemrc do
5
- desc "Setup global ~/.gemrc file"
6
- task :setup do
7
- put("gem: --no-ri --no-rdoc", "#{deploy_to}/.gemrc")
8
- end
3
+ namespace :gemrc do
4
+ desc "Setup global ~/.gemrc file"
5
+ task :setup do
6
+ put("gem: --no-ri --no-rdoc", "#{deploy_to}/.gemrc")
9
7
  end
10
8
  end
data/lib/capper/git.rb CHANGED
@@ -1,6 +1,2 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
2
-
3
- Capper.load do
4
- set(:scm, :git)
5
- set(:deploy_via, :remote_cache)
6
- end
1
+ set(:scm, :git)
2
+ set(:deploy_via, :remote_cache)
@@ -1,25 +1,18 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ # redefine the notify task without after hooks, so we can use them in
2
+ # specific stages only.
3
+ namespace :hoptoad do
4
+ desc "Notify Hoptoad of the deployment"
5
+ task :notify, :except => { :no_release => true } do
6
+ rails_env = fetch(:hoptoad_env, fetch(:rails_env, "production"))
7
+ local_user = ENV['USER'] || ENV['USERNAME']
8
+ executable = fetch(:rake, 'rake')
2
9
 
3
- # hoptoad requires bundler
4
- require 'capper/bundler'
10
+ notify_command = "#{executable} hoptoad:deploy TO=#{rails_env} REVISION=#{current_revision} REPO=#{repository} USER=#{local_user}"
11
+ notify_command << " DRY_RUN=true" if dry_run
12
+ notify_command << " API_KEY=#{ENV['API_KEY']}" if ENV['API_KEY']
5
13
 
6
- Capper.load do
7
- # redefine the notify task without after hooks, so we can use them in
8
- # specific stages only.
9
- namespace :hoptoad do
10
- desc "Notify Hoptoad of the deployment"
11
- task :notify, :except => { :no_release => true } do
12
- rails_env = fetch(:hoptoad_env, fetch(:rails_env, "production"))
13
- local_user = ENV['USER'] || ENV['USERNAME']
14
- executable = fetch(:rake, 'rake')
15
-
16
- notify_command = "#{executable} hoptoad:deploy TO=#{rails_env} REVISION=#{current_revision} REPO=#{repository} USER=#{local_user}"
17
- notify_command << " DRY_RUN=true" if dry_run
18
- notify_command << " API_KEY=#{ENV['API_KEY']}" if ENV['API_KEY']
19
-
20
- puts "Notifying Hoptoad of Deploy (#{notify_command})"
21
- `#{notify_command}`
22
- puts "Hoptoad Notification Complete."
23
- end
14
+ puts "Notifying Hoptoad of Deploy (#{notify_command})"
15
+ `#{notify_command}`
16
+ puts "Hoptoad Notification Complete."
24
17
  end
25
18
  end
data/lib/capper/monit.rb CHANGED
@@ -1,36 +1,32 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ set(:monitrc) { "#{deploy_to}/.monitrc.local" }
2
2
 
3
- Capper.load do
4
- set(:monitrc) { "#{deploy_to}/.monitrc.local" }
3
+ after "deploy:update_code", "monit:setup"
4
+ before "deploy:restart", "monit:reload"
5
5
 
6
- namespace :monit do
7
- desc "Setup monit configuration files"
8
- task :setup do
9
- configs = fetch(:monit_configs, {})
10
- servers = find_servers
6
+ namespace :monit do
7
+ desc "Setup monit configuration files"
8
+ task :setup do
9
+ configs = fetch(:monit_configs, {})
10
+ servers = find_servers
11
11
 
12
- upload_template(monitrc, :mode => "0644") do |server|
13
- configs.keys.select do |name|
14
- roles = configs[name][:options][:roles]
15
- if roles.nil?
16
- true
17
- else
18
- [roles].flatten.select do |r|
19
- self.roles[r.to_sym].include?(server)
20
- end.any?
21
- end
22
- end.map do |name|
23
- "# #{name}\n#{configs[name][:body]}"
24
- end.join("\n\n")
25
- end
26
- end
27
-
28
- desc "Reload monit configuration"
29
- task :reload do
30
- run "monit reload &>/dev/null && sleep 1"
12
+ upload_template(monitrc, :mode => "0644") do |server|
13
+ configs.keys.select do |name|
14
+ roles = configs[name][:options][:roles]
15
+ if roles.nil?
16
+ true
17
+ else
18
+ [roles].flatten.select do |r|
19
+ self.roles[r.to_sym].include?(server)
20
+ end.any?
21
+ end
22
+ end.map do |name|
23
+ "# #{name}\n#{configs[name][:body]}"
24
+ end.join("\n\n")
31
25
  end
32
26
  end
33
27
 
34
- after "deploy:update_code", "monit:setup"
35
- before "deploy:restart", "monit:reload"
28
+ desc "Reload monit configuration"
29
+ task :reload do
30
+ run "monit reload &>/dev/null && sleep 1"
31
+ end
36
32
  end
@@ -1,20 +1,16 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
2
-
3
- Capper.load do
4
- # execute the specified stage so that recipes required in stage can contribute to task list
5
- on :load do
6
- if stages.include?(ARGV.first)
7
- find_and_execute_task(ARGV.first) if ARGV.any?{ |option| option =~ /-T|--tasks|-e|--explain/ }
8
- end
1
+ # execute the specified stage so that recipes required in stage can contribute to task list
2
+ on :load do
3
+ if stages.include?(ARGV.first)
4
+ find_and_execute_task(ARGV.first) if ARGV.any?{ |option| option =~ /-T|--tasks|-e|--explain/ }
9
5
  end
6
+ end
10
7
 
11
- namespace :multistage do
12
- task :ensure do
13
- unless exists?(:current_stage)
14
- abort "No stage specified. Please specify one of: #{stages.join(', ')} (e.g. `cap #{stages.first} #{ARGV.last}')"
15
- end
8
+ namespace :multistage do
9
+ task :ensure do
10
+ unless exists?(:current_stage)
11
+ abort "No stage specified. Please specify one of: #{stages.join(', ')} (e.g. `cap #{stages.first} #{ARGV.last}')"
16
12
  end
17
13
  end
18
-
19
- on :start, "multistage:ensure", :except => stages
20
14
  end
15
+
16
+ on :start, "multistage:ensure", :except => stages
data/lib/capper/rails.rb CHANGED
@@ -1,20 +1,80 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ _cset(:rails_env, "production")
2
2
 
3
- # rails uses rvm and bundler
4
- require 'capper/rvm'
5
- require 'capper/bundler'
3
+ _cset(:asset_pipeline, true)
4
+ _cset(:asset_env, "RAILS_GROUPS=assets")
5
+ _cset(:assets_prefix, "assets")
6
6
 
7
- Capper.load do
8
- _cset(:rails_env, "production")
7
+ set(:normalize_asset_timestamps) do
8
+ if asset_pipeline
9
+ false
10
+ else
11
+ true
12
+ end
13
+ end
9
14
 
10
- namespace :rails do
11
- desc "Generate rails configuration and helpers"
12
- task :setup, :roles => :app, :except => { :no_release => true } do
13
- upload_template_file("rails.console.sh",
14
- File.join(bin_path, "con"),
15
- :mode => "0755")
16
- end
15
+ before 'deploy:finalize_update', 'rails:assets:symlink'
16
+ after 'deploy:update_code', 'rails:assets:precompile'
17
+ after 'deploy:update_code', 'rails:setup'
18
+
19
+ namespace :rails do
20
+ desc "Generate rails configuration and helpers"
21
+ task :setup, :roles => :app, :except => { :no_release => true } do
22
+ upload_template_file("rails.console.sh",
23
+ File.join(bin_path, "con"),
24
+ :mode => "0755")
17
25
  end
18
26
 
19
- after "deploy:update_code", "rails:setup"
27
+ namespace :assets do
28
+ desc <<-DESC
29
+ [internal] This task will set up a symlink to the shared directory \
30
+ for the assets directory. Assets are shared across deploys to avoid \
31
+ mid-deploy mismatches between old application html asking for assets \
32
+ and getting a 404 file not found error. The assets cache is shared \
33
+ for efficiency. If you cutomize the assets path prefix, override the \
34
+ :assets_prefix variable to match.
35
+ DESC
36
+ task :symlink, :roles => [:web, :asset], :except => { :no_release => true } do
37
+ if asset_pipeline
38
+ run <<-CMD
39
+ rm -rf #{latest_release}/public/#{assets_prefix} &&
40
+ mkdir -p #{latest_release}/public &&
41
+ mkdir -p #{shared_path}/assets &&
42
+ ln -s #{shared_path}/assets #{latest_release}/public/#{assets_prefix}
43
+ CMD
44
+ end
45
+ end
46
+
47
+ desc <<-DESC
48
+ Run the asset precompilation rake task. You can specify the full path \
49
+ to the rake executable by setting the rake variable. You can also \
50
+ specify additional environment variables to pass to rake via the \
51
+ asset_env variable. The defaults are:
52
+
53
+ set :rake, "rake"
54
+ set :rails_env, "production"
55
+ set :asset_env, "RAILS_GROUPS=assets"
56
+ DESC
57
+ task :precompile, :roles => [:web, :asset], :except => { :no_release => true } do
58
+ if asset_pipeline
59
+ run "cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile"
60
+ end
61
+ end
62
+
63
+ desc <<-DESC
64
+ Run the asset clean rake task. Use with caution, this will delete \
65
+ all of your compiled assets. You can specify the full path \
66
+ to the rake executable by setting the rake variable. You can also \
67
+ specify additional environment variables to pass to rake via the \
68
+ asset_env variable. The defaults are:
69
+
70
+ set :rake, "rake"
71
+ set :rails_env, "production"
72
+ set :asset_env, "RAILS_GROUPS=assets"
73
+ DESC
74
+ task :clean, :roles => [:web, :asset], :except => { :no_release => true } do
75
+ if asset_pipeline
76
+ run "cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:clean"
77
+ end
78
+ end
79
+ end
20
80
  end
data/lib/capper/resque.rb CHANGED
@@ -1,45 +1,38 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ # configuration variables
2
+ _cset(:resque_workers, {})
2
3
 
3
- require 'capper/bundler'
4
- require 'capper/monit'
4
+ # these cannot be overriden
5
+ set(:resque_script) { File.join(bin_path, "resque") }
5
6
 
6
- Capper.load do
7
- # configuration variables
8
- _cset(:resque_workers, {})
7
+ after "deploy:update_code", "resque:setup"
8
+ after "deploy:restart", "resque:restart"
9
9
 
10
- # these cannot be overriden
11
- set(:resque_script) { File.join(bin_path, "resque") }
12
-
13
- monit_config "resque", <<EOF, :roles => :worker
10
+ monit_config "resque", <<EOF, :roles => :worker
14
11
  <% resque_workers.each do |name, queue| %>
15
12
  check process resque_<%= name %>
16
- with pidfile <%= pid_path %>/resque.<%= name %>.pid
13
+ with pidfile <%= pid_path %>/resque.<%= name %>.pid
17
14
  <% if queue.nil? %>
18
- start program = "<%= resque_script %> <%= name %> * start"
19
- stop program = "<%= resque_script %> <%= name %> * stop"
15
+ start program = "<%= resque_script %> <%= name %> * start"
16
+ stop program = "<%= resque_script %> <%= name %> * stop"
20
17
  <% else %>
21
- start program = "<%= resque_script %> <%= name %> <%= queue %> start"
22
- stop program = "<%= resque_script %> <%= name %> <%= queue %> stop"
18
+ start program = "<%= resque_script %> <%= name %> <%= queue %> start"
19
+ stop program = "<%= resque_script %> <%= name %> <%= queue %> stop"
23
20
  <% end %>
24
- group resque
21
+ group resque
25
22
 
26
23
  <% end %>
27
24
  EOF
28
25
 
29
- namespace :resque do
30
- desc "Generate resque configuration files"
31
- task :setup, :except => { :no_release => true } do
32
- upload_template_file("resque.sh",
33
- resque_script,
34
- :mode => "0755")
35
- end
36
-
37
- desc "Restart resque workers"
38
- task :restart, :roles => :worker, :except => { :no_release => true } do
39
- run "monit -g resque restart all"
40
- end
26
+ namespace :resque do
27
+ desc "Generate resque configuration files"
28
+ task :setup, :roles => :worker, :except => { :no_release => true } do
29
+ upload_template_file("resque.sh",
30
+ resque_script,
31
+ :mode => "0755")
41
32
  end
42
33
 
43
- after "deploy:update_code", "resque:setup"
44
- after "deploy:restart", "resque:restart"
34
+ desc "Restart resque workers"
35
+ task :restart, :roles => :worker, :except => { :no_release => true } do
36
+ run "monit -g resque restart all"
37
+ end
45
38
  end
data/lib/capper/rvm.rb CHANGED
@@ -1,44 +1,40 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ load "capper/gem"
2
2
 
3
3
  $:.unshift(File.expand_path('./lib', ENV['rvm_path']))
4
4
  require 'rvm/capistrano'
5
5
 
6
- require "capper/gem"
7
-
8
- Capper.load do
9
- set(:rvm_type, :user)
10
- set(:rvm_ruby_string, File.read(".rvmrc").gsub(/^rvm use --create (.*)/, '\1').strip)
11
- _cset(:rvm_rubygems_version, "1.6.2")
12
-
13
- namespace :rvm do
14
- # install the requested ruby if missing
15
- desc "Install the selected ruby version using RVM."
16
- task :setup, :except => {:no_release => true} do
17
- wo_gemset = rvm_ruby_string.gsub(/@.*/, '')
18
-
19
- run("echo silent > ~/.curlrc", :shell => "/bin/bash")
20
- run("source ~/.rvm/scripts/rvm && " +
21
- "if ! rvm list rubies | grep -q #{wo_gemset}; then " +
22
- "rvm install #{wo_gemset}; fi && " +
23
- "rvm use --create #{rvm_ruby_string} >/dev/null",
24
- :shell => "/bin/bash")
25
- run("rm ~/.curlrc")
26
-
27
- # this ensures that Gentoos declare -x RUBYOPT="-rauto_gem" is ignored.
28
- run "touch ~/.rvm/rubies/#{wo_gemset}/lib/ruby/site_ruby/auto_gem.rb"
29
-
30
- # freeze rubygems version
31
- run("rvm rubygems #{rvm_rubygems_version}")
32
- end
33
-
34
- # prevents interactive rvm dialog
35
- task :trust_rvmrc, :except => {:no_release => true} do
36
- run "rvm rvmrc trust #{release_path} >/dev/null"
37
- run "rvm rvmrc trust #{current_path} >/dev/null"
38
- end
6
+ set(:rvm_type, :user)
7
+ set(:rvm_ruby_string, File.read(".rvmrc").gsub(/^rvm use --create (.*)/, '\1').strip)
8
+
9
+ _cset(:rvm_rubygems_version, "1.6.2")
10
+
11
+ before "deploy:setup", "rvm:setup"
12
+ after "deploy:symlink", "rvm:trust_rvmrc"
13
+
14
+ namespace :rvm do
15
+ # install the requested ruby if missing
16
+ desc "Install the selected ruby version using RVM."
17
+ task :setup, :except => {:no_release => true} do
18
+ wo_gemset = rvm_ruby_string.gsub(/@.*/, '')
19
+
20
+ run("echo silent > ~/.curlrc", :shell => "/bin/bash")
21
+ run("source ~/.rvm/scripts/rvm && " +
22
+ "if ! rvm list rubies | grep -q #{wo_gemset}; then " +
23
+ "rvm install #{wo_gemset}; fi && " +
24
+ "rvm use --create #{rvm_ruby_string} >/dev/null",
25
+ :shell => "/bin/bash")
26
+ run("rm ~/.curlrc")
27
+
28
+ # this ensures that Gentoos declare -x RUBYOPT="-rauto_gem" is ignored.
29
+ run "touch ~/.rvm/rubies/#{wo_gemset}/lib/ruby/site_ruby/auto_gem.rb"
30
+
31
+ # freeze rubygems version
32
+ run("rvm rubygems #{rvm_rubygems_version}")
39
33
  end
40
34
 
41
- before "rvm:setup", "gemrc:setup"
42
- before "deploy:setup", "rvm:setup"
43
- after "deploy:symlink", "rvm:trust_rvmrc"
35
+ # prevents interactive rvm dialog
36
+ task :trust_rvmrc, :except => {:no_release => true} do
37
+ run "rvm rvmrc trust #{release_path} >/dev/null"
38
+ run "rvm rvmrc trust #{current_path} >/dev/null"
39
+ end
44
40
  end
@@ -1,8 +1,11 @@
1
1
  #!/bin/bash
2
2
  export HOME=<%= deploy_to %>
3
- source <%= deploy_to %>/.rvm/scripts/rvm
4
3
  export RAILS_ENV=<%= rails_env %>
5
4
 
5
+ if [[ -e "${HOME}"/.rvm/scripts/rvm ]]; then
6
+ source "${HOME}"/.rvm/scripts/rvm
7
+ fi
8
+
6
9
  cd <%= current_path %> >/dev/null
7
10
 
8
11
  CMD=$1 && shift
@@ -16,4 +19,4 @@ if [[ $# -ge 1 ]]; then
16
19
  MAX="--max-priority $1" && shift
17
20
  fi
18
21
 
19
- exec bundle exec ./script/delayed_job $CMD --prefix <%= application %> --identifier $ID --pid-dir=<%= pid_path %> $MIN $MAX
22
+ exec <%= ruby_exec_prefix %> ./script/delayed_job $CMD --prefix <%= application %> --identifier $ID --pid-dir=<%= pid_path %> $MIN $MAX
@@ -1,12 +1,15 @@
1
1
  #!/bin/bash
2
2
  export HOME=<%= deploy_to %>
3
- source <%= deploy_to %>/.rvm/scripts/rvm
4
3
  export RAILS_ENV=<%= rails_env %>
5
4
 
5
+ if [[ -e "${HOME}"/.rvm/scripts/rvm ]]; then
6
+ source "${HOME}"/.rvm/scripts/rvm
7
+ fi
8
+
6
9
  cd <%= current_path %> >/dev/null
7
10
 
8
11
  if [[ -e ./script/console ]]; then
9
- exec bundle exec ruby ./script/console
12
+ exec <%= ruby_exec_prefix %> ruby ./script/console
10
13
  else
11
- exec bundle exec ruby ./script/rails console
14
+ exec <%= ruby_exec_prefix %> ruby ./script/rails console
12
15
  fi
@@ -1,13 +1,16 @@
1
1
  #!/bin/bash
2
2
  export HOME=<%= deploy_to %>
3
- source <%= deploy_to %>/.rvm/scripts/rvm
4
3
  export RAILS_ENV=<%= rails_env %>
5
4
 
5
+ if [[ -e "${HOME}"/.rvm/scripts/rvm ]]; then
6
+ source "${HOME}"/.rvm/scripts/rvm
7
+ fi
8
+
6
9
  WORKER="$1" && shift
7
10
  QUEUE="$1" && shift
8
11
 
9
12
  PIDFILE=<%= pid_path %>/resque.${WORKER}.pid
10
- CMD="bundle exec rake environment resque:work QUEUE=${QUEUE} PIDFILE=${PIDFILE}"
13
+ CMD="<%= rake %> environment resque:work QUEUE=${QUEUE} PIDFILE=${PIDFILE}"
11
14
 
12
15
  cd <%= current_path %> >/dev/null
13
16
 
@@ -1,11 +1,14 @@
1
1
  #!/bin/bash
2
2
  export HOME=<%= deploy_to %>
3
- source <%= deploy_to %>/.rvm/scripts/rvm
4
3
  export RAILS_ENV=<%= rails_env %>
5
4
 
5
+ if [[ -e "${HOME}"/.rvm/scripts/rvm ]]; then
6
+ source "${HOME}"/.rvm/scripts/rvm
7
+ fi
8
+
6
9
  PIDFILE=<%= shared_path %>/pids/unicorn.pid
7
10
  CONFIG=<%= shared_path %>/config/unicorn.rb
8
- CMD="bundle exec unicorn -c $CONFIG -E $RAILS_ENV -D config.ru"
11
+ CMD="<%= ruby_exec_prefix %> unicorn -c $CONFIG -E $RAILS_ENV -D config.ru"
9
12
 
10
13
  cd <%= current_path %> >/dev/null
11
14
 
@@ -1,75 +1,65 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ # unicorn configuration variables
2
+ _cset(:unicorn_worker_processes, 4)
3
+ _cset(:unicorn_timeout, 30)
2
4
 
3
- # Unicorn capistrano controls.
4
- # See http://unicorn.bogomips.org/SIGNALS.html for signals that can be sent to unicorn.
5
+ # these cannot be overriden
6
+ set(:unicorn_script) { File.join(bin_path, "unicorn") }
7
+ set(:unicorn_config) { File.join(config_path, "unicorn.rb") }
8
+ set(:unicorn_pidfile) { File.join(pid_path, "unicorn.pid") }
5
9
 
6
- # unicorn requires bundler
7
- require 'capper/bundler'
10
+ after "deploy:update_code", "unicorn:setup"
11
+ after "deploy:restart", "unicorn:restart"
8
12
 
9
- Capper.load do
10
- # unicorn configuration variables
11
- _cset(:unicorn_worker_processes, 4)
12
- _cset(:unicorn_timeout, 30)
13
-
14
- # these cannot be overriden
15
- set(:unicorn_script) { File.join(bin_path, "unicorn") }
16
- set(:unicorn_config) { File.join(config_path, "unicorn.rb") }
17
- set(:unicorn_pidfile) { File.join(pid_path, "unicorn.pid") }
18
-
19
- monit_config "unicorn", <<EOF, :roles => :app
13
+ monit_config "unicorn", <<EOF, :roles => :app
20
14
  check process unicorn
21
- with pidfile "<%= unicorn_pidfile %>"
22
- start program = "<%= unicorn_script %> start" with timeout 60 seconds
23
- stop program = "<%= unicorn_script %> stop"
15
+ with pidfile "<%= unicorn_pidfile %>"
16
+ start program = "<%= unicorn_script %> start" with timeout 60 seconds
17
+ stop program = "<%= unicorn_script %> stop"
24
18
  EOF
25
19
 
26
- namespace :unicorn do
27
- desc "Generate unicorn configuration files"
28
- task :setup, :roles => :app, :except => { :no_release => true } do
29
- upload_template_file("unicorn.rb",
30
- unicorn_config,
31
- :mode => "0644")
32
- upload_template_file("unicorn.sh",
33
- unicorn_script,
34
- :mode => "0755")
35
- end
36
-
37
- desc "Start unicorn"
38
- task :start, :roles => :app, :except => { :no_release => true } do
39
- run "#{unicorn_script} start"
40
- end
20
+ namespace :unicorn do
21
+ desc "Generate unicorn configuration files"
22
+ task :setup, :roles => :app, :except => { :no_release => true } do
23
+ upload_template_file("unicorn.rb",
24
+ unicorn_config,
25
+ :mode => "0644")
26
+ upload_template_file("unicorn.sh",
27
+ unicorn_script,
28
+ :mode => "0755")
29
+ end
41
30
 
42
- desc "Stop unicorn"
43
- task :stop, :roles => :app, :except => { :no_release => true } do
44
- run "#{unicorn_script} stop"
45
- end
31
+ desc "Start unicorn"
32
+ task :start, :roles => :app, :except => { :no_release => true } do
33
+ run "#{unicorn_script} start"
34
+ end
46
35
 
47
- desc "Restart unicorn with zero downtime"
48
- task :restart, :roles => :app, :except => { :no_release => true } do
49
- run "#{unicorn_script} upgrade"
50
- end
36
+ desc "Stop unicorn"
37
+ task :stop, :roles => :app, :except => { :no_release => true } do
38
+ run "#{unicorn_script} stop"
39
+ end
51
40
 
52
- desc "Kill unicorn (this should only be used if all else fails)"
53
- task :kill, :roles => :app, :except => { :no_release => true } do
54
- run "#{unicorn_script} kill"
55
- end
41
+ desc "Restart unicorn with zero downtime"
42
+ task :restart, :roles => :app, :except => { :no_release => true } do
43
+ run "#{unicorn_script} upgrade"
44
+ end
56
45
 
57
- desc "Add a new worker to the currently running process"
58
- task :addworker, :roles => :app, :except => { :no_release => true } do
59
- run "#{unicorn_script} addworker"
60
- end
46
+ desc "Kill unicorn (this should only be used if all else fails)"
47
+ task :kill, :roles => :app, :except => { :no_release => true } do
48
+ run "#{unicorn_script} kill"
49
+ end
61
50
 
62
- desc "Remove a worker from the currently running process"
63
- task :delworker, :roles => :app, :except => { :no_release => true } do
64
- run "#{unicorn_script} delworker"
65
- end
51
+ desc "Add a new worker to the currently running process"
52
+ task :addworker, :roles => :app, :except => { :no_release => true } do
53
+ run "#{unicorn_script} addworker"
54
+ end
66
55
 
67
- desc "Rotate all logfiles in the currently running process"
68
- task :logrotate, :roles => :app, :except => { :no_release => true } do
69
- run "#{unicorn_script} logrotate"
70
- end
56
+ desc "Remove a worker from the currently running process"
57
+ task :delworker, :roles => :app, :except => { :no_release => true } do
58
+ run "#{unicorn_script} delworker"
71
59
  end
72
60
 
73
- after "deploy:update_code", "unicorn:setup"
74
- after "deploy:restart", "unicorn:restart"
61
+ desc "Rotate all logfiles in the currently running process"
62
+ task :logrotate, :roles => :app, :except => { :no_release => true } do
63
+ run "#{unicorn_script} logrotate"
64
+ end
75
65
  end
@@ -1,49 +1,29 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
1
+ set(:whenever_command) { "#{ruby_exec_prefix} whenever" }
2
+ set(:whenever_identifier) { application }
3
+ set(:whenever_environment) { fetch(:rails_env, "production") }
4
+ set(:whenever_update_flags) { "--update-crontab #{whenever_identifier} --set environment=#{whenever_environment}" }
5
+ set(:whenever_clear_flags) { "--clear-crontab #{whenever_identifier}" }
2
6
 
3
- # whenever requires bundler
4
- require 'capper/bundler'
7
+ after "deploy:update_code", "whenever:clear_crontab"
8
+ after "deploy:symlink", "whenever:update_crontab"
9
+ after "deploy:rollback", "whenever:update_crontab"
5
10
 
6
- Capper.load do
7
- set(:whenever_command) { "bundle exec whenever" }
8
- set(:whenever_identifier) { application }
9
- set(:whenever_environment) { fetch(:rails_env, "production") }
10
- set(:whenever_update_flags) { "--update-crontab #{whenever_identifier} --set environment=#{whenever_environment}" }
11
- set(:whenever_clear_flags) { "--clear-crontab #{whenever_identifier}" }
12
-
13
- # Disable cron jobs at the begining of a deploy.
14
- after "deploy:update_code", "whenever:clear_crontab"
15
- # Write the new cron jobs near the end.
16
- after "deploy:symlink", "whenever:update_crontab"
17
- # If anything goes wrong, undo.
18
- after "deploy:rollback", "whenever:update_crontab"
19
-
20
- namespace :whenever do
21
- desc <<-DESC
22
- Update application's crontab entries using Whenever. You can configure \
23
- the command used to invoke Whenever by setting the :whenever_command \
24
- variable, which can be used with Bundler to set the command to \
25
- "bundle exec whenever". You can configure the identifier used by setting \
26
- the :whenever_identifier variable, which defaults to the same value configured \
27
- for the :application variable. You can configure the environment by setting \
28
- the :whenever_environment variable, which defaults to the same value \
29
- configured for the :rails_env variable which itself defaults to "production". \
30
- Finally, you can completely override all arguments to the Whenever command \
31
- by setting the :whenever_update_flags variable.
32
- DESC
33
- task :update_crontab do
34
- on_rollback do
35
- if previous_release
36
- run "cd #{previous_release} && #{whenever_command} #{whenever_update_flags}"
37
- else
38
- run "crontab /dev/null"
39
- end
11
+ namespace :whenever do
12
+ desc "Update application's crontab entries"
13
+ task :update_crontab do
14
+ on_rollback do
15
+ if previous_release
16
+ run "cd #{previous_release} && #{whenever_command} #{whenever_update_flags}"
17
+ else
18
+ run "crontab /dev/null"
40
19
  end
41
-
42
- run "cd #{current_path} && #{whenever_command} #{whenever_update_flags}"
43
20
  end
44
21
 
45
- task :clear_crontab do
46
- run "crontab /dev/null"
47
- end
22
+ run "cd #{current_path} && #{whenever_command} #{whenever_update_flags}"
23
+ end
24
+
25
+ desc "Remove all entries from application's crontab"
26
+ task :clear_crontab do
27
+ run "crontab /dev/null"
48
28
  end
49
29
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: capper
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.7.3
5
+ version: 0.8.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - "Benedikt B\xC3\xB6hm"
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-10-14 00:00:00 +02:00
13
+ date: 2011-10-23 00:00:00 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -57,7 +57,7 @@ dependencies:
57
57
  version: 1.0.0
58
58
  type: :development
59
59
  version_requirements: *id004
60
- description: Capistrano is a collection of opinionated Capistrano recipes
60
+ description: Capper is a collection of opinionated Capistrano recipes
61
61
  email:
62
62
  - bb@xnull.de
63
63
  executables: []
@@ -77,6 +77,7 @@ files:
77
77
  - README.md
78
78
  - Rakefile
79
79
  - capper.gemspec
80
+ - lib/capper.rb
80
81
  - lib/capper/base.rb
81
82
  - lib/capper/bundler.rb
82
83
  - lib/capper/config.rb
@@ -89,7 +90,6 @@ files:
89
90
  - lib/capper/rails.rb
90
91
  - lib/capper/resque.rb
91
92
  - lib/capper/rvm.rb
92
- - lib/capper/sass.rb
93
93
  - lib/capper/templates/delayed_job.sh.erb
94
94
  - lib/capper/templates/rails.console.sh.erb
95
95
  - lib/capper/templates/resque.sh.erb
@@ -102,7 +102,7 @@ files:
102
102
  - lib/capper/utils/templates.rb
103
103
  - lib/capper/whenever.rb
104
104
  has_rdoc: true
105
- homepage: http://github.com/hollow/capper
105
+ homepage: http://github.com/zenops/capper
106
106
  licenses:
107
107
  - MIT
108
108
  post_install_message:
@@ -128,6 +128,6 @@ rubyforge_project:
128
128
  rubygems_version: 1.6.2
129
129
  signing_key:
130
130
  specification_version: 3
131
- summary: Capistrano is a collection of opinionated Capistrano recipes
131
+ summary: Capper is a collection of opinionated Capistrano recipes
132
132
  test_files: []
133
133
 
data/lib/capper/sass.rb DELETED
@@ -1,14 +0,0 @@
1
- require File.dirname(__FILE__) + '/base' unless defined?(Capper)
2
-
3
- require "capper/rails"
4
-
5
- Capper.load do
6
- namespace :sass do
7
- desc "Updates the stylesheets generated by Sass"
8
- task :update, :roles => :app do
9
- run "cd #{release_path} && RAILS_ENV=#{rails_env} bundle exec rake --silent sass:update"
10
- end
11
- end
12
-
13
- before "deploy:symlink", "sass:update"
14
- end