perkins 0.0.3 → 0.0.5

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 (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