perkins 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/Gemfile +1 -0
  4. data/README.md +11 -8
  5. data/Rakefile +1 -18
  6. data/config/database.yml +19 -0
  7. data/db/migrate/20150130143050_create_builds.rb +1 -1
  8. data/db/migrate/20150220143051_add_build_status_to_build_reports.rb +10 -0
  9. data/db/migrate/20150220143053_add_commit_to_build_reports.rb +10 -0
  10. data/db/migrate/20150220143054_add_hook_id_to_repo.rb +10 -0
  11. data/db/schema.rb +4 -2
  12. data/examples/Capfile +17 -0
  13. data/examples/Gemfile +14 -1
  14. data/examples/Gemfile.lock +45 -19
  15. data/examples/Procfile +8 -3
  16. data/examples/README.md +12 -0
  17. data/examples/boot.rb +5 -4
  18. data/examples/config.ru +2 -11
  19. data/examples/{database.yml → config/database.example.yml} +0 -0
  20. data/examples/config/database.yml +27 -0
  21. data/examples/config/deploy.rb +78 -0
  22. data/examples/config/deploy/staging.rb +61 -0
  23. data/examples/{rainbows.rb → config/rainbows/development.rb} +1 -1
  24. data/examples/config/rainbows/production.rb +56 -0
  25. data/examples/{sidekiq.yml → config/sidekiq.yml} +0 -0
  26. data/examples/db/schema.rb +43 -0
  27. data/examples/rakefile +8 -0
  28. data/lib/perkins/application.rb +1 -1
  29. data/lib/perkins/assets.rb +3 -3
  30. data/lib/perkins/assets/javascripts/app.js +1 -0
  31. data/lib/perkins/assets/javascripts/perkings.js.coffee +14 -9
  32. data/lib/perkins/assets/javascripts/perkins/helpers.js.coffee +2 -2
  33. data/lib/perkins/assets/javascripts/perkins/m/models.js.coffee +15 -9
  34. data/lib/perkins/assets/javascripts/perkins/router.js.coffee +1 -0
  35. data/lib/perkins/assets/javascripts/perkins/v/my_repos.js.coffee +1 -1
  36. data/lib/perkins/assets/javascripts/perkins/v/orgs.js.coffee +1 -1
  37. data/lib/perkins/assets/javascripts/perkins/v/repo.js.coffee +38 -5
  38. data/lib/perkins/assets/javascripts/templates/repo.hamlc +5 -14
  39. data/lib/perkins/assets/javascripts/templates/repos/build_row.hamlc +10 -5
  40. data/lib/perkins/assets/javascripts/templates/repos/config.hamlc +23 -13
  41. data/lib/perkins/assets/javascripts/templates/repos/report_detail.hamlc +6 -6
  42. data/lib/perkins/assets/javascripts/vendor/eventsource.polyfill.js +512 -0
  43. data/lib/perkins/build/script.rb +2 -1
  44. data/lib/perkins/build/script/go.rb +1 -1
  45. data/lib/perkins/build/script/ruby.rb +1 -1
  46. data/lib/perkins/build/script/stages.rb +0 -1
  47. data/lib/perkins/build_report.rb +27 -7
  48. data/lib/perkins/build_worker.rb +10 -15
  49. data/lib/perkins/git_loader_worker.rb +1 -14
  50. data/lib/perkins/repo.rb +106 -21
  51. data/lib/perkins/runner.rb +57 -12
  52. data/lib/perkins/server.rb +42 -46
  53. data/lib/perkins/socket_server.rb +38 -0
  54. data/lib/perkins/version.rb +1 -1
  55. data/lib/tasks/db_tasks.rake +35 -0
  56. data/perkins.gemspec +16 -19
  57. data/spec/README.md +3 -0
  58. data/spec/lib/build/build_spec.rb +7 -3
  59. data/spec/lib/repo_spec.rb +23 -32
  60. data/spec/lib/runner_spec.rb +52 -2
  61. data/spec/lib/server_spec.rb +15 -6
  62. data/spec/spec_helper.rb +6 -5
  63. metadata +21 -57
  64. data/.DS_Store +0 -0
  65. data/lib/perkins/views/builds.haml +0 -43
  66. data/lib/perkins/views/menu.haml +0 -18
  67. data/lib/perkins/views/orgs.haml +0 -101
  68. data/lib/perkins/views/profile.haml +0 -31
  69. data/lib/perkins/views/repos/config.haml +0 -72
  70. data/lib/perkins/views/repos/github.haml +0 -45
  71. data/lib/perkins/views/repos/menu.haml +0 -17
  72. data/lib/perkins/views/repos/repo.haml +0 -64
  73. data/lib/perkins/views/repos/spinner.haml +0 -3
@@ -1,5 +1,5 @@
1
1
  require 'sinatra/base'
2
- require 'sinatra/activerecord'
2
+ require 'active_record'
3
3
  #require 'sinatra/reloader' #if ENV['RACK_ENV'] == "development"
4
4
  require 'pry'
5
5
  require 'json'
@@ -17,7 +17,7 @@ module Perkins
17
17
  class Server < Sinatra::Application
18
18
 
19
19
  attr_reader :app
20
- set server: 'thin', connections: []
20
+ set server: 'rainbows', connections: []
21
21
  set :sessions, true
22
22
  set :foo, 'bar'
23
23
  enable :sessions
@@ -32,6 +32,13 @@ module Perkins
32
32
 
33
33
  register Perkins::Auth::Github
34
34
 
35
+ before /.*/ do
36
+ if request.url.match(/.json$/)
37
+ request.accept.unshift('application/json')
38
+ request.path_info = request.path_info.gsub(/.json$/,'')
39
+ end
40
+ end
41
+
35
42
  #authenticate all -
36
43
  before do
37
44
  unless %w[stream sse logout unauthenticated /auth/github/callback /repos/receiver badge].include? request.path_info.split('/')[1]
@@ -87,7 +94,6 @@ module Perkins
87
94
  content_type :json
88
95
  repo = find_repo(params)
89
96
  #detects a recently added repo (no dir and no prev builds)
90
- enqueue_git_clone(repo) if !repo.exists? && repo.last_report_id.blank?
91
97
  repo.as_json(methods: [:last_report_id, :http_url]).to_json
92
98
  end
93
99
 
@@ -101,8 +107,7 @@ module Perkins
101
107
  get '/repos/:login/:name/builds' do
102
108
  content_type :json
103
109
  repo = find_repo(params)
104
- #respond or delay git load
105
- repo.exists? ? repo.build_reports.to_json : enqueue_git_clone(repo)
110
+ repo.build_reports.to_json
106
111
  end
107
112
 
108
113
  get '/repos/:login/:name/builds/:build_id' do
@@ -110,23 +115,21 @@ module Perkins
110
115
  repo = find_repo(params)
111
116
  record = repo.build_reports.find(params[:build_id])
112
117
  #record.to_json
113
- repo.exists? ? record.to_json : enqueue_git_clone(repo)
118
+ record.to_json
114
119
  end
115
120
 
116
121
  get '/repos/:login/:name/config' do
117
122
  content_type :json
118
123
  repo = find_repo(params)
119
- #find by id
120
- hook = github_user.api.hooks("#{repo.name}").detect{|o| o[:name] == "web"}
121
- hook.to_attrs.to_json
124
+ hook = repo.get_hook
125
+ hook.try(:to_attrs).try(:to_json) || {}.to_json
122
126
  end
123
127
 
124
128
  #TODO send this through bg job
125
129
  get '/repos/:login/:name/run_commit' do
126
130
  content_type :json
127
131
  repo = find_repo(params)
128
- repo.load_git
129
- sha = repo.git.log.map(&:sha).first
132
+ sha = github_user.api.commits(repo.name).first[:sha]
130
133
  repo.add_commit(sha, "master")
131
134
  repo.to_json
132
135
  end
@@ -134,24 +137,8 @@ module Perkins
134
137
  #TODO for json
135
138
  post '/repos/:login/:name/add_hook' do
136
139
  repo = find_repo(params)
137
- hook = github_user.api.hooks("#{repo.name}").detect{|o| o[:name] == "web"}
138
- if hook.present?
139
- res = github_user.api.edit_hook(
140
- repo.name,
141
- hook["id"],
142
- 'web',
143
- {:url => params[:webhook_url], :content_type => 'json'},
144
- {:active => true}
145
- )
146
- else
147
- res = github_user.api.create_hook(
148
- repo.name,
149
- 'web',
150
- { :url => params[:webhook_url], :content_type => 'json'},
151
- { :events => ['push'], :active => true}
152
- )
153
- end
154
- redirect "/repos/#{repo.name}/config"
140
+ hook = repo.add_hook(params[:webhook_url])
141
+ hook.try(:to_attrs).try(:to_json) || {}.to_json
155
142
  end
156
143
 
157
144
  get '/repos/:login/:name/builds/:build_id/restart' do
@@ -186,14 +173,27 @@ module Perkins
186
173
  github_user.api.user.to_attrs.merge({repos: repos}).to_json
187
174
  end
188
175
 
176
+ @@conns = []
189
177
 
190
178
  get '/stream', provides: 'text/event-stream' do
191
- stream :keep_open do |out|
192
- #EM.run {
193
- # EventMachine::PeriodicTimer.new(20) { out << "data: \n\n" } # added
194
- #}
195
- settings.connections << out
196
- out.callback { settings.connections.delete(out) }
179
+ stream(:keep_open) do |out|
180
+ @@conns << out
181
+ out.callback { @@conns.delete(out) }
182
+ end
183
+ end
184
+
185
+ Thread.new do
186
+ redis = Redis.connect
187
+ redis.psubscribe('message', 'message.*') do |on|
188
+ on.pmessage do |match, channel, message|
189
+
190
+ channel = channel.sub('message.', '')
191
+
192
+ @@conns.each do |out|
193
+ out << "event: #{channel}\n"
194
+ out << "data: #{message}\n\n"
195
+ end
196
+ end
197
197
  end
198
198
  end
199
199
 
@@ -210,9 +210,11 @@ module Perkins
210
210
 
211
211
  def initialize(args={})
212
212
  super
213
- return if args.blank?
214
- puts "PerkinsCI environment loaded on #{args[:host]}:#{args[:port]}".green
213
+ #return if args.blank?
215
214
  app = Perkins::Application.instance
215
+
216
+ puts "PerkinsCI #{settings.environment} environment loaded on #{app.host}:#{app.port}".green
217
+
216
218
  self.class.set :perkins_application, app
217
219
  self.class.set :github_options, {
218
220
  :scopes => "admin:repo_hook,repo,user:email",
@@ -237,17 +239,13 @@ module Perkins
237
239
  def find_repo(params)
238
240
  id = "#{params[:login]}/#{params[:name]}"
239
241
  repo = Repo.find_by(name: id)
240
- #repo.load_git #it seems that we dont need this here
241
242
  repo
242
243
  end
243
244
 
244
- def enqueue_git_clone(repo)
245
- GitLoaderWorker.perform_async(repo.id )
246
- end
247
-
248
245
  def request_badge(opts={})
249
246
  begin
250
- url = URI.parse("https://img.shields.io/badge/build-#{opts[:status]}-#{opts[:color]}.svg?style=flat-square")
247
+ image_path = "https://img.shields.io/badge/build-#{opts[:status]}-#{opts[:color]}.svg?style=flat-square"
248
+ url = URI.parse(image_path)
251
249
  result = Net::HTTP.get(url)
252
250
  rescue => e
253
251
  e
@@ -277,8 +275,6 @@ module Perkins
277
275
  #set :database, 'sqlite:///db/test.sqlite3'
278
276
  end
279
277
 
280
- #::Perkins::Server.run!(options)
281
-
282
278
  end
283
279
 
284
280
  def self.start_listener(app_config)
@@ -291,7 +287,7 @@ module Perkins
291
287
  ####################################
292
288
 
293
289
  def default_data
294
- {author: "miguel michelson", year: Time.now.year, app: @app}
290
+ { year: Time.now.year, app: @app}
295
291
  end
296
292
 
297
293
  helpers do
@@ -0,0 +1,38 @@
1
+ require 'goliath'
2
+ require 'redis'
3
+
4
+ module Perkins
5
+ class Subscribe < Goliath::API
6
+ def response(env)
7
+ EM.synchrony do
8
+ @redis = Redis.new(Options::redis)
9
+ channel = env["REQUEST_PATH"].sub(/^\/subscribe\//, '')
10
+
11
+ # We pass the subscribe method a block which describes what to
12
+ # do when we receive an event.
13
+ # This block writes the message formatted as a server sent event
14
+ # to the HTTP stream.
15
+ @redis.subscribe(channel) do |on|
16
+ on.message do |channel, message|
17
+ @message = message
18
+ env.stream_send(payload)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ streaming_response(200, { 'Content-Type' => "text/event-stream" })
24
+ end
25
+ end
26
+
27
+ def on_close(env)
28
+ @redis.disconnect
29
+ end
30
+
31
+ def payload
32
+ "id: #{Time.now}\n" +
33
+ "data: #{@message}" +
34
+ "\r\n\n"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,3 +1,3 @@
1
1
  module Perkins
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -0,0 +1,35 @@
1
+ require "pry"
2
+ require "perkins"
3
+ require 'yaml'
4
+ require 'logger'
5
+ require 'active_record'
6
+
7
+ include ActiveRecord::Tasks
8
+
9
+ class Seeder
10
+ def initialize(seed_file)
11
+ @seed_file = seed_file
12
+ end
13
+
14
+ def load_seed
15
+ raise "Seed file '#{@seed_file}' does not exist" unless File.file?(@seed_file)
16
+ load @seed_file
17
+ end
18
+ end
19
+
20
+
21
+ root = Dir.pwd #File.expand_path '..', __FILE__
22
+ DatabaseTasks.env = ENV['ENV'] || 'development'
23
+ DatabaseTasks.database_configuration = YAML.load(File.read(File.join(root, 'config/database.yml')))
24
+ DatabaseTasks.db_dir = File.join root, 'db'
25
+ DatabaseTasks.fixtures_path = File.join root, 'test/fixtures'
26
+ DatabaseTasks.migrations_paths = [File.join(root, 'db/migrate'), File.join(Perkins::ROOT_PATH, "db/migrate") ]
27
+ DatabaseTasks.seed_loader = Seeder.new File.join root, 'db/seeds.rb'
28
+ DatabaseTasks.root = root
29
+
30
+ task :environment do
31
+ ActiveRecord::Base.configurations = DatabaseTasks.database_configuration
32
+ ActiveRecord::Base.establish_connection DatabaseTasks.env.to_sym
33
+ end
34
+
35
+ load 'active_record/railties/databases.rake'
@@ -21,32 +21,29 @@ Gem::Specification.new do |spec|
21
21
  spec.add_dependency 'activesupport', ['>= 3', '< 4.1']
22
22
  spec.add_dependency 'activerecord', ['>= 3', '< 4.1']
23
23
 
24
- spec.add_dependency "sinatra-activerecord"
25
24
  spec.add_dependency "sinatra-contrib"
26
25
  spec.add_dependency "sqlite3"
27
26
 
28
- spec.add_runtime_dependency("git")
29
- spec.add_runtime_dependency("celluloid")
30
- spec.add_runtime_dependency("celluloid-io")
31
- spec.add_runtime_dependency("redis")
32
- spec.add_runtime_dependency("thor")
33
- spec.add_runtime_dependency("sinatra")
34
- spec.add_runtime_dependency("haml")
35
- spec.add_runtime_dependency("sprockets")
36
- spec.add_runtime_dependency("haml_coffee_assets")
37
- spec.add_runtime_dependency("yui-compressor")
38
- spec.add_runtime_dependency("rdiscount")
39
- spec.add_runtime_dependency("travis-yaml")
40
- spec.add_runtime_dependency("redis-namespace")
41
- spec.add_runtime_dependency("thin")
42
- spec.add_runtime_dependency("sidekiq")
43
- spec.add_runtime_dependency("dotenv-rails")
27
+ spec.add_dependency("git")
28
+ spec.add_dependency("redis")
29
+ spec.add_dependency("thor")
30
+ spec.add_dependency("sinatra")
31
+ spec.add_dependency("haml")
32
+ spec.add_dependency("sprockets")
33
+ spec.add_dependency("haml_coffee_assets")
34
+ spec.add_dependency("yui-compressor")
35
+ spec.add_dependency("rdiscount")
36
+ spec.add_dependency("travis-yaml")
37
+ spec.add_dependency("redis-namespace")
38
+ spec.add_dependency("thin")
39
+ spec.add_dependency("sidekiq")
40
+ spec.add_dependency("dotenv-rails")
44
41
 
45
42
  spec.add_dependency "warden-github", "~>1.0"
46
43
 
47
44
  # I find it well worth to include CoffeeScript and SASS as well
48
- spec.add_runtime_dependency( "coffee-script")
49
- spec.add_runtime_dependency( "sass")
45
+ spec.add_dependency("coffee-script")
46
+ spec.add_dependency("sass")
50
47
 
51
48
 
52
49
  spec.add_development_dependency "bundler", "~> 1.7"
@@ -0,0 +1,3 @@
1
+ ## configure:
2
+ #will read file in configure
3
+ rake db:create:all ENV=test --trace
@@ -32,9 +32,9 @@ describe "Repo" do
32
32
  before :each do
33
33
  @repo = Perkins::Repo.where(cached: false).last
34
34
  allow_any_instance_of(Perkins::Repo).to receive(:check_config_existence).and_return(file)
35
- @repo.load_git
36
- expect(@repo.git).to be_instance_of(Git::Base)
37
- @path = @repo.git.dir.path
35
+ #@repo.load_git
36
+ #expect(@repo.git).to be_instance_of(Git::Base)
37
+ #@path = @repo.git.dir.path
38
38
  end
39
39
 
40
40
  after :each do
@@ -46,8 +46,12 @@ describe "Repo" do
46
46
  end
47
47
 
48
48
  it "run run run should add a new report" do
49
+ @repo.load_git
49
50
  sha = @repo.git.log.map(&:sha).first
51
+ @repo.runner.report = @repo.build_reports.create
52
+
50
53
  @repo.runner.run(sha)
54
+ expect(@repo.build_reports.last.build_status).to_not be_blank
51
55
  expect(@repo.build_reports.size).to be == 1
52
56
  #binding.pry
53
57
  #expect(@repo.runner.status).to be == true
@@ -44,7 +44,6 @@ describe "Repo" do
44
44
  expect(r.name).to_not be_blank
45
45
  expect(r.id).to_not be_blank
46
46
  expect(r.url).to_not be_blank
47
- #expect(r.local_path).to_not be_blank
48
47
  end
49
48
 
50
49
  context "load git" do
@@ -52,34 +51,32 @@ describe "Repo" do
52
51
  @repo = Perkins::Repo.first
53
52
  end
54
53
 
55
- it "will not be downloaded" do
56
- expect(@repo.download_status).to be_blank
57
- expect(@repo.downloaded?).to be == false
54
+ it "git will be not loaded" do
55
+ expect(@repo.git).to be_blank
58
56
  end
59
57
 
60
58
  it "will be downloaded after load_git" do
61
59
  @repo.load_git
62
- expect(@repo.downloaded?).to be == true
60
+ expect(@repo.git).to be_present
61
+ expect(@repo.git.dir.path).to be == "/tmp/#{@repo.name}"
62
+ expect(File.exist?(@repo.git.dir.path)).to be_present
63
63
  end
64
- end
65
64
 
66
- context "loaded repo" do
67
- before :each do
68
- @repo = Perkins::Repo.first
65
+ it "override dir with virtual_sha" do
66
+ @repo.virtual_sha = "xxx"
69
67
  @repo.load_git
70
- expect(@repo.git).to be_instance_of(Git::Base)
71
- @path = @repo.git.dir.path
72
- end
73
-
74
- it "should download repo" do
75
- expect(File.exist?(@path)).to be_present
68
+ expect(@repo.git).to be_present
69
+ expect(@repo.git.dir.path).to be == "/tmp/#{@repo.name}xxx"
70
+ expect(File.exist?(@repo.git.dir.path)).to be_present
76
71
  end
77
72
 
78
73
  it "should have a default runner" do
74
+ @repo.load_git
79
75
  expect(@repo.runner).to_not be_blank
80
76
  end
81
77
 
82
78
  it "should have branches" do
79
+ @repo.load_git
83
80
  expect(@repo.runner_branch).to be == ["master"]
84
81
  expect(@repo.branches).to include("master")
85
82
  end
@@ -97,33 +94,27 @@ describe "Repo" do
97
94
  it "should have a runner" do
98
95
  expect(@repo.runner).to be_instance_of(Perkins::Runner)
99
96
  end
100
-
101
- it "runner true" do
102
- sha = @repo.git.log.map(&:sha).first
103
- allow_any_instance_of(Perkins::Runner).to receive(:run_script).and_return("stubbed")
104
- allow_any_instance_of(Perkins::Runner).to receive(:successful_command?).and_return(true)
105
- runner = @repo.runner
106
- runner.run(sha)
107
- expect(runner.response).to be == "stubbed"
108
- expect(runner.status).to be == true
109
- expect(@repo.build_status).to be == "stopped"
110
- end
111
97
  end
112
98
 
113
99
  context "receive commit" do
114
100
  before :each do
115
101
  allow_any_instance_of(Perkins::Repo).to receive(:check_config_existence).and_return(file)
116
102
  @repo = Perkins::Repo.first
117
- @repo.load_git
118
- expect(@repo.git).to be_instance_of(Git::Base)
119
- @path = @repo.git.dir.path
103
+ #@repo.load_git
104
+ #expect(@repo.git).to be_instance_of(Git::Base)
105
+ #@path = @repo.git.dir.path
106
+ end
107
+
108
+ it "will enqueue commit" do
109
+ sha = "123456789"
110
+ expect(@repo).to receive(:enqueue_commit) #.with(sha, "master")
111
+ @repo.add_commit(sha, "master")
120
112
  end
121
113
 
122
114
  it "will increment Worker jobs when receive commit " do
123
- sha = @repo.git.log.map(&:sha).first
115
+ sha = "123456789"
124
116
  @repo.add_commit(sha, "master")
125
- expect(@repo.new_commit).to be_instance_of(Perkins::Commit)
126
- expect(Perkins::Worker.jobs.size).to be > 0
117
+ expect(Perkins::BuildWorker.jobs.size).to be > 0
127
118
  end
128
119
 
129
120
  end
@@ -38,12 +38,20 @@ describe "Runner" do
38
38
  @runner = Perkins::Runner.new
39
39
  @runner.config = file
40
40
  @runner.repo = repo
41
+
42
+ report = Perkins::BuildReport.new
43
+ report.sha = "master"
44
+ report.branch = "master"
45
+
46
+ @runner.repo.build_reports << report
47
+ @runner.repo.save
48
+
49
+ @runner.report = report
41
50
  #allow_any_instance_of(Perkins::Repo).to receive(:clone_or_load).and_return(true)
42
51
  #allow_any_instance_of(Perkins::Repo).to receive(:git).and_return(Git::Base.new)
43
52
  end
44
53
 
45
54
  it "runner should raise error in case it fails" do
46
-
47
55
  expect{@runner.run!}.to raise_error
48
56
  end
49
57
 
@@ -51,10 +59,19 @@ describe "Runner" do
51
59
  #allow_any_instance_of(Git::Base).to receive(:chdir).and_return(true)
52
60
  expect{@runner.run("master")}.to_not raise_error
53
61
  #expect(Git::Base).to have_received(:chdir)
54
-
55
62
  expect(@runner.duration).to be > 0
56
63
  expect(@runner).to_not be_running
64
+ end
65
+
66
+ it "will make repo in sha dir" do
67
+ #allow_any_instance_of(Git::Base).to receive(:chdir).and_return(true)
68
+ @runner.repo.virtual_sha = "master"
57
69
 
70
+ expect{@runner.run("master")}.to_not raise_error
71
+ #expect(Git::Base).to have_received(:chdir)
72
+
73
+ expect(@runner.duration).to be > 0
74
+ expect(@runner).to_not be_running
58
75
  end
59
76
  end
60
77
 
@@ -63,6 +80,16 @@ describe "Runner" do
63
80
  before :each do
64
81
  repo.clone_or_load
65
82
  @runner = repo.runner
83
+
84
+
85
+ report = Perkins::BuildReport.new
86
+ report.sha = "master"
87
+ report.branch = "master"
88
+ repo.build_reports << report
89
+ repo.branch = "master"
90
+ repo.save
91
+ @runner.report = report
92
+
66
93
  end
67
94
 
68
95
  it "should install bundler" do
@@ -73,5 +100,28 @@ describe "Runner" do
73
100
 
74
101
  end
75
102
 
103
+ context "build report" do
104
+
105
+ let( :repo ){ Perkins::Repo.find_by(name: "michelson/godard") }
106
+ before :each do
107
+ repo.clone_or_load
108
+ @runner = repo.runner
109
+
110
+
111
+ @report = Perkins::BuildReport.new
112
+ @report.sha = "master"
113
+ @report.branch = "master"
114
+ repo.build_reports << @report
115
+ repo.branch = "master"
116
+ repo.save
117
+ @runner.report = @report
118
+
119
+ end
120
+
121
+ it "retrieve_commit_info" do
122
+ @report.retrieve_commit_info
123
+ end
124
+ end
125
+
76
126
  end
77
127