capsum 0.9.1 → 1.0.0.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -8
- data/VERSION +1 -1
- data/capsum.gemspec +6 -2
- data/lib/capistrano/rsync.rb +98 -0
- data/lib/capsum.rb +21 -21
- data/lib/capsum/bundler.rb +16 -6
- data/lib/capsum/daemons.rb +133 -72
- data/lib/capsum/foundation.rb +23 -11
- data/lib/capsum/git.rb +15 -15
- data/lib/capsum/passenger.rb +9 -16
- data/lib/capsum/shared.rb +6 -18
- data/lib/capsum/sidekiq.rb +77 -14
- data/lib/capsum/typical.rb +14 -5
- data/lib/capsum/whenever.rb +20 -4
- metadata +48 -19
- data/lib/capsum/setup.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5b60107345d838c120162111e8a6dd611ba65cd
|
4
|
+
data.tar.gz: b8386fe0edcb617f99a9923939feb2650adc8c79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9140dc0624a5401dcceab5b1eed05cd24e1e9bdbb3064d143f9f9709416237f5a37a649d73f49d949ad5cbbecef0ca3a0c3e5ed0d4495c7dd342525afca1268
|
7
|
+
data.tar.gz: feb0892470f529e79d7dcd4a0d54e33999709f6ffe990fde2df47f0fc453a7f5f79b2957386ba96a434b5616778260715b9ae4d4e8f7cbb8183903e32003914d
|
data/CHANGELOG.md
CHANGED
@@ -1,12 +1,24 @@
|
|
1
1
|
## TODO:
|
2
|
-
|
3
|
-
## v0.6.0:
|
4
2
|
|
5
|
-
|
6
|
-
|
3
|
+
## v1.0:
|
4
|
+
- upgrade capistrano to v3, v2 is not compatible
|
7
5
|
|
8
|
-
## v0.
|
6
|
+
## v0.9:
|
7
|
+
- use the official whenever recipe
|
8
|
+
- add sidekiq recipe support autostart
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
## v0.8:
|
11
|
+
- auto detect git setting by project git config
|
12
|
+
- always invoke deploy:cleanup after deploy:update
|
13
|
+
- support http_proxy variables
|
14
|
+
|
15
|
+
## v0.7:
|
16
|
+
- add daemons recipe
|
17
|
+
|
18
|
+
## v0.6:
|
19
|
+
- bundler only run on exist gemfile
|
20
|
+
- add rails cache clear recipe
|
21
|
+
|
22
|
+
## v0.5:
|
23
|
+
- add git recipe, support use current project's branch
|
24
|
+
- change typical recipe, now set :deploy_via, :copy
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0.alpha1
|
data/capsum.gemspec
CHANGED
@@ -14,10 +14,14 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
15
15
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
16
16
|
s.require_paths = ["lib"]
|
17
|
-
|
17
|
+
s.license = 'MIT'
|
18
18
|
|
19
19
|
# Dependency Gems
|
20
|
-
s.add_dependency "capistrano", "~>
|
20
|
+
s.add_dependency "capistrano", "~> 3.1"
|
21
|
+
# s.add_dependency "capistrano-rsync", "~> 1.0.2" # broken, wait update
|
22
|
+
s.add_dependency "capistrano-rails", "~> 1.1.1"
|
23
|
+
s.add_development_dependency "capistrano-sidekiq", "~> 0.1.3" # optional
|
24
|
+
|
21
25
|
# s.add_dependency "capistrano-helpers", "~> 0.7.1"
|
22
26
|
# s.add_dependency "cap-recipes", "~> 0.3.36"
|
23
27
|
# https://github.com/rubaidh/rubaidhstrano
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# NOTE: Please don't depend on tasks without a description (`desc`) as they
|
2
|
+
# might change between minor or patch version releases. They make up the
|
3
|
+
# private API and internals of Capistrano::Rsync. If you think something should
|
4
|
+
# be public for extending and hooking, please let me know!
|
5
|
+
|
6
|
+
rsync_cache = lambda do
|
7
|
+
cache = fetch(:rsync_cache)
|
8
|
+
cache = deploy_to + "/" + cache if cache && cache !~ /^\//
|
9
|
+
cache
|
10
|
+
end
|
11
|
+
|
12
|
+
# PATCH https://github.com/moll/capistrano-rsync/pull/13
|
13
|
+
# Use cap3's load:defaults to set default vars so that they can be overridden.
|
14
|
+
namespace :load do
|
15
|
+
task :defaults do
|
16
|
+
set :rsync_options, %w[--recursive --delete --delete-excluded --exclude .git*]
|
17
|
+
set :rsync_copy, "rsync --archive --acls --xattrs"
|
18
|
+
|
19
|
+
# Stage is used on your local machine for rsyncing from.
|
20
|
+
set :rsync_stage, "tmp/deploy"
|
21
|
+
|
22
|
+
# Cache is used on the server to copy files to from to the release
|
23
|
+
# directory. Saves you rsyncing your whole app folder each time. If you nil
|
24
|
+
# rsync_cache, Capistrano::Rsync will sync straight to the release path.
|
25
|
+
set :rsync_cache, "shared/deploy"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
Rake::Task["deploy:check"].enhance ["rsync:hook_scm"]
|
31
|
+
Rake::Task["deploy:updating"].enhance ["rsync:hook_scm"]
|
32
|
+
|
33
|
+
desc "Stage and rsync to the server (or its cache)."
|
34
|
+
task :rsync => %w[rsync:stage] do
|
35
|
+
roles(:all).each do |role|
|
36
|
+
user = role.user + "@" if !role.user.nil?
|
37
|
+
|
38
|
+
rsync = %w[rsync]
|
39
|
+
rsync.concat fetch(:rsync_options)
|
40
|
+
rsync << fetch(:rsync_stage) + "/"
|
41
|
+
rsync << "#{user}#{role.hostname}:#{rsync_cache.call || release_path}"
|
42
|
+
|
43
|
+
Kernel.system *rsync
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
namespace :rsync do
|
48
|
+
task :hook_scm do
|
49
|
+
Rake::Task.define_task("#{scm}:check") do
|
50
|
+
invoke "rsync:check"
|
51
|
+
end
|
52
|
+
|
53
|
+
Rake::Task.define_task("#{scm}:create_release") do
|
54
|
+
invoke "rsync:release"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
task :check do
|
59
|
+
# Everything's a-okay inherently!
|
60
|
+
end
|
61
|
+
|
62
|
+
task :create_stage do
|
63
|
+
next if File.directory?(fetch(:rsync_stage))
|
64
|
+
|
65
|
+
clone = %W[git clone]
|
66
|
+
clone << fetch(:repo_url, ".")
|
67
|
+
clone << fetch(:rsync_stage)
|
68
|
+
run_locally { execute *clone }
|
69
|
+
end
|
70
|
+
|
71
|
+
desc "Stage the repository in a local directory."
|
72
|
+
task :stage => %w[create_stage] do
|
73
|
+
Dir.chdir fetch(:rsync_stage) do
|
74
|
+
update = %W[git fetch --quiet --all --prune]
|
75
|
+
run_locally { execute *update }
|
76
|
+
|
77
|
+
checkout = %W[git reset --hard origin/#{fetch(:branch)}]
|
78
|
+
run_locally { execute *checkout }
|
79
|
+
|
80
|
+
# PATCH https://github.com/moll/capistrano-rsync/pull/8
|
81
|
+
set :current_revision, "#{`git rev-parse --short HEAD`}".chomp
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
desc "Copy the code to the releases directory."
|
86
|
+
task :release => %w[rsync] do
|
87
|
+
# Skip copying if we've already synced straight to the release directory.
|
88
|
+
next if !fetch(:rsync_cache)
|
89
|
+
|
90
|
+
copy = %(#{fetch(:rsync_copy)} "#{rsync_cache.call}/" "#{release_path}/")
|
91
|
+
on roles(:all).each do execute copy end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Matches the naming scheme of git tasks.
|
95
|
+
# Plus was part of the public API in Capistrano::Rsync <= v0.2.1.
|
96
|
+
task :create_release => %w[release]
|
97
|
+
end
|
98
|
+
|
data/lib/capsum.rb
CHANGED
@@ -1,31 +1,31 @@
|
|
1
|
-
require "capistrano"
|
1
|
+
# require "capistrano"
|
2
2
|
|
3
3
|
module Capsum
|
4
4
|
VERSION = open(File.expand_path("../../VERSION", __FILE__)).read.chomp
|
5
5
|
end
|
6
6
|
|
7
|
-
Capistrano::Configuration.instance(true).load do
|
7
|
+
# Capistrano::Configuration.instance(true).load do
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
# def self.unbefore(task_name, name)
|
10
|
+
# options = { :only => [ task_name ] }
|
11
|
+
# unon :before, name, options
|
12
|
+
# end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
# def self.unafter(task_name, name)
|
15
|
+
# options = { :only => [ task_name ] }
|
16
|
+
# unon :after, name, options
|
17
|
+
# end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
19
|
+
# def self.unon(event, name, options)
|
20
|
+
# self.callbacks[event].delete_if do |callback|
|
21
|
+
# do_delete = false
|
22
|
+
# if callback.respond_to?(:source)
|
23
|
+
# do_delete = (name == callback.source)
|
24
|
+
# do_delete &&= (options[:only] && options[:only] == callback.only)
|
25
|
+
# end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
# do_delete
|
28
|
+
# end
|
29
|
+
# end
|
30
30
|
|
31
|
-
end
|
31
|
+
# end
|
data/lib/capsum/bundler.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
|
-
require
|
2
|
-
require "bundler/capistrano"
|
1
|
+
require "capistrano/bundler"
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
namespace :load do
|
4
|
+
task :defaults do
|
5
|
+
set :bundle_flags, '--quiet'
|
6
|
+
set :bundle_env_variables, {}
|
7
7
|
|
8
|
-
|
8
|
+
bundle_env_variables[:http_proxy] = ENV["bundle_http_proxy"] if ENV["bundle_http_proxy"]
|
9
|
+
bundle_env_variables[:https_proxy] = ENV["bundle_https_proxy"] if ENV["bundle_https_proxy"]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module Capistrano
|
14
|
+
module DSL
|
15
|
+
def bundle_env_variables
|
16
|
+
fetch(:bundle_env_variables)
|
17
|
+
end
|
18
|
+
end
|
9
19
|
end
|
data/lib/capsum/daemons.rb
CHANGED
@@ -1,91 +1,152 @@
|
|
1
1
|
require File.expand_path("../../capsum.rb", __FILE__)
|
2
|
-
require File.expand_path("../autostart.rb", __FILE__)
|
2
|
+
# require File.expand_path("../autostart.rb", __FILE__)
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
4
|
+
namespace :load do
|
5
|
+
task :defaults do
|
6
|
+
set :daemons, []
|
7
|
+
set :daemon_list, []
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
namespace :daemons do
|
13
|
+
task :prepare do
|
14
|
+
# TODO: covert daemons to daemon_list
|
15
|
+
end
|
16
|
+
|
17
|
+
task upload_daemons: [ :prepare ] do
|
18
|
+
fetch(:daemon_list).each do |daemon|
|
19
|
+
script_path = release_path.join("daemons", daemon[:name])
|
20
|
+
content = convert_daemon_script(daemon)
|
21
|
+
|
22
|
+
on roles (daemon[:role] || :all) do |host|
|
23
|
+
execute :mkdir, "-pv", script_path.dirname
|
24
|
+
upload! StringIO.new(content), script_path
|
25
|
+
execute :chmod, "+x", script_path
|
14
26
|
end
|
15
27
|
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def convert_daemon_script(daemon)
|
31
|
+
strip_heredoc <<-EOF
|
32
|
+
#!/usr/bin/env bash
|
33
|
+
|
34
|
+
start(){
|
35
|
+
#{daemon[:start]}
|
36
|
+
}
|
37
|
+
|
38
|
+
stop(){
|
39
|
+
#{daemon[:stop]}
|
40
|
+
}
|
41
|
+
|
42
|
+
usage(){
|
43
|
+
echo "Usage: $(basename $0) {stop|stop}"
|
44
|
+
}
|
45
|
+
|
46
|
+
command=${1:-usage}
|
47
|
+
shift
|
48
|
+
case "$command" in
|
49
|
+
start) start $@ ;;
|
50
|
+
stop) stop $@ ;;
|
51
|
+
*) usage ;;
|
52
|
+
esac
|
53
|
+
EOF
|
54
|
+
end
|
55
|
+
|
56
|
+
def strip_heredoc(str)
|
57
|
+
indent = (str.scan(/^[ \t]*(?=\S)/).min || "").size
|
58
|
+
str.gsub(/^[ \t]{#{indent}}/, '')
|
59
|
+
end
|
60
|
+
|
61
|
+
after 'deploy:updated', :upload_daemons
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
# Capistrano::Configuration.instance(true).load do
|
66
|
+
|
67
|
+
# namespace :daemons do
|
68
|
+
# desc "Start daemons process"
|
69
|
+
# task :start, :roles => :app do
|
70
|
+
# find_servers(:roles => :app).each do |server|
|
71
|
+
# matcher = server.options[:daemons]
|
72
|
+
# daemon_list.each do |daemon|
|
73
|
+
# run "cd #{current_path}; #{daemon[:start]}", :pty => (daemon[:pty] || false), :hosts => server.host if match(matcher, daemon)
|
74
|
+
# end
|
75
|
+
# end
|
76
|
+
# end
|
16
77
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
78
|
+
# desc "Stop daemons process"
|
79
|
+
# task :stop, :roles => :app do
|
80
|
+
# daemon_list.each do |daemon|
|
81
|
+
# run "cd #{current_path}; #{daemon[:stop]}"
|
82
|
+
# end
|
83
|
+
# end
|
23
84
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
85
|
+
# desc "Restart daemons process"
|
86
|
+
# task :restart, :roles => :app do
|
87
|
+
# daemons.stop
|
88
|
+
# sleep(3)
|
89
|
+
# daemons.start
|
90
|
+
# end
|
30
91
|
|
31
|
-
|
32
|
-
|
33
|
-
|
92
|
+
# desc "setup daemons to autostart"
|
93
|
+
# task :setup_autostart, :roles => :app do
|
94
|
+
# autostart_server_commands = fetch(:autostart_server_commands)
|
34
95
|
|
35
|
-
|
36
|
-
|
37
|
-
|
96
|
+
# find_servers(:roles => :app).each do |server|
|
97
|
+
# matcher = server.options[:daemons]
|
98
|
+
# autostart_server_commands[server] ||= []
|
38
99
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
100
|
+
# daemon_list.each do |daemon|
|
101
|
+
# autostart_server_commands[server] << "cd #{current_path}; #{daemon[:start]}" if match(matcher, daemon)
|
102
|
+
# end
|
103
|
+
# end
|
104
|
+
# end
|
44
105
|
|
45
|
-
|
46
|
-
|
47
|
-
|
106
|
+
# def match(matcher, daemon)
|
107
|
+
# return matcher.call(daemon[:name]) if matcher.respond_to?(:call)
|
108
|
+
# return matcher.match(daemon[:name]) if matcher.respond_to?(:match)
|
48
109
|
|
49
|
-
|
50
|
-
|
110
|
+
# !!matcher # to boolean
|
111
|
+
# end
|
51
112
|
|
52
|
-
|
53
|
-
|
113
|
+
# def daemon_list
|
114
|
+
# settings = fetch(:daemons, [])
|
54
115
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
116
|
+
# case settings
|
117
|
+
# when Array
|
118
|
+
# settings.map { |setting| parse_daemon(setting) }
|
119
|
+
# when Hash
|
120
|
+
# settings.map { |pair| parse_daemon(pair[1], :name => pair[0] )}
|
121
|
+
# else
|
122
|
+
# [ parse_daemon(settings) ]
|
123
|
+
# end
|
124
|
+
# end
|
64
125
|
|
65
|
-
|
66
|
-
|
126
|
+
# def parse_daemon(source, options = {})
|
127
|
+
# daemon = {}
|
67
128
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
129
|
+
# case source
|
130
|
+
# when Array
|
131
|
+
# daemon[:start] = source.first
|
132
|
+
# daemon[:stop] = source.last
|
133
|
+
# when Hash
|
134
|
+
# daemon = options.merge(source)
|
135
|
+
# else
|
136
|
+
# command = source.to_s
|
137
|
+
# daemon[:start] = command.gsub("%{command}", "start")
|
138
|
+
# daemon[:stop] = command.gsub("%{command}", "stop")
|
139
|
+
# end
|
79
140
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
141
|
+
# daemon[:name] = daemon[:start] if daemon[:name].nil?
|
142
|
+
# daemon
|
143
|
+
# end
|
144
|
+
# end
|
84
145
|
|
85
|
-
|
146
|
+
# before "autostart:update_crontab", "daemons:setup_autostart"
|
86
147
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
end
|
148
|
+
# after "deploy:start", "daemons:start"
|
149
|
+
# after "deploy:stop", "daemons:stop"
|
150
|
+
# after "deploy:restart", "daemons:restart"
|
151
|
+
# end
|
91
152
|
|
data/lib/capsum/foundation.rb
CHANGED
@@ -1,17 +1,29 @@
|
|
1
1
|
require File.expand_path("../../capsum.rb", __FILE__)
|
2
|
-
require "capistrano/ext/multistage"
|
3
|
-
require File.expand_path("../setup.rb", __FILE__)
|
4
2
|
require File.expand_path("../git.rb", __FILE__)
|
5
3
|
require File.expand_path("../shared.rb", __FILE__)
|
4
|
+
require "capistrano/rsync"
|
6
5
|
|
7
|
-
|
8
|
-
|
6
|
+
namespace :load do
|
7
|
+
task :defaults do
|
8
|
+
if spec = Gem.loaded_specs["capistrano-rsync"]
|
9
|
+
raise "capsum don't compatible 'capistrano-rsync' gem, please remove capistrano-rsync depend. because it uses a modified version of capistrano-rsync script. "
|
10
|
+
end
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
fetch(:linked_files) { set :linked_files, [] }
|
13
|
+
fetch(:linked_dirs) { set :linked_dirs, [] }
|
14
|
+
|
15
|
+
set :scm, :rsync
|
16
|
+
set :rsync_options, %w[--recursive --delete]
|
17
|
+
|
18
|
+
default_env[:http_proxy] = ENV["http_proxy"] if ENV["http_proxy"]
|
19
|
+
default_env[:https_proxy] = ENV["https_proxy"] if ENV["https_proxy"]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Capistrano
|
24
|
+
module DSL
|
25
|
+
def default_env
|
26
|
+
fetch(:default_env)
|
27
|
+
end
|
28
|
+
end
|
17
29
|
end
|
data/lib/capsum/git.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
require File.expand_path("../../capsum.rb", __FILE__)
|
1
|
+
# require File.expand_path("../../capsum.rb", __FILE__)
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
# use current branch
|
8
|
-
set(:branch) { `git describe --contains --all HEAD | tr -d '\n'` }
|
3
|
+
namespace :load do
|
4
|
+
task :defaults do
|
5
|
+
# use current branch
|
6
|
+
set :branch, -> { `git describe --contains --all HEAD | tr -d '\n'` }
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
# use current remote
|
9
|
+
set :repo_url, -> {
|
10
|
+
remote = `git config --get branch.#{fetch(:branch)}.remote | tr -d '\n'`
|
11
|
+
`git config --get remote.#{remote}.url | tr -d '\n'`
|
12
|
+
}
|
13
|
+
|
14
|
+
set :repo_url, ENV['repo_url'] if ENV['repo_url']
|
15
|
+
|
16
|
+
# TODO: set :scm_verbose, true
|
14
17
|
end
|
15
|
-
|
16
|
-
set :scm_verbose, true
|
17
|
-
|
18
|
-
end
|
18
|
+
end
|
data/lib/capsum/passenger.rb
CHANGED
@@ -1,20 +1,13 @@
|
|
1
1
|
require File.expand_path("../../capsum.rb", __FILE__)
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
desc 'Start passenger'
|
11
|
-
task :start, :roles => :app do
|
12
|
-
# do nothing
|
13
|
-
end
|
14
|
-
|
15
|
-
desc 'Stop passenger'
|
16
|
-
task :stop, :roles => :app do
|
17
|
-
# do nothing
|
3
|
+
namespace :deploy do
|
4
|
+
desc 'Restart passenger'
|
5
|
+
task :restart do
|
6
|
+
on roles(:app), in: :sequence, wait: 5 do
|
7
|
+
execute :mkdir, '-pv', release_path.join('tmp')
|
8
|
+
execute :touch, release_path.join('tmp/restart.txt')
|
18
9
|
end
|
19
10
|
end
|
20
|
-
|
11
|
+
|
12
|
+
after :publishing, :restart
|
13
|
+
end
|
data/lib/capsum/shared.rb
CHANGED
@@ -1,21 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
namespace :deploy do
|
6
|
-
desc 'Replace named files with a symlink to their counterparts in shared/'
|
7
|
-
task :symlink_shared do
|
8
|
-
if !exists?(:shared)
|
9
|
-
abort 'You must specify which files to symlink using the "set :shared" command.'
|
10
|
-
end
|
11
|
-
shared.each do |path|
|
12
|
-
if release_path.nil? || release_path.empty? || path.nil? || path.empty?
|
13
|
-
raise "Release path or path are nil!"
|
14
|
-
end
|
15
|
-
run "rm -rf #{release_path}/#{path} && ln -nfs #{shared_path}/#{path} #{release_path}/#{path}"
|
16
|
-
end
|
1
|
+
namespace :capsum do
|
2
|
+
task :symlink_shared_deprecated do
|
3
|
+
if fetch(:shared)
|
4
|
+
raise "set :shared is deprecated. use :linked_files or :linked_dirs instead."
|
17
5
|
end
|
18
6
|
end
|
19
|
-
|
20
|
-
before "deploy:finalize_update", "deploy:symlink_shared"
|
21
7
|
end
|
8
|
+
|
9
|
+
Rake::Task["deploy:check"].enhance ["capsum:symlink_shared_deprecated"]
|
data/lib/capsum/sidekiq.rb
CHANGED
@@ -1,23 +1,86 @@
|
|
1
1
|
require File.expand_path("../../capsum.rb", __FILE__)
|
2
|
-
require File.expand_path("../
|
3
|
-
require 'sidekiq
|
2
|
+
require File.expand_path("../daemons.rb", __FILE__)
|
3
|
+
require 'capistrano/sidekiq'
|
4
4
|
|
5
|
+
namespace :sidekiq do
|
6
|
+
task :update_daemon_list do
|
7
|
+
scripts = []
|
8
|
+
sidekiq_role = fetch(:sidekiq_role)
|
9
|
+
on (roles sidekiq_role || []).first do |host|
|
10
|
+
return if host.nil?
|
11
|
+
for_each_process do |pid_file, idx|
|
12
|
+
start_scripts = SimpleScriptRecord.new do
|
13
|
+
start_sidekiq(pid_file)
|
14
|
+
end
|
5
15
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
desc "setup sidekiq daemon to autostart"
|
10
|
-
task :setup_autostart do
|
11
|
-
autostart_server_commands = fetch(:autostart_server_commands)
|
12
|
-
rails_env = fetch(:rails_env, "production")
|
13
|
-
find_servers(roles: fetch(:sidekiq_role)).each do |server|
|
14
|
-
autostart_server_commands[server] ||= []
|
15
|
-
for_each_process do |pid_file, idx|
|
16
|
-
autostart_server_commands[server] << "cd #{current_path} ; nohup #{fetch(:sidekiq_cmd)} -e #{rails_env} -C #{current_path}/config/sidekiq.yml -i #{idx} -P #{pid_file} >> #{current_path}/log/sidekiq.log 2>&1 &"
|
16
|
+
stop_scripts = SimpleScriptRecord.new do
|
17
|
+
stop_sidekiq(pid_file)
|
17
18
|
end
|
19
|
+
|
20
|
+
scripts << {
|
21
|
+
start: start_scripts.to_bash,
|
22
|
+
stop: stop_scripts.to_bash,
|
23
|
+
pid_file: pid_file
|
24
|
+
}
|
18
25
|
end
|
19
26
|
end
|
27
|
+
|
28
|
+
scripts.each do |script|
|
29
|
+
script[:role] = sidekiq_role
|
30
|
+
script[:name] = File.basename(script[:pid_file], ".pid") if script[:pid_file]
|
31
|
+
end
|
32
|
+
|
33
|
+
fetch(:daemon_list).concat scripts
|
20
34
|
end
|
21
35
|
|
22
|
-
|
36
|
+
after 'daemons:prepare', :update_daemon_list
|
23
37
|
end
|
38
|
+
|
39
|
+
namespace :load do
|
40
|
+
task :defaults do
|
41
|
+
set :sidekiq_options, "--config config/sidekiq.yml"
|
42
|
+
set :sidekiq_role, [ :db, filter: :sidekiq ]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class SimpleScriptRecord < SSHKit::Backend::Printer
|
47
|
+
attr_accessor :result
|
48
|
+
|
49
|
+
def initialize(&block)
|
50
|
+
@result = []
|
51
|
+
@block = block
|
52
|
+
self.run
|
53
|
+
end
|
54
|
+
|
55
|
+
def within(directory, &block)
|
56
|
+
(@pwd ||= []).push directory.to_s
|
57
|
+
yield
|
58
|
+
ensure
|
59
|
+
@pwd.pop
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_bash
|
63
|
+
result.map do |args|
|
64
|
+
cmd = []
|
65
|
+
options = args.extract_options!
|
66
|
+
cmd << "cd #{options[:in]} && " if options[:in]
|
67
|
+
cmd << args.join(" ")
|
68
|
+
|
69
|
+
cmd.join
|
70
|
+
end.join("\n")
|
71
|
+
end
|
72
|
+
|
73
|
+
def execute(*args)
|
74
|
+
options = args.extract_options!
|
75
|
+
options.merge!(in: @pwd.nil? ? nil : File.join(@pwd), env: @env, host: @host, user: @user, group: @group)
|
76
|
+
@result << [ *args, options ]
|
77
|
+
end
|
78
|
+
|
79
|
+
def test(*args)
|
80
|
+
raise SSHKit::Backend::MethodUnavailableError
|
81
|
+
end
|
82
|
+
|
83
|
+
def command(*args)
|
84
|
+
raise SSHKit::Backend::MethodUnavailableError
|
85
|
+
end
|
86
|
+
end
|
data/lib/capsum/typical.rb
CHANGED
@@ -1,11 +1,20 @@
|
|
1
1
|
require File.expand_path("../foundation.rb", __FILE__)
|
2
2
|
|
3
3
|
require File.expand_path("../bundler.rb", __FILE__)
|
4
|
+
require 'capistrano/rails'
|
5
|
+
|
4
6
|
require File.expand_path("../passenger.rb", __FILE__)
|
5
7
|
require File.expand_path("../whenever.rb", __FILE__)
|
6
|
-
require File.expand_path("../daemons.rb", __FILE__)
|
7
|
-
require File.expand_path("../cache.rb", __FILE__)
|
8
|
+
# require File.expand_path("../daemons.rb", __FILE__)
|
9
|
+
# require File.expand_path("../cache.rb", __FILE__)
|
10
|
+
|
11
|
+
namespace :load do
|
12
|
+
task :defaults do
|
13
|
+
set :rails_env, "production"
|
8
14
|
|
9
|
-
|
10
|
-
|
11
|
-
|
15
|
+
fetch(:linked_dirs).concat %w[
|
16
|
+
log
|
17
|
+
tmp/pids
|
18
|
+
]
|
19
|
+
end
|
20
|
+
end
|
data/lib/capsum/whenever.rb
CHANGED
@@ -6,8 +6,24 @@ rescue LoadError => e
|
|
6
6
|
# skip
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
namespace :load do
|
10
|
+
task :defaults do
|
11
|
+
set(:whenever_identifier, -> { fetch :deploy_to })
|
12
|
+
set(:whenever_roles, [ :db, filter: :whenever ])
|
13
|
+
end
|
13
14
|
end
|
15
|
+
|
16
|
+
namespace :whenever do
|
17
|
+
def setup_whenever_task(*args, &block)
|
18
|
+
args = Array(fetch(:whenever_command)) + args
|
19
|
+
on roles fetch(:whenever_roles) do |host|
|
20
|
+
return if host.nil?
|
21
|
+
host_args = Array(yield(host))
|
22
|
+
within release_path do
|
23
|
+
with fetch(:whenever_command_environment_variables) do
|
24
|
+
execute *(args + host_args)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capsum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.alpha1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sunteya
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: '3.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: '3.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: capistrano-rails
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.1.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: capistrano-sidekiq
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.1.3
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.3
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: rake
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
30
58
|
requirements:
|
31
|
-
- -
|
59
|
+
- - ">="
|
32
60
|
- !ruby/object:Gem::Version
|
33
61
|
version: '0'
|
34
62
|
type: :development
|
35
63
|
prerelease: false
|
36
64
|
version_requirements: !ruby/object:Gem::Requirement
|
37
65
|
requirements:
|
38
|
-
- -
|
66
|
+
- - ">="
|
39
67
|
- !ruby/object:Gem::Version
|
40
68
|
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: bundler
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
|
-
- -
|
73
|
+
- - ">="
|
46
74
|
- !ruby/object:Gem::Version
|
47
75
|
version: '0'
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
|
-
- -
|
80
|
+
- - ">="
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: version
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
|
-
- -
|
87
|
+
- - ">="
|
60
88
|
- !ruby/object:Gem::Version
|
61
89
|
version: '0'
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
|
-
- -
|
94
|
+
- - ">="
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: '0'
|
69
97
|
description: Collect gems and recipes related capistrano.
|
@@ -73,13 +101,14 @@ executables: []
|
|
73
101
|
extensions: []
|
74
102
|
extra_rdoc_files: []
|
75
103
|
files:
|
76
|
-
- .gitignore
|
104
|
+
- ".gitignore"
|
77
105
|
- CHANGELOG.md
|
78
106
|
- Gemfile
|
79
107
|
- README.md
|
80
108
|
- Rakefile
|
81
109
|
- VERSION
|
82
110
|
- capsum.gemspec
|
111
|
+
- lib/capistrano/rsync.rb
|
83
112
|
- lib/capsum.rb
|
84
113
|
- lib/capsum/autostart.rb
|
85
114
|
- lib/capsum/bundler.rb
|
@@ -88,13 +117,13 @@ files:
|
|
88
117
|
- lib/capsum/foundation.rb
|
89
118
|
- lib/capsum/git.rb
|
90
119
|
- lib/capsum/passenger.rb
|
91
|
-
- lib/capsum/setup.rb
|
92
120
|
- lib/capsum/shared.rb
|
93
121
|
- lib/capsum/sidekiq.rb
|
94
122
|
- lib/capsum/typical.rb
|
95
123
|
- lib/capsum/whenever.rb
|
96
124
|
homepage: http://github.com/sunteya/capsum
|
97
|
-
licenses:
|
125
|
+
licenses:
|
126
|
+
- MIT
|
98
127
|
metadata: {}
|
99
128
|
post_install_message:
|
100
129
|
rdoc_options: []
|
@@ -102,17 +131,17 @@ require_paths:
|
|
102
131
|
- lib
|
103
132
|
required_ruby_version: !ruby/object:Gem::Requirement
|
104
133
|
requirements:
|
105
|
-
- -
|
134
|
+
- - ">="
|
106
135
|
- !ruby/object:Gem::Version
|
107
136
|
version: '0'
|
108
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
138
|
requirements:
|
110
|
-
- -
|
139
|
+
- - ">"
|
111
140
|
- !ruby/object:Gem::Version
|
112
|
-
version:
|
141
|
+
version: 1.3.1
|
113
142
|
requirements: []
|
114
143
|
rubyforge_project:
|
115
|
-
rubygems_version: 2.0
|
144
|
+
rubygems_version: 2.2.0
|
116
145
|
signing_key:
|
117
146
|
specification_version: 4
|
118
147
|
summary: Collect gems and recipes related capistrano.
|
data/lib/capsum/setup.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require File.expand_path("../../capsum.rb", __FILE__)
|
2
|
-
|
3
|
-
Capistrano::Configuration.instance(true).load do
|
4
|
-
namespace :capsum do
|
5
|
-
desc 'upload example files to server on deploy:setup'
|
6
|
-
task :setup do
|
7
|
-
Dir["**/*.example", "**/*.sample"].each do |source|
|
8
|
-
target_dir = File.join(shared_path, File.dirname(source))
|
9
|
-
target_file = File.basename(source, ".*")
|
10
|
-
|
11
|
-
run "mkdir -p '#{target_dir}'"
|
12
|
-
top.upload(source, File.join(target_dir, target_file))
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
after "deploy:setup", "capsum:setup"
|
18
|
-
end
|