build-buddy 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20b7313e36172e051a99a9b341a94fc92338455a
4
- data.tar.gz: 578b2c07c30fc4d4cf678049ae2e9212883e1857
3
+ metadata.gz: 42ef29e6a888d9a89ced4aa309d964810eb39727
4
+ data.tar.gz: 9042302dd8276aa3f0cb4e6b6d56f5bb8d32a869
5
5
  SHA512:
6
- metadata.gz: 144e5b4600e573917693fd6389c8d7e9e7f9ea1d53a27f65806779014cbdbe6748c2add4ded28a36f619830348bd43e4a552f902a8322bf5c71920d3006e9ad3
7
- data.tar.gz: c96c2800fa8975b29e3511c23dc108c78f316f103d61f6245b0d33d36098daaeacc8a9dfebcf85f3ad217930f5e4b0b6c520f55d6952a6fcd8949d32f9d0e212
6
+ metadata.gz: ec95fce9bc150e5d93210959c58d8840ceefe1b8ef4ef4b99e18a7de742e091ee142a016aa25428040779895740f9ba21476e7cc3bbbd7613cb85f17c182a293
7
+ data.tar.gz: 1e64657ef0e400bac314eb75a1fcab1d1b60ba3a18cc5a0d7e53568b6b80c6ba3ddafb39b34f1573ae8ae10ba5f6012c13230e11fe3387a2eff6d1723c754ca7
@@ -8,46 +8,48 @@ require 'celluloid/supervision/container'
8
8
  require 'methadone'
9
9
  require 'build_buddy'
10
10
 
11
- class Tool
12
- include Methadone::Main
13
- include Methadone::CLILogging
11
+ module BuildBuddy
12
+ class Tool
13
+ include Methadone::Main
14
+ include Methadone::CLILogging
14
15
 
15
- main do |config_name|
16
- config_file_name = config_name
16
+ main do |config_name|
17
+ config_file_name = config_name
17
18
 
18
- if File.extname(config_file_name) != '.bbconfig'
19
- config_file_name += '.bbconfig'
20
- end
19
+ if File.extname(config_file_name) != '.bbconfig'
20
+ config_file_name += '.bbconfig'
21
+ end
21
22
 
22
- load config_file_name
23
+ load config_file_name
23
24
 
24
- config_path = File.dirname(config_file_name)
25
- BuildBuddy::Config.pull_request_build_script = File.expand_path(BuildBuddy::Config.pull_request_build_script, config_path)
26
- BuildBuddy::Config.master_build_script = File.expand_path(BuildBuddy::Config.master_build_script, config_path)
27
- BuildBuddy::Config.release_build_script = File.expand_path(BuildBuddy::Config.release_build_script, config_path)
28
- BuildBuddy::Config.build_log_dir = File.expand_path(BuildBuddy::Config.build_log_dir, config_path)
25
+ config_path = File.dirname(config_file_name)
26
+ Config.pull_request_build_script = File.expand_path(Config.pull_request_build_script, config_path)
27
+ Config.master_build_script = File.expand_path(Config.master_build_script, config_path)
28
+ Config.release_build_script = File.expand_path(Config.release_build_script, config_path)
29
+ Config.build_log_dir = File.expand_path(Config.build_log_dir, config_path)
29
30
 
30
- build_log_dir = BuildBuddy::Config.build_log_dir
31
+ build_log_dir = BuildBuddy::Config.build_log_dir
31
32
 
32
- unless Dir.exist?(build_log_dir)
33
- Dir.mkdir(build_log_dir)
34
- end
33
+ unless Dir.exist?(build_log_dir)
34
+ Dir.mkdir(build_log_dir)
35
+ end
35
36
 
36
- Slack.configure do |config|
37
- config.token = BuildBuddy::Config.slack_api_token
38
- end
37
+ Slack.configure do |config|
38
+ config.token = Config.slack_api_token
39
+ end
39
40
 
40
- Celluloid.logger = Reel::Logger.logger
41
+ Celluloid.logger = Reel::Logger.logger
41
42
 
42
- BuildBuddy::Builder.supervise as: :builder
43
- BuildBuddy::Server.supervise as: :server
43
+ Builder.supervise as: :builder
44
+ Server.supervise as: :server
44
45
 
45
- sleep
46
- end
46
+ sleep
47
+ end
47
48
 
48
- version BuildBuddy::VERSION
49
- description 'Build Buddy'
50
- arg :config_name, :required
49
+ version BuildBuddy::VERSION
50
+ description 'Build Buddy'
51
+ arg :config_name, :required
51
52
 
52
- go!
53
- end
53
+ go!
54
+ end
55
+ end
@@ -2,8 +2,8 @@ require 'build_buddy/config'
2
2
  require 'build_buddy/server'
3
3
  require 'build_buddy/builder'
4
4
  require 'build_buddy/watcher'
5
+ require 'build_buddy/build_data'
5
6
 
6
7
  module BuildBuddy
7
- VERSION = "1.2.0"
8
+ VERSION = "1.3.0"
8
9
  end
9
-
@@ -0,0 +1,21 @@
1
+ module BuildBuddy
2
+ class BuildData
3
+ attr_accessor :build_type # one of :master, :release or :pull_request
4
+ attr_accessor :repo_full_name
5
+ attr_accessor :build_version
6
+ attr_accessor :repo_full_name
7
+ attr_accessor :repo_sha
8
+ attr_accessor :termination_type
9
+ attr_accessor :exit_code
10
+ attr_accessor :start_time
11
+ attr_accessor :end_time
12
+ attr_accessor :build_log_filename
13
+
14
+ def initialize(build_type, args)
15
+ @build_type = build_type
16
+ @repo_full_name = args[:repo_full_name]
17
+ @repo_sha = args[:repo_sha]
18
+ @build_version = args[:build_version]
19
+ end
20
+ end
21
+ end
@@ -46,8 +46,10 @@ module BuildBuddy
46
46
  raise "Unknown build type"
47
47
  end
48
48
 
49
- build_log_filename = File.join(Config.build_log_dir, "build_#{build_data.build_type.to_s}_#{Time.now.utc.strftime('%Y%m%d%_H%M%S')}.log")
50
- build_data.build_log_filename = build_log_filename
49
+ @build_data.start_time = Time.now.utc
50
+ build_log_filename = File.join(Config.build_log_dir,
51
+ "build_#{build_data.build_type.to_s}_#{build_data.start_time.strftime('%Y%m%d_%H%M%S')}.log")
52
+ @build_data.build_log_filename = build_log_filename
51
53
 
52
54
  Bundler.with_clean_env do
53
55
  @pid = Process.spawn(env, command, :pgroup => true, [:out, :err] => build_log_filename)
@@ -64,6 +66,7 @@ module BuildBuddy
64
66
  end
65
67
 
66
68
  def process_done(status)
69
+ @build_data.end_time = Time.now.utc
67
70
  @build_data.termination_type = (status.signaled? ? :killed : :exited)
68
71
  @build_data.exit_code = (status.exited? ? status.exitstatus : -1)
69
72
  info "Process #{status.pid} #{@build_data.termination_type == :killed ? 'was terminated' : "exited (#{@build_data.exit_code})"}"
@@ -76,6 +79,7 @@ module BuildBuddy
76
79
  if @gid
77
80
  info "Killing gid #{@gid}"
78
81
  Process.kill(:SIGABRT, -@gid)
82
+ @gid = nil
79
83
  end
80
84
  end
81
85
  end
@@ -2,6 +2,8 @@ module BuildBuddy
2
2
  module Config
3
3
  extend self
4
4
 
5
+ attr_accessor :github_webhook_port
6
+ attr_accessor :github_webhook_path
5
7
  attr_accessor :github_webhook_secret_token
6
8
  attr_accessor :github_webhook_repo_full_name
7
9
  attr_accessor :github_api_token
@@ -14,10 +16,15 @@ module BuildBuddy
14
16
  attr_accessor :pull_request_build_script
15
17
  attr_accessor :master_build_script
16
18
  attr_accessor :release_build_script
17
- end
19
+ attr_accessor :valid_release_versions
20
+ attr_accessor :kill_build_after_mins
21
+ end
18
22
 
19
23
  class << self
20
24
  def configure
25
+ Config.github_webhook_port = 4567
26
+ Config.github_webhook_path = '/webhook'
27
+ Config.kill_build_after_mins = 30
21
28
  block_given? ? yield(Config) : Config
22
29
  end
23
30
 
@@ -3,7 +3,6 @@ require 'celluloid/current'
3
3
  require 'reel'
4
4
  require 'slack-ruby-client'
5
5
  require 'json'
6
- require 'ostruct'
7
6
  require 'octokit'
8
7
  require 'thread'
9
8
  require 'timers'
@@ -14,7 +13,7 @@ module BuildBuddy
14
13
  class Server < Reel::Server::HTTP
15
14
  include Celluloid::Internals::Logger
16
15
 
17
- def initialize(host = "127.0.0.1", port = 4567)
16
+ def initialize(host = "127.0.0.1", port = Config.github_webhook_port)
18
17
  super(host, port, &method(:on_connection))
19
18
  @gh_client ||= Octokit::Client.new(:access_token => Config.github_api_token)
20
19
  @rt_client = Slack::RealTime::Client.new
@@ -106,23 +105,24 @@ module BuildBuddy
106
105
  case message
107
106
  when /master/i
108
107
  response = "OK, I've queued a build of the `master` branch."
109
- queue_a_build(OpenStruct.new(
110
- :build_type => :master,
108
+ queue_a_build(BuildData.new(:master,
111
109
  :repo_full_name => Config.github_webhook_repo_full_name))
112
110
  when /(?<version>v\d+\.\d+)/
113
111
  version = $~[:version]
114
- response = "OK, I've queued a build of `#{version}` branch."
115
- queue_a_build(OpenStruct.new(
116
- :build_type => :release,
117
- :build_version => version,
118
- :repo_full_name => Config.github_webhook_repo_full_name))
112
+ if Config.valid_release_versions.include?(version)
113
+ response = "OK, I've queued a build of `#{version}` branch."
114
+ queue_a_build(BuildData.new(:release,
115
+ :build_version => version,
116
+ :repo_full_name => Config.github_webhook_repo_full_name))
117
+ else
118
+ response = "I'm sorry, I cannot build the #{version} release branch"
119
+ end
119
120
  when /stop/i
120
121
  build_data = @active_build
121
122
  if build_data.nil?
122
123
  response = "There is no build running to stop"
123
124
  else
124
- # TODO: We need some more checks here to avoid accidental stoppage
125
- response = "OK, I'm trying to *stop* the currently running build..."
125
+ response = "OK, I killed the currently running build..."
126
126
  Celluloid::Actor[:builder].async.stop_build
127
127
  end
128
128
  else
@@ -178,7 +178,7 @@ module BuildBuddy
178
178
  case request.method
179
179
  when 'POST'
180
180
  case request.path
181
- when '/webhook'
181
+ when Config.github_webhook_path
182
182
  case request.headers["X-GitHub-Event"]
183
183
  when 'pull_request'
184
184
  payload_text = request.body.to_s
@@ -188,12 +188,11 @@ module BuildBuddy
188
188
  else
189
189
  payload = JSON.parse(payload_text)
190
190
  pull_request = payload['pull_request']
191
- build_data = OpenStruct.new(
192
- :build_type => :pull_request,
191
+ build_data = BuildData.new(:pull_request,
193
192
  :pull_request => pull_request['number'],
194
193
  :repo_sha => pull_request['head']['sha'],
195
194
  :repo_full_name => pull_request['base']['repo']['full_name'])
196
- info "Got pull request #{build_data[:pull_request]} from GitHub"
195
+ info "Got pull request #{build_data.pull_request} from GitHub"
197
196
  queue_a_build(build_data)
198
197
  request.respond 200
199
198
  end
@@ -235,7 +234,6 @@ module BuildBuddy
235
234
  if @build_queue.length > 0
236
235
  build_data = @build_queue.pop()
237
236
  @active_build = build_data
238
- # TODO: Add timing information into the build_data
239
237
  if build_data.build_type == :pull_request
240
238
  @gh_client.create_status(
241
239
  build_data.repo_full_name, build_data.repo_sha, 'pending',
@@ -243,7 +241,6 @@ module BuildBuddy
243
241
  end
244
242
  Celluloid::Actor[:builder].async.start_build(build_data)
245
243
  elsif @done_queue.length > 0
246
- # TODO: Should pop everything in the done queue
247
244
  build_data = @done_queue.pop
248
245
  term_msg = (build_data.termination_type == :killed ? "was stopped" : "completed")
249
246
  if build_data.termination_type == :exited
@@ -279,7 +276,10 @@ module BuildBuddy
279
276
  info "Build timer stopped"
280
277
  end
281
278
  else
282
- # TODO: Make sure that the build has not run too long and kill if necessary
279
+ # Make sure that the build has not run too long and kill if necessary
280
+ if Time.now.utc - @active_build.start_time > Config.kill_build_after_mins * 60
281
+ Celluloid::Actor[:builder].async.stop_build()
282
+ end
283
283
  end
284
284
  end
285
285
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: build-buddy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Lyon-smith
@@ -173,6 +173,7 @@ extra_rdoc_files: []
173
173
  files:
174
174
  - bin/build-buddy
175
175
  - lib/build_buddy.rb
176
+ - lib/build_buddy/build_data.rb
176
177
  - lib/build_buddy/builder.rb
177
178
  - lib/build_buddy/config.rb
178
179
  - lib/build_buddy/server.rb