hockey-gerrit 0.0.4 → 1.0.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: 748dda909ad2476ef9596b37212edf3b7ebf58b2
4
- data.tar.gz: 87c22f978ebbd7902fbaf924150856644aaacb98
3
+ metadata.gz: 33dabbc32ca92ae60bf2d88ac65491c1037e7dea
4
+ data.tar.gz: e544b00de71d7e68cf298e1950328f0a6450608e
5
5
  SHA512:
6
- metadata.gz: f1649ac96f41f8877178ba3e013465e9dcecdc11c529283ed0249e30cd99da33b6a84f3a7102d4a8ecf0f48aaa259d1a8b10092ed50c14caded62d86d8d144ee
7
- data.tar.gz: d2939745213e54c7abb29cfabd59efe223730593be92917bfc603b6f76a4a2852375a32e4077bd111a6bca837c2476bcfe9d4b9d1526605a6d72275ed7483b0e
6
+ metadata.gz: b7495c4cf19234679f045e68ab217d39b969a742e8ddc7bc9bd2ecd0b33f7d44e68da53a57d5100cfde669d3997b8962eadd4508c7edb64ab89d64b142c51f07
7
+ data.tar.gz: 2ac67394f78af6ac01b0de5c4049df6d19a790cf7e66e7a4cba7d0d6883cd9c10cd90443794c004c80ee9dd95fd990f7c51f8c8374bc376e0396d09846ae176d
data/.gitignore CHANGED
@@ -34,6 +34,11 @@ build/
34
34
 
35
35
  # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
36
36
  .rvmrc
37
+ *.ipa
38
+ *.zip
37
39
 
38
40
 
39
- changelog.md
41
+ changelog.md
42
+ .idea/*
43
+
44
+ Gemfile.lock
@@ -27,5 +27,13 @@ Metrics/ClassLength:
27
27
  Max: 150
28
28
  Metrics/CyclomaticComplexity:
29
29
  Max: 10
30
+ Metrics/PerceivedComplexity:
31
+ Max: 10
30
32
  Metrics/AbcSize:
31
- Max: 40
33
+ Max: 40
34
+ AllCops:
35
+ Exclude:
36
+ - 'lib/hockey_gerrit/shenzhen.rb'
37
+ # RubyMine default formatting breaks this rule
38
+ Style/SpaceInsideHashLiteralBraces:
39
+ Enabled: false
@@ -1,15 +1,15 @@
1
1
  sudo: false
2
- cache: bundler
3
2
  language: ruby
3
+ cache:
4
+ bundler: true
4
5
  rvm:
5
- - 2.3.0
6
+ - 2.3.1
6
7
  before_install: gem update --remote bundler
7
8
  install:
8
9
  - bundle install --retry=3
9
10
  script:
10
- - bundle exec rubocop
11
- - bundle exec rspec
11
+ - bundle exec rake
12
12
  notifications:
13
13
  email:
14
14
  on_success: never
15
- on_failure: never
15
+ on_failure: never
data/Rakefile CHANGED
@@ -5,9 +5,13 @@ require 'rubocop/rake_task'
5
5
 
6
6
  RSpec::Core::RakeTask.new
7
7
 
8
- task default: :spec
8
+ task default: [:spec, :rubocop]
9
+
9
10
  task test: :spec
11
+
10
12
  # rake rubocop
11
13
  RuboCop::RakeTask.new do |task|
12
14
  task.options = ['-D']
13
15
  end
16
+
17
+ task cop: :rubocop
@@ -2,4 +2,4 @@
2
2
 
3
3
  require_relative '../lib/hockey_gerrit'
4
4
 
5
- HockeyGerrit.new.write
5
+ HockeyGerrit.new.run
@@ -3,11 +3,12 @@ require_relative 'lib/hockey_gerrit/version'
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'hockey-gerrit'
5
5
  spec.version = HockeyGerrit::VERSION
6
- spec.authors = ['Trevor Renshaw']
7
- spec.email = ['trenshaw@instructure.com']
8
- spec.summary = 'Gets build information from gerrit to then send to hockeyapp.'
9
- spec.description = 'Generates a change log.'
6
+ spec.authors = ['Trevor Renshaw', 'bootstraponline']
7
+ spec.email = %w[trenshaw@instructure.com code@bootstraponline.com]
8
+ spec.summary = 'Uploads a build from gerrit/Jenkins to hockeyapp'
9
+ spec.description = 'Uploads a build from gerrit/Jenkins to hockeyapp.'
10
10
  spec.license = 'Apache-2.0'
11
+ spec.homepage = 'https://github.com/instructure/hockey-gerrit'
11
12
 
12
13
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
13
14
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -17,6 +18,13 @@ Gem::Specification.new do |spec|
17
18
 
18
19
  spec.required_ruby_version = '>= 2.0.0'
19
20
 
21
+ spec.add_runtime_dependency 'faraday', '~> 0.9.2'
22
+ spec.add_runtime_dependency 'faraday_middleware', '~> 0.10.0'
23
+
24
+ spec.add_development_dependency 'safe_yaml', '~> 1.0', '>= 1.0.4'
25
+ spec.add_development_dependency 'pry', '~> 0.10.3'
26
+ spec.add_development_dependency 'trace_files', '~> 1.0'
27
+ spec.add_development_dependency 'webmock', '~> 2.0', '>= 2.0.3'
20
28
  spec.add_development_dependency 'bundler', '~> 1.11', '>= 1.11.0'
21
29
  spec.add_development_dependency 'byebug', '~> 8.2.2', '>= 8.2.2'
22
30
  spec.add_development_dependency 'rake', '~> 11.1.1', '>= 11.1.1'
@@ -1,41 +1,104 @@
1
1
  require_relative 'hockey_gerrit/version'
2
2
  require 'English'
3
3
 
4
+ require 'rubygems'
5
+ require_relative 'hockey_gerrit/shenzhen'
6
+
4
7
  class HockeyGerrit
5
- attr_accessor :output_file, :change, :patch, :log, :log_line
6
- def changes(gerrit)
7
- raise 'No line from Gerrit provided' if gerrit.empty?
8
- gerrit_split = gerrit.split('/')
9
- raise 'ENV GERRIT_REFSPEC has invalid format' unless gerrit_split.size >= 2
10
- @change, @patch = gerrit_split[-2..-1]
8
+ attr_reader :token, :ipa, :build_url, :gerrit_env, :tries, :upload_url
9
+
10
+ def gerrit_refspec
11
+ raise 'Must set GERRIT_REFSPEC' unless gerrit_env && !gerrit_env.empty?
12
+ gerrit_split = gerrit_env.split('/')
13
+ raise 'GERRIT_REFSPEC is invalid' unless gerrit_split.size >= 2
14
+ change, patch = gerrit_split[-2..-1]
15
+ "g#{change},#{patch}"
11
16
  end
12
17
 
13
- def assign_log
14
- @log = `git log --reverse -1 --format="%an: %s"`
15
- raise 'log command failed' unless $CHILD_STATUS.success?
18
+ def git_log
19
+ git_log = `git log --reverse -1 --format="%an: %s"`
20
+ raise 'command failed' unless $CHILD_STATUS.success?
21
+ git_log
16
22
  end
17
23
 
18
- def write_file
19
- File.write(output_file, log_line)
24
+ def git_commit_sha
25
+ sha = `git rev-parse --verify HEAD`
26
+ raise 'command failed' unless $CHILD_STATUS.success?
27
+ sha
20
28
  end
21
29
 
22
- def delete_file
23
- File.delete(output_file)
30
+ def configure_options
31
+ gerrit = gerrit_refspec
32
+ log = git_log
33
+ release_notes = "#{gerrit}\n\n#{log}"
34
+
35
+ markdown = 1
36
+ available_for_download = 2
37
+ dont_notify = 0
38
+ options = {
39
+ notes_type: markdown,
40
+ notes: release_notes,
41
+ notify: dont_notify,
42
+ ipa: ipa,
43
+ status: available_for_download,
44
+ build_server_url: build_url,
45
+ commit_sha: git_commit_sha
46
+ }
47
+
48
+ dsym_ext = 'app.dSYM.zip'
49
+ dsym = ipa.to_s.gsub('ipa', dsym_ext)
50
+
51
+ if File.exist?(dsym) && dsym.end_with?(dsym_ext)
52
+ options[:dsym_filename] = dsym
53
+ else
54
+ is_android = File.extname(ipa) == '.apk'
55
+ puts 'dSYM not found! Unable to symbolicate crashes' unless is_android
56
+ end
57
+ options
24
58
  end
25
59
 
26
- def change_line
27
- raise 'Change empty' if change.empty?
28
- raise 'Patch empty' if patch.empty?
29
- raise 'Log empty' if log.empty?
30
- @log_line = "g#{change},#{patch}\n#{log}"
60
+ def hockey_url(response)
61
+ config_url = response.body ? response.body['config_url'] : ''
62
+ raise 'Missing config_url' unless config_url
63
+ config_url.gsub!('https://upload.hockeyapp.net/', 'https://rink.hockeyapp.net/')
64
+ @upload_url = config_url
65
+ config_url
31
66
  end
32
67
 
33
- def write
34
- @output_file = 'changelog.md'
35
- raise 'ENV GERRIT_REFSPEC not defined' unless ENV['GERRIT_REFSPEC']
36
- changes(ENV['GERRIT_REFSPEC'])
37
- assign_log
38
- change_line
39
- write_file
68
+ def validate_args(opts)
69
+ @token = opts.fetch :token, ENV['token']
70
+ @ipa = opts.fetch :ipa, ARGV.first
71
+ @build_url = opts.fetch :build_url, ENV['build_url']
72
+ @gerrit_env = opts.fetch :gerrit, ENV['GERRIT_REFSPEC']
73
+ @tries = opts.fetch :retry, 5
74
+
75
+ raise 'Must set token' unless token && token.is_a?(String) && !token.empty?
76
+ raise 'Must provide path to ipa' unless ipa
77
+ raise 'ipa doesn\'t exist' unless File.exist?(ipa)
78
+ raise 'Must provide build_url' unless build_url
79
+ raise 'Retry must be an int >= 1' unless tries && tries.is_a?(Integer) && tries >= 1
80
+ end
81
+
82
+ def run(opts = {})
83
+ validate_args opts
84
+
85
+ tries = @tries # required for tries to be in scope for 'retry'
86
+
87
+ puts "Uploading #{File.basename(ipa)}"
88
+
89
+ # http://support.hockeyapp.net/kb/api/api-versions#upload-version
90
+ begin
91
+ client = Shenzhen::Plugins::HockeyApp::Client.new(token)
92
+
93
+ options = configure_options
94
+ response = client.upload_build(ipa, options)
95
+
96
+ raise "Invalid response: #{response.body}" unless response.status == 201
97
+ puts "Build uploaded to: #{hockey_url(response)}"
98
+ rescue
99
+ puts "Retrying upload. #{tries} attempts remaining..." if tries > 1
100
+ retry unless (tries -= 1).zero?
101
+ raise
102
+ end
40
103
  end
41
104
  end
@@ -0,0 +1,71 @@
1
+ # we only need the Hockey part of shenzhen
2
+ # https://github.com/nomad/shenzhen/blob/master/lib/shenzhen/plugins/hockeyapp.rb
3
+
4
+ =begin
5
+ Copyright (c) 2012–2015 Mattt Thompson (http://mattt.me/)
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ of this software and associated documentation files (the "Software"), to deal
9
+ in the Software without restriction, including without limitation the rights
10
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in
15
+ all copies or substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
+ THE SOFTWARE.
24
+ =end
25
+
26
+ module Shenzhen
27
+ end
28
+
29
+ require 'json'
30
+ require 'openssl'
31
+ require 'faraday'
32
+ require 'faraday_middleware'
33
+
34
+ module Shenzhen::Plugins
35
+ module HockeyApp
36
+ class Client
37
+ HOSTNAME = 'upload.hockeyapp.net'
38
+
39
+ def initialize(api_token)
40
+ @api_token = api_token
41
+ @connection = Faraday.new(:url => "https://#{HOSTNAME}") do |builder|
42
+ builder.request :multipart
43
+ builder.request :url_encoded
44
+ builder.response :json, :content_type => /\bjson$/
45
+ builder.use FaradayMiddleware::FollowRedirects
46
+ builder.adapter :net_http
47
+ end
48
+ end
49
+
50
+ def upload_build(ipa, options)
51
+ options[:ipa] = Faraday::UploadIO.new(ipa, 'application/octet-stream') if ipa and File.exist?(ipa)
52
+
53
+ if dsym_filename = options.delete(:dsym_filename)
54
+ options[:dsym] = Faraday::UploadIO.new(dsym_filename, 'application/octet-stream')
55
+ end
56
+
57
+ @connection.post do |req|
58
+ if options[:public_identifier].nil?
59
+ req.url("/api/2/apps/upload")
60
+ else
61
+ req.url("/api/2/apps/#{options.delete(:public_identifier)}/app_versions/upload")
62
+ end
63
+ req.headers['X-HockeyAppToken'] = @api_token
64
+ req.body = options
65
+ end.on_complete do |env|
66
+ yield env[:status], env[:body] if block_given?
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -1,3 +1,3 @@
1
1
  class HockeyGerrit
2
- VERSION = '0.0.4'.freeze unless defined? ::HockeyGerrit::VERSION
2
+ VERSION = '1.0.0'.freeze unless defined? ::HockeyGerrit::VERSION
3
3
  end
@@ -0,0 +1,6 @@
1
+ ```ruby
2
+ # ArgumentError: WebMock does not support matching body for multipart/form-data requests yet :(
3
+ # https://github.com/bblimke/webmock/issues/623
4
+ # expect(WebMock).to have_requested(http_method, http_uri).
5
+ # with(body: http_body, headers: http_headers)
6
+ ````
metadata CHANGED
@@ -1,15 +1,112 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hockey-gerrit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Trevor Renshaw
8
+ - bootstraponline
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-05-19 00:00:00.000000000 Z
12
+ date: 2016-05-28 00:00:00.000000000 Z
12
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: faraday
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.9.2
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.9.2
28
+ - !ruby/object:Gem::Dependency
29
+ name: faraday_middleware
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 0.10.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 0.10.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: safe_yaml
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.0'
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 1.0.4
52
+ type: :development
53
+ prerelease: false
54
+ version_requirements: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: '1.0'
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.4
62
+ - !ruby/object:Gem::Dependency
63
+ name: pry
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.10.3
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.10.3
76
+ - !ruby/object:Gem::Dependency
77
+ name: trace_files
78
+ requirement: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ type: :development
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.0'
90
+ - !ruby/object:Gem::Dependency
91
+ name: webmock
92
+ requirement: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.0'
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 2.0.3
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - "~>"
105
+ - !ruby/object:Gem::Version
106
+ version: '2.0'
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: 2.0.3
13
110
  - !ruby/object:Gem::Dependency
14
111
  name: bundler
15
112
  requirement: !ruby/object:Gem::Requirement
@@ -150,9 +247,10 @@ dependencies:
150
247
  - - ">="
151
248
  - !ruby/object:Gem::Version
152
249
  version: 0.8.3
153
- description: Generates a change log.
250
+ description: Uploads a build from gerrit/Jenkins to hockeyapp.
154
251
  email:
155
252
  - trenshaw@instructure.com
253
+ - code@bootstraponline.com
156
254
  executables:
157
255
  - hockey-gerrit
158
256
  extensions: []
@@ -161,7 +259,6 @@ files:
161
259
  - ".codeclimate.yml"
162
260
  - ".coveralls.yml"
163
261
  - ".gitignore"
164
- - ".rspec"
165
262
  - ".rubocop.yml"
166
263
  - ".travis.yml"
167
264
  - Gemfile
@@ -171,8 +268,10 @@ files:
171
268
  - bin/hockey-gerrit
172
269
  - hockey-gerrit.gemspec
173
270
  - lib/hockey_gerrit.rb
271
+ - lib/hockey_gerrit/shenzhen.rb
174
272
  - lib/hockey_gerrit/version.rb
175
- homepage:
273
+ - notes.md
274
+ homepage: https://github.com/instructure/hockey-gerrit
176
275
  licenses:
177
276
  - Apache-2.0
178
277
  metadata: {}
@@ -195,5 +294,5 @@ rubyforge_project:
195
294
  rubygems_version: 2.6.4
196
295
  signing_key:
197
296
  specification_version: 4
198
- summary: Gets build information from gerrit to then send to hockeyapp.
297
+ summary: Uploads a build from gerrit/Jenkins to hockeyapp
199
298
  test_files: []
data/.rspec DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --require spec_helper