build-buddy 1.2.0 → 1.3.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.
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