marionetta 0.4.8 → 0.4.8.1

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.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