pindo 5.12.2 → 5.13.2
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/pindo/base/git_handler.rb +692 -0
- data/lib/pindo/command/android/autobuild.rb +2 -2
- data/lib/pindo/command/android.rb +0 -1
- data/lib/pindo/command/appstore/adhocbuild.rb +258 -311
- data/lib/pindo/command/appstore/autobuild.rb +203 -0
- data/lib/pindo/command/appstore/autoresign.rb +35 -17
- data/lib/pindo/command/appstore/bundleid.rb +120 -0
- data/lib/pindo/command/appstore/cert.rb +212 -0
- data/lib/pindo/command/appstore/configproj.rb +81 -0
- data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
- data/lib/pindo/command/appstore/iap.rb +788 -24
- data/lib/pindo/command/appstore/initconfig.rb +105 -0
- data/lib/pindo/command/appstore/itcapp.rb +95 -13
- data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
- data/lib/pindo/command/appstore/pem.rb +136 -0
- data/lib/pindo/command/appstore/pullconfig.rb +99 -0
- data/lib/pindo/command/appstore/quswark.rb +87 -0
- data/lib/pindo/command/appstore/quswauth.rb +67 -0
- data/lib/pindo/command/appstore/tag.rb +77 -0
- data/lib/pindo/command/appstore.rb +13 -1
- data/lib/pindo/command/env/quarkenv.rb +11 -13
- data/lib/pindo/command/env/swarkenv.rb +11 -16
- data/lib/pindo/command/ios/autobuild.rb +64 -43
- data/lib/pindo/command/ios/autoresign.rb +34 -19
- data/lib/pindo/command/ios/build.rb +10 -7
- data/lib/pindo/command/ios/cert.rb +27 -20
- data/lib/pindo/command/jps/upload.rb +3 -3
- data/lib/pindo/command/unity/autobuild.rb +2 -2
- data/lib/pindo/command/utils/clearcert.rb +2 -17
- data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
- data/lib/pindo/command/utils/renewcert.rb +62 -38
- data/lib/pindo/command/utils/renewproj.rb +0 -3
- data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
- data/lib/pindo/command/utils.rb +2 -0
- data/lib/pindo/command/web/autobuild.rb +2 -2
- data/lib/pindo/command.rb +30 -3
- data/lib/pindo/config/build_info_manager.rb +176 -0
- data/lib/pindo/config/ios_config_parser.rb +404 -0
- data/lib/pindo/module/android/android_build_helper.rb +110 -0
- data/lib/pindo/module/android/android_config_helper.rb +9 -5
- data/lib/pindo/module/android/gradle_helper.rb +88 -0
- data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
- data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
- data/lib/pindo/module/build/build_helper.rb +12 -0
- data/lib/pindo/module/build/swark_helper.rb +116 -77
- data/lib/pindo/module/cert/cert_helper.rb +74 -0
- data/lib/pindo/module/cert/pem_helper.rb +72 -0
- data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +208 -6
- data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
- data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
- data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
- data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
- data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
- data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
- data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +197 -0
- data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +367 -0
- data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +37 -27
- data/lib/pindo/module/task/model/build/ios_build_task.rb +13 -0
- data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
- data/lib/pindo/module/task/model/build_task.rb +15 -12
- data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
- data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
- data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
- data/lib/pindo/module/task/pindo_task.rb +19 -10
- data/lib/pindo/module/unity/unity_helper.rb +2 -1
- data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
- data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
- data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
- data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
- data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
- data/lib/pindo/options/core/global_options_state.rb +268 -0
- data/lib/pindo/options/core/option_configuration.rb +206 -0
- data/lib/pindo/options/core/option_initializer.rb +51 -0
- data/lib/pindo/options/core/option_item.rb +144 -0
- data/lib/pindo/options/core/option_value_parser.rb +54 -0
- data/lib/pindo/options/groups/build_options.rb +60 -0
- data/lib/pindo/options/groups/jps_options.rb +70 -0
- data/lib/pindo/options/groups/option_group.rb +73 -0
- data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
- data/lib/pindo/options/options.rb +14 -0
- data/lib/pindo/version.rb +1 -1
- metadata +49 -41
- data/lib/pindo/command/android/build.rb +0 -186
- data/lib/pindo/command/appstore/import.rb +0 -259
- data/lib/pindo/command/deploy/build.rb +0 -250
- data/lib/pindo/command/deploy/bundleid.rb +0 -259
- data/lib/pindo/command/deploy/cert.rb +0 -202
- data/lib/pindo/command/deploy/check.rb +0 -93
- data/lib/pindo/command/deploy/configproj.rb +0 -120
- data/lib/pindo/command/deploy/confusecode.rb +0 -262
- data/lib/pindo/command/deploy/confuseproj.rb +0 -122
- data/lib/pindo/command/deploy/iap.rb +0 -826
- data/lib/pindo/command/deploy/initconfig.rb +0 -138
- data/lib/pindo/command/deploy/itcapp.rb +0 -146
- data/lib/pindo/command/deploy/pem.rb +0 -55
- data/lib/pindo/command/deploy/pullconfig.rb +0 -56
- data/lib/pindo/command/deploy/pushconfig.rb +0 -93
- data/lib/pindo/command/deploy/quswark.rb +0 -156
- data/lib/pindo/command/deploy/quswauth.rb +0 -76
- data/lib/pindo/command/deploy/reportbug.rb +0 -145
- data/lib/pindo/command/deploy/resign.rb +0 -300
- data/lib/pindo/command/deploy/tag.rb +0 -108
- data/lib/pindo/command/deploy/uploadipa.rb +0 -73
- data/lib/pindo/command/deploy.rb +0 -42
- data/lib/pindo/command/dev/autobuild.rb +0 -117
- data/lib/pindo/command/dev/build.rb +0 -94
- data/lib/pindo/command/dev/debug.rb +0 -112
- data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
- data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
- data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
- data/lib/pindo/options/appconfigoptions.rb +0 -24
- data/lib/pindo/options/deployoptions.rb +0 -372
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
require_relative 'appstore_task'
|
|
2
|
+
require_relative '../task_config'
|
|
3
|
+
|
|
4
|
+
module Pindo
|
|
5
|
+
module TaskSystem
|
|
6
|
+
# App Store Screenshot 上传任务
|
|
7
|
+
# 上传应用截图到 App Store Connect
|
|
8
|
+
class AppStoreUploadScreenshotTask < AppStoreTask
|
|
9
|
+
attr_reader :app_id, :screenshot_path
|
|
10
|
+
|
|
11
|
+
# 重试配置
|
|
12
|
+
def self.default_retry_mode
|
|
13
|
+
RetryMode::DELAYED # 延迟重试
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.default_retry_count
|
|
17
|
+
2 # 默认可以重试 2 次
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.default_retry_delay
|
|
21
|
+
15 # 默认延迟 15 秒
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# 初始化 Screenshot 上传任务
|
|
25
|
+
# @param app_id [String] App Store Connect 应用 ID
|
|
26
|
+
# @param screenshot_path [String] 截图目录路径
|
|
27
|
+
# @param options [Hash] 选项
|
|
28
|
+
# @option options [String] :apple_id Apple ID(App Store Connect 账号)
|
|
29
|
+
# @option options [String] :api_key_id API Key ID(使用 API Key 认证)
|
|
30
|
+
# @option options [String] :api_issuer_id API Issuer ID
|
|
31
|
+
# @option options [String] :api_key_path API Key 文件路径(.p8 文件)
|
|
32
|
+
# @option options [String] :locale 语言区域(默认 "zh-Hans")
|
|
33
|
+
# @option options [Array<String>] :device_types 设备类型(如 ["iPhone 6.5", "iPad Pro"])
|
|
34
|
+
# @option options [Boolean] :overwrite 是否覆盖已有截图(默认 false)
|
|
35
|
+
def initialize(app_id, screenshot_path, options = {})
|
|
36
|
+
@app_id = app_id # App Store Connect 应用 ID
|
|
37
|
+
@screenshot_path = screenshot_path # 截图目录路径
|
|
38
|
+
|
|
39
|
+
# App Store Connect 认证配置
|
|
40
|
+
@apple_id = options[:apple_id]
|
|
41
|
+
@api_key_id = options[:api_key_id]
|
|
42
|
+
@api_issuer_id = options[:api_issuer_id]
|
|
43
|
+
@api_key_path = options[:api_key_path]
|
|
44
|
+
|
|
45
|
+
# 截图配置
|
|
46
|
+
@locale = options[:locale] || "zh-Hans"
|
|
47
|
+
@device_types = options[:device_types] || []
|
|
48
|
+
@overwrite = options[:overwrite] || false
|
|
49
|
+
|
|
50
|
+
# 设置上传任务的优先级为 LOW(截图上传可以最后执行)
|
|
51
|
+
options[:priority] ||= TaskPriority::LOW
|
|
52
|
+
|
|
53
|
+
super("上传 Screenshot 到 App Store", options)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def validate
|
|
57
|
+
# 验证基本参数
|
|
58
|
+
unless @app_id && !@app_id.empty?
|
|
59
|
+
@error = "缺少必需参数: app_id"
|
|
60
|
+
return false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
unless @screenshot_path && !@screenshot_path.empty?
|
|
64
|
+
@error = "缺少必需参数: screenshot_path"
|
|
65
|
+
return false
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# 验证截图路径
|
|
69
|
+
unless File.directory?(@screenshot_path)
|
|
70
|
+
@error = "截图路径不存在或不是目录: #{@screenshot_path}"
|
|
71
|
+
return false
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# 验证认证信息(Apple ID 或 API Key)
|
|
75
|
+
has_apple_id_auth = @apple_id && !@apple_id.empty?
|
|
76
|
+
has_api_key_auth = @api_key_id && @api_issuer_id && @api_key_path
|
|
77
|
+
|
|
78
|
+
unless has_apple_id_auth || has_api_key_auth
|
|
79
|
+
@error = "缺少认证信息:需要提供 Apple ID 或 API Key"
|
|
80
|
+
return false
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
true
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
protected
|
|
87
|
+
|
|
88
|
+
def do_work
|
|
89
|
+
# 1. 扫描截图文件
|
|
90
|
+
screenshots = scan_screenshots
|
|
91
|
+
|
|
92
|
+
if screenshots.empty?
|
|
93
|
+
puts " 警告: 未找到任何截图文件"
|
|
94
|
+
return {
|
|
95
|
+
success: true,
|
|
96
|
+
app_id: @app_id,
|
|
97
|
+
screenshot_count: 0
|
|
98
|
+
}
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# 2. 上传截图到 App Store Connect
|
|
102
|
+
upload_screenshots(screenshots)
|
|
103
|
+
|
|
104
|
+
{
|
|
105
|
+
success: true,
|
|
106
|
+
app_id: @app_id,
|
|
107
|
+
locale: @locale,
|
|
108
|
+
screenshot_count: screenshots.size
|
|
109
|
+
}
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
private
|
|
113
|
+
|
|
114
|
+
# 扫描截图文件
|
|
115
|
+
def scan_screenshots
|
|
116
|
+
puts " 扫描截图目录: #{@screenshot_path}"
|
|
117
|
+
|
|
118
|
+
screenshots = []
|
|
119
|
+
|
|
120
|
+
# 支持的截图格式
|
|
121
|
+
valid_extensions = ['.png', '.jpg', '.jpeg']
|
|
122
|
+
|
|
123
|
+
# 扫描目录结构
|
|
124
|
+
# 标准 Fastlane 结构: screenshots/{locale}/{device_type}/*.png
|
|
125
|
+
locale_path = File.join(@screenshot_path, @locale)
|
|
126
|
+
|
|
127
|
+
if File.directory?(locale_path)
|
|
128
|
+
# 有语言目录
|
|
129
|
+
scan_locale_directory(locale_path, screenshots, valid_extensions)
|
|
130
|
+
else
|
|
131
|
+
# 直接扫描根目录
|
|
132
|
+
scan_root_directory(@screenshot_path, screenshots, valid_extensions)
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
puts " 找到 #{screenshots.size} 个截图文件"
|
|
136
|
+
screenshots
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# 扫描语言目录
|
|
140
|
+
def scan_locale_directory(locale_path, screenshots, valid_extensions)
|
|
141
|
+
# 遍历设备类型目录
|
|
142
|
+
Dir.glob(File.join(locale_path, "*")).each do |device_dir|
|
|
143
|
+
next unless File.directory?(device_dir)
|
|
144
|
+
|
|
145
|
+
device_type = File.basename(device_dir)
|
|
146
|
+
|
|
147
|
+
# 如果指定了设备类型,跳过不匹配的
|
|
148
|
+
unless @device_types.empty?
|
|
149
|
+
next unless @device_types.include?(device_type)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# 扫描设备目录下的截图
|
|
153
|
+
Dir.glob(File.join(device_dir, "*")).each do |file|
|
|
154
|
+
next unless File.file?(file)
|
|
155
|
+
next unless valid_extensions.include?(File.extname(file).downcase)
|
|
156
|
+
|
|
157
|
+
screenshots << {
|
|
158
|
+
path: file,
|
|
159
|
+
device_type: device_type,
|
|
160
|
+
locale: @locale,
|
|
161
|
+
filename: File.basename(file)
|
|
162
|
+
}
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# 扫描根目录(无语言/设备分类)
|
|
168
|
+
def scan_root_directory(root_path, screenshots, valid_extensions)
|
|
169
|
+
Dir.glob(File.join(root_path, "**", "*")).each do |file|
|
|
170
|
+
next unless File.file?(file)
|
|
171
|
+
next unless valid_extensions.include?(File.extname(file).downcase)
|
|
172
|
+
|
|
173
|
+
screenshots << {
|
|
174
|
+
path: file,
|
|
175
|
+
device_type: 'unknown',
|
|
176
|
+
locale: @locale,
|
|
177
|
+
filename: File.basename(file)
|
|
178
|
+
}
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# 上传截图到 App Store Connect
|
|
183
|
+
def upload_screenshots(screenshots)
|
|
184
|
+
puts "\n开始上传 Screenshot 到 App Store Connect..."
|
|
185
|
+
puts " App ID: #{@app_id}"
|
|
186
|
+
puts " 语言区域: #{@locale}"
|
|
187
|
+
puts " 截图数量: #{screenshots.size}"
|
|
188
|
+
puts " 覆盖模式: #{@overwrite}"
|
|
189
|
+
|
|
190
|
+
# 按设备类型分组
|
|
191
|
+
screenshots_by_device = screenshots.group_by { |s| s[:device_type] }
|
|
192
|
+
|
|
193
|
+
screenshots_by_device.each do |device_type, device_screenshots|
|
|
194
|
+
puts "\n 上传 #{device_type} 截图 (#{device_screenshots.size} 张)..."
|
|
195
|
+
|
|
196
|
+
device_screenshots.each_with_index do |screenshot, index|
|
|
197
|
+
puts " [#{index + 1}/#{device_screenshots.size}] #{screenshot[:filename]}"
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# 使用 Fastlane deliver 或 API 上传截图
|
|
202
|
+
if use_api_key?
|
|
203
|
+
upload_with_api(screenshots)
|
|
204
|
+
else
|
|
205
|
+
upload_with_fastlane(screenshots)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
puts "✓ Screenshot 上传成功"
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# 判断是否使用 API Key 认证
|
|
212
|
+
def use_api_key?
|
|
213
|
+
@api_key_id && @api_issuer_id && @api_key_path
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# 使用 App Store Connect API 上传
|
|
217
|
+
def upload_with_api(screenshots)
|
|
218
|
+
puts " 使用 App Store Connect API 上传..."
|
|
219
|
+
|
|
220
|
+
# 这里需要调用 App Store Connect API Helper
|
|
221
|
+
# require 'pindo/module/appstore/appstore_metadata_connect_api_helper'
|
|
222
|
+
|
|
223
|
+
# 示例实现(需要根据实际 Helper 调整)
|
|
224
|
+
# screenshots.each do |screenshot|
|
|
225
|
+
# AppstoreMetadataConnectApiHelper.upload_screenshot(
|
|
226
|
+
# app_id: @app_id,
|
|
227
|
+
# api_key_id: @api_key_id,
|
|
228
|
+
# api_issuer_id: @api_issuer_id,
|
|
229
|
+
# api_key_path: @api_key_path,
|
|
230
|
+
# locale: screenshot[:locale],
|
|
231
|
+
# device_type: screenshot[:device_type],
|
|
232
|
+
# screenshot_path: screenshot[:path],
|
|
233
|
+
# overwrite: @overwrite
|
|
234
|
+
# )
|
|
235
|
+
# end
|
|
236
|
+
|
|
237
|
+
# 临时占位实现
|
|
238
|
+
puts " TODO: 实现 API 上传逻辑"
|
|
239
|
+
raise "API 上传功能尚未实现,请使用 Fastlane 方式"
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# 使用 Fastlane deliver 上传
|
|
243
|
+
def upload_with_fastlane(screenshots)
|
|
244
|
+
puts " 使用 Fastlane deliver 上传..."
|
|
245
|
+
|
|
246
|
+
# 构建 deliver 命令参数
|
|
247
|
+
fastlane_cmd = ["fastlane", "deliver"]
|
|
248
|
+
fastlane_cmd << "--app_identifier" << @app_id
|
|
249
|
+
fastlane_cmd << "--username" << @apple_id if @apple_id
|
|
250
|
+
|
|
251
|
+
# 截图路径
|
|
252
|
+
fastlane_cmd << "--screenshots_path" << @screenshot_path
|
|
253
|
+
|
|
254
|
+
# 覆盖已有截图
|
|
255
|
+
if @overwrite
|
|
256
|
+
fastlane_cmd << "--overwrite_screenshots"
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
# 跳过元数据上传
|
|
260
|
+
fastlane_cmd << "--skip_metadata"
|
|
261
|
+
|
|
262
|
+
# 跳过二进制文件上传
|
|
263
|
+
fastlane_cmd << "--skip_binary_upload"
|
|
264
|
+
|
|
265
|
+
# 执行命令
|
|
266
|
+
puts " 执行命令: #{fastlane_cmd.join(' ')}"
|
|
267
|
+
|
|
268
|
+
success = system(*fastlane_cmd)
|
|
269
|
+
|
|
270
|
+
unless success
|
|
271
|
+
raise "上传失败:Fastlane deliver 命令执行出错(退出码: #{$?.exitstatus})"
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
require_relative 'android_build_task'
|
|
2
|
+
require 'pindo/module/build/build_helper'
|
|
3
|
+
require 'pindo/module/build/version_helper'
|
|
4
|
+
require 'pindo/module/build/git_repo_helper'
|
|
5
|
+
require 'pindo/module/android/android_config_helper'
|
|
6
|
+
require 'pindo/module/android/android_build_helper'
|
|
7
|
+
require 'pindo/module/pgyer/pgyerhelper'
|
|
8
|
+
require 'pindo/base/githelper'
|
|
9
|
+
|
|
10
|
+
module Pindo
|
|
11
|
+
module TaskSystem
|
|
12
|
+
# Android AdHoc 模式构建任务
|
|
13
|
+
# 使用 Release 模式编译 Android 工程(AdHoc 版本)
|
|
14
|
+
class AndroidBuildAdhocTask < AndroidBuildTask
|
|
15
|
+
include Pindo::Githelper
|
|
16
|
+
|
|
17
|
+
def initialize(options = {})
|
|
18
|
+
@bundle_name = options[:bundle_name]
|
|
19
|
+
@proj_name = options[:proj_name]
|
|
20
|
+
@upload_flag = options[:upload] || false
|
|
21
|
+
@send_flag = options[:send] || false
|
|
22
|
+
|
|
23
|
+
# 接收外部传入的 JPS 配置
|
|
24
|
+
@app_info_obj = options[:app_info_obj]
|
|
25
|
+
@workflow_info = options[:workflow_info]
|
|
26
|
+
|
|
27
|
+
super(:android, :adhoc, options)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
|
|
32
|
+
def build_task_name
|
|
33
|
+
"构建 APK (AdHoc)"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def prepare_build
|
|
37
|
+
# 校验必需的参数
|
|
38
|
+
Dir.chdir(@project_path)
|
|
39
|
+
validate_workflow_info
|
|
40
|
+
check_git_tag if @upload_flag
|
|
41
|
+
update_project_config
|
|
42
|
+
update_version_info
|
|
43
|
+
handle_bundle_name_config if @bundle_name
|
|
44
|
+
add_application_id_scheme
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def execute_build
|
|
48
|
+
build_android_project
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def find_output
|
|
52
|
+
# 搜索 APK 和 AAB 文件
|
|
53
|
+
search_paths = []
|
|
54
|
+
search_paths.concat(TaskConfig::BUILD_OUTPUT_PATTERNS[:apk].map { |p| File.join(@project_path, p) })
|
|
55
|
+
search_paths.concat(TaskConfig::BUILD_OUTPUT_PATTERNS[:aab].map { |p| File.join(@project_path, p) })
|
|
56
|
+
|
|
57
|
+
package_files = []
|
|
58
|
+
search_paths.each do |pattern|
|
|
59
|
+
package_files.concat(Dir.glob(pattern))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# 过滤测试包和未签名包
|
|
63
|
+
package_files.reject! do |f|
|
|
64
|
+
basename = File.basename(f).downcase
|
|
65
|
+
TaskConfig::EXCLUDED_PATTERNS.any? { |pattern| basename.include?(pattern) }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
if package_files.any?
|
|
69
|
+
# 优先返回 AAB,其次 APK
|
|
70
|
+
aab_files = package_files.select { |f| f.end_with?(".aab") }
|
|
71
|
+
apk_files = package_files.select { |f| f.end_with?(".apk") }
|
|
72
|
+
|
|
73
|
+
latest_package = if aab_files.any?
|
|
74
|
+
aab_files.max_by { |f| File.mtime(f) }
|
|
75
|
+
elsif apk_files.any?
|
|
76
|
+
apk_files.max_by { |f| File.mtime(f) }
|
|
77
|
+
else
|
|
78
|
+
package_files.max_by { |f| File.mtime(f) }
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
puts " 找到 Android 包文件: #{latest_package}"
|
|
82
|
+
latest_package
|
|
83
|
+
else
|
|
84
|
+
puts " 警告: 未找到 APK/AAB 文件"
|
|
85
|
+
nil
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
# 校验工作流信息
|
|
92
|
+
def validate_workflow_info
|
|
93
|
+
unless @workflow_info && @workflow_info[:package_name]
|
|
94
|
+
raise Informative, "未提供工作流信息,请在创建任务时传入 workflow_info 参数"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Git 标签检查
|
|
99
|
+
def check_git_tag
|
|
100
|
+
git_repo_helper = Pindo::GitRepoHelper.share_instance
|
|
101
|
+
is_need_add_tag, tag_action_params = git_repo_helper.check_is_need_add_tag?(@project_path)
|
|
102
|
+
if is_need_add_tag
|
|
103
|
+
git_repo_helper.create_and_push_tag(
|
|
104
|
+
project_dir: @project_path,
|
|
105
|
+
mode: 'minor',
|
|
106
|
+
force_retag: tag_action_params&.include?('--retag') || false,
|
|
107
|
+
custom_tag: nil,
|
|
108
|
+
release_branch: 'master'
|
|
109
|
+
)
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# 更新工程配置
|
|
114
|
+
def update_project_config
|
|
115
|
+
workflow_packname = @workflow_info[:package_name]
|
|
116
|
+
|
|
117
|
+
puts "\n使用工作流配置更新 Android 项目:"
|
|
118
|
+
puts " Workflow Package Name: #{workflow_packname}"
|
|
119
|
+
|
|
120
|
+
# 更新 App Name、Application ID 和 URL Schemes
|
|
121
|
+
Pindo::AndroidConfigHelper.update_project_with_workflow(
|
|
122
|
+
project_dir: @project_path,
|
|
123
|
+
workflow_packname: workflow_packname
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
# 下载并替换 Icon
|
|
127
|
+
if @app_info_obj && @app_info_obj["projectIcon"] && !@app_info_obj["projectIcon"].empty?
|
|
128
|
+
icon_replace_success = Pindo::AndroidConfigHelper.download_and_replace_icon_from_url(
|
|
129
|
+
project_dir: @project_path,
|
|
130
|
+
icon_url: @app_info_obj["projectIcon"]
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
unless icon_replace_success
|
|
134
|
+
raise Informative, "Icon 下载或替换失败,请检查 Icon URL 是否有效: #{@app_info_obj["projectIcon"]}"
|
|
135
|
+
end
|
|
136
|
+
else
|
|
137
|
+
Funlog.warning("未配置 Icon URL,跳过 Icon 替换")
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# 更新版本号
|
|
142
|
+
def update_version_info
|
|
143
|
+
version_helper = Pindo::VersionHelper.share_instance
|
|
144
|
+
version_info = version_helper.get_version_info(project_dir: @project_path)
|
|
145
|
+
|
|
146
|
+
if version_info[:is_git_repo]
|
|
147
|
+
Pindo::AndroidConfigHelper.update_android_project_version(
|
|
148
|
+
project_dir: @project_path,
|
|
149
|
+
version_name: version_info[:version],
|
|
150
|
+
version_code: version_info[:build_number]
|
|
151
|
+
)
|
|
152
|
+
else
|
|
153
|
+
Funlog.warning("非Git仓库,保持工程原有版本号")
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# 处理 Bundle Name 特殊配置
|
|
158
|
+
def handle_bundle_name_config
|
|
159
|
+
return unless @bundle_name && !@bundle_name.empty?
|
|
160
|
+
|
|
161
|
+
puts "\n正在处理指定的 Bundle Name: #{@bundle_name}..."
|
|
162
|
+
|
|
163
|
+
# 检查是否为通配符
|
|
164
|
+
is_wildcard = @bundle_name.include?('*') ||
|
|
165
|
+
@bundle_name.end_with?('.') ||
|
|
166
|
+
['com.test', 'com.example', 'com.demo'].include?(@bundle_name)
|
|
167
|
+
|
|
168
|
+
if is_wildcard
|
|
169
|
+
puts " ⚠️ 检测到通配符或通用 Bundle Name: #{@bundle_name}"
|
|
170
|
+
puts " ⚠️ 跳过 google-services.json 和 Application ID 更新"
|
|
171
|
+
else
|
|
172
|
+
# 拉取配置仓库
|
|
173
|
+
config_repo_dir = clong_buildconfig_repo(repo_name: @bundle_name)
|
|
174
|
+
|
|
175
|
+
if config_repo_dir && File.exist?(config_repo_dir)
|
|
176
|
+
# 拷贝 google-services.json
|
|
177
|
+
Pindo::AndroidConfigHelper.copy_google_services_from_config_repo(
|
|
178
|
+
config_repo_dir: config_repo_dir,
|
|
179
|
+
project_dir: @project_path
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# 更新 Application ID
|
|
183
|
+
Pindo::AndroidConfigHelper.update_application_id(
|
|
184
|
+
project_dir: @project_path,
|
|
185
|
+
application_id: @bundle_name
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
puts " ✓ Bundle Name 配置处理完成"
|
|
189
|
+
else
|
|
190
|
+
raise Informative, "无法获取配置仓库"
|
|
191
|
+
end
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# 添加基于 Application ID 的 Scheme
|
|
196
|
+
def add_application_id_scheme
|
|
197
|
+
Pindo::AndroidConfigHelper.add_application_id_based_scheme(
|
|
198
|
+
project_dir: @project_path
|
|
199
|
+
)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# 构建 Android 工程
|
|
203
|
+
def build_android_project
|
|
204
|
+
android_build_helper = Pindo::AndroidBuildHelper.share_instance
|
|
205
|
+
# 第二个参数 false 表示 release 模式
|
|
206
|
+
android_build_helper.auto_build_apk(@project_path, false)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require_relative '
|
|
1
|
+
require_relative 'android_build_task'
|
|
2
2
|
require 'pindo/module/build/build_helper'
|
|
3
3
|
require 'pindo/module/build/version_helper'
|
|
4
4
|
require 'pindo/module/build/git_repo_helper'
|
|
@@ -11,7 +11,7 @@ module Pindo
|
|
|
11
11
|
module TaskSystem
|
|
12
12
|
# Android Dev 模式构建任务
|
|
13
13
|
# 使用 Debug 模式编译 Android 工程
|
|
14
|
-
class
|
|
14
|
+
class AndroidBuildDevTask < AndroidBuildTask
|
|
15
15
|
include Pindo::Githelper
|
|
16
16
|
def initialize(options = {})
|
|
17
17
|
@bundle_name = options[:bundle_name]
|