ors 0.2.10 → 0.3.0
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.
- data/README.markdown +71 -0
- data/bin/ors +1 -1
- data/lib/ors.rb +21 -2
- data/lib/ors/base.rb +30 -0
- data/lib/ors/commands/base.rb +56 -12
- data/lib/ors/commands/changes.rb +21 -7
- data/lib/ors/commands/console.rb +16 -18
- data/lib/ors/commands/deploy.rb +24 -13
- data/lib/ors/commands/env.rb +9 -9
- data/lib/ors/commands/exec.rb +14 -7
- data/lib/ors/commands/help.rb +9 -11
- data/lib/ors/commands/logs.rb +16 -14
- data/lib/ors/commands/migrate.rb +8 -9
- data/lib/ors/commands/restart.rb +9 -11
- data/lib/ors/commands/ruby.rb +8 -6
- data/lib/ors/commands/runner.rb +29 -25
- data/lib/ors/commands/setup.rb +16 -16
- data/lib/ors/commands/start.rb +9 -11
- data/lib/ors/commands/stop.rb +9 -11
- data/lib/ors/commands/symlink.rb +31 -0
- data/lib/ors/commands/timestamps.rb +27 -0
- data/lib/ors/commands/update.rb +15 -11
- data/lib/ors/config.rb +88 -58
- data/lib/ors/helpers.rb +107 -76
- data/lib/ors/log_unifier.rb +2 -2
- data/lib/ors/version.rb +2 -2
- data/spec/ors/{command_spec.rb → base_spec.rb} +11 -8
- data/spec/ors/commands/base_spec.rb +17 -9
- data/spec/ors/commands/deploy_spec.rb +4 -3
- data/spec/ors/commands/runner_spec.rb +8 -27
- data/spec/ors/commands/timestamps_spec.rb +16 -0
- data/spec/ors/commands/update_spec.rb +8 -3
- data/spec/ors/config_spec.rb +56 -61
- data/spec/ors/helpers_spec.rb +6 -2
- data/spec/ors/log_unifier_spec.rb +2 -2
- metadata +82 -57
- data/README +0 -52
- data/lib/ors/command.rb +0 -46
- data/lib/ors/commands/check.rb +0 -27
- data/lib/ors/commands/sync.rb +0 -27
- data/lib/ors/core_ext.rb +0 -53
- data/spec/ors/commands/check_spec.rb +0 -15
data/lib/ors/commands/migrate.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
|
-
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Migrate < Base
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
def execute
|
6
|
-
info "migrating #{name} #{environment}..."
|
7
|
-
|
8
|
-
run_migrations migration_server
|
9
|
-
end
|
5
|
+
def execute
|
6
|
+
info "migrating #{ORS.config[:name]} #{ORS.config[:environment]}..."
|
10
7
|
|
8
|
+
run_migrations ORS.config[:migration_server]
|
9
|
+
end
|
10
|
+
end # Migrate < Base
|
11
11
|
end
|
12
|
-
|
13
12
|
end
|
data/lib/ors/commands/restart.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Restart < Base
|
4
|
+
def execute
|
5
|
+
info "restarting #{ORS.config[:name]} #{ORS.config[:environment]}..."
|
6
|
+
|
7
|
+
execute_in_parallel(ORS.config[:app_servers]) {|server| restart_server server }
|
8
|
+
end
|
9
|
+
end # Restart < Base
|
11
10
|
end
|
12
|
-
|
13
11
|
end
|
data/lib/ors/commands/ruby.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Ruby < Base
|
4
|
+
def execute
|
5
|
+
info "setting up ruby/rubygems for #{ORS.config[:name]} #{ORS.config[:environment]}..."
|
6
|
+
execute_in_parallel(ORS.config[:ruby_servers]) {|server| setup_ruby server }
|
7
|
+
end
|
8
|
+
end # Ruby < Base
|
7
9
|
end
|
8
10
|
end
|
data/lib/ors/commands/runner.rb
CHANGED
@@ -1,33 +1,37 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
code = ORS
|
6
|
-
raise if code.strip.empty?
|
7
|
-
rescue
|
8
|
-
fatal "ERROR: Missing option --code 'ruby code'."
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Runner < Base
|
4
|
+
def setup
|
5
|
+
@code = ORS.config[:args].shift
|
9
6
|
end
|
10
|
-
results = execute_command console_server, prepare_environment,
|
11
|
-
%(if [ -f script/rails ]; then bundle exec rails runner -e #{environment} \\"#{code}\\"; else ./script/runner -e #{environment} \\"#{code}\\"; fi),
|
12
|
-
:capture => true, :quiet_ssh => true
|
13
|
-
results.sub!(/\AUsing BufferedLogger due to exception: .*?\n/, '') # The central_logger gem spits this out without any way of shutting it up
|
14
|
-
puts results
|
15
|
-
end
|
16
7
|
|
17
|
-
|
18
|
-
|
19
|
-
|
8
|
+
def execute
|
9
|
+
# need code to run
|
10
|
+
fatal "ERROR: Missing 'ruby code'." if @code.nil?
|
20
11
|
|
21
|
-
|
12
|
+
# get results
|
13
|
+
results = execute_command(ORS.config[:console_server],
|
14
|
+
prepare_environment,
|
15
|
+
%(if [ -f script/rails ]; then bundle exec rails runner -e #{ORS.config[:environment]} \\"#{@code}\\"; else ./script/runner -e #{ORS.config[:environment]} \\"#{@code}\\"; fi),
|
16
|
+
:capture => true, :quiet_ssh => true)
|
17
|
+
|
18
|
+
# The central_logger gem spits this out
|
19
|
+
results.sub!(/\AUsing BufferedLogger due to exception: .*?\n/, '')
|
20
|
+
|
21
|
+
puts results
|
22
|
+
end
|
23
|
+
|
24
|
+
def usage
|
25
|
+
"./ors runner 'ruby code here' [options]"
|
26
|
+
end
|
27
|
+
|
28
|
+
def description
|
29
|
+
<<-END
|
22
30
|
Runs rails runner returning the result on STDOUT.
|
23
31
|
The ruby code will be transmitted within several nested quotes: '"\"ruby code here\""'
|
24
32
|
Keep that in mind if you need to use quotes.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
--pretend (or -p) Don't execute anything, just show me what you're going to do
|
29
|
-
--no-gateway (or -ng) Don't use a gateway (if you're inside the firewall)
|
30
|
-
END
|
31
|
-
end
|
33
|
+
END
|
34
|
+
end
|
35
|
+
end # Runner < Base
|
32
36
|
end
|
33
37
|
end
|
data/lib/ors/commands/setup.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
|
-
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Setup < Base
|
2
4
|
|
3
|
-
|
5
|
+
def execute
|
6
|
+
info "setting up #{ORS.config[:name]} #{ORS.config[:environment]}..."
|
4
7
|
|
5
|
-
|
6
|
-
|
8
|
+
info "Are you sure? ('yes' + ctrl+D^2)"
|
9
|
+
if ORS.config[:pretending] || STDIN.read == "yes"
|
10
|
+
execute_in_parallel(ORS.config[:all_servers]) {|server| setup_repo server }
|
7
11
|
|
8
|
-
|
9
|
-
if pretending || STDIN.read == "yes"
|
10
|
-
execute_in_parallel(all_servers) {|server| setup_repo server }
|
12
|
+
Ruby.run_without_setup
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
execute_command(ORS.config[:migration_server],
|
15
|
+
prepare_environment,
|
16
|
+
%(RAILS_ENV=#{environment} bundle exec rake db:create))
|
17
|
+
else
|
18
|
+
info "Setup aborted."
|
19
|
+
end
|
18
20
|
end
|
19
|
-
end
|
20
|
-
|
21
|
+
end # Setup < Base
|
21
22
|
end
|
22
|
-
|
23
23
|
end
|
data/lib/ors/commands/start.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Start < Base
|
4
|
+
def execute
|
5
|
+
info "starting #{ORS.config[:name]} #{ORS.config[:environment]}..."
|
6
|
+
|
7
|
+
execute_in_parallel(ORS.config[:app_servers]) {|server| start_server server }
|
8
|
+
end
|
9
|
+
end # Start < Base
|
11
10
|
end
|
12
|
-
|
13
11
|
end
|
data/lib/ors/commands/stop.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Stop < Base
|
4
|
+
def execute
|
5
|
+
info "stopping #{ORS.config[:name]} #{ORS.config[:environment]}..."
|
6
|
+
|
7
|
+
execute_in_parallel(ORS.config[:app_servers]) {|server| stop_server server }
|
8
|
+
end
|
9
|
+
end # Stop < Base
|
11
10
|
end
|
12
|
-
|
13
11
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Symlink < Base
|
4
|
+
|
5
|
+
def setup
|
6
|
+
parse_remote_and_or_branch
|
7
|
+
end
|
8
|
+
|
9
|
+
def execute
|
10
|
+
info "symlinking #{ORS.config[:name]} #{ORS.config[:environment]}..."
|
11
|
+
|
12
|
+
execute_in_parallel(ORS.config[:ruby_servers]) do |server|
|
13
|
+
info "[#{server}] symlinking..."
|
14
|
+
execute_command(server,
|
15
|
+
prepare_environment,
|
16
|
+
#%(if [ -d config/deploy ]; then cd config/deploy; for i in ./**/*; do if [ -f \\\$i ]; then echo \\\$i; fi; done; cd ../../; fi))
|
17
|
+
%(if [ -d config/deploy ]; then cd config/deploy; for i in ./**/*; do if [ -f \\\$i ]; then ln -nfs #{ORS.config[:deploy_directory]}/config/deploy/\\\$i ../../\\\$i; fi; done; cd ../../; fi))
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def usage
|
23
|
+
"./ors symlink [remote|remote/branch] [options]"
|
24
|
+
end
|
25
|
+
|
26
|
+
def description
|
27
|
+
"Symlinks files in config/deploy/ in given branch (origin/environment by default) to given environment"
|
28
|
+
end
|
29
|
+
end # Deploy < Base
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
|
4
|
+
# ors timestamps
|
5
|
+
# ors timestamps from staging
|
6
|
+
class Timestamps < Base
|
7
|
+
def execute
|
8
|
+
timestamps = ORS.config[:app_servers].map do |server|
|
9
|
+
[
|
10
|
+
"[#{server}] ",
|
11
|
+
execute_command(server, prepare_environment, %(cat restart.timestamp), :capture => true)
|
12
|
+
].join
|
13
|
+
end.join("\n")
|
14
|
+
|
15
|
+
puts timestamps unless ORS.config[:pretending]
|
16
|
+
end
|
17
|
+
|
18
|
+
def usage
|
19
|
+
"./ors check [options]"
|
20
|
+
end
|
21
|
+
|
22
|
+
def description
|
23
|
+
"Prints out contents of restart.timestamp on the app servers"
|
24
|
+
end
|
25
|
+
end # Timestamps < Base
|
26
|
+
end
|
27
|
+
end
|
data/lib/ors/commands/update.rb
CHANGED
@@ -1,17 +1,21 @@
|
|
1
|
-
|
1
|
+
class ORS
|
2
|
+
module Commands
|
3
|
+
class Update < Base
|
2
4
|
|
3
|
-
|
5
|
+
def setup
|
6
|
+
parse_remote_and_or_branch
|
7
|
+
end
|
4
8
|
|
5
|
-
|
6
|
-
|
9
|
+
def execute
|
10
|
+
info "updating #{ORS.config[:name]} #{ORS.config[:environment]}..."
|
7
11
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
execute_command cron_server, prepare_environment,
|
12
|
-
%(if [ -f config/schedule.rb ]; then bundle exec whenever --update-crontab --set environment=#{environment} -i #{name}_#{environment}; fi)
|
13
|
-
end
|
12
|
+
execute_in_parallel(ORS.config[:all_servers]) {|server| update_code(server) }
|
13
|
+
execute_in_parallel(ORS.config[:ruby_servers]) {|server| bundle_install(server) }
|
14
14
|
|
15
|
+
execute_command(ORS.config[:cron_server],
|
16
|
+
prepare_environment,
|
17
|
+
%(if [ -f config/schedule.rb ]; then bundle exec whenever --update-crontab --set environment=#{ORS.config[:environment]} -i #{ORS.config[:name]}_#{ORS.config[:environment]}; fi))
|
18
|
+
end
|
19
|
+
end # Update < Base
|
15
20
|
end
|
16
|
-
|
17
21
|
end
|
data/lib/ors/config.rb
CHANGED
@@ -1,90 +1,120 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
class ORS
|
2
|
+
class Config
|
3
3
|
|
4
|
-
CONFIG_FILENAME="config/deploy.yml"
|
4
|
+
CONFIG_FILENAME = "config/deploy.yml"
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
mattr_accessor :options
|
6
|
+
@@args = []
|
7
|
+
@@options = {}
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
def initialize(options)
|
10
|
+
parse_options(options)
|
11
|
+
parse_config_file
|
12
|
+
end
|
14
13
|
|
15
|
-
|
14
|
+
def _options
|
15
|
+
@@options
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
self.options = options.dup
|
18
|
+
def [](key)
|
19
|
+
@@options[key]
|
20
|
+
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
when "-ng", "--no-gateway" then self.use_gateway = false
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
22
|
+
def []=(key, value)
|
23
|
+
@@options[key] = value
|
24
|
+
end
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
YAML.load(File.read(CONFIG_FILENAME)).each {|(name, value)| send "#{name}=", value }
|
33
|
-
else
|
34
|
-
self.gateway = "deploy-gateway"
|
35
|
-
self.deploy_user = "deployer"
|
36
|
-
self.repo = "ors_git"
|
37
|
-
self.base_path = "/var/www"
|
38
|
-
self.web_servers = %w(koala)
|
39
|
-
self.app_servers = %w(eel jellyfish squid)
|
40
|
-
self.migration_server = "tuna"
|
41
|
-
self.console_server = "tuna"
|
42
|
-
self.cron_server = "tuna"
|
43
|
-
end
|
44
|
-
end
|
26
|
+
def parse_options(options)
|
27
|
+
@@options[:pretending] = true if options.delete("-p") || options.delete("--pretend")
|
45
28
|
|
46
|
-
|
47
|
-
|
29
|
+
if options.delete("-ng") || options.delete("--no-gateway")
|
30
|
+
@@options[:use_gateway] = false
|
31
|
+
else
|
32
|
+
@@options[:use_gateway] = true
|
48
33
|
end
|
49
34
|
|
50
|
-
|
51
|
-
|
35
|
+
# grab environment
|
36
|
+
index = options.index("to") || options.index("from")
|
37
|
+
unless index.nil?
|
38
|
+
@@options[:environment] = options.delete_at(index + 1)
|
39
|
+
options.delete_at(index)
|
52
40
|
end
|
53
41
|
|
54
|
-
|
55
|
-
@git ||= Git.open(Dir.pwd)
|
56
|
-
end
|
42
|
+
@@options[:args] = options.dup
|
57
43
|
|
58
|
-
|
44
|
+
set_default_options
|
45
|
+
end
|
46
|
+
|
47
|
+
def set_default_options
|
48
|
+
@@options[:environment] ||= "production"
|
49
|
+
@@options[:remote] ||= "origin"
|
50
|
+
@@options[:branch] ||= @@options[:environment]
|
51
|
+
@@options[:pretending] ||= false
|
52
|
+
@@options[:log_lines] = 100
|
53
|
+
|
54
|
+
@@options[:gateway] = "deploy-gateway"
|
55
|
+
@@options[:user] = "deployer"
|
56
|
+
@@options[:base_path] = "/var/www"
|
57
|
+
@@options[:web_servers] = %w(koala)
|
58
|
+
@@options[:app_servers] = %w(eel jellyfish squid)
|
59
|
+
@@options[:migration_server] = "tuna"
|
60
|
+
@@options[:console_server] = "tuna"
|
61
|
+
@@options[:cron_server] = "tuna"
|
62
|
+
end
|
59
63
|
|
60
|
-
|
61
|
-
|
64
|
+
def parse_config_file
|
65
|
+
if File.exists?(CONFIG_FILENAME)
|
66
|
+
YAML.load(File.read(CONFIG_FILENAME)).each do |(name, value)|
|
67
|
+
@@options[name.to_sym] = value
|
68
|
+
end
|
62
69
|
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def finalize!
|
73
|
+
@@options[:name] = name
|
74
|
+
@@options[:remote_url] = remote_url
|
75
|
+
@@options[:deploy_directory] = deploy_directory
|
76
|
+
|
77
|
+
@@options[:revision] = git.log(1).first.sha
|
78
|
+
|
79
|
+
@@options[:ruby_servers] = [@@options[:app_servers], @@options[:console_server], @@options[:cron_server], @@options[:migration_server]].flatten.compact.uniq
|
80
|
+
@@options[:all_servers] = [@@options[:web_servers], @@options[:ruby_servers]].flatten.compact.uniq
|
81
|
+
end
|
63
82
|
|
83
|
+
def git
|
84
|
+
@git ||= Git.open(Dir.pwd)
|
64
85
|
end
|
65
|
-
extend ModuleMethods
|
66
86
|
|
67
|
-
def
|
68
|
-
|
87
|
+
def valid?
|
88
|
+
name.to_s.size > 0
|
69
89
|
end
|
70
90
|
|
71
|
-
|
72
|
-
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
#
|
95
|
+
# methods to help finalize the config
|
96
|
+
#
|
97
|
+
|
98
|
+
def remote_url
|
99
|
+
if git.config.has_key?("remote.#{@@options[:remote]}.url")
|
100
|
+
git.config["remote.#{@@options[:remote]}.url"]
|
101
|
+
else
|
102
|
+
raise StandardError, "There is no #{@@options[:remote]} remote in your git config, please check your config/deploy.yml"
|
103
|
+
end
|
73
104
|
end
|
74
105
|
|
75
|
-
def
|
76
|
-
|
106
|
+
def name
|
107
|
+
remote_url.gsub(/^[\w]*(@|:\/\/)[^\/:]*(\/|:)([a-zA-Z0-9\/_\-]*)(.git)?$/i, '\3')
|
77
108
|
end
|
78
109
|
|
79
110
|
def deploy_directory
|
80
|
-
directory = File.join
|
111
|
+
directory = File.join(@@options[:base_path], @@options[:name])
|
81
112
|
|
82
|
-
if environment == "production"
|
113
|
+
if @@options[:environment] == "production"
|
83
114
|
directory
|
84
115
|
else
|
85
|
-
"#{directory}_#{environment}"
|
116
|
+
"#{directory}_#{@@options[:environment]}"
|
86
117
|
end
|
87
118
|
end
|
88
|
-
|
89
119
|
end
|
90
120
|
end
|