octopusci 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ require 'resque'
2
+ require 'octopusci/config'
3
+
4
+ module Octopusci
5
+ module WorkerLauncher
6
+ def self.launch
7
+ Octopusci::CONFIG['stages'].size.times do
8
+ cur_pid = Process.fork do
9
+ queues = ['commit']
10
+ worker = Resque::Worker.new(*queues)
11
+ worker.log "Starting worker #{worker}"
12
+ worker.work(5)
13
+ end
14
+ Process.waitall
15
+ end
16
+ end
17
+ end
18
+ end
data/lib/octopusci.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'time-ago-in-words'
2
+
3
+ require 'octopusci/version'
4
+ require 'octopusci/helpers'
5
+ require 'octopusci/schema'
6
+ require 'octopusci/notifier'
7
+ require 'octopusci/queue'
8
+ require 'octopusci/stage_locker'
9
+ require 'octopusci/job'
10
+ require 'octopusci/config'
11
+ require 'octopusci/worker_launcher'
12
+
13
+ module Octopusci
14
+ def self.greet
15
+ return "Hello RSpec!"
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Octopusci::Notifier do
4
+ before(:each) do
5
+ Octopusci::Notifier.delivery_method = :test
6
+ Octopusci::Notifier.perform_deliveries = true
7
+ Octopusci::Notifier.deliveries = []
8
+ end
9
+
10
+ describe "#job_complete" do
11
+ it "should send a multi-part email with the text version containing job status" do
12
+ pending
13
+ mail = Octopusci::Notifier.job_complete('joe@example.com', 'my output', 'my status').deliver()
14
+
15
+ Octopusci::Notifier.deliveries.size.should == 1
16
+ mail.parts[0].body.should =~ /my output/
17
+ end
18
+
19
+ it "should send a multi-part email with the html version containing job status" do
20
+ pending
21
+ mail = Octopusci::Notifier.job_complete('joe@example.com', 'my output', 'my status').deliver()
22
+
23
+ Octopusci::Notifier.deliveries.size.should == 1
24
+ mail.parts[1].body.should =~ /my output/
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Octopusci::Server" do
4
+ before(:all) do
5
+ @github_test_payload = '{"base_ref":null,"ref":"refs/heads/master","commits":[{"message":"shit son","removed":[],"modified":["test.txt"],"added":[],"author":{"username":"cyphactor","email":"cyphactor@gmail.com","name":"Andrew De Ponte"},"distinct":true,"timestamp":"2011-09-06T22:01:12-07:00","id":"d7f49d93ee8fbce466c23c4e8a6bcbe8cab88a57","url":"https://github.com/cyphactor/temp_pusci_test/commit/d7f49d93ee8fbce466c23c4e8a6bcbe8cab88a57"},{"message":"again broham","removed":[],"modified":["test.txt"],"added":[],"author":{"username":"cyphactor","email":"cyphactor@gmail.com","name":"Andrew De Ponte"},"distinct":true,"timestamp":"2011-09-06T23:01:07-07:00","id":"60ae8e76469931b3e879d594099b0f4ac6f5cb99","url":"https://github.com/cyphactor/temp_pusci_test/commit/60ae8e76469931b3e879d594099b0f4ac6f5cb99"},{"message":"again broham","removed":[],"modified":["test.txt"],"added":[],"author":{"username":"cyphactor","email":"cyphactor@gmail.com","name":"Andrew De Ponte"},"distinct":true,"timestamp":"2011-09-06T23:03:16-07:00","id":"dd6e7913cc12937db88e469684e8698f8eee8c14","url":"https://github.com/cyphactor/temp_pusci_test/commit/dd6e7913cc12937db88e469684e8698f8eee8c14"}],"created":false,"before":"e5a1385fd8654c46d2b52d90c1ba31c865493602","repository":{"created_at":"2011/09/02 12:40:14 -0700","open_issues":0,"forks":1,"description":"Temp repo for testing pusci as I dev it","has_wiki":true,"fork":false,"watchers":1,"has_downloads":true,"homepage":"","has_issues":true,"private":false,"size":116,"owner":{"email":"cyphactor@gmail.com","name":"cyphactor"},"name":"temp_pusci_test","pushed_at":"2011/09/06 23:03:21 -0700","url":"https://github.com/cyphactor/temp_pusci_test"},"pusher":{"name":"none"},"forced":false,"after":"dd6e7913cc12937db88e469684e8698f8eee8c14","deleted":false,"compare":"https://github.com/cyphactor/temp_pusci_test/compare/e5a1385...dd6e791"}'
6
+ @github_real_payload = '{"created":false,"ref":"refs/heads/master","compare":"https://github.com/cyphactor/temp_pusci_test/compare/dd6e791...23485e0","repository":{"owner":{"email":"cyphactor@gmail.com","name":"cyphactor"},"has_downloads":true,"pushed_at":"2011/09/09 08:27:00 -0700","has_wiki":true,"url":"https://github.com/cyphactor/temp_pusci_test","size":116,"fork":false,"watchers":1,"has_issues":true,"name":"temp_pusci_test","created_at":"2011/09/02 12:40:14 -0700","open_issues":0,"private":false,"homepage":"","description":"Temp repo for testing pusci as I dev it","forks":1},"before":"dd6e7913cc12937db88e469684e8698f8eee8c14","forced":false,"after":"23485e00f329d7db02bc7b8c51ef11025046bd95","commits":[{"added":[],"removed":[],"timestamp":"2011-09-09T08:26:49-07:00","message":"Woot woot a nother push","modified":["test.txt"],"url":"https://github.com/cyphactor/temp_pusci_test/commit/23485e00f329d7db02bc7b8c51ef11025046bd95","distinct":true,"id":"23485e00f329d7db02bc7b8c51ef11025046bd95","author":{"username":"cyphactor","email":"cyphactor@gmail.com","name":"Andrew De Ponte"}}],"pusher":{"email":"cyphactor@gmail.com","name":"cyphactor"},"deleted":false,"base_ref":null}'
7
+ end
8
+
9
+ describe "POST /github-build" do
10
+ it "should parse the github payload using JSON" do
11
+ parsed_github_payload = Octopusci::Helpers.decode(@github_test_payload)
12
+ Octopusci::Helpers.should_receive(:decode).with(@github_test_payload).and_return(parsed_github_payload)
13
+ post '/github-build', :payload => @github_test_payload
14
+ end
15
+
16
+ it "should return 404 if the request is for a non-managed project" do
17
+ Octopusci::Helpers.should_receive(:get_project_info).with("temp_pusci_test", "cyphactor").and_return(nil)
18
+ post '/github-build', :payload => @github_test_payload
19
+ last_response.status.should == 404
20
+ end
21
+
22
+ it "should enqueue a job if the request is for a managed project" do
23
+ test_proj_info = { 'name' => 'temp_pusc_test', 'owner' => 'cyphactor', 'job_klass' => 'MyTestJob' }
24
+ Octopusci::Helpers.stub(:get_project_info).and_return(test_proj_info)
25
+ Octopusci::Queue.should_receive(:enqueue).with(test_proj_info['job_klass'], "temp_pusci_test", "master", Octopusci::Helpers.decode(@github_test_payload))
26
+ post '/github-build', :payload => @github_test_payload
27
+ last_response.status.should == 200
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Octopusci" do
4
+ end
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
2
+ require 'octopusci/server'
3
+ require 'rack/test'
4
+
5
+ Octopusci::Server.set :environment, :test
6
+
7
+ def app
8
+ Octopusci::Server
9
+ end
10
+
11
+ include Rack::Test::Methods
metadata ADDED
@@ -0,0 +1,247 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: octopusci
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Andrew De Ponte
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-09-21 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sinatra
16
+ requirement: &70093880092720 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70093880092720
25
+ - !ruby/object:Gem::Dependency
26
+ name: json
27
+ requirement: &70093880078580 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70093880078580
36
+ - !ruby/object:Gem::Dependency
37
+ name: resque
38
+ requirement: &70093880075780 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70093880075780
47
+ - !ruby/object:Gem::Dependency
48
+ name: actionmailer
49
+ requirement: &70093880075000 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70093880075000
58
+ - !ruby/object:Gem::Dependency
59
+ name: activerecord
60
+ requirement: &70093880073080 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *70093880073080
69
+ - !ruby/object:Gem::Dependency
70
+ name: mysql
71
+ requirement: &70093880070800 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: *70093880070800
80
+ - !ruby/object:Gem::Dependency
81
+ name: multi_json
82
+ requirement: &70093880068020 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ type: :runtime
89
+ prerelease: false
90
+ version_requirements: *70093880068020
91
+ - !ruby/object:Gem::Dependency
92
+ name: time-ago-in-words
93
+ requirement: &70093880067280 !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ type: :runtime
100
+ prerelease: false
101
+ version_requirements: *70093880067280
102
+ - !ruby/object:Gem::Dependency
103
+ name: rake
104
+ requirement: &70093880065500 !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: *70093880065500
113
+ - !ruby/object:Gem::Dependency
114
+ name: rspec
115
+ requirement: &70093880062860 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ! '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ type: :development
122
+ prerelease: false
123
+ version_requirements: *70093880062860
124
+ - !ruby/object:Gem::Dependency
125
+ name: rack-test
126
+ requirement: &70093880061660 !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: *70093880061660
135
+ - !ruby/object:Gem::Dependency
136
+ name: guard
137
+ requirement: &70093880060360 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: *70093880060360
146
+ - !ruby/object:Gem::Dependency
147
+ name: rb-fsevent
148
+ requirement: &70093880059500 !ruby/object:Gem::Requirement
149
+ none: false
150
+ requirements:
151
+ - - ! '>='
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ type: :development
155
+ prerelease: false
156
+ version_requirements: *70093880059500
157
+ - !ruby/object:Gem::Dependency
158
+ name: growl
159
+ requirement: &70093880058780 !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ type: :development
166
+ prerelease: false
167
+ version_requirements: *70093880058780
168
+ - !ruby/object:Gem::Dependency
169
+ name: guard-rspec
170
+ requirement: &70093880057920 !ruby/object:Gem::Requirement
171
+ none: false
172
+ requirements:
173
+ - - ! '>='
174
+ - !ruby/object:Gem::Version
175
+ version: '0'
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: *70093880057920
179
+ description: A multi-branch Continous Integration server that integrates with GitHub
180
+ email:
181
+ - cyphactor@gmail.com
182
+ executables:
183
+ - octopusci-tentacles
184
+ - octopusci-skel
185
+ - octopusci-db-migrate
186
+ extensions: []
187
+ extra_rdoc_files: []
188
+ files:
189
+ - README
190
+ - LICENSE
191
+ - config.ru
192
+ - lib/octopusci/config.rb
193
+ - lib/octopusci/errors.rb
194
+ - lib/octopusci/helpers.rb
195
+ - lib/octopusci/job.rb
196
+ - lib/octopusci/notifier/job_complete.html.erb
197
+ - lib/octopusci/notifier/job_complete.text.erb
198
+ - lib/octopusci/notifier.rb
199
+ - lib/octopusci/queue.rb
200
+ - lib/octopusci/schema.rb
201
+ - lib/octopusci/server/public/images/noise.gif
202
+ - lib/octopusci/server/public/images/status.png
203
+ - lib/octopusci/server/public/images/status2.png
204
+ - lib/octopusci/server/public/javascripts/jquery-1.6.4.min.js
205
+ - lib/octopusci/server/views/hello_world.erb
206
+ - lib/octopusci/server/views/index.erb
207
+ - lib/octopusci/server/views/layout.erb
208
+ - lib/octopusci/server.rb
209
+ - lib/octopusci/stage_locker.rb
210
+ - lib/octopusci/version.rb
211
+ - lib/octopusci/worker_launcher.rb
212
+ - lib/octopusci.rb
213
+ - bin/octopusci
214
+ - bin/octopusci-db-migrate
215
+ - bin/octopusci-skel
216
+ - bin/octopusci-tentacles
217
+ - bin/pusci-stage
218
+ - spec/lib/octopusci/notifier_spec.rb
219
+ - spec/lib/octopusci/server_spec.rb
220
+ - spec/lib/octopusci_spec.rb
221
+ - spec/spec_helper.rb
222
+ - db/migrate/0001_init.rb
223
+ homepage: https://github.com/cyphactor/octopusci
224
+ licenses: []
225
+ post_install_message:
226
+ rdoc_options: []
227
+ require_paths:
228
+ - lib
229
+ required_ruby_version: !ruby/object:Gem::Requirement
230
+ none: false
231
+ requirements:
232
+ - - ! '>='
233
+ - !ruby/object:Gem::Version
234
+ version: '0'
235
+ required_rubygems_version: !ruby/object:Gem::Requirement
236
+ none: false
237
+ requirements:
238
+ - - ! '>='
239
+ - !ruby/object:Gem::Version
240
+ version: '0'
241
+ requirements: []
242
+ rubyforge_project:
243
+ rubygems_version: 1.8.10
244
+ signing_key:
245
+ specification_version: 3
246
+ summary: A continuous integration application using Sinatra.
247
+ test_files: []