engineyard-jenkins 0.4.0

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.
Files changed (51) hide show
  1. data/.gitignore +5 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +87 -0
  4. data/History.md +32 -0
  5. data/README.md +186 -0
  6. data/Rakefile +24 -0
  7. data/bin/ey-jenkins +7 -0
  8. data/engineyard-jenkins.gemspec +33 -0
  9. data/features/install.feature +53 -0
  10. data/features/install_server.feature +69 -0
  11. data/features/step_definitions/api_steps.rb +10 -0
  12. data/features/step_definitions/common_steps.rb +211 -0
  13. data/features/step_definitions/fixture_project_steps.rb +14 -0
  14. data/features/step_definitions/jenkins_steps.rb +9 -0
  15. data/features/support/common.rb +51 -0
  16. data/features/support/engineyard.rb +24 -0
  17. data/features/support/env.rb +14 -0
  18. data/features/support/matchers.rb +10 -0
  19. data/fixtures/cookbooks/main/recipes/default.rb +1 -0
  20. data/fixtures/cookbooks/redis/recipes/default.rb +0 -0
  21. data/fixtures/jenkins_boot_sequence/jenkins_booting.html +1 -0
  22. data/fixtures/jenkins_boot_sequence/jenkins_ready.html +1 -0
  23. data/fixtures/jenkins_boot_sequence/pre_jenkins_booting.html +1 -0
  24. data/fixtures/projects/rails/Gemfile +3 -0
  25. data/fixtures/projects/rails/Gemfile.lock +10 -0
  26. data/fixtures/projects/rails/Rakefile +4 -0
  27. data/lib/engineyard-jenkins.rb +4 -0
  28. data/lib/engineyard-jenkins/appcloud_env.rb +49 -0
  29. data/lib/engineyard-jenkins/cli.rb +134 -0
  30. data/lib/engineyard-jenkins/cli/install_generator.rb +55 -0
  31. data/lib/engineyard-jenkins/cli/install_generator/templates/attributes.rb.tt +17 -0
  32. data/lib/engineyard-jenkins/cli/install_generator/templates/cookbooks/main/attributes/recipe.rb +3 -0
  33. data/lib/engineyard-jenkins/cli/install_generator/templates/cookbooks/main/definitions/ey_cloud_report.rb +6 -0
  34. data/lib/engineyard-jenkins/cli/install_generator/templates/cookbooks/main/libraries/ruby_block.rb +40 -0
  35. data/lib/engineyard-jenkins/cli/install_generator/templates/cookbooks/main/libraries/run_for_app.rb +12 -0
  36. data/lib/engineyard-jenkins/cli/install_generator/templates/recipes.rb +95 -0
  37. data/lib/engineyard-jenkins/cli/install_server_generator.rb +25 -0
  38. data/lib/engineyard-jenkins/cli/install_server_generator/templates/attributes.rb.tt +3 -0
  39. data/lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/jenkins_master/recipes/default.rb +95 -0
  40. data/lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/jenkins_master/templates/default/init.sh.erb +26 -0
  41. data/lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/jenkins_master/templates/default/proxy.conf.erb +20 -0
  42. data/lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/attributes/recipe.rb +3 -0
  43. data/lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/definitions/ey_cloud_report.rb +6 -0
  44. data/lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/libraries/ruby_block.rb +40 -0
  45. data/lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/libraries/run_for_app.rb +12 -0
  46. data/lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/recipes/default.rb +1 -0
  47. data/lib/engineyard-jenkins/thor-ext/actions/directory.rb +33 -0
  48. data/lib/engineyard-jenkins/version.rb +5 -0
  49. data/spec/appcloud_env_spec.rb +75 -0
  50. data/spec/spec_helper.rb +4 -0
  51. metadata +254 -0
@@ -0,0 +1,26 @@
1
+ #!/sbin/runscript
2
+
3
+ # Start/stop script for jenkins
4
+
5
+ PIDFILE=<%= @pid %>
6
+ HUDSON_HOME="<%= @home %>"
7
+ COMMAND=/usr/bin/java
8
+ ARGUMENTS="-Djava.io.tmpdir=${HUDSON_HOME}/tmp -jar ${HUDSON_HOME}/jenkins.war --webroot=${HUDSON_HOME}/war --httpPort=<%= @port %> ajp13ListenAddress=127.0.0.1"
9
+ RUN_AS="<%= @user %>"
10
+ NAME=Jenkins-CI
11
+
12
+ start() {
13
+ ebegin "Starting $NAME"
14
+ export HUDSON_HOME="${HUDSON_HOME}"
15
+ export HOME="/home/${RUN_AS}"
16
+ export USER="${RUN_AS}"
17
+ start-stop-daemon -b --start --make-pidfile --pidfile $PIDFILE --chuid $RUN_AS --exec $COMMAND -- $ARGUMENTS &>$HUDSON_HOME/logs/jenkins_log
18
+ eend $?
19
+ }
20
+
21
+ stop() {
22
+ ebegin "Stopping $NAME"
23
+ start-stop-daemon --stop --quiet --pidfile $PIDFILE
24
+ rm -f $PIDFILE
25
+ eend $?
26
+ }
@@ -0,0 +1,20 @@
1
+ # Nginx config for Jenkins CI behind a virtual host
2
+ # TODO: Add SSL support as per http://gist.github.com/460906
3
+
4
+ upstream jenkins {
5
+ server localhost:<%= @port %>;
6
+ }
7
+
8
+ server {
9
+ listen 80 default;
10
+ server_name jenkins.example.com;
11
+
12
+ location / {
13
+ proxy_set_header X-Real-IP $remote_addr;
14
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
15
+ proxy_set_header X-Forwarded-Proto https;
16
+ proxy_set_header Host $http_host;
17
+ proxy_next_upstream error;
18
+ proxy_pass http://jenkins;
19
+ }
20
+ }
@@ -0,0 +1,3 @@
1
+ recipes('main')
2
+ owner_name(@attribute[:users].first[:username])
3
+ owner_pass(@attribute[:users].first[:password])
@@ -0,0 +1,6 @@
1
+ define :ey_cloud_report do
2
+ execute "reporting for #{params[:name]}" do
3
+ command "ey-enzyme --report '#{params[:message]}'"
4
+ epic_fail true
5
+ end
6
+ end
@@ -0,0 +1,40 @@
1
+
2
+ class Chef
3
+ class Resource
4
+ class RubyBlock < Chef::Resource
5
+ def initialize(name, collection=nil, node=nil)
6
+ super(name, collection, node)
7
+ @resource_name = :ruby_block
8
+ @action = :create
9
+ @allowed_actions.push(:create)
10
+ end
11
+
12
+ def block(&block)
13
+ if block
14
+ @block = block
15
+ else
16
+ @block
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+
24
+ class Chef
25
+ class Provider
26
+ class RubyBlock < Chef::Provider
27
+ def load_current_resource
28
+ Chef::Log.debug(@new_resource.inspect)
29
+ true
30
+ end
31
+
32
+ def action_create
33
+ @new_resource.block.call
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ Chef::Platform.platforms[:default].merge! :ruby_block => Chef::Provider::RubyBlock
40
+
@@ -0,0 +1,12 @@
1
+ class Chef
2
+ class Recipe
3
+ def run_for_app(*apps, &block)
4
+ apps.map! {|a| a.to_s }
5
+ node[:applications].map{|k,v| [k,v] }.sort_by {|a,b| a }.each do |name, app_data|
6
+ if apps.include?(name)
7
+ block.call(name, app_data)
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,33 @@
1
+ # Extension: Sorts the Dir[lookup] to ensure deterministic ordering of actions
2
+ # to allow test assertions
3
+
4
+ class Thor
5
+ module Actions
6
+ class Directory < EmptyDirectory #:nodoc:
7
+ protected
8
+
9
+ def execute!
10
+ lookup = config[:recursive] ? File.join(source, '**') : source
11
+ lookup = File.join(lookup, '{*,.[a-z]*}')
12
+
13
+ Dir[lookup].sort.each do |file_source|
14
+ next if File.directory?(file_source)
15
+ file_destination = File.join(given_destination, file_source.gsub(source, '.'))
16
+ file_destination.gsub!('/./', '/')
17
+
18
+ case file_source
19
+ when /\.empty_directory$/
20
+ dirname = File.dirname(file_destination).gsub(/\/\.$/, '')
21
+ next if dirname == given_destination
22
+ base.empty_directory(dirname, config)
23
+ when /\.tt$/
24
+ destination = base.template(file_source, file_destination[0..-4], config, &@block)
25
+ else
26
+ destination = base.copy_file(file_source, file_destination, config, &@block)
27
+ end
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,5 @@
1
+ module Engineyard
2
+ module Jenkins
3
+ VERSION = '0.4.0'
4
+ end
5
+ end
@@ -0,0 +1,75 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ require 'engineyard-jenkins/appcloud_env'
4
+
5
+ describe Engineyard::Jenkins::AppcloudEnv do
6
+ def appcloud_env
7
+ @appcloud_env ||= Engineyard::Jenkins::AppcloudEnv.new
8
+ end
9
+
10
+ def find_environments(options = {})
11
+ appcloud_env.find_environments(options)
12
+ end
13
+
14
+ before do
15
+ @tmp_root = File.dirname(__FILE__) + "/../tmp"
16
+ @home_path = File.expand_path(File.join(@tmp_root, "home"))
17
+ FileUtils.mkdir_p(@home_path)
18
+ ENV['EYRC'] = File.join(@home_path, ".eyrc")
19
+ appcloud_env.stub(:clean_host_name)
20
+ end
21
+ describe ".find_environments - no args" do
22
+ it "return [nil, nil] unless it has reason to return something else" do
23
+ appcloud_env.stub(:fetch_environment).and_raise(EY::NoEnvironmentError)
24
+ find_environments.should == []
25
+ end
26
+ it "returns [env_name, account_name] if finds one env 'jenkins' in any account" do
27
+ appcloud_env.should_receive(:fetch_environment).with("jenkins", nil).and_return(env = EY::Model::App.new(123, EY::Model::Account.new(789, 'mine')))
28
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_server", nil).and_raise(EY::NoEnvironmentError)
29
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_production", nil).and_raise(EY::NoEnvironmentError)
30
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_server_production", nil).and_raise(EY::NoEnvironmentError)
31
+ find_environments.should == [['jenkins', 'mine', env]]
32
+ end
33
+ it "returns many result pairs" do
34
+ appcloud_env.should_receive(:fetch_environment).with("jenkins", nil).and_return(env = EY::Model::App.new(123, EY::Model::Account.new(789, 'mine')))
35
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_server", nil).and_raise(EY::NoEnvironmentError)
36
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_server_production", nil).and_raise(EY::NoEnvironmentError)
37
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_production", nil) {
38
+ raise EY::MultipleMatchesError, <<-ERROR.gsub(/^\s+/, '')
39
+ jenkins_production # ey <command> --environment='jenkins_production' --account='mine'
40
+ jenkins_production # ey <command> --environment='jenkins_production' --account='yours'
41
+ ERROR
42
+ }
43
+ find_environments.should == [['jenkins', 'mine', env], ['jenkins_production', 'mine', nil], ['jenkins_production', 'yours', nil]]
44
+ end
45
+ end
46
+
47
+ describe ".find_environments - specific account" do
48
+ it "return [nil, nil] unless it has reason to return something else" do
49
+ appcloud_env.stub(:fetch_environment).and_raise(EY::NoEnvironmentError)
50
+ find_environments(:account => "mine").should == []
51
+ end
52
+ it "returns [env_name, account_name] if finds one env 'jenkins' in specific account" do
53
+ appcloud_env.should_receive(:fetch_environment).with("jenkins", "mine").and_return(env = EY::Model::App.new(123, EY::Model::Account.new(789, 'mine')))
54
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_server", "mine").and_raise(EY::NoEnvironmentError)
55
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_production", "mine").and_raise(EY::NoEnvironmentError)
56
+ appcloud_env.should_receive(:fetch_environment).with("jenkins_server_production", "mine").and_raise(EY::NoEnvironmentError)
57
+ find_environments(:account => "mine").should == [['jenkins', 'mine', env]]
58
+ end
59
+ end
60
+
61
+ describe ".find_environments - specific environment" do
62
+ it "return [nil, nil] unless it has reason to return something else" do
63
+ appcloud_env.stub(:fetch_environment).and_raise(EY::NoEnvironmentError)
64
+ find_environments(:environment => "jenkins").should == []
65
+ end
66
+ it "returns [env_name, account_name] if finds one env 'jenkins' in any account" do
67
+ appcloud_env.should_receive(:fetch_environment).with("jenkins", nil).and_return(env = EY::Model::App.new(123, EY::Model::Account.new(789, 'mine')))
68
+ find_environments(:environment => "jenkins").should == [['jenkins', 'mine', env]]
69
+ end
70
+ it "returns [env_name, account_name] if finds one env 'jenkins' in specific account" do
71
+ appcloud_env.should_receive(:fetch_environment).with("jenkins", "mine").and_return(env = EY::Model::App.new(123, EY::Model::Account.new(789, 'mine')))
72
+ find_environments(:environment => "jenkins", :account => "mine").should == [['jenkins', 'mine', env]]
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,4 @@
1
+ $:.unshift(File.expand_path(File.dirname(__FILE__) + '/../lib'))
2
+ require 'bundler/setup'
3
+ require 'engineyard-jenkins'
4
+ require 'rspec'
metadata ADDED
@@ -0,0 +1,254 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: engineyard-jenkins
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.4.0
6
+ platform: ruby
7
+ authors:
8
+ - Dr Nic Williams
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-04-12 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: thor
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ~>
22
+ - !ruby/object:Gem::Version
23
+ version: 0.14.6
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: engineyard
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 1.3.17
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: jenkins
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.6.2
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: rake
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: 0.8.7
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: cucumber
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ~>
66
+ - !ruby/object:Gem::Version
67
+ version: 0.9.4
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: rspec
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 2.1.0
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: json
84
+ requirement: &id007 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: 1.4.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: awesome_print
95
+ requirement: &id008 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
105
+ name: realweb
106
+ requirement: &id009 !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ~>
110
+ - !ruby/object:Gem::Version
111
+ version: 0.1.6
112
+ type: :development
113
+ prerelease: false
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
116
+ name: open4
117
+ requirement: &id010 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: "0"
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
127
+ name: sinatra
128
+ requirement: &id011 !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: "0"
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: *id011
137
+ - !ruby/object:Gem::Dependency
138
+ name: fakeweb
139
+ requirement: &id012 !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ~>
143
+ - !ruby/object:Gem::Version
144
+ version: 1.3.0
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: *id012
148
+ description: Run your continuous integration (CI) tests against your Engine Yard AppCloud environments - the exact same configuration you are using in production!
149
+ email:
150
+ - drnicwilliams@gmail.com
151
+ executables:
152
+ - ey-jenkins
153
+ extensions: []
154
+
155
+ extra_rdoc_files: []
156
+
157
+ files:
158
+ - .gitignore
159
+ - Gemfile
160
+ - Gemfile.lock
161
+ - History.md
162
+ - README.md
163
+ - Rakefile
164
+ - bin/ey-jenkins
165
+ - engineyard-jenkins.gemspec
166
+ - features/install.feature
167
+ - features/install_server.feature
168
+ - features/step_definitions/api_steps.rb
169
+ - features/step_definitions/common_steps.rb
170
+ - features/step_definitions/fixture_project_steps.rb
171
+ - features/step_definitions/jenkins_steps.rb
172
+ - features/support/common.rb
173
+ - features/support/engineyard.rb
174
+ - features/support/env.rb
175
+ - features/support/matchers.rb
176
+ - fixtures/cookbooks/main/recipes/default.rb
177
+ - fixtures/cookbooks/redis/recipes/default.rb
178
+ - fixtures/jenkins_boot_sequence/jenkins_booting.html
179
+ - fixtures/jenkins_boot_sequence/jenkins_ready.html
180
+ - fixtures/jenkins_boot_sequence/pre_jenkins_booting.html
181
+ - fixtures/projects/rails/Gemfile
182
+ - fixtures/projects/rails/Gemfile.lock
183
+ - fixtures/projects/rails/Rakefile
184
+ - lib/engineyard-jenkins.rb
185
+ - lib/engineyard-jenkins/appcloud_env.rb
186
+ - lib/engineyard-jenkins/cli.rb
187
+ - lib/engineyard-jenkins/cli/install_generator.rb
188
+ - lib/engineyard-jenkins/cli/install_generator/templates/attributes.rb.tt
189
+ - lib/engineyard-jenkins/cli/install_generator/templates/cookbooks/main/attributes/recipe.rb
190
+ - lib/engineyard-jenkins/cli/install_generator/templates/cookbooks/main/definitions/ey_cloud_report.rb
191
+ - lib/engineyard-jenkins/cli/install_generator/templates/cookbooks/main/libraries/ruby_block.rb
192
+ - lib/engineyard-jenkins/cli/install_generator/templates/cookbooks/main/libraries/run_for_app.rb
193
+ - lib/engineyard-jenkins/cli/install_generator/templates/recipes.rb
194
+ - lib/engineyard-jenkins/cli/install_server_generator.rb
195
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/attributes.rb.tt
196
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/jenkins_master/recipes/default.rb
197
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/jenkins_master/templates/default/init.sh.erb
198
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/jenkins_master/templates/default/proxy.conf.erb
199
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/attributes/recipe.rb
200
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/definitions/ey_cloud_report.rb
201
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/libraries/ruby_block.rb
202
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/libraries/run_for_app.rb
203
+ - lib/engineyard-jenkins/cli/install_server_generator/templates/cookbooks/main/recipes/default.rb
204
+ - lib/engineyard-jenkins/thor-ext/actions/directory.rb
205
+ - lib/engineyard-jenkins/version.rb
206
+ - spec/appcloud_env_spec.rb
207
+ - spec/spec_helper.rb
208
+ has_rdoc: true
209
+ homepage: http://github.com/engineyard/engineyard-jenkins
210
+ licenses: []
211
+
212
+ post_install_message:
213
+ rdoc_options: []
214
+
215
+ require_paths:
216
+ - lib
217
+ required_ruby_version: !ruby/object:Gem::Requirement
218
+ none: false
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ hash: -2707218013729594709
223
+ segments:
224
+ - 0
225
+ version: "0"
226
+ required_rubygems_version: !ruby/object:Gem::Requirement
227
+ none: false
228
+ requirements:
229
+ - - ">="
230
+ - !ruby/object:Gem::Version
231
+ hash: -2707218013729594709
232
+ segments:
233
+ - 0
234
+ version: "0"
235
+ requirements: []
236
+
237
+ rubyforge_project: engineyard-jenkins
238
+ rubygems_version: 1.6.2
239
+ signing_key:
240
+ specification_version: 3
241
+ summary: Easier to do CI than not to. Use Jenkins CI with Engine Yard AppCloud.
242
+ test_files:
243
+ - features/install.feature
244
+ - features/install_server.feature
245
+ - features/step_definitions/api_steps.rb
246
+ - features/step_definitions/common_steps.rb
247
+ - features/step_definitions/fixture_project_steps.rb
248
+ - features/step_definitions/jenkins_steps.rb
249
+ - features/support/common.rb
250
+ - features/support/engineyard.rb
251
+ - features/support/env.rb
252
+ - features/support/matchers.rb
253
+ - spec/appcloud_env_spec.rb
254
+ - spec/spec_helper.rb