chef_cap 0.3.9 → 0.3.10
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/chef_cap/version.rb +1 -1
- data/recipes/chef_cap.rb +14 -8
- data/recipes/rbenv.rb +49 -0
- data/recipes/ruby.rb +30 -0
- data/recipes/{rvm_bootstrap.rb → rvm.rb} +2 -7
- data/spec/chef_cap_spec.rb +107 -29
- metadata +12 -10
data/lib/chef_cap/version.rb
CHANGED
data/recipes/chef_cap.rb
CHANGED
@@ -9,6 +9,7 @@ ChefCapConfiguration.configuration = self
|
|
9
9
|
ChefDnaParser.load_dna
|
10
10
|
|
11
11
|
before "deploy", "chef:setup"
|
12
|
+
before "chef:setup", "bootstrap:ruby"
|
12
13
|
|
13
14
|
set :application, ChefDnaParser.parsed["application"]["name"] rescue nil
|
14
15
|
set :repository, ChefDnaParser.parsed["application"]["repository"] rescue nil
|
@@ -154,15 +155,22 @@ else
|
|
154
155
|
set :chef_version, default_chef_version
|
155
156
|
end
|
156
157
|
|
157
|
-
set :
|
158
|
+
set :debug_flag, ENV['DEBUG'] ? '-l debug' : ''
|
158
159
|
|
159
160
|
namespace :chef do
|
160
|
-
desc "Setup chef solo on the server(s)"
|
161
161
|
task :setup do
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
162
|
+
case ruby_version_switcher
|
163
|
+
when 'rbenv'
|
164
|
+
gem_check_for_chef_cmd = "gem specification --version '>=#{chef_version}' chef 2>&1 | awk 'BEGIN { s = 0 } /^name:/ { s = 1; exit }; END { if(s == 0) exit 1 }'"
|
165
|
+
install_chef_cmd = "gem install chef --no-ri --no-rdoc"
|
166
|
+
run "#{gem_check_for_chef_cmd} || #{install_chef_cmd} && echo 'Chef Solo already on this server.'"
|
167
|
+
run "rbenv rehash"
|
168
|
+
else
|
169
|
+
gem_check_for_chef_cmd = "gem specification --version '>=#{chef_version}' chef 2>&1 | awk 'BEGIN { s = 0 } /^name:/ { s = 1; exit }; END { if(s == 0) exit 1 }'"
|
170
|
+
install_chef_cmd = "sudo `cat #{rvm_bin_path}` default exec gem install chef --no-ri --no-rdoc"
|
171
|
+
sudo "`cat #{rvm_bin_path}` default exec #{gem_check_for_chef_cmd} || #{install_chef_cmd} && echo 'Chef Solo already on this server.'"
|
172
|
+
sudo "`cat #{rvm_bin_path}` default exec which chef-solo"
|
173
|
+
end
|
166
174
|
end
|
167
175
|
|
168
176
|
desc "Run chef-solo on the server(s)"
|
@@ -218,8 +226,6 @@ namespace :chef do
|
|
218
226
|
end
|
219
227
|
|
220
228
|
task :setup_to_run_chef_solo do
|
221
|
-
set :debug_flag, ENV['DEBUG'] ? '-l debug' : ''
|
222
|
-
exec_chef_solo = "env PATH=$PATH:/usr/sbin `cat #{rvm_bin_path}` default exec chef-solo -c /tmp/chef-cap-solo-#{rails_env}.rb #{debug_flag}"
|
223
229
|
set :run_chef_solo_deploy_command, "#{exec_chef_solo} -j /tmp/chef-cap-#{rails_env}-`hostname`.json"
|
224
230
|
set :run_chef_solo_rollback_command, "#{exec_chef_solo} -j /tmp/chef-cap-#{rails_env}-`hostname`-rollback.json"
|
225
231
|
set :run_chef_solo_block, { :block => lambda { |command_to_run|
|
data/recipes/rbenv.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
namespace :bootstrap do
|
2
|
+
desc "Create a standalone rbenv installation with a default ruby to use with chef-solo"
|
3
|
+
task :rbenv do
|
4
|
+
set :rvm_ruby_version, (ChefDnaParser.parsed["environment"]["rvm_ruby_version"] rescue "ruby-1.9.3-p0" || "ruby-1.9.3-p0")
|
5
|
+
set :rbenv_ruby_version, rvm_ruby_version.gsub(/^ruby\-/,'')
|
6
|
+
standup_script = <<-SH
|
7
|
+
#!/bin/bash
|
8
|
+
#
|
9
|
+
# And now install rbenv
|
10
|
+
export PATH=$HOME/bin:$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH
|
11
|
+
|
12
|
+
HAVE_RBENV_ALREADY=`which rbenv 2>/dev/null`
|
13
|
+
if [ $? != 0 ]; then
|
14
|
+
## Install rbenv dependencies
|
15
|
+
sudo yum install -y automake gcc make libtool curl zlib zlib-devel patch readline readline-devel libffi-devel openssl openssl-devel git
|
16
|
+
|
17
|
+
echo "Building rbenv..."
|
18
|
+
git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
|
19
|
+
# Add rbenv to your path
|
20
|
+
echo 'export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH"' >> .bashrc
|
21
|
+
echo 'eval "$(rbenv init -)"' >> .bashrc
|
22
|
+
source ~/.bash_profile
|
23
|
+
fi;
|
24
|
+
|
25
|
+
# Install ruby-build
|
26
|
+
HAVE_RUBY_BUILD=`which ruby-build 2>/dev/null`
|
27
|
+
if [ $? != 0 ]; then
|
28
|
+
echo "Building ruby-build..."
|
29
|
+
cd /tmp
|
30
|
+
git clone git://github.com/sstephenson/ruby-build.git
|
31
|
+
cd ruby-build
|
32
|
+
PREFIX=$HOME ./install.sh
|
33
|
+
cd $HOME
|
34
|
+
fi;
|
35
|
+
|
36
|
+
# Install Ruby #{rbenv_ruby_version}
|
37
|
+
HAVE_CORRECT_VERSION=`rbenv versions | grep '#{rbenv_ruby_version}' | wc -l`
|
38
|
+
if [ $HAVE_CORRECT_VERSION -eq 0 ]; then
|
39
|
+
echo "Installing #{rbenv_ruby_version}..."
|
40
|
+
rbenv install #{rbenv_ruby_version}
|
41
|
+
rbenv global #{rbenv_ruby_version}
|
42
|
+
# Rehash!
|
43
|
+
rbenv rehash
|
44
|
+
fi;
|
45
|
+
SH
|
46
|
+
put standup_script, "/tmp/chef-cap-#{rails_env}-rbenv-standup.sh", :mode => "0700"
|
47
|
+
run "/tmp/chef-cap-#{rails_env}-rbenv-standup.sh"
|
48
|
+
end
|
49
|
+
end
|
data/recipes/ruby.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
namespace :bootstrap do
|
2
|
+
desc "Create a standalone rbenv installation with a default ruby to use with chef-solo"
|
3
|
+
task :ruby do
|
4
|
+
local_rvs = ruby_version_switcher rescue 'rvm'
|
5
|
+
local_env = rails_env rescue 'unkown'
|
6
|
+
|
7
|
+
case local_rvs
|
8
|
+
when 'rbenv'
|
9
|
+
|
10
|
+
set :default_environment, {
|
11
|
+
'PATH' => "$HOME/.rbenv/bin:$HOME/.rbenv/shims:$PATH:/usr/sbin"
|
12
|
+
}
|
13
|
+
set :ruby_version_switcher, "rbenv"
|
14
|
+
set :exec_chef_solo, "chef-solo -c /tmp/chef-cap-solo-#{local_env}.rb #{debug_flag}"
|
15
|
+
else
|
16
|
+
## rvm is the default
|
17
|
+
set :default_environment, {
|
18
|
+
'PATH' => "$PATH:/usr/sbin"
|
19
|
+
}
|
20
|
+
set :ruby_version_switcher, "rvm"
|
21
|
+
set :rvm_bin_path, "/tmp/.chef_cap_rvm_path"
|
22
|
+
set :exec_chef_solo, "`cat #{rvm_bin_path}` default exec chef-solo -c /tmp/chef-cap-solo-#{local_env}.rb #{debug_flag}"
|
23
|
+
end
|
24
|
+
|
25
|
+
depend :remote, :command, ruby_version_switcher
|
26
|
+
depend :remote, :command, "chef-solo"
|
27
|
+
|
28
|
+
after "bootstrap:ruby", "bootstrap:#{ruby_version_switcher}"
|
29
|
+
end
|
30
|
+
end
|
@@ -1,11 +1,6 @@
|
|
1
|
-
|
2
|
-
depend :remote, :command, "chef-solo"
|
3
|
-
|
4
|
-
before "chef:setup", "rvm:bootstrap"
|
5
|
-
|
6
|
-
namespace :rvm do
|
1
|
+
namespace :bootstrap do
|
7
2
|
desc "Create a standalone rvm installation with a default ruby to use with chef-solo"
|
8
|
-
task :
|
3
|
+
task :rvm do
|
9
4
|
set :rvm_ruby_version, (ChefDnaParser.parsed["environment"]["rvm_ruby_version"] rescue "ruby-1.9.3-p0" || "ruby-1.9.3-p0")
|
10
5
|
rvm_standup_script = <<-SH
|
11
6
|
#!/bin/bash
|
data/spec/chef_cap_spec.rb
CHANGED
@@ -302,7 +302,7 @@ describe "chef_cap" do
|
|
302
302
|
|
303
303
|
end
|
304
304
|
|
305
|
-
describe "
|
305
|
+
describe "rbenv bootstrap" do
|
306
306
|
it "uploads a shell script to the server and runs it as root" do
|
307
307
|
@test_dna = <<-ERB
|
308
308
|
{
|
@@ -311,6 +311,7 @@ describe "chef_cap" do
|
|
311
311
|
},
|
312
312
|
"environments": {
|
313
313
|
"some_env": {
|
314
|
+
"ruby_version_switcher": "rbenv",
|
314
315
|
"rails_env": "my_env"
|
315
316
|
}
|
316
317
|
}
|
@@ -318,17 +319,37 @@ describe "chef_cap" do
|
|
318
319
|
ERB
|
319
320
|
|
320
321
|
chef_cap.cap_task[:some_env].call
|
321
|
-
chef_cap.cap_namespace[:
|
322
|
-
chef_cap.cap_task["
|
322
|
+
chef_cap.cap_namespace[:bootstrap].should_not be_nil
|
323
|
+
chef_cap.cap_task["bootstrap:rbenv"].should_not be_nil
|
323
324
|
|
324
325
|
chef_cap.should_receive(:put)
|
325
|
-
chef_cap.should_receive(:
|
326
|
-
chef_cap.cap_task["
|
326
|
+
chef_cap.should_receive(:run).with("/tmp/chef-cap-my_env-rbenv-standup.sh")
|
327
|
+
chef_cap.cap_task["bootstrap:rbenv"].call
|
327
328
|
end
|
329
|
+
end
|
328
330
|
|
329
|
-
|
330
|
-
|
331
|
-
|
331
|
+
describe "rvm bootstrap" do
|
332
|
+
it "uploads a shell script to the server and runs it as root" do
|
333
|
+
@test_dna = <<-ERB
|
334
|
+
{
|
335
|
+
"chef": {
|
336
|
+
"root": "path_to_cookbooks"
|
337
|
+
},
|
338
|
+
"environments": {
|
339
|
+
"some_env": {
|
340
|
+
"rails_env": "my_env"
|
341
|
+
}
|
342
|
+
}
|
343
|
+
}
|
344
|
+
ERB
|
345
|
+
|
346
|
+
chef_cap.cap_task[:some_env].call
|
347
|
+
chef_cap.cap_namespace[:bootstrap].should_not be_nil
|
348
|
+
chef_cap.cap_task["bootstrap:rvm"].should_not be_nil
|
349
|
+
|
350
|
+
chef_cap.should_receive(:put)
|
351
|
+
chef_cap.should_receive(:sudo).with("/tmp/chef-cap-my_env-rvm-standup.sh")
|
352
|
+
chef_cap.cap_task["bootstrap:rvm"].call
|
332
353
|
end
|
333
354
|
end
|
334
355
|
|
@@ -344,25 +365,19 @@ describe "chef_cap" do
|
|
344
365
|
|
345
366
|
describe "namespace :chef" do
|
346
367
|
|
347
|
-
it "adds a remote dependency on chef-solo" do
|
348
|
-
chef_cap.cap_depends["chef-solo"].should_not be_nil
|
349
|
-
chef_cap.cap_depends["chef-solo"].should == { :remote => :command }
|
350
|
-
end
|
351
|
-
|
352
368
|
it "runs chef:setup before chef:deploy" do
|
353
369
|
chef_cap.cap_before["chef:deploy"].should_not be_nil
|
354
370
|
chef_cap.cap_before["chef:deploy"].should include("chef:setup")
|
355
371
|
end
|
356
372
|
|
357
|
-
it "runs
|
373
|
+
it "runs bootstrap:ruby before chef:setup" do
|
358
374
|
chef_cap.cap_before["chef:setup"].should_not be_nil
|
359
|
-
chef_cap.cap_before["chef:setup"].should include("
|
375
|
+
chef_cap.cap_before["chef:setup"].should include("bootstrap:ruby")
|
360
376
|
end
|
361
377
|
|
362
378
|
describe "task :deploy" do
|
363
|
-
|
364
|
-
|
365
|
-
@test_dna = <<-JS
|
379
|
+
let(:test_dna) do
|
380
|
+
<<-JS
|
366
381
|
{
|
367
382
|
"chef": {
|
368
383
|
"root": "path_to_cookbooks",
|
@@ -389,7 +404,10 @@ describe "chef_cap" do
|
|
389
404
|
}
|
390
405
|
}
|
391
406
|
JS
|
407
|
+
end
|
392
408
|
|
409
|
+
before do
|
410
|
+
@test_dna = test_dna
|
393
411
|
chef_cap.cap_task[:some_env].should_not be_nil
|
394
412
|
chef_cap.cap_task[:some_env].call
|
395
413
|
chef_cap.stub(:system).and_return(true)
|
@@ -459,23 +477,78 @@ describe "chef_cap" do
|
|
459
477
|
chef_cap.cap_task["chef:deploy"].call
|
460
478
|
end
|
461
479
|
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
end
|
480
|
+
context "using rvm" do
|
481
|
+
it "sets up chef gem" do
|
482
|
+
chef_cap.cap_servers.should_not be_empty
|
483
|
+
chef_cap.should_receive(:sudo).ordered.with("`cat /tmp/.chef_cap_rvm_path` default exec gem specification --version '>=0.1982.1234' chef 2>&1 | awk 'BEGIN { s = 0 } /^name:/ { s = 1; exit }; END { if(s == 0) exit 1 }' || sudo `cat /tmp/.chef_cap_rvm_path` default exec gem install chef --no-ri --no-rdoc && echo 'Chef Solo already on this server.'").and_return("mocked")
|
484
|
+
chef_cap.should_receive(:sudo).ordered.with("`cat /tmp/.chef_cap_rvm_path` default exec which chef-solo").and_return("mocked")
|
468
485
|
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
486
|
+
chef_cap.cap_task["bootstrap:ruby"].call
|
487
|
+
chef_cap.cap_task["chef:setup"].call
|
488
|
+
end
|
489
|
+
|
490
|
+
it "installs rvm + ruby and run it if it does not exist" do
|
491
|
+
chef_cap.cap_servers.should_not be_empty
|
492
|
+
chef_cap.stub!(:put => "stubbed")
|
493
|
+
chef_cap.should_receive(:sudo).ordered.with("/tmp/chef-cap-myenv-rvm-standup.sh").and_return("mocked")
|
494
|
+
chef_cap.cap_task["bootstrap:rvm"].call
|
495
|
+
end
|
474
496
|
end
|
475
497
|
|
498
|
+
context "using rbenv" do
|
499
|
+
|
500
|
+
let(:test_dna) do
|
501
|
+
<<-JS
|
502
|
+
{
|
503
|
+
"chef": {
|
504
|
+
"root": "path_to_cookbooks",
|
505
|
+
"version": "0.1982.1234"
|
506
|
+
},
|
507
|
+
"environments": {
|
508
|
+
"some_env": {
|
509
|
+
"rails_env": "myenv",
|
510
|
+
"ruby_version_switcher": "rbenv",
|
511
|
+
"servers": [
|
512
|
+
{
|
513
|
+
"hostname": "localhost",
|
514
|
+
"roles": ["role1", "role2"]
|
515
|
+
},
|
516
|
+
{
|
517
|
+
"hostname": "otherhost.com",
|
518
|
+
"roles": ["role1"]
|
519
|
+
}
|
520
|
+
]
|
521
|
+
}
|
522
|
+
},
|
523
|
+
"roles": {
|
524
|
+
"role1": { "run_list": ["foo"] },
|
525
|
+
"role2": { "run_list": ["foo", "bar"] }
|
526
|
+
}
|
527
|
+
}
|
528
|
+
JS
|
529
|
+
end
|
530
|
+
|
531
|
+
it "sets up chef gem" do
|
532
|
+
chef_cap.cap_servers.should_not be_empty
|
533
|
+
chef_cap.stub!(:put => "stubbed")
|
534
|
+
chef_cap.should_receive(:run).ordered.with("gem specification --version '>=0.1982.1234' chef 2>&1 | awk 'BEGIN { s = 0 } /^name:/ { s = 1; exit }; END { if(s == 0) exit 1 }' || gem install chef --no-ri --no-rdoc && echo 'Chef Solo already on this server.'").and_return("mocked")
|
535
|
+
chef_cap.should_receive(:run).ordered.with("rbenv rehash").and_return("mocked")
|
536
|
+
|
537
|
+
chef_cap.cap_task["bootstrap:ruby"].call
|
538
|
+
chef_cap.cap_task["chef:setup"].call
|
539
|
+
end
|
540
|
+
|
541
|
+
it "installs rbenv + ruby and run it if it does not exist" do
|
542
|
+
chef_cap.cap_servers.should_not be_empty
|
543
|
+
chef_cap.stub!(:put => "stubbed")
|
544
|
+
chef_cap.should_receive(:run).ordered.with("/tmp/chef-cap-myenv-rbenv-standup.sh").and_return("mocked")
|
545
|
+
chef_cap.cap_task["bootstrap:rbenv"].call
|
546
|
+
end
|
547
|
+
end
|
476
548
|
end
|
477
549
|
|
478
550
|
describe "task :run_chef_solo" do
|
551
|
+
|
479
552
|
context "with a db role" do
|
480
553
|
before do
|
481
554
|
@test_dna = <<-JS
|
@@ -508,6 +581,7 @@ describe "chef_cap" do
|
|
508
581
|
|
509
582
|
chef_cap.cap_task[:some_env].should_not be_nil
|
510
583
|
chef_cap.cap_task[:some_env].call
|
584
|
+
chef_cap.cap_task["bootstrap:ruby"].call
|
511
585
|
chef_cap.cap_task["chef:setup_to_run_chef_solo"].call
|
512
586
|
end
|
513
587
|
|
@@ -516,6 +590,7 @@ describe "chef_cap" do
|
|
516
590
|
|
517
591
|
chef_cap.should_receive(:sudo).ordered.with(/.*chef-solo.*/, :hosts => ["dbhost"]).and_return("mocked")
|
518
592
|
chef_cap.should_receive(:sudo).ordered.with(/.*chef-solo.*/, :hosts => ["apphost"]).and_return("mocked")
|
593
|
+
chef_cap.cap_task["bootstrap:ruby"].call
|
519
594
|
chef_cap.cap_task["chef:run_chef_solo"].call
|
520
595
|
end
|
521
596
|
end
|
@@ -546,6 +621,7 @@ describe "chef_cap" do
|
|
546
621
|
|
547
622
|
chef_cap.cap_task[:some_env].should_not be_nil
|
548
623
|
chef_cap.cap_task[:some_env].call
|
624
|
+
chef_cap.cap_task["bootstrap:ruby"].call
|
549
625
|
chef_cap.cap_task["chef:setup_to_run_chef_solo"].call
|
550
626
|
end
|
551
627
|
|
@@ -598,6 +674,7 @@ describe "chef_cap" do
|
|
598
674
|
|
599
675
|
chef_cap.cap_task[:some_env].should_not be_nil
|
600
676
|
chef_cap.cap_task[:some_env].call
|
677
|
+
chef_cap.cap_task["bootstrap:ruby"].call
|
601
678
|
chef_cap.cap_task["chef:setup_to_run_chef_solo"].call
|
602
679
|
end
|
603
680
|
|
@@ -649,6 +726,7 @@ describe "chef_cap" do
|
|
649
726
|
|
650
727
|
chef_cap.cap_task[:some_env].should_not be_nil
|
651
728
|
chef_cap.cap_task[:some_env].call
|
729
|
+
chef_cap.cap_task["bootstrap:ruby"].call
|
652
730
|
chef_cap.cap_task["chef:setup_to_run_chef_solo"].call
|
653
731
|
end
|
654
732
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef_cap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
16
|
-
requirement: &
|
16
|
+
requirement: &70167065111120 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 2.5.5
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70167065111120
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec-rails
|
27
|
-
requirement: &
|
27
|
+
requirement: &70167065110620 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '2.1'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70167065110620
|
36
36
|
description: chef_cap uses chef"s JSON config format to drive both capistrano and
|
37
37
|
chef-solo"
|
38
38
|
email:
|
@@ -68,7 +68,9 @@ files:
|
|
68
68
|
- recipes/lib/chef_cap_helper.rb
|
69
69
|
- recipes/lib/chef_cap_initializer.rb
|
70
70
|
- recipes/lib/chef_dna_parser.rb
|
71
|
-
- recipes/
|
71
|
+
- recipes/rbenv.rb
|
72
|
+
- recipes/ruby.rb
|
73
|
+
- recipes/rvm.rb
|
72
74
|
- recipes/unset_default_deploy.rb
|
73
75
|
- spec/chef_cap_configuration_spec.rb
|
74
76
|
- spec/chef_cap_helper_spec.rb
|
@@ -91,7 +93,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
91
93
|
version: '0'
|
92
94
|
segments:
|
93
95
|
- 0
|
94
|
-
hash: -
|
96
|
+
hash: -2439517596644042865
|
95
97
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
98
|
none: false
|
97
99
|
requirements:
|
@@ -100,10 +102,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
100
102
|
version: '0'
|
101
103
|
segments:
|
102
104
|
- 0
|
103
|
-
hash: -
|
105
|
+
hash: -2439517596644042865
|
104
106
|
requirements: []
|
105
107
|
rubyforge_project:
|
106
|
-
rubygems_version: 1.8.
|
108
|
+
rubygems_version: 1.8.17
|
107
109
|
signing_key:
|
108
110
|
specification_version: 3
|
109
111
|
summary: capistrano + chef-solo == chef_cap"
|