torquebox-remote-deployer 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/lib/torquebox/remote_deploy_utils.rb +98 -20
- data/spec/fixtures/local_torquebox_remote.rb +5 -0
- data/spec/fixtures/multihost_torquebox_remote.rb +18 -0
- data/spec/fixtures/myapp.knob +1 -0
- data/spec/fixtures/simple_torquebox_remote.rb +7 -0
- data/spec/remote_deploy_spec.rb +138 -0
- data/spec/remote_deploy_utils_spec.rb +55 -0
- data/spec/spec_helper.rb +5 -0
- data/torquebox-remote-deployer.gemspec +1 -1
- metadata +18 -5
data/.gitignore
CHANGED
@@ -1,44 +1,66 @@
|
|
1
1
|
require "net/ssh"
|
2
2
|
require "net/scp"
|
3
3
|
|
4
|
+
require 'tempfile'
|
5
|
+
|
4
6
|
module TorqueBox
|
5
7
|
module RemoteDeployUtils
|
6
8
|
class << self
|
7
9
|
|
8
10
|
def stage(archive_file)
|
9
11
|
with_config(archive_file) do |config, app_name|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
# no need to stage if we are local. we'll just run from the app dir
|
13
|
+
unless config.local
|
14
|
+
cleanup_stage(config, archive_file, app_name)
|
15
|
+
prepare_stage(config, app_name)
|
16
|
+
stage_archive(config, archive_file)
|
17
|
+
unjar_staged_archive(config, archive_file, app_name)
|
18
|
+
end
|
14
19
|
end
|
15
20
|
end
|
16
21
|
|
17
22
|
def deploy(archive_file)
|
18
23
|
with_config(archive_file) do |config, app_name|
|
19
|
-
scp_upload(config, archive_file, "#{config.
|
24
|
+
scp_upload(config, archive_file, "#{config.jboss_home}/standalone/deployments/")
|
20
25
|
do_deploy(config, app_name)
|
21
26
|
end
|
22
27
|
end
|
23
28
|
|
24
29
|
def deploy_from_stage(archive_file)
|
25
30
|
with_config(archive_file) do |config, app_name|
|
26
|
-
|
31
|
+
unless config.local
|
32
|
+
ssh_exec(config, "cp #{config.torquebox_home}/stage/#{app_name}.knob #{config.jboss_home}/standalone/deployments")
|
33
|
+
else
|
34
|
+
scp_upload(config, archive_file, "#{config.jboss_home}/standalone/deployments/")
|
35
|
+
end
|
27
36
|
do_deploy(config, app_name)
|
28
37
|
end
|
29
38
|
end
|
30
39
|
|
31
40
|
def undeploy(archive_file)
|
32
41
|
with_config(archive_file) do |config, app_name|
|
33
|
-
|
42
|
+
unless config.local
|
43
|
+
ssh_exec(config, "rm -f #{config.jboss_home}/standalone/deployments/#{app_name}-knob.yml*")
|
44
|
+
ssh_exec(config, "rm -f #{config.jboss_home}/standalone/deployments/#{app_name}.knob")
|
45
|
+
else
|
46
|
+
FileUtils.rm("#{config.jboss_home}/standalone/deployments/#{app_name}-knob.yml*")
|
47
|
+
FileUtils.rm("#{config.jboss_home}/standalone/deployments/#{app_name}.knob")
|
48
|
+
end
|
34
49
|
end
|
35
50
|
end
|
36
51
|
|
37
52
|
def exec_ruby(archive_file, cmd)
|
38
53
|
with_config(archive_file) do |config, app_name|
|
39
|
-
|
40
|
-
|
41
|
-
|
54
|
+
unless config.local
|
55
|
+
# TODO set RACK_ENV based on env var, and default to production
|
56
|
+
ssh_exec(config, "cd #{config.torquebox_home}/stage/#{app_name}",
|
57
|
+
"export PATH=$PATH:#{config.torquebox_home}/jruby/bin",
|
58
|
+
"export RAILS_ENV=production",
|
59
|
+
"export RACK_ENV=production",
|
60
|
+
"#{config.torquebox_home}/jruby/bin/jruby -S #{cmd}")
|
61
|
+
else
|
62
|
+
# not sure what to do here yet
|
63
|
+
end
|
42
64
|
end
|
43
65
|
end
|
44
66
|
|
@@ -49,7 +71,25 @@ module TorqueBox
|
|
49
71
|
end
|
50
72
|
|
51
73
|
def do_deploy(config, app_name)
|
52
|
-
|
74
|
+
# TODO set RACK_ENV based on env var, and default to production
|
75
|
+
knob_yml = <<-YAML
|
76
|
+
application:
|
77
|
+
root: #{config.jboss_home}/standalone/deployments/#{app_name}.knob
|
78
|
+
environment:
|
79
|
+
RACK_ENV: production
|
80
|
+
RAILS_ENV: production
|
81
|
+
YAML
|
82
|
+
|
83
|
+
unless config.local
|
84
|
+
knob_yml_file = Tempfile.new("#{app_name}-knob.yml")
|
85
|
+
knob_yml_file.write(knob_yml)
|
86
|
+
knob_yml_file.rewind
|
87
|
+
scp_upload(config, knob_yml_file.path, "#{config.jboss_home}/standalone/deployments/#{app_name}-knob.yml")
|
88
|
+
ssh_exec(config, "touch #{config.jboss_home}/standalone/deployments/#{app_name}-knob.yml.dodeploy")
|
89
|
+
else
|
90
|
+
# todo copy temp file to somewhere
|
91
|
+
File.open("#{config.jboss_home}/standalone/deployments/#{app_name}-knob.yml.dodeploy", "w") {}
|
92
|
+
end
|
53
93
|
end
|
54
94
|
|
55
95
|
def app_name(archive_file)
|
@@ -70,11 +110,17 @@ module TorqueBox
|
|
70
110
|
end
|
71
111
|
|
72
112
|
def prepare_stage(config, app_name)
|
73
|
-
|
113
|
+
unless config.local
|
114
|
+
ssh_exec(config, "mkdir -p #{config.torquebox_home}/stage/#{app_name}")
|
115
|
+
else
|
116
|
+
FileUtils.mkdir_p("#{config.torquebox_home}/stage/#{app_name}")
|
117
|
+
end
|
74
118
|
end
|
75
119
|
|
76
120
|
def with_config(archive_file)
|
77
|
-
|
121
|
+
read_config.each do |config|
|
122
|
+
yield config, app_name(archive_file)
|
123
|
+
end
|
78
124
|
end
|
79
125
|
|
80
126
|
def ssh_exec(config, *cmd)
|
@@ -84,16 +130,21 @@ module TorqueBox
|
|
84
130
|
end
|
85
131
|
|
86
132
|
def scp_upload(config, local_file, remote_file)
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
133
|
+
unless config.local
|
134
|
+
Net::SCP.upload!(config.hostname, config.user, local_file, remote_file,
|
135
|
+
:ssh => {:port => config.port, :keys => [config.key]}
|
136
|
+
) do |ch, name, sent, total|
|
137
|
+
print "\rCopying #{name}: #{sent}/#{total}"
|
138
|
+
end
|
139
|
+
print "\n"
|
140
|
+
else
|
141
|
+
FileUtils.cp(local_file, remote_file)
|
91
142
|
end
|
92
|
-
print "\n"
|
93
143
|
end
|
94
144
|
|
95
145
|
def read_config
|
96
|
-
|
146
|
+
config_file = ENV["CONFIG_FILE"] || ENV["config_file"] || "config/torquebox_remote.rb"
|
147
|
+
eval(File.read(config_file)).configurations
|
97
148
|
end
|
98
149
|
end
|
99
150
|
end
|
@@ -105,11 +156,17 @@ module TorqueBox
|
|
105
156
|
|
106
157
|
def initialize(blk)
|
107
158
|
@config = RemoteConfig.new
|
159
|
+
@configs = []
|
108
160
|
instance_eval &blk
|
109
161
|
end
|
110
162
|
|
111
163
|
attr_reader :config
|
112
164
|
|
165
|
+
def configurations
|
166
|
+
# evenually, we should merge the base @config settings into the @configs
|
167
|
+
@configs.empty? ? [@config] : @configs
|
168
|
+
end
|
169
|
+
|
113
170
|
def hostname(h)
|
114
171
|
@config.hostname = h
|
115
172
|
end
|
@@ -130,18 +187,39 @@ module TorqueBox
|
|
130
187
|
@config.torquebox_home = tbh
|
131
188
|
end
|
132
189
|
|
190
|
+
def jboss_home(jbh)
|
191
|
+
@config.jboss_home = jbh
|
192
|
+
end
|
193
|
+
|
133
194
|
def sudo(sudo)
|
134
195
|
@config.sudo = sudo
|
135
196
|
end
|
197
|
+
|
198
|
+
def local(l)
|
199
|
+
@config.local = l
|
200
|
+
end
|
201
|
+
|
202
|
+
def host(&block)
|
203
|
+
@configs << RemoteDeploy.new(block).config
|
204
|
+
end
|
136
205
|
end
|
137
206
|
|
138
207
|
class RemoteConfig
|
139
|
-
attr_accessor :hostname, :port, :user, :key, :torquebox_home, :sudo
|
208
|
+
attr_accessor :hostname, :port, :user, :key, :torquebox_home, :sudo, :local
|
209
|
+
|
210
|
+
def jboss_home=(jbh)
|
211
|
+
@jboss_home = jbh
|
212
|
+
end
|
213
|
+
|
214
|
+
def jboss_home
|
215
|
+
@jboss_home || "#{@torquebox_home}/jboss"
|
216
|
+
end
|
140
217
|
|
141
218
|
def initialize
|
142
219
|
@user = "torquebox"
|
143
220
|
@torquebox_home = "/opt/torquebox"
|
144
221
|
@sudo = false
|
222
|
+
@local = false
|
145
223
|
end
|
146
224
|
end
|
147
225
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
TorqueBox::RemoteDeploy.configure do
|
2
|
+
host do
|
3
|
+
torquebox_home "/my/tb/dir"
|
4
|
+
jboss_home "/my/jboss/dir"
|
5
|
+
hostname "1.2.3.4"
|
6
|
+
port "2222"
|
7
|
+
user "torquebox"
|
8
|
+
key "~/.ssh/id_rsa.pub"
|
9
|
+
sudo true
|
10
|
+
end
|
11
|
+
|
12
|
+
host do
|
13
|
+
hostname "4.4.4.4"
|
14
|
+
port "22"
|
15
|
+
user "deploy"
|
16
|
+
key "~/.ssh/torquebox.pub"
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
this is not really a knob file
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TorqueBox::RemoteDeploy do
|
4
|
+
describe ".configure" do
|
5
|
+
context "defaults" do
|
6
|
+
subject do
|
7
|
+
TorqueBox::RemoteDeploy.configure do
|
8
|
+
hostname "1.2.3.4"
|
9
|
+
port "2222"
|
10
|
+
user "torquebox"
|
11
|
+
key "~/.ssh/id_rsa.pub"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has one configurations" do
|
16
|
+
subject.configurations.size.should == 1
|
17
|
+
subject.config.should == subject.configurations[0]
|
18
|
+
end
|
19
|
+
|
20
|
+
it "has hostname 1.2.3.4" do
|
21
|
+
subject.config.hostname.should == "1.2.3.4"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has port 2222" do
|
25
|
+
subject.config.port.should == "2222"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has user torquebox" do
|
29
|
+
subject.config.user.should == "torquebox"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "has key '~/.ssh/id_rsa.pub'" do
|
33
|
+
subject.config.key.should == "~/.ssh/id_rsa.pub"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "has torquebox_home '/opt/torquebox'" do
|
37
|
+
subject.config.torquebox_home.should == "/opt/torquebox"
|
38
|
+
end
|
39
|
+
|
40
|
+
it "has jboss_home '/opt/torquebox/jboss'" do
|
41
|
+
subject.config.jboss_home.should == "/opt/torquebox/jboss"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "has sudo false" do
|
45
|
+
subject.config.sudo.should == false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "overrides" do
|
50
|
+
subject do
|
51
|
+
TorqueBox::RemoteDeploy.configure do
|
52
|
+
torquebox_home "/my/tb/dir"
|
53
|
+
jboss_home "/my/jboss/dir"
|
54
|
+
hostname "1.2.3.4"
|
55
|
+
port "2222"
|
56
|
+
user "torquebox"
|
57
|
+
key "~/.ssh/id_rsa.pub"
|
58
|
+
sudo true
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it "has one configurations" do
|
63
|
+
subject.configurations.size.should == 1
|
64
|
+
subject.config.should == subject.configurations[0]
|
65
|
+
end
|
66
|
+
|
67
|
+
it "has hostname 1.2.3.4" do
|
68
|
+
subject.config.hostname.should == "1.2.3.4"
|
69
|
+
end
|
70
|
+
|
71
|
+
it "has port 2222" do
|
72
|
+
subject.config.port.should == "2222"
|
73
|
+
end
|
74
|
+
|
75
|
+
it "has user torquebox" do
|
76
|
+
subject.config.user.should == "torquebox"
|
77
|
+
end
|
78
|
+
|
79
|
+
it "has key '~/.ssh/id_rsa.pub'" do
|
80
|
+
subject.config.key.should == "~/.ssh/id_rsa.pub"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "has torquebox_home '/my/tb/dir'" do
|
84
|
+
subject.config.torquebox_home.should == "/my/tb/dir"
|
85
|
+
end
|
86
|
+
|
87
|
+
it "has jboss_home '/my/jboss/dir'" do
|
88
|
+
subject.config.jboss_home.should == "/my/jboss/dir"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "has sudo true" do
|
92
|
+
subject.config.sudo.should == true
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "multiple hosts" do
|
97
|
+
subject do
|
98
|
+
TorqueBox::RemoteDeploy.configure do
|
99
|
+
host do
|
100
|
+
torquebox_home "/my/tb/dir"
|
101
|
+
jboss_home "/my/jboss/dir"
|
102
|
+
hostname "1.2.3.4"
|
103
|
+
port "2222"
|
104
|
+
user "torquebox"
|
105
|
+
key "~/.ssh/id_rsa.pub"
|
106
|
+
sudo true
|
107
|
+
end
|
108
|
+
|
109
|
+
host do
|
110
|
+
hostname "4.4.4.4"
|
111
|
+
port "22"
|
112
|
+
user "deploy"
|
113
|
+
key "~/.ssh/torquebox.pub"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it "has one configurations" do
|
119
|
+
subject.configurations.size.should == 2
|
120
|
+
end
|
121
|
+
|
122
|
+
it "has correct config" do
|
123
|
+
test_config(subject.configurations[0])
|
124
|
+
test_config(subject.configurations[1])
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_config(configuration)
|
128
|
+
if configuration.hostname == "4.4.4.4"
|
129
|
+
configuration.torquebox_home.should == "/opt/torquebox"
|
130
|
+
elsif configuration.hostname == "1.2.3.4"
|
131
|
+
configuration.torquebox_home.should == "/my/tb/dir"
|
132
|
+
else
|
133
|
+
fail
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TorqueBox::RemoteDeployUtils do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@util = TorqueBox::RemoteDeployUtils
|
7
|
+
end
|
8
|
+
|
9
|
+
describe ".stage" do
|
10
|
+
it "stages one host" do
|
11
|
+
ENV["config_file"] = File.join(File.dirname(__FILE__), "fixtures/simple_torquebox_remote.rb")
|
12
|
+
@util.stub(:ssh_exec)
|
13
|
+
@util.should_receive(:scp_upload).with(anything(), "myapp.knob", "/opt/torquebox/stage/myapp.knob")
|
14
|
+
@util.stage("myapp.knob")
|
15
|
+
end
|
16
|
+
|
17
|
+
it "stages two hosts" do
|
18
|
+
ENV["config_file"] = File.join(File.dirname(__FILE__), "fixtures/multihost_torquebox_remote.rb")
|
19
|
+
@util.stub(:ssh_exec)
|
20
|
+
@util.should_receive(:scp_upload).with(anything(), "myapp.knob", "/my/tb/dir/stage/myapp.knob")
|
21
|
+
@util.should_receive(:scp_upload).with(anything(), "myapp.knob", "/opt/torquebox/stage/myapp.knob")
|
22
|
+
@util.stage("myapp.knob")
|
23
|
+
end
|
24
|
+
|
25
|
+
context "local" do
|
26
|
+
it "stages" do
|
27
|
+
ENV["config_file"] = File.join(File.dirname(__FILE__), "fixtures/local_torquebox_remote.rb")
|
28
|
+
@util.stage("myapp.knob") # does nothing
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe ".deploy" do
|
34
|
+
context "local" do
|
35
|
+
before do
|
36
|
+
FileUtils.mkdir_p(deploy_dir)
|
37
|
+
end
|
38
|
+
|
39
|
+
after do
|
40
|
+
FileUtils.remove_dir("#{File.dirname(__FILE__)}/../tmp/torquebox", true)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "deploys" do
|
44
|
+
ENV["config_file"] = File.join(File.dirname(__FILE__), "fixtures/local_torquebox_remote.rb")
|
45
|
+
@util.deploy(File.join(File.dirname(__FILE__), "fixtures/myapp.knob"))
|
46
|
+
File.exists?("#{deploy_dir}/myapp.knob").should == true
|
47
|
+
File.exists?("#{deploy_dir}/myapp.knob.dodeploy").should == true
|
48
|
+
end
|
49
|
+
|
50
|
+
def deploy_dir
|
51
|
+
"#{File.dirname(__FILE__)}/../tmp/torquebox/jboss/standalone/deployments/"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: torquebox-remote-deployer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.1.
|
5
|
+
version: 0.1.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Joe Kutner
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-03-24 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: jruby-openssl
|
@@ -83,6 +83,13 @@ files:
|
|
83
83
|
- lib/torquebox-remote-deployer.rb
|
84
84
|
- lib/torquebox/rake/tasks/remote.rb
|
85
85
|
- lib/torquebox/remote_deploy_utils.rb
|
86
|
+
- spec/fixtures/local_torquebox_remote.rb
|
87
|
+
- spec/fixtures/multihost_torquebox_remote.rb
|
88
|
+
- spec/fixtures/myapp.knob
|
89
|
+
- spec/fixtures/simple_torquebox_remote.rb
|
90
|
+
- spec/remote_deploy_spec.rb
|
91
|
+
- spec/remote_deploy_utils_spec.rb
|
92
|
+
- spec/spec_helper.rb
|
86
93
|
- torquebox-remote-deployer.gemspec
|
87
94
|
homepage: https://github.com/jkutner/torquebox-remote-deployer
|
88
95
|
licenses: []
|
@@ -107,9 +114,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
114
|
requirements: []
|
108
115
|
|
109
116
|
rubyforge_project: torquebox-remote-deployer
|
110
|
-
rubygems_version: 1.8.
|
117
|
+
rubygems_version: 1.8.15
|
111
118
|
signing_key:
|
112
119
|
specification_version: 3
|
113
120
|
summary: Deploy Knob files to a remote server with ease.
|
114
|
-
test_files:
|
115
|
-
|
121
|
+
test_files:
|
122
|
+
- spec/fixtures/local_torquebox_remote.rb
|
123
|
+
- spec/fixtures/multihost_torquebox_remote.rb
|
124
|
+
- spec/fixtures/myapp.knob
|
125
|
+
- spec/fixtures/simple_torquebox_remote.rb
|
126
|
+
- spec/remote_deploy_spec.rb
|
127
|
+
- spec/remote_deploy_utils_spec.rb
|
128
|
+
- spec/spec_helper.rb
|