marionetta 0.3.2 → 0.3.3

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.
@@ -24,11 +24,15 @@ module Marionetta
24
24
  end
25
25
 
26
26
  def deploy()
27
+ run_script(:before)
28
+
27
29
  release = timestamp
28
30
  create_tmp_release_dir(release)
29
31
  send_tmp_release_dir_as_archive(release)
30
32
  extract_archive_into_release_dir(release)
31
33
  symlink_release_dir(release)
34
+
35
+ run_script(:after)
32
36
  end
33
37
 
34
38
  def releases()
@@ -90,34 +94,57 @@ module Marionetta
90
94
  "#{to_dir}/current"
91
95
  end
92
96
 
97
+ def fatal(message)
98
+ server[:logger].fatal(cmd.last)
99
+ server[:logger].fatal(message)
100
+ exit(1)
101
+ end
102
+
103
+ def run_script(script)
104
+ script_key = "#{script}_script".to_sym
105
+
106
+ if server[:deployer].has_key?(script_key)
107
+ script = server[:deployer][script_key]
108
+ cmd.put(script, '/tmp')
109
+ tmp_script = "/tmp/#{File.basename(script)}"
110
+ cmd.ssh("chmod +x #{tmp_script} && exec #{tmp_script}")
111
+ end
112
+ end
113
+
93
114
  def create_tmp_release_dir(release)
94
- cmd.system("cp -r #{from_dir} #{tmp_release_dir(release)}")
115
+ tmp_release_dir = tmp_release_dir(release)
116
+ cmd.system("cp -r #{from_dir} #{tmp_release_dir}")
117
+
118
+ if server[:deployer].has_key?(:exclude)
119
+ exclude_files = server[:deployer][:exclude]
120
+ exclude_files.map! {|f| "#{tmp_release_dir}/#{f}"}
121
+ cmd.system("rm -rf #{exclude_files.join(' ')}")
122
+ end
95
123
  end
96
124
 
97
125
  def send_tmp_release_dir_as_archive(release)
98
126
  release_archive = tmp_release_archive(release)
99
- cmd.archive(tmp_release_dir(release), release_archive)
127
+
128
+ unless cmd.archive(tmp_release_dir(release), release_archive)
129
+ fatal('Could not create archive')
130
+ end
131
+
100
132
  cmd.put(release_archive)
101
133
  end
102
134
 
103
135
  def extract_archive_into_release_dir(release)
104
136
  release_archive = tmp_release_archive(release)
105
- release_dir = release_dir(release)
106
137
 
107
138
  unless cmd.ssh_extract(release_archive, release_dir)
108
- server[:logger].fatal(cmd.last)
109
- server[:logger].fatal('Could not extract archive')
110
- exit(1)
139
+ fatal('Could not extract archive')
111
140
  end
112
141
  end
113
142
 
114
143
  def symlink_release_dir(release)
115
144
  release_dir = release_dir(release)
116
145
 
117
- unless cmd.ssh("rm -rf #{current_dir} && ln -s #{release_dir} #{current_dir}")
118
- server[:logger].fatal(cmd.last)
119
- server[:logger].fatal('Could not symlink release as current')
120
- exit(1)
146
+ unless cmd.ssh("rm -f #{current_dir} && ln -s #{release_dir} #{current_dir}")
147
+ fatal('Could not symlink release as current')
121
148
  end
122
149
  end
123
150
 
@@ -89,19 +89,19 @@ module Marionetta
89
89
  cmd.ssh_extract('/tmp/puppet.tar.gz')
90
90
  cmds = ['cd /tmp/puppet']
91
91
 
92
- puppet_cmd = 'sudo puppet apply '
92
+ puppet_cmd = ['sudo puppet apply']
93
93
 
94
94
  if server[:puppet].has_key?(:modules)
95
- puppet_cmd += '--modulepath=/tmp/puppet/modules '
95
+ puppet_cmd << '--modulepath=/tmp/puppet/modules'
96
96
  end
97
97
 
98
- puppet_cmd += 'manifest.pp'
98
+ puppet_cmd << 'manifest.pp'
99
99
 
100
- if server[:puppet].has_key?(:options)
101
- puppet_cmd += " #{server[:puppet][:options]}"
100
+ if server[:puppet].has_key?(:flags)
101
+ puppet_cmd << server[:puppet][:flags]
102
102
  end
103
103
 
104
- cmds << puppet_cmd
104
+ cmds << puppet_cmd.flatten.join(' ')
105
105
 
106
106
  cmd.ssh(cmds.join(' && '))
107
107
  end
data/lib/marionetta.rb CHANGED
@@ -1,9 +1,43 @@
1
+ # Marionetta is a ruby library for executing commands to one
2
+ # or more remote machines via SSH.
3
+ #
4
+ # It provides puppet provisioning without the need for a
5
+ # puppet master and can also deploy your application code
6
+ # (with rollbacks) via rsync. With a RakeHelper you can
7
+ # integrate it into your workflow with ease.
8
+ #
9
+ # Installing the gem is the best way to start using
10
+ # Marionetta. You can do this from command line:
11
+ #
12
+ # gem install marionetta
13
+ #
14
+ # Or – better yet – in your Gemfile:
15
+ #
16
+ # source "http://rubygems.org"
17
+ # gem 'marionetta'
18
+ #
19
+ # Marionetta is written by [Luke Morton][author] and licensed
20
+ # under the MIT license. The project is [hosted on github][github]
21
+ # where you can report issues and send your well thought out
22
+ # pull requests.
23
+ #
24
+ # [author]: http://lukemorton.co.uk
25
+ # [github]: https://github.com/DrPheltRight/marionetta
1
26
  module Marionetta
2
- VERSION = '0.3.2'
3
- DESCRIPTION = 'For lightweight puppet mastery. Organise
4
- multiple machines via rsync and SSH rather
5
- than using puppet master'
27
+ VERSION = '0.3.3'
6
28
 
29
+ # In order to connect to servers you must define configs for
30
+ # each. This method provides a default map describing some
31
+ # common settings including command binaries, default flags
32
+ # and more.
33
+ #
34
+ # One interesting this to note is a logger is set, pointing
35
+ # to `STDOUT`.
36
+ #
37
+ # Do not get too caught up in this method, it is called
38
+ # elsewhere in Marionetta where you can better define your
39
+ # servers. You should consult this method in order to see
40
+ # the defaults.
7
41
  def self.default_server()
8
42
  {
9
43
  :logger => Logger.new($stdout),
data/marionetta.gemspec CHANGED
@@ -6,9 +6,14 @@ Gem::Specification.new do |s|
6
6
  s.homepage = 'https://github.com/DrPheltRight/marionetta'
7
7
  s.authors = ["Luke Morton"]
8
8
  s.email = ["lukemorton.dev@gmail.com"]
9
- s.summary = Marionetta::DESCRIPTION
10
- s.description = Marionetta::DESCRIPTION
11
-
9
+ s.summary = "Provision using puppet and deploy your servers over SSH."
10
+ s.description = "Marionetta is a ruby library for executing commands to one
11
+ or more remote machines via SSH. It provides puppet
12
+ provisioning without the need for a puppet master and can
13
+ also deploy your application code (with rollbacks) via
14
+ rsync. With a RakeHelper you can integrate it into your
15
+ workflow with ease."
16
+
12
17
  s.files = `git ls-files`.split("\n")
13
18
  s.test_files = `git ls-files -- spec/*`.split("\n")
14
19
  s.executables = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f)}
data/spec/app/after ADDED
@@ -0,0 +1 @@
1
+ cp ~/app/current/app.rb ~/app/current/app-copy.rb
@@ -0,0 +1 @@
1
+ exclude me
@@ -0,0 +1 @@
1
+ exclude me
@@ -6,9 +6,21 @@ def deployer()
6
6
  Marionetta::Manipulators::Deployer.new(server)
7
7
  end
8
8
 
9
+ def cmd()
10
+ Marionetta::CommandRunner.new(server)
11
+ end
12
+
9
13
  describe Marionetta::Manipulators::Deployer do
10
14
  it 'should deploy' do
15
+ cmd.ssh('rm -rf ~/app')
11
16
  deployer.deploy
17
+ cmd.ssh("[ -d ~/app/current ]").should == true
18
+ cmd.ssh("[ -d ~/app/releases ]").should == true
19
+ cmd.ssh("[ -f ~/app/current/app.rb ]").should == true
20
+ cmd.ssh("[ -f ~/app/current/app-copy.rb ]").should == true
21
+ cmd.ssh("[ -f ~/app/current/exclude.txt ]").should_not == true
22
+ cmd.ssh("[ -f ~/app/current/exclude/another.txt ]").should_not == true
23
+ cmd.ssh("[ -f ~/app/current/after ]").should_not == true
12
24
  end
13
25
 
14
26
  it 'should list releases' do
data/spec/spec_helper.rb CHANGED
@@ -8,23 +8,30 @@ env = Vagrant::Environment.new(:cwd => File.dirname(__FILE__)+'/vagrant')
8
8
  env.cli('up')
9
9
 
10
10
  def server()
11
- s = Marionetta.default_server
11
+ s = Marionetta.default_server
12
12
 
13
- s[:hostname] = 'vagrant@192.168.33.11'
14
- ssh_key_path = File.dirname(__FILE__)+'/vagrant/key'
15
- s[:ssh][:flags] = ['-i', ssh_key_path]
16
- s[:rsync][:flags] = ['-azP', '-e', "ssh -i #{ssh_key_path}", '--delete']
13
+ # s[:logger].level = Logger::INFO
17
14
 
18
- s[:deployer][:from] = File.dirname(__FILE__)+'/app'
19
- s[:deployer][:to] = '/home/vagrant'
15
+ s[:hostname] = 'vagrant@192.168.33.11'
20
16
 
21
- s[:debloyer][:from] = File.dirname(__FILE__)+'/app'
22
- s[:debloyer][:to] = '/home/vagrant'
23
- s[:debloyer][:name] = 'test'
17
+ ssh_key_path = File.dirname(__FILE__)+'/vagrant/key'
18
+ s[:ssh][:flags] = ['-i', ssh_key_path]
19
+ s[:rsync][:flags] = ['-azP', '-e', "ssh -i #{ssh_key_path}", '--delete']
24
20
 
25
- s[:puppet] = {
26
- :manifest => File.dirname(__FILE__)+'/puppet/manifest.pp',
27
- }
21
+ app_dir = File.dirname(__FILE__)+'/app'
28
22
 
29
- return s
23
+ s[:deployer][:from] = app_dir
24
+ s[:deployer][:to] = '~/app'
25
+ s[:deployer][:exclude] = ['exclud*', 'before', 'after']
26
+ s[:deployer][:after_script] = "#{app_dir}/after"
27
+
28
+ s[:debloyer][:from] = app_dir
29
+ s[:debloyer][:to] = '~/app-deb'
30
+ s[:debloyer][:name] = 'test'
31
+
32
+ s[:puppet] = {
33
+ :manifest => File.dirname(__FILE__)+'/puppet/manifest.pp',
34
+ }
35
+
36
+ return s
30
37
  end
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.3.2
4
+ version: 0.3.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -107,8 +107,11 @@ dependencies:
107
107
  - - ! '>='
108
108
  - !ruby/object:Gem::Version
109
109
  version: '0'
110
- description: ! "For lightweight puppet mastery. Organise\n multiple
111
- machines via rsync and SSH rather\n than using puppet master"
110
+ description: ! "Marionetta is a ruby library for executing commands to one\n or
111
+ more remote machines via SSH. It provides puppet\n provisioning
112
+ without the need for a puppet master and can\n also deploy your
113
+ application code (with rollbacks) via\n rsync. With a RakeHelper
114
+ you can integrate it into your\n workflow with ease."
112
115
  email:
113
116
  - lukemorton.dev@gmail.com
114
117
  executables: []
@@ -128,7 +131,10 @@ files:
128
131
  - lib/marionetta/manipulators/puppet_manipulator.rb
129
132
  - lib/marionetta/rake_helper.rb
130
133
  - marionetta.gemspec
134
+ - spec/app/after
131
135
  - spec/app/app.rb
136
+ - spec/app/exclude.txt
137
+ - spec/app/exclude/another.txt
132
138
  - spec/debloyer_spec.rb
133
139
  - spec/deployer_spec.rb
134
140
  - spec/group_spec.rb
@@ -164,10 +170,12 @@ rubyforge_project:
164
170
  rubygems_version: 1.8.24
165
171
  signing_key:
166
172
  specification_version: 3
167
- summary: For lightweight puppet mastery. Organise multiple machines via rsync and
168
- SSH rather than using puppet master
173
+ summary: Provision using puppet and deploy your servers over SSH.
169
174
  test_files:
175
+ - spec/app/after
170
176
  - spec/app/app.rb
177
+ - spec/app/exclude.txt
178
+ - spec/app/exclude/another.txt
171
179
  - spec/debloyer_spec.rb
172
180
  - spec/deployer_spec.rb
173
181
  - spec/group_spec.rb