marionetta 0.4.8 → 0.4.8.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -166,17 +166,12 @@ staging.manipulate_each_server(:deployer, :rollback)
166
166
 
167
167
  ## Upcoming
168
168
 
169
- - Output deploy excludes to tmp file for use with rsync --exclude-from (v0.4.x)
170
- - Add clean up for deployments (v0.4.x)
171
- - Add puppet safe-upgrade ability (v0.4.x)
169
+ - Add permissions with Manipulators::Deployer (v0.4.x)
172
170
  - Remove rollback feature... we don't need rollbacks IMO. (v0.5.x)
173
171
  - Remove Marionetta::Manipulators::Debloyer (v0.5.x)
174
172
  - Use rye for commands (https://github.com/delano/rye) (v0.5.x)
175
173
  - Use a single SSH connection per task (v0.5.x)
176
- - Add ability to define shared directories with Manipulators::Deployer
177
- - Add ability to define permissions with Manipulators::Deployer
178
- - Change :before_script and :after_script to :before_scripts and :after_scripts
179
- that take an array
174
+ - Ensure concurrency is tested and therefore guaranteed (v0.5.x)
180
175
 
181
176
  ## Author
182
177
 
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'bundler'
2
2
  require 'rspec/core/rake_task'
3
- require 'marionetta'
4
3
 
5
4
  Bundler::GemHelper.install_tasks
6
5
  RSpec::Core::RakeTask.new(:spec)
data/lib/marionetta.rb CHANGED
@@ -27,7 +27,7 @@
27
27
  #
28
28
  module Marionetta
29
29
 
30
- VERSION = '0.4.8'
30
+ VERSION = '0.4.8.1'
31
31
 
32
32
  ### Defining Servers
33
33
 
@@ -42,10 +42,15 @@ module Marionetta
42
42
  end
43
43
 
44
44
  def rsync_exclude_flags(exclude_files)
45
- exclude_files.map! {|f| ['--exclude', f]}
46
- exclude_files.flatten!
45
+ excludes_path = '/tmp/exclude-rsync'
46
+ excludes_file = File.open(excludes_path, 'w')
47
47
 
48
- return exclude_files
48
+ exclude_files.each do |f|
49
+ excludes_file << "#{f}\n"
50
+ end
51
+
52
+ excludes_file.close
53
+ return ['--exclude-from', excludes_path]
49
54
  end
50
55
 
51
56
  def sync_dir(from, to, exclude_files = [])
@@ -19,6 +19,8 @@ module Marionetta
19
19
 
20
20
  def initialize(server)
21
21
  @server = server
22
+ server[:logger].warn('You should try Marionetta::Manipulators::Deployer')
23
+ server[:logger].warn('Debloyer (thats Deb) is now deprecated and will be removed in v0.5.x')
22
24
  end
23
25
 
24
26
  def can?()
@@ -90,4 +92,4 @@ module Marionetta
90
92
  end
91
93
  end
92
94
  end
93
- end
95
+ end
@@ -54,16 +54,22 @@ module Marionetta
54
54
 
55
55
  ### Deploying
56
56
 
57
- # Call `.deploy()` to run a deploy to your remote
58
- # server. The process involves:
57
+ # Setup deploy environment on remote server.
58
+ #
59
+ def setup()
60
+ create_directories
61
+ end
62
+
63
+ # Run a deploy to your remote server. The process
64
+ # involves:
59
65
  #
60
66
  # - `:from` directory rsync'd to remote cache directory
61
67
  # with `:exclude` files being ignored
62
68
  # - cache directory copied on remote machine to
63
69
  # releases directory
64
- # - `:before_script` run
70
+ # - `:before_script` and `:before_scripts` run
65
71
  # - release directory symlinked to a current directory
66
- # - `:after_script` run
72
+ # - `:after_script` and `:before_scripts` run
67
73
  #
68
74
  # The directory structure under `server[:deployer][:to]`
69
75
  # looks something like this:
@@ -80,26 +86,33 @@ module Marionetta
80
86
  DirectorySync.sync(server, from_dir, cache_dir, server[:deployer])
81
87
  copy_cache_dir_to_release(release)
82
88
 
89
+ symlink_shared_directories(release)
90
+
83
91
  send_scripts()
84
92
  run_script(:before, release)
85
93
  symlink_release_dir(release)
86
94
  run_script(:after, release)
87
95
  end
88
96
 
89
- # To get an array of all releases call `.releases()`.
90
- # Any release that is subsequently rolled back will not
91
- # be listed.
97
+ # Get an array of all releases including those which
98
+ # have been rolled back (skipped).
92
99
  #
93
- def releases()
94
- releases = []
100
+ def releases_including_skipped()
101
+ files = []
95
102
 
96
103
  cmd.ssh("ls -m #{releases_dir}") do |stdout|
97
- stdout.read.split(/[,\s]+/).each do |release|
98
- releases << release unless release.index('skip-') == 0
99
- end
104
+ files.concat(stdout.read.split(/[,\s]+/))
100
105
  end
101
106
 
102
- return releases
107
+ return files
108
+ end
109
+
110
+ # Get an array of all releases call `.releases()`. Any
111
+ # release that is subsequently rolled back will not
112
+ # be listed.
113
+ #
114
+ def releases()
115
+ releases_including_skipped.delete_if {|r| r =~ /^skip-/}
103
116
  end
104
117
 
105
118
  # If you push out and need to rollback to the previous
@@ -119,6 +132,16 @@ module Marionetta
119
132
  end
120
133
  end
121
134
 
135
+ # Delete release directories on remote machine.
136
+ #
137
+ def clean()
138
+ rels = releases()
139
+ rels.pop()
140
+ rm = ['rm', '-r'].concat(rels.map {|r| release_dir(r)})
141
+ rm << release_dir('skip-*')
142
+ cmd.ssh(rm)
143
+ end
144
+
122
145
  private
123
146
 
124
147
  def from_dir()
@@ -141,6 +164,10 @@ module Marionetta
141
164
  "#{to_dir}/cache"
142
165
  end
143
166
 
167
+ def shared_dir()
168
+ "#{to_dir}/shared"
169
+ end
170
+
144
171
  def releases_dir()
145
172
  "#{to_dir}/releases"
146
173
  end
@@ -153,6 +180,24 @@ module Marionetta
153
180
  "#{to_dir}/current"
154
181
  end
155
182
 
183
+ def install_dir_cmd(dir)
184
+ owner = 'www-data'
185
+ group = 'www-data'
186
+ chmod = '775'
187
+
188
+ return "install -d #{dir} -o #{owner} -g #{group} -m #{chmod}"
189
+ end
190
+
191
+ def create_directories()
192
+ install = [install_dir_cmd(releases_dir), install_dir_cmd(cache_dir)]
193
+
194
+ if server[:deployer].has_key?(:shared_directories)
195
+ install << install_dir_cmd(shared_dir)
196
+ end
197
+
198
+ cmd.ssh(install)
199
+ end
200
+
156
201
  def create_release_name()
157
202
  name = timestamp
158
203
 
@@ -173,14 +218,37 @@ module Marionetta
173
218
  cmd.ssh("mkdir -p #{releases_dir} && cp -r #{cache_dir} #{release_dir}")
174
219
  end
175
220
 
221
+ def symlink_shared_directories(release)
222
+ return unless server[:deployer].has_key?(:shared_directories)
223
+
224
+ release_dir = release_dir(release)
225
+ cmds = []
226
+
227
+ server[:deployer][:shared_directories].each do |d|
228
+ to = "#{release_dir}/#{d}"
229
+ from = "#{shared_dir}/#{d}"
230
+
231
+ cmds << "rm -r #{to}"
232
+ cmds << "mkdir -p #{from}"
233
+ cmds << "ln -s #{from} #{to}"
234
+ end
235
+
236
+ cmd.ssh(cmds.join(' && '))
237
+ end
238
+
176
239
  def send_scripts()
177
240
  files = []
178
241
 
179
242
  [:before, :after].each do |script|
180
- script_key = "#{script}_script".to_sym
243
+ singular_script_key = "#{script}_script".to_sym
244
+ plural_script_key = "#{script}_scripts".to_sym
245
+
246
+ if server[:deployer].has_key?(singular_script_key)
247
+ files << server[:deployer][singular_script_key]
248
+ end
181
249
 
182
- if server[:deployer].has_key?(script_key)
183
- files << server[:deployer][script_key]
250
+ if server[:deployer].has_key?(plural_script_key)
251
+ files.concat(server[:deployer][plural_script_key])
184
252
  end
185
253
  end
186
254
 
@@ -54,7 +54,9 @@ module Marionetta
54
54
  # to install puppet on debian or ubuntu servers.
55
55
  #
56
56
  def install()
57
- unless server[:puppet].has_key?(:use_distro_repo) and server[:puppet][:use_distro_repo] == true
57
+ p = server[:puppet]
58
+
59
+ unless p.has_key?(:use_distro_repo) and p[:use_distro_repo] == true
58
60
  install_deb_repo
59
61
  end
60
62
 
@@ -6,7 +6,6 @@
6
6
  #
7
7
  require 'marionetta'
8
8
  require 'marionetta/manipulators'
9
- require 'rake'
10
9
 
11
10
  module Marionetta
12
11
  module RakeHelper
data/spec/app/after2 ADDED
@@ -0,0 +1 @@
1
+ echo 'Cool'
@@ -11,17 +11,25 @@ def cmd()
11
11
  end
12
12
 
13
13
  describe Marionetta::Manipulators::Deployer do
14
- it 'should deploy' do
14
+ it 'should setup' do
15
15
  cmd.ssh('rm -rf ~/app')
16
+ deployer.setup
17
+ cmd.ssh("[ -d ~/app/releases ]").should == true
18
+ cmd.ssh("[ -d ~/app/shared ]").should == true
19
+ cmd.ssh("[ -d ~/app/cache ]").should == true
20
+ end
21
+
22
+ it 'should deploy' do
16
23
  deployer.deploy
17
24
  deployer.deploy
18
25
  cmd.ssh("[ -L ~/app/current ]").should == true
19
- cmd.ssh("[ -d ~/app/releases ]").should == true
20
26
  cmd.ssh("[ -f ~/app/current/app.rb ]").should == true
21
27
  cmd.ssh("[ -f ~/app/current/app-copy.rb ]").should == true
22
28
  cmd.ssh("[ -f ~/app/current/exclude.txt ]").should_not == true
23
29
  cmd.ssh("[ -f ~/app/current/exclude/another.txt ]").should_not == true
24
30
  cmd.ssh("[ -f ~/app/current/after ]").should_not == true
31
+ cmd.ssh("[ -f ~/app/current/after2 ]").should_not == true
32
+ cmd.ssh("[ -L ~/app/current/logs ]").should == true
25
33
  end
26
34
 
27
35
  it 'should list releases' do
@@ -31,4 +39,9 @@ describe Marionetta::Manipulators::Deployer do
31
39
  it 'should rollback' do
32
40
  deployer.rollback
33
41
  end
42
+
43
+ it 'should clean up' do
44
+ deployer.clean
45
+ deployer.releases_including_skipped.length.should == 1
46
+ end
34
47
  end
data/spec/spec_helper.rb CHANGED
@@ -22,8 +22,10 @@ def server()
22
22
 
23
23
  s[:deployer][:from] = app_dir
24
24
  s[:deployer][:to] = '~/app'
25
- s[:deployer][:exclude] = ['exclud*', 'before', 'after']
25
+ s[:deployer][:exclude] = ['exclud*', 'before', 'after*']
26
26
  s[:deployer][:after_script] = "#{app_dir}/after"
27
+ s[:deployer][:after_scripts] = ["#{app_dir}/after2"]
28
+ s[:deployer][:shared_directories] = ['logs']
27
29
 
28
30
  s[:debloyer][:from] = app_dir
29
31
  s[:debloyer][:to] = '~/app-deb'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marionetta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.8
4
+ version: 0.4.8.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-02-08 00:00:00.000000000 Z
12
+ date: 2013-02-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: open4
@@ -150,6 +150,7 @@ files:
150
150
  - lib/marionetta/rake_helper.rb
151
151
  - marionetta.gemspec
152
152
  - spec/app/after
153
+ - spec/app/after2
153
154
  - spec/app/app.rb
154
155
  - spec/app/exclude.txt
155
156
  - spec/app/exclude/another.txt
@@ -179,7 +180,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
180
  version: '0'
180
181
  segments:
181
182
  - 0
182
- hash: 3588169205023904270
183
+ hash: 2416169289769076479
183
184
  required_rubygems_version: !ruby/object:Gem::Requirement
184
185
  none: false
185
186
  requirements:
@@ -188,7 +189,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
188
189
  version: '0'
189
190
  segments:
190
191
  - 0
191
- hash: 3588169205023904270
192
+ hash: 2416169289769076479
192
193
  requirements: []
193
194
  rubyforge_project:
194
195
  rubygems_version: 1.8.24
@@ -197,6 +198,7 @@ specification_version: 3
197
198
  summary: Provision using puppet and deploy your servers over SSH.
198
199
  test_files:
199
200
  - spec/app/after
201
+ - spec/app/after2
200
202
  - spec/app/app.rb
201
203
  - spec/app/exclude.txt
202
204
  - spec/app/exclude/another.txt