capistrano_evrone_recipes 0.1.11 → 0.1.12

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