capistrano_evrone_recipes 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bb1291d5aa6007f379ce5c7aef95599db1064251
4
+ data.tar.gz: b5f784f23d1890e5fe8fe1dc4c3fb48ddd033051
5
+ SHA512:
6
+ metadata.gz: 7112ce18ed7c4a8965a45c6c70ca5143a16138beb03c0cfc404c75f9372308a1f2d7899cefb07533fcc42543780e23d93450b7bada5f7f3c0832203c2c33c225
7
+ data.tar.gz: aff8ce74eebeb6648e716c79fad38b4db783d25e383cd81e89f3ef386adfb025c377517747495b2e8d349c7ff96fb0fa57677436010e0397e72143a2e7b5f659
@@ -2,13 +2,13 @@ require 'logger'
2
2
  require File.dirname(__FILE__) + "/util"
3
3
 
4
4
  Capistrano::Configuration.instance(:must_exist).load do
5
- logger.level = Capistrano::Logger::DEBUG
5
+ logger.level = Capistrano::Logger::INFO
6
6
 
7
7
  default_run_options[:pty] = true
8
8
  ssh_options[:forward_agent] = true
9
9
 
10
10
  set :bundle_cmd, "rbenv exec bundle"
11
- set :bundle_flags, "--deployment --quiet --binstubs --shebang ruby-local-exec"
11
+ set :bundle_flags, "--deployment --quiet"
12
12
  set :rake, -> { "#{bundle_cmd} exec rake" }
13
13
  set :keep_releases, 7
14
14
  set :scm, "git"
@@ -17,19 +17,21 @@ Capistrano::Configuration.instance(:must_exist).load do
17
17
  set :copy_exclude, [".git"]
18
18
  set :repository_cache, -> { "#{deploy_to}/shared/#{application}.git" }
19
19
  set :normalize_asset_timestamps, false
20
+ set :use_sudo, false
20
21
 
21
22
  load "deploy"
22
23
  require 'bundler/capistrano'
23
24
 
24
25
  recipes_dir = File.dirname(File.expand_path(__FILE__))
25
26
 
27
+ #disabled_modules = fetch(:disabled_features, [])
28
+
26
29
  load "#{recipes_dir}/recipes/crontab.rb"
27
30
  load "#{recipes_dir}/recipes/runit.rb"
28
31
  load "#{recipes_dir}/recipes/deploy.rb"
29
32
  load "#{recipes_dir}/recipes/login.rb"
30
33
  load "#{recipes_dir}/recipes/migrate.rb"
31
34
  load "#{recipes_dir}/recipes/rails.rb"
32
- load "#{recipes_dir}/recipes/unicorn.rb"
35
+ #load "#{recipes_dir}/recipes/unicorn.rb"
33
36
  load "#{recipes_dir}/recipes/assets.rb"
34
- load "#{recipes_dir}/recipes/silent.rb" if ENV['CAP_SILENT_MODE']
35
37
  end
@@ -7,14 +7,18 @@ require "whenever/capistrano/recipes"
7
7
  namespace :crontab do
8
8
  desc "Generate crontab from config/whenever.rb"
9
9
  task :generate, :roles => :crontab, :on_no_matching_servers => :continue, :except => { :no_release => true } do
10
- CapistranoEvroneRecipes::Util.ensure_changed_remote_files(self, "config/schedule.rb") do
11
- find_and_execute_task("whenever:update_crontab")
10
+ if find_servers_for_task(current_task).any?
11
+ CapistranoEvroneRecipes::Util.ensure_changed_remote_files(self, "config/schedule.rb") do
12
+ find_and_execute_task("whenever:update_crontab")
13
+ end
12
14
  end
13
15
  end
14
16
 
15
17
  desc "Clear crontab"
16
18
  task :clear, :roles => :crontab, :on_no_matching_servers => :continue, :except => { :no_release => true } do
17
- find_and_execute_task("whenever:clear_crontab")
19
+ if find_servers_for_task(current_task).any?
20
+ find_and_execute_task("whenever:clear_crontab")
21
+ end
18
22
  end
19
23
  end
20
24
 
@@ -3,30 +3,19 @@ namespace :deploy do
3
3
  task :symlink_configs do
4
4
  s = "cd #{shared_path}/config && "
5
5
  s << "for i in `find . -type f | sed 's/^\\.\\///'` ; do "
6
- s << "echo \"> ${i}\" ;"
6
+ s << "echo \"create current/config/${i}\" ;"
7
7
  s << "rm -f #{release_path}/config/${i} ;"
8
8
  s << "ln -snf #{shared_path}/config/${i} #{release_path}/config/${i} ; done"
9
9
  run s
10
10
  end
11
11
 
12
12
  task :start, :on_no_matching_servers => :continue, :except => { :no_release => true } do
13
- CapistranoEvroneRecipes::Util.with_roles(self, :app) { unicorn.start }
14
- CapistranoEvroneRecipes::Util.with_roles(self, :worker) { runit.start }
15
13
  end
16
14
 
17
15
  task :stop, :on_no_matching_servers => :continue, :except => { :no_release => true } do
18
- CapistranoEvroneRecipes::Util.with_roles(self, :app) { unicorn.stop }
19
- CapistranoEvroneRecipes::Util.with_roles(self, :worker) { runit.stop }
20
- end
21
-
22
- task :graceful_stop, :on_no_matching_servers => :continue, :except => { :no_release => true } do
23
- CapistranoEvroneRecipes::Util.with_roles(self, :app) { unicorn.graceful_stop }
24
- CapistranoEvroneRecipes::Util.with_roles(self, :worker) { runit.stop }
25
16
  end
26
17
 
27
18
  task :restart, :on_no_matching_servers => :continue, :except => {:no_release => true} do
28
- CapistranoEvroneRecipes::Util.with_roles(self, :app) { unicorn.restart }
29
- CapistranoEvroneRecipes::Util.with_roles(self, :worker) { runit.restart }
30
19
  end
31
20
  end
32
21
 
@@ -1,5 +1,6 @@
1
1
  desc "Login to remote host"
2
2
  task :login do
3
3
  hostname = find_servers_for_task(current_task).first
4
- exec "ssh -A -l #{user} #{hostname} -t 'cd #{current_path} && ${SHELL} -l'"
4
+ port = hostname.port || fetch(:port, 22)
5
+ exec "ssh -A -p #{port} -l #{user} #{hostname} -t 'cd #{current_path} && ${SHELL} -l'"
5
6
  end
@@ -3,8 +3,10 @@ namespace :deploy do
3
3
  task :migrate, :roles => :db, :on_no_matching_servers => :continue, :only => {:primary => true}, :except => { :no_release => true } do
4
4
  return if ENV['MIGRATE_SKIP']
5
5
 
6
- CapistranoEvroneRecipes::Util.ensure_changed_remote_dirs(self, "db/migrate") do
7
- run "cd #{release_path} && #{fetch :rake} RAILS_ENV=#{rails_env} db:migrate"
6
+ if find_servers_for_task(current_task).any?
7
+ CapistranoEvroneRecipes::Util.ensure_changed_remote_dirs(self, "db/migrate") do
8
+ run "cd #{release_path} && #{fetch :rake} RAILS_ENV=#{rails_env} db:migrate"
9
+ end
8
10
  end
9
11
  end
10
12
  end
@@ -4,8 +4,9 @@ namespace :rails do
4
4
  task :console, :roles => :app do
5
5
  server = find_servers_for_task(current_task).first
6
6
  if server
7
- cmd = "ssh -l #{user} -A #{server} -t 'cd #{current_path} && #{fetch :bundle_cmd} exec rails console #{rails_env}'"
8
- puts cmd
7
+ port = server.port || fetch(:port, 22)
8
+ cmd = "ssh -p #{port} -l #{user} -A #{server} -t 'cd #{current_path} && #{fetch :bundle_cmd} exec rails console #{rails_env}'"
9
+ exec cmd
9
10
  end
10
11
  end
11
12
 
@@ -14,7 +15,8 @@ namespace :rails do
14
15
  task :dbconsole, :roles => :db, :only => { :primary => true } do
15
16
  server = find_servers_for_task(current_task).first
16
17
  if server
17
- exec "ssh -l #{user} -A #{server} -t 'cd #{current_path} && #{fetch :bundle_cmd} exec rails dbconsole #{rails_env}'"
18
+ port = server.port || fetch(:port, 22)
19
+ exec "ssh -p #{port} -l #{user} -A #{server} -t 'cd #{current_path} && #{fetch :bundle_cmd} exec rails dbconsole #{rails_env}'"
18
20
  end
19
21
  end
20
22
  end
@@ -1,59 +1,77 @@
1
1
  _cset(:runit_export_path) { "#{latest_release}/var/services" }
2
2
  _cset(:runit_services_path) { "#{deploy_to}/services" }
3
3
  _cset(:runit_export_cmd) { "#{fetch :bundle_cmd} exec foreman export runitu" }
4
- _cset(:runit_procfile) { "#{latest_release}/Procfile" }
4
+ _cset(:runit_procfile) { "Procfile" }
5
5
  _cset(:foreman_concurency) { nil }
6
6
 
7
7
  namespace :runit do
8
8
 
9
9
  desc "Restart Procfile services"
10
10
  task :restart, :roles => :worker, :on_no_matching_servers => :continue, :except => { :no_release => true } do
11
- current_link = capture("readlink #{runit_services_path}/current || echo").to_s.strip
12
- if current_link == runit_export_path
13
- stop
14
- start
15
- else
16
- relink
11
+ if find_servers_for_task(current_task).any?
12
+ cmd = %Q{
13
+ if [ -d #{runit_export_path} ] ; then
14
+ echo "----> Updating services" ;
15
+ rm -rf #{runit_services_path}/* ;
16
+ sync ;
17
+ cp -r #{runit_export_path}/* #{runit_services_path}/ ;
18
+ sync ;
19
+ rm -rf #{runit_export_path} ;
20
+ else
21
+ echo "----> Restart services" ;
22
+ test $(ls -1 #{runit_services_path} | wc -l) -eq 0 || sv t #{runit_services_path}/* ;
23
+ fi
24
+ }.compact
25
+ run cmd
17
26
  end
18
27
  end
19
28
 
20
- task :relink, :roles => :worker, :on_no_matching_servers => :continue, :except => { :no_release => true } do
21
- cmd = <<-EOF
22
- (test -L previous && readlink previous | xargs rm -rf) ;
23
- rm -f current.new &&
24
- ln -s #{runit_export_path} current.new &&
25
- rm -f previous &&
26
- (test -L current && mv current previous) || true
27
- && mv current.new current
28
- EOF
29
- cmd = cmd.gsub(/\n/, " ").gsub(/ +/, " ")
30
- run("cd #{runit_services_path} && #{cmd}")
31
- end
32
-
33
29
  desc "Stop services"
34
30
  task :stop, :roles => :worker, :on_no_matching_servers => :continue, :except => { :no_release => true } do
35
- cmd = "for i in `ls -1 #{runit_services_path}/current`; do"
36
- cmd << " sv -w 10 force-stop #{runit_services_path}/current/${i} ; done"
37
- run(cmd)
31
+ if find_servers_for_task(current_task).any?
32
+ run "sv -w 10 force-stop #{runit_services_path}/*"
33
+ end
38
34
  end
39
35
 
40
36
  desc "Start services"
41
37
  task :start, :roles => :worker, :on_no_matching_servers => :continue, :except => { :no_release => true } do
42
- cmd = "for i in `ls -1 #{runit_services_path}/current`; do"
43
- cmd << " sv -v -w 10 up #{runit_services_path}/current/${i} ; done"
44
- run(cmd)
38
+ if find_servers_for_task(current_task).any?
39
+ run "sv -v start #{runit_services_path}/*"
40
+ end
45
41
  end
46
42
 
47
43
  desc "Export Procfile"
48
44
  task :export, :roles => :worker, :on_no_matching_servers => :continue, :except => { :no_release => true } do
49
- env = <<-EOF
50
- RAILS_ENV=#{rails_env}
51
- EOF
52
- put(env, "#{release_path}/.env")
45
+ if find_servers_for_task(current_task).any?
46
+ CapistranoEvroneRecipes::Util.ensure_changed_remote_files(self, fetch(:runit_procfile)) do
47
+ env = %{ RAILS_ENV=#{rails_env} }.strip + "\n"
48
+ put(env, "#{latest_release}/.env")
49
+
50
+ c = fetch(:foreman_concurency) ? "-c #{fetch :foreman_concurency}" : ""
51
+ cmd = %{
52
+ cd #{latest_release} &&
53
+ #{runit_export_cmd} #{runit_export_path}
54
+ -e #{latest_release}/.env
55
+ -l #{shared_path}/log
56
+ -f #{latest_release}/#{runit_procfile}
57
+ --root=#{current_path}
58
+ -a #{application} #{c} > /dev/null &&
59
+ echo "----> Export #{runit_procfile}"
60
+ }.compact
61
+ run cmd
53
62
 
54
- conc = fetch(:foreman_concurency) ? "-c #{fetch :foreman_concurency}" : ""
55
- run "cd #{release_path} && #{runit_export_cmd} #{runit_export_path} -e #{release_path}/.env -l #{shared_path}/log -f #{runit_procfile} --root=#{release_path} -a #{application} #{conc} > /dev/null"
63
+ cmd = %{
64
+ for i in $(ls #{runit_export_path}/); do
65
+ sed -i 's|#{runit_export_path}|#{runit_services_path}|g' #{runit_export_path}/${i}/run ;
66
+ done
67
+ }.compact
68
+ run cmd
69
+ end
70
+ end
56
71
  end
57
72
  end
58
73
 
59
74
  after "deploy:finalize_update", "runit:export"
75
+ after "deploy:start", "runit:start"
76
+ after "deploy:stop", "runit:stop"
77
+ after "deploy:restart", "runit:restart"
@@ -12,11 +12,6 @@ EOF
12
12
  run cmd
13
13
  end
14
14
 
15
- desc "Fast restart unicorn"
16
- task :fast_restart, :roles => :app, :on_no_matching_servers => :continue, :except => {:no_release => true} do
17
- run "test -f #{fetch :unicorn_pid} ] && kill -s USR2 `cat #{fetch :unicorn_pid}`"
18
- end
19
-
20
15
  desc "Start unicorn"
21
16
  task :start, :roles => :app, :on_no_matching_servers => :continue, :except => {:no_release => true} do
22
17
  run "cd #{current_path} && env #{fetch :unicorn_binary} -c #{fetch :unicorn_config} -E #{rails_env} -D"
@@ -26,9 +21,8 @@ EOF
26
21
  task :stop, :roles => :app, :on_no_matching_servers => :continue, :except => {:no_release => true} do
27
22
  run "test -f #{fetch :unicorn_pid} && kill `cat #{fetch :unicorn_pid}`"
28
23
  end
29
-
30
- desc "Graceful stop unicorn"
31
- task :graceful_stop, :on_no_matching_servers => :continue, :roles => :app, :except => { :no_release => true } do
32
- run "test -f #{fetch :unicorn_pid} && kill -s QUIT `cat #{fetch :unicorn_pid}`"
33
- end
34
24
  end
25
+
26
+ after "deploy:start", "unicorn:start"
27
+ after "deploy:stop", "unicorn:stop"
28
+ after "deploy:restart", "unicorn:restart"
@@ -2,45 +2,44 @@ module CapistranoEvroneRecipes
2
2
  class Util
3
3
  class << self
4
4
  def ensure_changed_remote_dirs(cap, path)
5
- diff = if cap.previous_release
6
- -> { cap.capture("diff -r #{cap.previous_release}/#{path} #{cap.current_release}/#{path} | wc -l").to_i }
7
- else
8
- -> { 1 }
9
- end
10
- force = ENV["FORCE"].to_i
11
- if force > 0 || diff.call > 0
5
+ if ENV['FORCE'] || !cap.previous_release
12
6
  yield
13
- else
14
- cap.logger.info "skip because #{path} not changed"
15
- $silent_stack_skip = true
7
+ return
8
+ end
9
+ cap.run changed?(cap, path, recursive: true) do |ch, st, data|
10
+ Capistrano::Configuration.default_io_proc.call(ch,st,data)
11
+ unless data.include?(" is not changed")
12
+ yield
13
+ end
16
14
  end
17
15
  end
18
16
 
19
17
  def ensure_changed_remote_files(cap, path)
20
- diff = if cap.previous_release
21
- -> { cap.capture("diff -r #{cap.previous_release}/#{path} #{cap.current_release}/#{path} | wc -l").to_i }
22
- else
23
- -> { 1 }
24
- end
25
- force = ENV["FORCE"].to_i
26
- if force > 0 || diff.call > 0
18
+ if ENV['FORCE'] || !cap.previous_release
27
19
  yield
28
- else
29
- cap.logger.info "skip because #{path} not changed"
30
- $silent_stack_skip = true
20
+ return
21
+ end
22
+ cap.run changed?(cap, path) do |ch, st, data|
23
+ Capistrano::Configuration.default_io_proc.call(ch,st,data)
24
+ unless data.include?(" is not changed")
25
+ yield
26
+ end
31
27
  end
32
28
  end
33
29
 
34
-
35
- def with_roles(cap, role)
36
- original, hosts = ENV["HOSTS"], cap.find_servers(:roles => role).map{|i| i.host }.join(",")
37
- return if hosts.empty?
38
- begin
39
- ENV["HOSTS"] = hosts
40
- yield
41
- ensure
42
- ENV["HOSTS"] = original
43
- end
30
+ def changed?(cap, path, options = {})
31
+ r = options[:recursive] ? "-r" : ""
32
+ %{
33
+ diff #{r} #{cap.previous_release}/#{path} #{cap.latest_release}/#{path} |
34
+ wc -l |
35
+ grep -q -v 0 ;
36
+ ST=$? ;
37
+ if [ $ST -eq 0 ] ; then
38
+ echo '----> #{path} changed' ;
39
+ else
40
+ echo '----> #{path} is not changed' ;
41
+ fi
42
+ }.compact
44
43
  end
45
44
  end
46
45
  end
@@ -3,7 +3,7 @@ module CapistranoEvroneRecipes
3
3
 
4
4
  MAJOR = 0
5
5
  MINOR = 1
6
- PATCH = 11
6
+ PATCH = 12
7
7
 
8
8
  def self.to_s
9
9
  "#{MAJOR}.#{MINOR}.#{PATCH}"
metadata CHANGED
@@ -1,96 +1,85 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capistrano_evrone_recipes
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 0.1.11
4
+ version: 0.1.12
6
5
  platform: ruby
7
6
  authors:
8
7
  - Dmitry Galinsky
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-20 00:00:00.000000000 Z
11
+ date: 2013-09-19 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
- version_requirements: !ruby/object:Gem::Requirement
14
+ name: capistrano
15
+ requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: 2.13.5
20
- none: false
21
- name: capistrano
22
20
  type: :runtime
23
21
  prerelease: false
24
- requirement: !ruby/object:Gem::Requirement
22
+ version_requirements: !ruby/object:Gem::Requirement
25
23
  requirements:
26
- - - ! '>='
24
+ - - '>='
27
25
  - !ruby/object:Gem::Version
28
26
  version: 2.13.5
29
- none: false
30
27
  - !ruby/object:Gem::Dependency
31
- version_requirements: !ruby/object:Gem::Requirement
28
+ name: colored
29
+ requirement: !ruby/object:Gem::Requirement
32
30
  requirements:
33
- - - ! '>='
31
+ - - '>='
34
32
  - !ruby/object:Gem::Version
35
33
  version: '0'
36
- none: false
37
- name: colored
38
34
  type: :runtime
39
35
  prerelease: false
40
- requirement: !ruby/object:Gem::Requirement
36
+ version_requirements: !ruby/object:Gem::Requirement
41
37
  requirements:
42
- - - ! '>='
38
+ - - '>='
43
39
  - !ruby/object:Gem::Version
44
40
  version: '0'
45
- none: false
46
41
  - !ruby/object:Gem::Dependency
47
- version_requirements: !ruby/object:Gem::Requirement
42
+ name: unicorn
43
+ requirement: !ruby/object:Gem::Requirement
48
44
  requirements:
49
- - - ! '>='
45
+ - - '>='
50
46
  - !ruby/object:Gem::Version
51
47
  version: '0'
52
- none: false
53
- name: unicorn
54
48
  type: :runtime
55
49
  prerelease: false
56
- requirement: !ruby/object:Gem::Requirement
50
+ version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
- - - ! '>='
52
+ - - '>='
59
53
  - !ruby/object:Gem::Version
60
54
  version: '0'
61
- none: false
62
55
  - !ruby/object:Gem::Dependency
63
- version_requirements: !ruby/object:Gem::Requirement
56
+ name: foreman_export_runitu
57
+ requirement: !ruby/object:Gem::Requirement
64
58
  requirements:
65
- - - ! '>='
59
+ - - '>='
66
60
  - !ruby/object:Gem::Version
67
61
  version: '0'
68
- none: false
69
- name: foreman_export_runitu
70
62
  type: :runtime
71
63
  prerelease: false
72
- requirement: !ruby/object:Gem::Requirement
64
+ version_requirements: !ruby/object:Gem::Requirement
73
65
  requirements:
74
- - - ! '>='
66
+ - - '>='
75
67
  - !ruby/object:Gem::Version
76
68
  version: '0'
77
- none: false
78
69
  - !ruby/object:Gem::Dependency
79
- version_requirements: !ruby/object:Gem::Requirement
70
+ name: whenever
71
+ requirement: !ruby/object:Gem::Requirement
80
72
  requirements:
81
- - - ! '>='
73
+ - - '>='
82
74
  - !ruby/object:Gem::Version
83
75
  version: '0'
84
- none: false
85
- name: whenever
86
76
  type: :runtime
87
77
  prerelease: false
88
- requirement: !ruby/object:Gem::Requirement
78
+ version_requirements: !ruby/object:Gem::Requirement
89
79
  requirements:
90
- - - ! '>='
80
+ - - '>='
91
81
  - !ruby/object:Gem::Version
92
82
  version: '0'
93
- none: false
94
83
  description: Capistrano recipes used in evrone company
95
84
  email: dima.exe@gmail.com
96
85
  executables: []
@@ -118,27 +107,26 @@ files:
118
107
  - lib/capistrano_evrone_recipes/version.rb
119
108
  homepage: http://github.com/evrone/capistrano_evrone_recipes
120
109
  licenses: []
110
+ metadata: {}
121
111
  post_install_message:
122
112
  rdoc_options: []
123
113
  require_paths:
124
114
  - lib
125
115
  required_ruby_version: !ruby/object:Gem::Requirement
126
116
  requirements:
127
- - - ! '>='
117
+ - - '>='
128
118
  - !ruby/object:Gem::Version
129
119
  version: '0'
130
- none: false
131
120
  required_rubygems_version: !ruby/object:Gem::Requirement
132
121
  requirements:
133
- - - ! '>='
122
+ - - '>='
134
123
  - !ruby/object:Gem::Version
135
124
  version: '0'
136
- none: false
137
125
  requirements: []
138
126
  rubyforge_project:
139
- rubygems_version: 1.8.23
127
+ rubygems_version: 2.0.2
140
128
  signing_key:
141
- specification_version: 3
129
+ specification_version: 4
142
130
  summary: Capistrano recipes used in evrone company
143
131
  test_files: []
144
132
  has_rdoc: