build-buddy 1.9.2 → 1.10.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: 76cc3ddfbee154ee1432443968a760f9e17e79e8
4
- data.tar.gz: 575d15f41abb55fcbc7e0e8174144f3926e5c568
3
+ metadata.gz: 2a8a7992124d1da142da38648ea45d39b805582f
4
+ data.tar.gz: 6785a428216e7499fc90d437692715f3442434b2
5
5
  SHA512:
6
- metadata.gz: cc093742b96214e7f4f5a2e1c58bb1fe39efe77fadacec41d75a86672da153d6098bc90b48dbc11c7571bb83c490fad7b19a7cba2dc04e536c110a72763c88c2
7
- data.tar.gz: 456bcf537cd820466616367118a23fdef23c67c08842c9d6ead7ed35cf3ed86fa38809f303be637ab81f67dd91b423d4ba89a295ae1e247cd034cd9a3841dfc4
6
+ metadata.gz: 1b789719672f1d11b0bf637063db822d66a4867d2f430e478cf7a6c212209081b2a3e00e95bcad838a220eca323142a39edc35c5fadc07e887825b820861c01d
7
+ data.tar.gz: 05299a51f399a428f3038f1da2de44edc9b9d671d65a7cdc9b8009f035a9173e356ae35d94b79b7aaf994bb69041ffa6e72d22ccc214f5261abf82ce5664b410
data/bin/build-buddy CHANGED
@@ -22,12 +22,7 @@ module BuildBuddy
22
22
  load config_file_name
23
23
 
24
24
  config_path = File.dirname(config_file_name)
25
- Config.pull_request_build_script = File.expand_path(Config.pull_request_build_script, config_path)
26
- Config.master_build_script = File.expand_path(Config.master_build_script, config_path)
27
- Config.release_build_script = File.expand_path(Config.release_build_script, config_path)
28
- Config.build_log_dir = File.expand_path(Config.build_log_dir, config_path)
29
-
30
- build_log_dir = BuildBuddy::Config.build_log_dir
25
+ build_log_dir = File.expand_path(Config.build_log_dir, config_path)
31
26
 
32
27
  unless Dir.exist?(build_log_dir)
33
28
  Dir.mkdir(build_log_dir)
data/lib/build_buddy.rb CHANGED
@@ -9,5 +9,5 @@ require 'build_buddy/recorder'
9
9
  require 'build_buddy/build_data'
10
10
 
11
11
  module BuildBuddy
12
- VERSION = "1.9.2"
12
+ VERSION = "1.10.0"
13
13
  end
@@ -2,6 +2,7 @@ require 'rubygems'
2
2
  require 'bundler'
3
3
  require 'celluloid'
4
4
  require 'psych'
5
+ require 'fileutils'
5
6
  require_relative './watcher.rb'
6
7
  require_relative './config.rb'
7
8
 
@@ -18,51 +19,123 @@ module BuildBuddy
18
19
  end
19
20
 
20
21
  def start_build(build_data)
22
+ def expand_vars(s)
23
+ s.gsub(/\$([a-zA-Z_]+[a-zA-Z0-9_]*)|\$\{(.+)\}/) { ENV[$1||$2] }
24
+ end
25
+
21
26
  @build_data = build_data
22
27
  @metrics_tempfile = Tempfile.new('build-metrics')
23
28
  @metrics_tempfile.close()
24
29
 
25
30
  repo_parts = build_data.repo_full_name.split('/')
26
- command = "bash "
27
- env = {
28
- "GIT_REPO_OWNER" => repo_parts[0],
29
- "GIT_REPO_NAME" => repo_parts[1],
31
+ git_repo_owner = repo_parts[0]
32
+ git_repo_name = repo_parts[1]
33
+ env = {}
34
+ build_script = %q(#!/bin/bash
35
+
36
+ if [[ -z "$GIT_REPO_OWNER" || -z "$GIT_REPO_NAME" || -z "$BUILD_SCRIPT" ]]; then
37
+ echo Must set GIT_REPO_OWNER, GIT_REPO_NAME, GIT_PULL_REQUEST and BUILD_SCRIPT before calling
38
+ exit 1
39
+ fi
40
+ )
41
+
42
+ case build_data.type
43
+ when :pull_request
44
+ build_script += %q(
45
+ if [[ -z "$GIT_PULL_REQUEST" ]]; then
46
+ echo Must set GIT_PULL_REQUEST before calling
47
+ fi
48
+ )
49
+ when :branch
50
+ build_script += %q(
51
+ if [[ -z "$GIT_BRANCH" ]]; then
52
+ echo Must set GIT_BRANCH before calling
53
+ fi
54
+ )
55
+ else
56
+ raise "Unknown build type"
57
+ end
58
+
59
+ build_script += %q(
60
+ if [[ -d ${GIT_REPO_NAME} ]]; then
61
+ echo WARNING: Deleting old clone directory $(pwd)/${GIT_REPO_NAME}
62
+ rm -rf ${GIT_REPO_NAME}
63
+ fi
64
+
65
+ echo Pulling sources to $(pwd)/${GIT_REPO_NAME}
66
+ if ! git clone git@github.com:${GIT_REPO_OWNER}/${GIT_REPO_NAME}.git ${GIT_REPO_NAME}; then
67
+ echo ERROR: Unable to clone repository
68
+ exit 1
69
+ fi
70
+
71
+ cd ${GIT_REPO_NAME}
72
+ )
73
+
74
+ case build_data.type
75
+ when :pull_request
76
+ build_root_dir = expand_vars(Config.pull_request_root_dir)
77
+ env.merge!({
78
+ "GIT_PULL_REQUEST" => build_data.pull_request.to_s,
79
+ "BUILD_SCRIPT" => Config.pull_request_build_script
80
+ })
81
+ # See https://gist.github.com/piscisaureus/3342247
82
+ build_script += %q(
83
+ echo Switching to pr/${GIT_PULL_REQUEST} branch
84
+ git config --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'
85
+ git fetch -q origin
86
+ git checkout pr/$GIT_PULL_REQUEST
87
+ )
88
+ when :branch
89
+ build_root_dir = expand_vars(Config.branch_root_dir)
90
+ env.merge!({
91
+ "GIT_BRANCH" => 'master',
92
+ "BUILD_SCRIPT" => Config.branch_build_script
93
+ })
94
+ build_script += %q(
95
+ echo Switching to ${GIT_BRANCH} branch
96
+ git checkout ${GIT_BRANCH}
97
+ )
98
+ end
99
+
100
+ build_script += %q(
101
+ source ${BUILD_SCRIPT}
102
+ )
103
+ env.merge!({
104
+ "GIT_REPO_OWNER" => git_repo_owner,
105
+ "GIT_REPO_NAME" => git_repo_name,
30
106
  "METRICS_DATA_FILE" => @metrics_tempfile.path,
31
107
  "RBENV_DIR" => nil,
32
108
  "RBENV_VERSION" => nil,
33
109
  "RBENV_HOOK_PATH" => nil,
34
110
  "RBENV_ROOT" => nil,
35
- "PATH" => ENV['PATH'].split(':').select { |v| !v.match(/\.rbenv\/versions|Cellar\/rbenv/) }.join(':')
36
- }
111
+ "PATH" => ENV['PATH'].split(':').select { |v| !v.match(/\.rbenv\/versions|Cellar\/rbenv/) }.join(':'),
112
+ })
113
+
37
114
  unless build_data.flags.nil?
38
115
  build_data.flags.each do |flag|
39
116
  env["BUILD_FLAG_#{flag.to_s.upcase}"] = '1'
40
117
  end
41
118
  end
42
119
 
43
- case build_data.type
44
- when :pull_request
45
- env["GIT_PULL_REQUEST"] = build_data.pull_request.to_s
46
- command += Config.pull_request_build_script
47
- when :master
48
- command += Config.master_build_script
49
- when :release
50
- env["GIT_BRANCH"] = build_data.branch
51
- command += Config.release_build_script
52
- else
53
- raise "Unknown build type"
54
- end
55
-
56
120
  @build_data.start_time = Time.now.utc
57
- log_filename = File.join(Config.build_log_dir,
121
+ log_filename = File.join(File.expand_path(Config.build_log_dir),
58
122
  "build_#{build_data.type.to_s}_#{build_data.start_time.strftime('%Y%m%d_%H%M%S')}.log")
59
123
  @build_data.log_filename = log_filename
60
124
 
125
+ # Ensure build root and git user directory exists
126
+ clone_dir = File.join(build_root_dir, git_repo_owner)
127
+ FileUtils.mkdir_p(clone_dir)
128
+
129
+ # Write the bootstrapping build script to it
130
+ script_filename = File.join(clone_dir, "build-buddy-bootstrap.sh")
131
+ File.write(script_filename, build_script)
132
+
133
+ # Run the build script
61
134
  Bundler.with_clean_env do
62
- @pid = Process.spawn(env, command, :pgroup => true, [:out, :err] => log_filename)
135
+ @pid = Process.spawn(env, "bash #{script_filename}", :pgroup => true, :chdir => clone_dir, [:out, :err] => log_filename)
63
136
  @gid = Process.getpgid(@pid)
64
137
  end
65
- info "Running #{File.basename(command)} (pid #{@pid}, gid #{@gid}) : Log #{log_filename}"
138
+ info "Running build script (pid #{@pid}, gid #{@gid}) : Log #{log_filename}"
66
139
 
67
140
  if @watcher
68
141
  @watcher.terminate
@@ -14,9 +14,10 @@ module BuildBuddy
14
14
  attr_accessor :xcode_test_scheme
15
15
  attr_accessor :build_log_dir
16
16
  attr_accessor :pull_request_build_script
17
- attr_accessor :master_build_script
18
- attr_accessor :release_build_script
19
- attr_accessor :valid_release_versions
17
+ attr_accessor :branch_build_script
18
+ attr_accessor :pull_request_root_dir
19
+ attr_accessor :branch_root_dir
20
+ attr_accessor :allowed_build_branches
20
21
  attr_accessor :kill_build_after_mins
21
22
  attr_accessor :server_base_uri
22
23
  attr_accessor :mongo_uri
@@ -25,10 +25,8 @@ module BuildBuddy
25
25
  Celluloid::Actor[:gitter].async.set_status(
26
26
  build_data.repo_full_name, build_data.repo_sha, :pending, "This build is in the queue")
27
27
  info "Pull request build queued"
28
- when :master
29
- info "`master` branch build queued"
30
- when :release
31
- info "Release branch build queued"
28
+ when :branch
29
+ info "'#{build_data.branch}' branch build queued"
32
30
  end
33
31
 
34
32
  if @build_timer.nil?
@@ -56,21 +56,22 @@ module BuildBuddy
56
56
  flags = Slacker.get_build_flags($~[:flags])
57
57
  response = "OK, I've queued a build of the `master` branch."
58
58
  scheduler.queue_a_build(BuildData.new(
59
- :type => :master,
59
+ :type => :branch,
60
+ :branch => 'master',
60
61
  :flags => flags,
61
62
  :repo_full_name => Config.github_webhook_repo_full_name))
62
63
  when /^(?<version>v\d+\.\d+)(?: with )?(?<flags>.*)?/
63
64
  flags = Slacker.get_build_flags($~[:flags])
64
65
  version = $~[:version]
65
- if Config.valid_release_versions.include?(version)
66
+ if Config.allowed_build_branches.include?(version)
66
67
  response = "OK, I've queued a build of the `#{version}` branch."
67
68
  scheduler.queue_a_build(BuildData.new(
68
- :type => :release,
69
+ :type => :branch,
69
70
  :branch => version,
70
71
  :flags => flags,
71
72
  :repo_full_name => Config.github_webhook_repo_full_name))
72
73
  else
73
- response = "I'm sorry, I am not allowed to build the `#{version}` release branch"
74
+ response = "I'm sorry, I am not allowed to build the `#{version}` branch"
74
75
  end
75
76
  else
76
77
  response = "Sorry#{from_slack_channel ? " <@#{data['user']}>" : ""}, I'm not sure if you want do a `master` or release branch build"
@@ -107,9 +108,7 @@ module BuildBuddy
107
108
  case build_data.type
108
109
  when :pull_request
109
110
  response = "There is a pull request build in progress for https://github.com/#{build_data.repo_full_name}/pull/#{build_data.pull_request}."
110
- when :master
111
- response = "There is a build of the `master` branch of https://github.com/#{build_data.repo_full_name} in progress."
112
- when :release
111
+ when :branch
113
112
  response = "There is a build of the `#{build_data.branch}` branch of https://github.com/#{build_data.repo_full_name} in progress."
114
113
  end
115
114
  if queue_length == 1
@@ -159,10 +158,8 @@ Ask me `what happened` to get a list of recent builds and log files and `what op
159
158
  build_datas.each do |build_data|
160
159
  response += "A "
161
160
  response += case build_data.type
162
- when :master
163
- "`master` branch build"
164
- when :release
165
- "`#{build_data.branch}` release branch build"
161
+ when :branch
162
+ "`#{build_data.branch}` branch build"
166
163
  when :pull_request
167
164
  "pull request `#{build_data.pull_request}` build"
168
165
  end
@@ -278,10 +275,7 @@ Ask me `what happened` to get a list of recent builds and log files and `what op
278
275
  info "Pull request build #{status_message}"
279
276
  else
280
277
  status_message += "Log file at #{log_url}."
281
- if build_data.type == :master
282
- message = "A build of the `master` branch #{status_message}"
283
- info "`master` branch build #{status_message}"
284
- else
278
+ if build_data.type == :branch
285
279
  message = "A build of the `#{build_data.branch}` branch #{status_message}"
286
280
  info "Release branch build #{status_message}"
287
281
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: build-buddy
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.2
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Lyon-smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-09 00:00:00.000000000 Z
11
+ date: 2016-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: timers