fastlane-plugin-debug_file 0.1.1 → 0.2.1
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 +4 -4
- data/lib/fastlane/plugin/debug_file/actions/dsym_action.rb +33 -15
- data/lib/fastlane/plugin/debug_file/actions/list_dsym_action.rb +105 -0
- data/lib/fastlane/plugin/debug_file/helper/debug_file_helper.rb +44 -1
- data/lib/fastlane/plugin/debug_file/runner.rb +70 -0
- data/lib/fastlane/plugin/debug_file/version.rb +1 -1
- data/lib/fastlane/plugin/debug_file.rb +1 -0
- metadata +23 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '079226ebaba880735af3cabaed19276177316c093b6db6d81ddaa9c89279bd81'
|
4
|
+
data.tar.gz: 2c8c6d1e32ca4d7cb468bd8b16339d8e91d5f2074c15efad70c1ac8475b18e10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5375e5d39b154be40cc1e58712bed9d0dce3417f85c3ef0a6abfc0690979e8e342cd484101bc407307120f0955b5ebea87f0d01728a41d339fd6b0e064b64171
|
7
|
+
data.tar.gz: a5e53a19cdf77e09f4f4328a3f18c5e2f8ac8a2bc0618190c012b3b0273c914a584cfc4f9ce3b50a3d2a70df5f12796ff40ae25dfbd9c2b3b1ffe2cea981f126
|
@@ -10,7 +10,7 @@ module Fastlane
|
|
10
10
|
end
|
11
11
|
|
12
12
|
class DsymAction < Action
|
13
|
-
ARCHIVE_PATH =
|
13
|
+
ARCHIVE_PATH = ::DebugFile::Runner::ARCHIVE_PATH
|
14
14
|
OUTPUT_PATH = '.'
|
15
15
|
|
16
16
|
def self.run(params)
|
@@ -30,7 +30,11 @@ module Fastlane
|
|
30
30
|
UI.user_error! "Not matched any archive with scheme: #{scheme}"
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
xcarchive_file = File.basename(File.dirname(archive_dsym_path))
|
34
|
+
xcarchive_info_file = File.join(File.expand_path('../', archive_dsym_path), 'Info.plist')
|
35
|
+
xcarchive_info = Helper::DebugFileHelper.xcarchive_metadata(xcarchive_info_file)
|
36
|
+
release_version, build_version, created_at = version_info(xcarchive_info)
|
37
|
+
UI.success "Selected dSYM archive: #{release_version} (#{build_version}) [#{xcarchive_file}] #{created_at}"
|
34
38
|
|
35
39
|
extra_dsym = params[:extra_dsym] || []
|
36
40
|
dsym_files = [app_dsym_filename].concat(extra_dsym).uniq
|
@@ -45,39 +49,43 @@ module Fastlane
|
|
45
49
|
UI.success "Prepare #{dsym_files.size} dSYM file(s) compressing"
|
46
50
|
Helper::DebugFileHelper.compress(dsym_files, output_file)
|
47
51
|
|
48
|
-
UI.success "Compressed
|
52
|
+
UI.success "Compressed dSYM file: #{output_file}"
|
49
53
|
Helper::DebugFileHelper.store_shard_value SharedValues::DF_DSYM_ZIP_PATH, output_file
|
50
54
|
end
|
51
55
|
|
52
56
|
def self.last_created_dsym(scheme, archive_path)
|
53
57
|
info_path = File.join(archive_path, '**', '*.xcarchive', 'Info.plist')
|
54
58
|
matched_paths = []
|
59
|
+
|
60
|
+
UI.verbose "Finding #{scheme} xcarchive in #{archive_path} ..."
|
55
61
|
Dir.glob(info_path) do |path|
|
56
|
-
|
62
|
+
info = Helper::DebugFileHelper.xcarchive_metadata(path)
|
63
|
+
name = Helper::DebugFileHelper.fetch_key(info, 'Name')
|
57
64
|
if scheme == name
|
65
|
+
xcarchive = File.basename(File.dirname(path))
|
66
|
+
release_version, build_version, created_at = version_info(info)
|
67
|
+
UI.verbose " => #{release_version} (#{build_version}) [#{xcarchive}] was created at #{created_at}"
|
68
|
+
|
58
69
|
matched_paths << path
|
59
70
|
end
|
60
71
|
end
|
61
72
|
|
62
73
|
return if matched_paths.empty?
|
63
74
|
|
64
|
-
UI.verbose "Found #{matched_paths.size} matched dSYM archive(s)"
|
75
|
+
UI.verbose "Found #{matched_paths.size} matched dSYM archive(s) of #{scheme}"
|
65
76
|
last_created_path = matched_paths.size == 1 ? matched_paths.first : matched_paths.max_by { |p| File.stat(p).mtime }
|
66
77
|
File.join(File.dirname(last_created_path), 'dSYMs')
|
67
78
|
end
|
68
79
|
private_class_method :last_created_dsym
|
69
80
|
|
70
|
-
def self.
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
private_class_method :get_plist_value
|
81
|
+
def self.version_info(info)
|
82
|
+
release_version = Helper::DebugFileHelper.fetch_key(info, 'ApplicationProperties', 'CFBundleShortVersionString')
|
83
|
+
build = Helper::DebugFileHelper.fetch_key(info, 'ApplicationProperties', 'CFBundleVersion')
|
84
|
+
created_at = Helper::DebugFileHelper.fetch_key(info, 'CreationDate')
|
75
85
|
|
76
|
-
|
77
|
-
require 'plist'
|
78
|
-
Plist.parse_xml(file)
|
86
|
+
[release_version, build, created_at]
|
79
87
|
end
|
80
|
-
private_class_method :
|
88
|
+
private_class_method :version_info
|
81
89
|
|
82
90
|
#####################################################
|
83
91
|
# @!group Documentation
|
@@ -93,7 +101,7 @@ module Fastlane
|
|
93
101
|
env_name: 'DF_DSYM_ARCHIVE_PATH',
|
94
102
|
description: 'The archive path of xcode',
|
95
103
|
type: String,
|
96
|
-
default_value: Actions.lane_context[SharedValues::XCODEBUILD_ARCHIVE] || ARCHIVE_PATH,
|
104
|
+
default_value: Actions.lane_context[SharedValues::XCODEBUILD_ARCHIVE] || ::DebugFile::Runner::ARCHIVE_PATH,
|
97
105
|
optional: true),
|
98
106
|
FastlaneCore::ConfigItem.new(key: :scheme,
|
99
107
|
env_name: 'DF_DSYM_SCHEME',
|
@@ -105,6 +113,16 @@ module Fastlane
|
|
105
113
|
optional: true,
|
106
114
|
default_value: [],
|
107
115
|
type: Array),
|
116
|
+
FastlaneCore::ConfigItem.new(key: :release_version,
|
117
|
+
env_name: 'DF_DSYM_RELEASE_VERSION',
|
118
|
+
description: 'Use the given release version of app',
|
119
|
+
optional: true,
|
120
|
+
type: String),
|
121
|
+
FastlaneCore::ConfigItem.new(key: :build,
|
122
|
+
env_name: 'DF_DSYM_BUILD',
|
123
|
+
description: 'Use the given build version of app',
|
124
|
+
optional: true,
|
125
|
+
type: String),
|
108
126
|
FastlaneCore::ConfigItem.new(key: :output_path,
|
109
127
|
env_name: 'DF_DSYM_OUTPUT_PATH',
|
110
128
|
description: "The output path of compressed dSYM file",
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fastlane/action'
|
4
|
+
require_relative '../helper/debug_file_helper'
|
5
|
+
|
6
|
+
module Fastlane
|
7
|
+
module Actions
|
8
|
+
module SharedValues
|
9
|
+
DF_DSYMS_LIST = :DF_DSYMS_LIST
|
10
|
+
end
|
11
|
+
|
12
|
+
class ListDsymAction < Action
|
13
|
+
def self.run(params)
|
14
|
+
archive_path = params[:archive_path]
|
15
|
+
scheme = params[:scheme]
|
16
|
+
Fastlane::UI.verbose "Finding #{scheme || 'all' } xcarchive in #{archive_path} ..."
|
17
|
+
|
18
|
+
runner = ::DebugFile::Runner.new({
|
19
|
+
archive_path: archive_path,
|
20
|
+
scheme: scheme
|
21
|
+
})
|
22
|
+
|
23
|
+
dsyms = runner.list_dsym
|
24
|
+
|
25
|
+
Fastlane::UI.success "Found #{dsyms.size} dSYM files"
|
26
|
+
dsyms.each do |dsym|
|
27
|
+
Fastlane::UI.success "• #{dsym[:name]} #{dsym[:release_version]} (#{dsym[:build]}) - #{dsym[:created_at]}"
|
28
|
+
dsym[:machos].each do |macho|
|
29
|
+
Fastlane::UI.message " #{macho[:uuid]} (#{macho[:arch]})"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
Helper::DebugFileHelper.store_shard_value SharedValues::DF_DSYMS_LIST, dsyms
|
34
|
+
|
35
|
+
dsyms
|
36
|
+
end
|
37
|
+
|
38
|
+
#####################################################
|
39
|
+
# @!group Documentation
|
40
|
+
#####################################################
|
41
|
+
|
42
|
+
def self.description
|
43
|
+
'Find and generate iOS/MacOS dSYM file(s) to zip file'
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.available_options
|
47
|
+
[
|
48
|
+
FastlaneCore::ConfigItem.new(key: :archive_path,
|
49
|
+
env_name: 'DF_DSYM_ARCHIVE_PATH',
|
50
|
+
description: 'The archive path of xcode',
|
51
|
+
type: String,
|
52
|
+
default_value: Actions.lane_context[SharedValues::XCODEBUILD_ARCHIVE] || ::DebugFile::Runner::ARCHIVE_PATH,
|
53
|
+
optional: true),
|
54
|
+
FastlaneCore::ConfigItem.new(key: :scheme,
|
55
|
+
env_name: 'DF_DSYM_SCHEME',
|
56
|
+
description: 'The scheme name of app',
|
57
|
+
optional: true,
|
58
|
+
type: String),
|
59
|
+
FastlaneCore::ConfigItem.new(key: :release_version,
|
60
|
+
env_name: 'DF_DSYM_RELEASE_VERSION',
|
61
|
+
description: 'Use the given release version of app',
|
62
|
+
optional: true,
|
63
|
+
type: String),
|
64
|
+
FastlaneCore::ConfigItem.new(key: :build,
|
65
|
+
env_name: 'DF_DSYM_BUILD',
|
66
|
+
description: 'Use the given build version of app',
|
67
|
+
optional: true,
|
68
|
+
type: String)
|
69
|
+
]
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.example_code
|
73
|
+
[
|
74
|
+
'list_dsym',
|
75
|
+
'list_dsym(
|
76
|
+
archive_path: "~/Library/Developer/Xcode/Archives",
|
77
|
+
scheme: "AppName"
|
78
|
+
)'
|
79
|
+
]
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.category
|
83
|
+
:misc
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.return_value
|
87
|
+
Array
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.output
|
91
|
+
[
|
92
|
+
['DF_DSYMS_LIST', 'the array of dSYMs metadata']
|
93
|
+
]
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.authors
|
97
|
+
['icyleaf']
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.is_supported?(platform)
|
101
|
+
[:ios, :mac].include?(platform)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -35,9 +35,52 @@ module Fastlane
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
def self.macho_metadata(file)
|
39
|
+
require 'macho'
|
40
|
+
|
41
|
+
macho_type = MachO.open(file)
|
42
|
+
case macho_type
|
43
|
+
when ::MachO::MachOFile
|
44
|
+
[macho_type]
|
45
|
+
else
|
46
|
+
size = macho_type.fat_archs.each_with_object([]) do |arch, obj|
|
47
|
+
obj << arch.size
|
48
|
+
end
|
49
|
+
|
50
|
+
machos = []
|
51
|
+
macho_type.machos.each do |file|
|
52
|
+
machos << file
|
53
|
+
end
|
54
|
+
machos
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
38
58
|
def self.store_shard_value(key, value)
|
39
59
|
Actions.lane_context[key] = value
|
40
|
-
ENV[key.to_s] = value
|
60
|
+
ENV[key.to_s] = case value
|
61
|
+
when String
|
62
|
+
value
|
63
|
+
else
|
64
|
+
JSON.dump(value)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.xcarchive_metadata(path)
|
69
|
+
file = File.directory?(path) ? File.join(path, 'Info.plist') : path
|
70
|
+
UI.user_error! "Can not read Info.plist in #{file}" unless File.file?(file)
|
71
|
+
|
72
|
+
require 'plist'
|
73
|
+
Plist.parse_xml(file)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.fetch_key(plist, *keys)
|
77
|
+
UI.crash! 'Missing keys' if keys.empty?
|
78
|
+
|
79
|
+
if keys.size == 1
|
80
|
+
plist[keys[0]]
|
81
|
+
else
|
82
|
+
plist.dig(*keys)
|
83
|
+
end
|
41
84
|
end
|
42
85
|
end
|
43
86
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module DebugFile
|
2
|
+
class Runner
|
3
|
+
ARCHIVE_PATH = File.expand_path('~/Library/Developer/Xcode/Archives')
|
4
|
+
|
5
|
+
attr_accessor :options
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@options = options
|
9
|
+
end
|
10
|
+
|
11
|
+
def latest_dsym(filter: :date)
|
12
|
+
dsyms = list_dsym
|
13
|
+
case filter
|
14
|
+
when :version
|
15
|
+
dsyms.max_by {|v| Gem::Version.new(v[:release_version])}
|
16
|
+
else
|
17
|
+
dsyms.max_by {|v| v[:created_at]}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def list_dsym
|
22
|
+
archive_path = File.expand_path(options.fetch(:archive_path, ARCHIVE_PATH))
|
23
|
+
search_dsym(archive_path, options[:scheme])
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def search_dsym(path, scheme = nil)
|
29
|
+
info_path = File.join(path, '**', '*.xcarchive', 'Info.plist')
|
30
|
+
matched_paths = []
|
31
|
+
|
32
|
+
obj = []
|
33
|
+
Dir.glob(info_path) do |path|
|
34
|
+
info = Fastlane::Helper::DebugFileHelper.xcarchive_metadata(path)
|
35
|
+
name = Fastlane::Helper::DebugFileHelper.fetch_key(info, 'Name')
|
36
|
+
next unless scheme.to_s.empty? || scheme == name
|
37
|
+
|
38
|
+
release_version = Fastlane::Helper::DebugFileHelper.fetch_key(info, 'ApplicationProperties', 'CFBundleShortVersionString')
|
39
|
+
build = Fastlane::Helper::DebugFileHelper.fetch_key(info, 'ApplicationProperties', 'CFBundleVersion')
|
40
|
+
dsym_path = Dir.glob(File.join(File.dirname(path), 'dSYMs', "#{name}.app.dSYM", '**', '*', name)).first
|
41
|
+
created_at = Fastlane::Helper::DebugFileHelper.fetch_key(info, 'CreationDate')
|
42
|
+
|
43
|
+
machos = []
|
44
|
+
Fastlane::Helper::DebugFileHelper.macho_metadata(dsym_path).each do |macho|
|
45
|
+
machos << {
|
46
|
+
arch: macho.cpusubtype,
|
47
|
+
uuid: macho[:LC_UUID][0].uuid_string
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
item = {
|
52
|
+
root_path: File.basename(File.dirname(path)),
|
53
|
+
dsym_path: dsym_path,
|
54
|
+
machos: machos,
|
55
|
+
info: info,
|
56
|
+
name: name,
|
57
|
+
release_version: release_version,
|
58
|
+
build: build,
|
59
|
+
created_at: created_at,
|
60
|
+
}
|
61
|
+
|
62
|
+
yield item if block_given?
|
63
|
+
|
64
|
+
obj << item
|
65
|
+
end
|
66
|
+
|
67
|
+
obj
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-debug_file
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- icyleaf
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: ruby-macho
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.2.0
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: pry
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,7 +150,7 @@ dependencies:
|
|
136
150
|
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: 2.139.0
|
139
|
-
description:
|
153
|
+
description:
|
140
154
|
email: icyleaf.cn@gmail.com
|
141
155
|
executables: []
|
142
156
|
extensions: []
|
@@ -146,14 +160,16 @@ files:
|
|
146
160
|
- README.md
|
147
161
|
- lib/fastlane/plugin/debug_file.rb
|
148
162
|
- lib/fastlane/plugin/debug_file/actions/dsym_action.rb
|
163
|
+
- lib/fastlane/plugin/debug_file/actions/list_dsym_action.rb
|
149
164
|
- lib/fastlane/plugin/debug_file/actions/proguard_action.rb
|
150
165
|
- lib/fastlane/plugin/debug_file/helper/debug_file_helper.rb
|
166
|
+
- lib/fastlane/plugin/debug_file/runner.rb
|
151
167
|
- lib/fastlane/plugin/debug_file/version.rb
|
152
168
|
homepage: https://github.com/icyleaf/fastlane-plugin-debug_file
|
153
169
|
licenses:
|
154
170
|
- MIT
|
155
171
|
metadata: {}
|
156
|
-
post_install_message:
|
172
|
+
post_install_message:
|
157
173
|
rdoc_options: []
|
158
174
|
require_paths:
|
159
175
|
- lib
|
@@ -168,8 +184,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
184
|
- !ruby/object:Gem::Version
|
169
185
|
version: '0'
|
170
186
|
requirements: []
|
171
|
-
rubygems_version: 3.
|
172
|
-
signing_key:
|
187
|
+
rubygems_version: 3.1.2
|
188
|
+
signing_key:
|
173
189
|
specification_version: 4
|
174
190
|
summary: Compress iOS/macApp dSYM or Android Proguard(mapping/R/AndroidManifest) to
|
175
191
|
zip file
|