fastlane-plugin-bugsnag 1.3.4 → 1.4.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
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad582c6af1ea151c4ac204309b0d3fe48da1aa071eb9274b25ea8dc5ba993835
|
4
|
+
data.tar.gz: 5f9526a7383816b5e747fe8f8ba879a911e81a176f589057353158eba93d49c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 639170c3dd8dd10827bc50757fcb0aaf2074a864d547dc55943e4540dad4a6c00ed97265aeacc42d21e6d55ca84e234c6b69de763d3214156b0042ba0a8c55ab
|
7
|
+
data.tar.gz: bb33da203e7a26e0eb75efc929573140b1bf59236aaba4613263026579864acc61e7bbd485cc3cc12b951220e85390f7f2603003954761c2beec5327799bfb41
|
data/bugsnag-dsym-upload
CHANGED
@@ -15,6 +15,7 @@ function print_usage() {
|
|
15
15
|
echo
|
16
16
|
echo "-h, --help Displays this message"
|
17
17
|
echo "-v, --verbose Print verbose logging output during execution"
|
18
|
+
echo "--api-key API_KEY The API key of the project the dSYM should be applied to"
|
18
19
|
echo "--symbol-maps DIR Path to a directory of bitcode symbol maps. The"
|
19
20
|
echo " dSYM files will be restored with symbols prior to"
|
20
21
|
echo " upload. Requires dsymutil."
|
@@ -51,6 +52,7 @@ unset dsym_dir
|
|
51
52
|
unset verbose
|
52
53
|
unset silent
|
53
54
|
unset project_root
|
55
|
+
unset api_key
|
54
56
|
|
55
57
|
while [[ $# -gt 0 ]]; do
|
56
58
|
case $1 in
|
@@ -71,6 +73,10 @@ while [[ $# -gt 0 ]]; do
|
|
71
73
|
upload_server=$2
|
72
74
|
shift
|
73
75
|
shift;;
|
76
|
+
--api-key)
|
77
|
+
api_key=$2
|
78
|
+
shift
|
79
|
+
shift;;
|
74
80
|
--project-root)
|
75
81
|
project_root=$2
|
76
82
|
shift
|
@@ -131,12 +137,23 @@ for dsym in $dsym_dir/*.dSYM; do
|
|
131
137
|
uuid=$(dwarfdump -u $file 2>/dev/null)
|
132
138
|
if [[ $uuid == UUID* ]]; then
|
133
139
|
log Uploading $uuid
|
140
|
+
|
141
|
+
# Attach the api key and project root parameters if they have been provided
|
142
|
+
args=""
|
134
143
|
if [[ ! -z $project_root ]]; then
|
135
|
-
|
136
|
-
else
|
137
|
-
output=$(curl --silent --show-error $upload_server -F dsym=@\"$file\")
|
144
|
+
args="-F projectRoot=$project_root "
|
138
145
|
fi
|
139
|
-
|
146
|
+
|
147
|
+
if [[ ! -z $api_key ]]; then
|
148
|
+
args="$args-F apiKey=$api_key"
|
149
|
+
fi
|
150
|
+
|
151
|
+
# We need to shell out to perform the curl as there seems to be some indirect
|
152
|
+
# wrapping of this script which causes the command to fail if called directly.
|
153
|
+
curl_cmd="curl --silent --show-error $upload_server -F dsym=@\"$file\" $args"
|
154
|
+
output=$(sh -c "$curl_cmd")
|
155
|
+
|
156
|
+
if [ $? -eq 0 ] && [ "$output" != "invalid apiKey" ]; then
|
140
157
|
success_count=$((success_count+1))
|
141
158
|
else
|
142
159
|
fail_count=$((fail_count+1))
|
@@ -6,9 +6,21 @@ module Fastlane
|
|
6
6
|
File.join(File.dirname(__FILE__), '..', '..', '..', '..', '..', 'bugsnag-dsym-upload'))
|
7
7
|
|
8
8
|
def self.run(params)
|
9
|
+
options = {}
|
10
|
+
options = options_from_info_plist(params[:config_file]) if params[:config_file]
|
11
|
+
|
12
|
+
if (params[:config_file] == default_info_plist_path || options[:apiKey].nil? || options[:apiKey].empty?)
|
13
|
+
# Load custom API key if config file has not been overridden or the API key couldn't be found in config files
|
14
|
+
options[:apiKey] = params[:api_key] unless params[:api_key].nil?
|
15
|
+
else
|
16
|
+
# Print which file is populating version and API key information since the value has been
|
17
|
+
# overridden
|
18
|
+
UI.message("Loading API key from #{params[:config_file]}")
|
19
|
+
end
|
20
|
+
|
9
21
|
parse_dsym_paths(params[:dsym_path]).each do |dsym_path|
|
10
22
|
if dsym_path.end_with?(".zip") or File.directory?(dsym_path)
|
11
|
-
args = upload_args(dsym_path, params[:symbol_maps_path], params[:upload_url], params[:project_root], params[:verbose])
|
23
|
+
args = upload_args(dsym_path, params[:symbol_maps_path], params[:upload_url], params[:project_root], options[:apiKey], params[:verbose])
|
12
24
|
success = Kernel.system(UPLOAD_SCRIPT_PATH, *args)
|
13
25
|
if success
|
14
26
|
UI.success("Uploaded dSYMs in #{dsym_path}")
|
@@ -59,7 +71,23 @@ module Fastlane
|
|
59
71
|
UI.user_error!("Symbol maps file needs to be a directory containing symbol map files")
|
60
72
|
end
|
61
73
|
end
|
74
|
+
validate_api_key = proc do |key|
|
75
|
+
return if key.nil?
|
76
|
+
|
77
|
+
unless !key[/\H/] and key.length == 32
|
78
|
+
UI.user_error!("API key should be a 32 character hexdeciaml string")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
options = {}
|
83
|
+
options = options_from_info_plist(default_info_plist_path) if file_path = default_info_plist_path
|
62
84
|
[
|
85
|
+
FastlaneCore::ConfigItem.new(key: :api_key,
|
86
|
+
env_name: "BUGSNAG_API_KEY",
|
87
|
+
description: "Bugsnag API Key",
|
88
|
+
optional: true,
|
89
|
+
default_value: options[:apiKey],
|
90
|
+
verify_block: validate_api_key),
|
63
91
|
FastlaneCore::ConfigItem.new(key: :dsym_path,
|
64
92
|
type: Array,
|
65
93
|
env_name: "BUGSNAG_DSYM_PATH",
|
@@ -83,6 +111,10 @@ module Fastlane
|
|
83
111
|
description: "Root path of the project",
|
84
112
|
default_value: Dir::pwd,
|
85
113
|
optional: true),
|
114
|
+
FastlaneCore::ConfigItem.new(key: :config_file,
|
115
|
+
description: "Info.plist location",
|
116
|
+
optional: true,
|
117
|
+
default_value: options[:config_file]),
|
86
118
|
FastlaneCore::ConfigItem.new(key: :verbose,
|
87
119
|
env_name: "BUGSNAG_VERBOSE",
|
88
120
|
description: "Print helpful debug info",
|
@@ -93,8 +125,21 @@ module Fastlane
|
|
93
125
|
|
94
126
|
private
|
95
127
|
|
96
|
-
def self.
|
128
|
+
def self.default_info_plist_path
|
129
|
+
Dir.glob("./{ios/,}*/Info.plist").reject {|path| path =~ /build|test/i }.first
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.options_from_info_plist file_path
|
133
|
+
plist_getter = Fastlane::Actions::GetInfoPlistValueAction
|
134
|
+
{
|
135
|
+
apiKey: plist_getter.run(path: file_path, key: "BugsnagAPIKey"),
|
136
|
+
config_file: file_path,
|
137
|
+
}
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.upload_args dir, symbol_maps_dir, upload_url, project_root, api_key, verbose
|
97
141
|
args = [verbose ? "--verbose" : "--silent"]
|
142
|
+
args += ["--api-key", api_key] unless api_key.nil?
|
98
143
|
args += ["--upload-server", upload_url] unless upload_url.nil?
|
99
144
|
args += ["--symbol-maps", symbol_maps_dir] unless symbol_maps_dir.nil?
|
100
145
|
args += ["--project-root", project_root] unless project_root.nil?
|
@@ -110,9 +155,10 @@ module Fastlane
|
|
110
155
|
end
|
111
156
|
|
112
157
|
def self.default_dsym_path
|
113
|
-
|
114
|
-
|
115
|
-
|
158
|
+
path = Dir["./**/*.dSYM.zip"] + Dir["./**/*.dSYM"]
|
159
|
+
dsym_paths = Actions.lane_context[SharedValues::DSYM_PATHS] if defined? SharedValues::DSYM_PATHS
|
160
|
+
dsyms_output_path = Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH] if defined? SharedValues::DSYM_OUTPUT_PATH
|
161
|
+
dsyms_output_path || dsym_paths || path
|
116
162
|
end
|
117
163
|
end
|
118
164
|
end
|
@@ -3,6 +3,11 @@ require 'spec_helper'
|
|
3
3
|
Action = Fastlane::Actions::UploadSymbolsToBugsnagAction
|
4
4
|
|
5
5
|
describe Action do
|
6
|
+
def load_default_opts
|
7
|
+
Action.available_options.map do |x|
|
8
|
+
[x.key, x.default_value]
|
9
|
+
end.to_h
|
10
|
+
end
|
6
11
|
|
7
12
|
context "the packaged gem" do
|
8
13
|
gem_name = "fastlane-plugin-bugsnag-#{Fastlane::Bugsnag::VERSION}"
|
@@ -22,57 +27,61 @@ describe Action do
|
|
22
27
|
describe '#run' do
|
23
28
|
it 'silences script output by default' do
|
24
29
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
25
|
-
"--silent",
|
26
|
-
|
30
|
+
"--silent",
|
31
|
+
"--project-root", Dir::pwd,
|
32
|
+
FIXTURE_PATH).and_return(true)
|
33
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH}))
|
27
34
|
end
|
28
35
|
|
29
36
|
it 'prints verbose if verbose flag set' do
|
30
37
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
31
|
-
"--verbose",
|
32
|
-
|
38
|
+
"--verbose",
|
39
|
+
"--project-root", Dir::pwd,
|
40
|
+
FIXTURE_PATH).and_return(true)
|
41
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH, verbose: true}))
|
33
42
|
end
|
34
43
|
|
35
44
|
it 'UI.user_error when script fails' do
|
36
45
|
expect(Fastlane::UI).to receive(:user_error!).with("Failed uploading #{FIXTURE_PATH}")
|
37
46
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
38
|
-
"--silent", FIXTURE_PATH).and_return(false)
|
39
|
-
Action.run({dsym_path: FIXTURE_PATH})
|
47
|
+
"--silent", "--project-root", Dir::pwd, FIXTURE_PATH).and_return(false)
|
48
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH}))
|
40
49
|
end
|
41
50
|
|
42
51
|
it 'requires the dSYM file path to exist' do
|
43
52
|
expect(Fastlane::UI).to receive(:user_error!)
|
44
53
|
|
45
|
-
Action.run({dsym_path: 'fake/file/path'})
|
54
|
+
Action.run(load_default_opts.merge({dsym_path: 'fake/file/path'}))
|
46
55
|
end
|
47
56
|
|
48
57
|
it 'rejects dSYM files which are not a .zip or a directory' do
|
49
58
|
expect(Fastlane::UI).to receive(:user_error!)
|
50
59
|
|
51
|
-
Action.run({dsym_path: File.join(FIXTURE_PATH, 'invalid_file')})
|
60
|
+
Action.run(load_default_opts.merge({dsym_path: File.join(FIXTURE_PATH, 'invalid_file')}))
|
52
61
|
end
|
53
62
|
|
54
63
|
it 'uploads a single .dSYM file' do
|
55
64
|
directory = File.join(FIXTURE_PATH, 'dSYMs')
|
56
65
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
57
|
-
"--silent", directory).and_return(true)
|
58
|
-
Action.run({dsym_path: File.join(FIXTURE_PATH, 'dSYMs/app.dSYM')})
|
66
|
+
"--silent", "--project-root", Dir::pwd, directory).and_return(true)
|
67
|
+
Action.run(load_default_opts.merge({dsym_path: File.join(FIXTURE_PATH, 'dSYMs/app.dSYM')}))
|
59
68
|
end
|
60
69
|
|
61
70
|
it 'uploads a .zip of .dSYM files' do
|
62
71
|
path = File.join(FIXTURE_PATH, 'files.zip')
|
63
72
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
64
|
-
"--silent", path).and_return(true)
|
65
|
-
Action.run({dsym_path: path})
|
73
|
+
"--silent", "--project-root", Dir::pwd, path).and_return(true)
|
74
|
+
Action.run(load_default_opts.merge({dsym_path: path}))
|
66
75
|
end
|
67
76
|
|
68
77
|
it 'uploads multiple .zip files' do
|
69
78
|
zip1 = File.join(FIXTURE_PATH, 'files.zip')
|
70
79
|
zip2 = File.join(FIXTURE_PATH, 'more_files.zip')
|
71
80
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
72
|
-
"--silent", zip1).and_return(true)
|
81
|
+
"--silent", "--project-root", Dir::pwd, zip1).and_return(true)
|
73
82
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
74
|
-
"--silent", zip2).and_return(true)
|
75
|
-
Action.run({dsym_path: [zip1, zip2]})
|
83
|
+
"--silent", "--project-root", Dir::pwd, zip2).and_return(true)
|
84
|
+
Action.run(load_default_opts.merge({dsym_path: [zip1, zip2]}))
|
76
85
|
end
|
77
86
|
|
78
87
|
it 'uploads multiple .dSYM files multiple directories' do
|
@@ -82,10 +91,10 @@ describe Action do
|
|
82
91
|
dsym4 = File.join(FIXTURE_PATH, 'stuff/app2.dSYM')
|
83
92
|
directories = [File.join(FIXTURE_PATH, 'dSYMs'), File.join(FIXTURE_PATH, 'stuff')]
|
84
93
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
85
|
-
"--silent", directories[0]).and_return(true)
|
94
|
+
"--silent", "--project-root", Dir::pwd, directories[0]).and_return(true)
|
86
95
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
87
|
-
"--silent", directories[1]).and_return(true)
|
88
|
-
Action.run({dsym_path: [dsym1, dsym2, dsym3, dsym4]})
|
96
|
+
"--silent", "--project-root", Dir::pwd, directories[1]).and_return(true)
|
97
|
+
Action.run(load_default_opts.merge({dsym_path: [dsym1, dsym2, dsym3, dsym4]}))
|
89
98
|
end
|
90
99
|
|
91
100
|
it 'uploads multiple .dSYM files in a single directory' do
|
@@ -93,8 +102,8 @@ describe Action do
|
|
93
102
|
dsym2 = File.join(FIXTURE_PATH, 'dSYMs/app2.dSYM')
|
94
103
|
directory = File.join(FIXTURE_PATH, 'dSYMs')
|
95
104
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
96
|
-
"--silent", directory).and_return(true)
|
97
|
-
Action.run({dsym_path: [dsym1, dsym2]})
|
105
|
+
"--silent", "--project-root", Dir::pwd, directory).and_return(true)
|
106
|
+
Action.run(load_default_opts.merge({dsym_path: [dsym1, dsym2]}))
|
98
107
|
end
|
99
108
|
|
100
109
|
it 'accepts a project root argument' do
|
@@ -103,7 +112,49 @@ describe Action do
|
|
103
112
|
"--silent",
|
104
113
|
"--project-root", root_path,
|
105
114
|
FIXTURE_PATH).and_return(true)
|
106
|
-
Action.run({dsym_path: FIXTURE_PATH, project_root: root_path})
|
115
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH, project_root: root_path}))
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'accepts an API key argument' do
|
119
|
+
api_key = "1234567890ABCDE"
|
120
|
+
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
121
|
+
"--silent",
|
122
|
+
"--api-key", api_key,
|
123
|
+
"--project-root", Dir::pwd,
|
124
|
+
FIXTURE_PATH).and_return(true)
|
125
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH, api_key: api_key}))
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'accepts an API key argument with no project root' do
|
129
|
+
api_key = "1234567890ABCDE"
|
130
|
+
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
131
|
+
"--silent",
|
132
|
+
"--api-key", api_key,
|
133
|
+
FIXTURE_PATH).and_return(true)
|
134
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH, api_key: api_key, project_root: nil}))
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'uses default API key argument from plist' do
|
138
|
+
root_path = "/test/test/test"
|
139
|
+
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
140
|
+
"--silent",
|
141
|
+
"--api-key", "other-key",
|
142
|
+
"--project-root", root_path,
|
143
|
+
FIXTURE_PATH).and_return(true)
|
144
|
+
Dir.chdir(File.join(FIXTURE_PATH, 'ios_proj')) do
|
145
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH, project_root: root_path}))
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'allows config file to overwrite parameter' do
|
150
|
+
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
151
|
+
"--silent",
|
152
|
+
"--api-key", "project-key",
|
153
|
+
"--project-root", File.join(FIXTURE_PATH, 'ios_proj'),
|
154
|
+
FIXTURE_PATH).and_return(true)
|
155
|
+
Dir.chdir(File.join(FIXTURE_PATH, 'ios_proj')) do
|
156
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH, api_key: "ignored:", config_file: File.join('Project', 'Info.plist')}))
|
157
|
+
end
|
107
158
|
end
|
108
159
|
|
109
160
|
context 'using a private server' do
|
@@ -111,9 +162,9 @@ describe Action do
|
|
111
162
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
112
163
|
"--silent",
|
113
164
|
"--upload-server", "http://myserver.example.com",
|
165
|
+
"--project-root", Dir::pwd,
|
114
166
|
FIXTURE_PATH).and_return(true)
|
115
|
-
Action.run({dsym_path: FIXTURE_PATH,
|
116
|
-
upload_url: "http://myserver.example.com"})
|
167
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH, upload_url: "http://myserver.example.com"}))
|
117
168
|
end
|
118
169
|
end
|
119
170
|
|
@@ -123,8 +174,9 @@ describe Action do
|
|
123
174
|
expect(Kernel).to receive(:system).with(Action::UPLOAD_SCRIPT_PATH,
|
124
175
|
"--silent",
|
125
176
|
"--symbol-maps", path,
|
177
|
+
"--project-root", Dir::pwd,
|
126
178
|
FIXTURE_PATH).and_return(true)
|
127
|
-
Action.run({dsym_path: FIXTURE_PATH, symbol_maps_path: path})
|
179
|
+
Action.run(load_default_opts.merge({dsym_path: FIXTURE_PATH, symbol_maps_path: path}))
|
128
180
|
end
|
129
181
|
end
|
130
182
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-bugsnag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delisa Mason
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xml-simple
|