ors 0.2.10 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|