chap 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Chap
2
2
 
3
+ [![Build History][2]][1]
4
+
5
+ [1]: http://travis-ci.org/tongueroo/chap
6
+ [2]: https://secure.travis-ci.org/tongueroo/chap.png?branch=master
7
+
3
8
  chef + capistrano = chap: deploy your app with either chef or capistrano. This was written to solve the issue between having 2 deployment systems that are very similar but not exactly the same. With chap you can deploy to a single server by running one command:
4
9
 
5
10
  <pre>
@@ -118,4 +123,15 @@ Special variables:
118
123
  Special methods:
119
124
 
120
125
  * run - output the command to be ran and runs command.
121
- * log - log messages to [shared_path]/chap/chap.log.
126
+ * log - log messages to [shared_path]/chap/chap.log.
127
+
128
+ ### Test deploy hooks
129
+
130
+ When a chap hook fails, you want want to quicky test it on the server without having commit new code and running a full deploy. You can edit the chap/* hooks on the spot and test them via:
131
+
132
+ <pre>
133
+ $ cap hook deploy
134
+ $ cap hook restart
135
+ </pre>
136
+
137
+ This will test the hooks on the latest timestamp release at [deploy_to]/releases/[timestamp].
data/lib/chap/cli.rb CHANGED
@@ -22,5 +22,19 @@ module Chap
22
22
  def deploy
23
23
  Chap::Task.deploy(options)
24
24
  end
25
+
26
+ desc "hook", "Run chap hook"
27
+ long_desc <<-EOL
28
+ Example:
29
+
30
+ $ chap hook deploy
31
+
32
+ A way to test the chap hooks
33
+ EOL
34
+ method_option :quiet, :aliases => '-q', :type => :boolean, :desc => "Quiet commands"
35
+ method_option :config, :aliases => '-c', :default => '/etc/chef/chap.yml', :desc => "chap.yml config to use"
36
+ def hook(name)
37
+ Chap::Runner.new(options).test_hook(name)
38
+ end
25
39
  end
26
40
  end
data/lib/chap/config.rb CHANGED
@@ -51,24 +51,26 @@ module Chap
51
51
  @timestamp ||= Time.now.strftime("%Y%m%d%H%M%S")
52
52
  end
53
53
 
54
+ # useful so we can test hooks
55
+ def override_timestamp(timestamp)
56
+ @timestamp = timestamp
57
+ end
58
+
54
59
  def deploy_to
55
60
  chap[:deploy_to]
56
61
  end
57
62
 
58
63
  # special attributes added to chap
59
64
  def release_path
60
- return @release_path if @release_path
61
- @release_path = "#{deploy_to}/releases/#{timestamp}"
65
+ "#{deploy_to}/releases/#{timestamp}"
62
66
  end
63
67
 
64
68
  def current_path
65
- return @current_path if @current_path
66
- @current_path = "#{deploy_to}/current"
69
+ "#{deploy_to}/current"
67
70
  end
68
71
 
69
72
  def shared_path
70
- return @shared_path if @shared_path
71
- @shared_path = "#{deploy_to}/shared"
73
+ "#{deploy_to}/shared"
72
74
  end
73
75
 
74
76
  def cached_path
@@ -77,6 +79,14 @@ module Chap
77
79
  @cached_path = "#{shared_path}/cache/#{strategy}/#{path}"
78
80
  end
79
81
 
82
+ def latest_release
83
+ return @latest_release if @latest_release
84
+ @latest_release = Dir.glob("#{deploy_to}/releases/*").
85
+ select {|p| File.directory?(p) }.
86
+ sort.
87
+ last
88
+ end
89
+
80
90
  def strategy
81
91
  chap[:strategy] || 'checkout'
82
92
  end
data/lib/chap/runner.rb CHANGED
@@ -116,6 +116,12 @@ module Chap
116
116
  dirs.map! {|p| "#{shared_path}/#{p}"}
117
117
  end
118
118
 
119
+ def test_hook(name)
120
+ timestamp = File.basename(latest_release)
121
+ config.override_timestamp(timestamp)
122
+ hook(name)
123
+ end
124
+
119
125
  def hook(name)
120
126
  log "Running hook: #{name}".colorize(:green)
121
127
  path = "#{release_path}/chap/#{name}"
@@ -1,6 +1,6 @@
1
1
  module Chap
2
2
  module SpecialMethods
3
- SPECIAL_METHODS = %w/deploy_to release_path current_path shared_path cached_path node chap log run/
3
+ SPECIAL_METHODS = %w/deploy_to release_path current_path shared_path cached_path latest_release node chap log run/
4
4
 
5
5
  def self.included(base)
6
6
  base.send(:extend, ClassMethods)
data/lib/chap/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Chap
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -2,5 +2,6 @@
2
2
 
3
3
  log "cd #{release_path} && bundle"
4
4
  run "cd #{release_path} && echo bundle"
5
+ run "cd #{release_path} && echo 'chap deploy hook' > deploy.txt"
5
6
 
6
7
  symlink_configs
@@ -7,4 +7,4 @@ restart = case node[:instance_role]
7
7
  "rvmsudo bluepill restart resque"
8
8
  end
9
9
  log "cd #{current_path} && #{restart}"
10
- run "cd #{current_path} && echo '#{restart}'"
10
+ run "cd #{current_path} && echo '#{restart}' > restart.txt"
@@ -6,7 +6,7 @@ describe Chap do
6
6
  @system_root = "#{@root}/spec/fixtures/system_root"
7
7
  end
8
8
 
9
- describe "deploy" do
9
+ describe "internal code deploy" do
10
10
  before(:each) do
11
11
  setup_files
12
12
 
@@ -27,6 +27,12 @@ describe Chap do
27
27
  releases.should >= 1
28
28
  releases.should <= 2 # test the keep option
29
29
  end
30
+ end
31
+
32
+ describe "cli deploy" do
33
+ before(:each) do
34
+ setup_files
35
+ end
30
36
 
31
37
  it "should deploy code via command line" do
32
38
  system("cd #{@root} && ./bin/chap deploy -q -c #{@system_root}/etc/chef/chap.yml")
@@ -40,5 +46,26 @@ describe Chap do
40
46
  releases = Dir.glob("#{@system_root}/data/chapdemo/releases/*").size
41
47
  releases.should >= 1
42
48
  end
49
+
50
+ it "should deploy code and test hook" do
51
+ system("cd #{@root} && ./bin/chap deploy -q -c #{@system_root}/etc/chef/chap.yml")
52
+ releases = Dir.glob("#{@system_root}/data/chapdemo/releases/*").sort
53
+ timestamp = releases.last.split('/').last
54
+ release_path = "#{@system_root}/data/chapdemo/releases/#{timestamp}"
55
+ current_path = "#{@system_root}/data/chapdemo/current"
56
+ File.exist?(release_path).should be_true
57
+ File.exist?("#{release_path}/deploy.txt").should be_true
58
+
59
+ # test hook deploy
60
+ FileUtils.rm_f("#{release_path}/deploy.txt")
61
+ File.exist?("#{release_path}/deploy.txt").should be_false
62
+ system("cd #{@root} && ./bin/chap hook deploy -q -c #{@system_root}/etc/chef/chap.yml")
63
+ File.exist?("#{release_path}/deploy.txt").should be_true
64
+
65
+ # test hook restart
66
+ FileUtils.rm_f("#{current_path}/restart.txt")
67
+ system("cd #{@root} && ./bin/chap hook restart -q -c #{@system_root}/etc/chef/chap.yml")
68
+ File.exist?("#{current_path}/restart.txt").should be_true
69
+ end
43
70
  end
44
71
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
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-04 00:00:00.000000000 Z
12
+ date: 2013-02-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake