pindo 5.13.12 → 5.13.13
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/funlog.rb +62 -5
- data/lib/pindo/base/git_handler.rb +83 -22
- data/lib/pindo/base/output_sink.rb +69 -0
- data/lib/pindo/command/android/autobuild.rb +57 -8
- data/lib/pindo/command/appstore/autobuild.rb +10 -1
- data/lib/pindo/command/ios/autobuild.rb +59 -7
- data/lib/pindo/command/jps/media.rb +164 -13
- data/lib/pindo/command/jps/upload.rb +14 -9
- data/lib/pindo/command/unity/autobuild.rb +64 -10
- data/lib/pindo/command/utils/tag.rb +9 -1
- data/lib/pindo/command/web/autobuild.rb +59 -10
- data/lib/pindo/module/android/android_build_helper.rb +6 -7
- data/lib/pindo/module/build/git_repo_helper.rb +29 -25
- data/lib/pindo/module/pgyer/pgyerhelper.rb +174 -77
- data/lib/pindo/module/task/core/concurrent_execution_strategy.rb +237 -0
- data/lib/pindo/module/task/core/dependency_checker.rb +123 -0
- data/lib/pindo/module/task/core/execution_strategy.rb +61 -0
- data/lib/pindo/module/task/core/resource_lock_manager.rb +190 -0
- data/lib/pindo/module/task/core/serial_execution_strategy.rb +60 -0
- data/lib/pindo/module/task/core/task_executor.rb +131 -0
- data/lib/pindo/module/task/core/task_queue.rb +221 -0
- data/lib/pindo/module/task/model/build/android_build_dev_task.rb +1 -1
- data/lib/pindo/module/task/model/build/android_build_task.rb +6 -2
- data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +2 -3
- data/lib/pindo/module/task/model/build/ios_build_task.rb +6 -0
- data/lib/pindo/module/task/model/build_task.rb +22 -0
- data/lib/pindo/module/task/model/git/git_commit_task.rb +11 -2
- data/lib/pindo/module/task/model/git_task.rb +6 -0
- data/lib/pindo/module/task/model/jps/jps_message_task.rb +9 -11
- data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +204 -103
- data/lib/pindo/module/task/model/jps_task.rb +0 -1
- data/lib/pindo/module/task/model/unity_task.rb +38 -2
- data/lib/pindo/module/task/output/multi_line_output_manager.rb +380 -0
- data/lib/pindo/module/task/output/multi_line_task_display.rb +185 -0
- data/lib/pindo/module/task/output/stdout_redirector.rb +95 -0
- data/lib/pindo/module/task/pindo_task.rb +133 -9
- data/lib/pindo/module/task/task_manager.rb +98 -268
- data/lib/pindo/module/task/task_reporter.rb +135 -0
- data/lib/pindo/module/task/task_resources/resource_instance.rb +90 -0
- data/lib/pindo/module/task/task_resources/resource_registry.rb +105 -0
- data/lib/pindo/module/task/task_resources/resource_type.rb +59 -0
- data/lib/pindo/module/task/task_resources/types/directory_based_resource.rb +63 -0
- data/lib/pindo/module/task/task_resources/types/global_exclusive_resource.rb +33 -0
- data/lib/pindo/module/task/task_resources/types/global_shared_resource.rb +34 -0
- data/lib/pindo/module/xcode/xcode_build_helper.rb +26 -8
- data/lib/pindo/options/groups/jps_options.rb +10 -0
- data/lib/pindo/options/groups/task_options.rb +39 -0
- data/lib/pindo/version.rb +3 -2
- metadata +20 -1
|
@@ -58,7 +58,7 @@ module Pindo
|
|
|
58
58
|
if Pindo::GitHandler.is_git_directory?(local_repo_dir: project_path)
|
|
59
59
|
current_git_root_path = Pindo::GitHandler.git_root_directory(local_repo_dir: project_path)
|
|
60
60
|
Dir.chdir(current_git_root_path)
|
|
61
|
-
pindo_common_dir =
|
|
61
|
+
pindo_common_dir = Pindoconfig.instance.pindo_common_configdir
|
|
62
62
|
if File.exist?(File.join(pindo_common_dir, 'cliff.toml'))
|
|
63
63
|
FileUtils.cp_r(File.join(pindo_common_dir, 'cliff.toml'), File.join(current_git_root_path, 'cliff.toml'))
|
|
64
64
|
end
|
|
@@ -104,30 +104,34 @@ module Pindo
|
|
|
104
104
|
gitignore_path = File.join(git_root_dir, '.gitignore')
|
|
105
105
|
file_modified = false
|
|
106
106
|
|
|
107
|
-
#
|
|
108
|
-
ignore_rules = [
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
'
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
107
|
+
# 从 pindo_common_config 读取 gitignore 规则
|
|
108
|
+
ignore_rules = []
|
|
109
|
+
begin
|
|
110
|
+
pindo_common_dir = Pindoconfig.instance.pindo_common_configdir
|
|
111
|
+
template_file = File.join(pindo_common_dir, 'gitignore_template.txt')
|
|
112
|
+
|
|
113
|
+
if File.exist?(template_file)
|
|
114
|
+
# 读取模板文件并解析每一行
|
|
115
|
+
File.readlines(template_file).each do |line|
|
|
116
|
+
# 去掉前后空白
|
|
117
|
+
rule = line.strip
|
|
118
|
+
# 去掉末尾的逗号
|
|
119
|
+
rule = rule.chomp(',')
|
|
120
|
+
# 去掉开头和结尾的单引号
|
|
121
|
+
rule = rule.gsub(/^'/, '').gsub(/'$/, '')
|
|
122
|
+
# 再次去掉空白
|
|
123
|
+
rule = rule.strip
|
|
124
|
+
# 跳过空行
|
|
125
|
+
ignore_rules << rule unless rule.empty?
|
|
126
|
+
end
|
|
127
|
+
else
|
|
128
|
+
Funlog.instance.fancyinfo_warning("未找到 gitignore_template.txt,跳过添加规则")
|
|
129
|
+
return false
|
|
130
|
+
end
|
|
131
|
+
rescue => e
|
|
132
|
+
Funlog.instance.fancyinfo_error("读取 gitignore 模板失败: #{e.message}")
|
|
133
|
+
return false
|
|
134
|
+
end
|
|
131
135
|
|
|
132
136
|
# 读取现有的gitignore内容
|
|
133
137
|
existing_lines = []
|
|
@@ -55,7 +55,7 @@ module Pindo
|
|
|
55
55
|
# - project_name [String] 项目名称
|
|
56
56
|
# - project_id [String] 项目ID
|
|
57
57
|
# - workflow_info [Hash] 工作流信息(如果有效)
|
|
58
|
-
def try_load_jps_build_config(working_directory:, package_type:)
|
|
58
|
+
def try_load_jps_build_config(working_directory:, package_type:, manage_type: "")
|
|
59
59
|
result = {
|
|
60
60
|
valid: false,
|
|
61
61
|
project_name: nil,
|
|
@@ -89,15 +89,24 @@ module Pindo
|
|
|
89
89
|
return result
|
|
90
90
|
end
|
|
91
91
|
|
|
92
|
-
# 5.
|
|
93
|
-
workflow_key =
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
92
|
+
# 5. 根据 manage_type 决定 workflow_key
|
|
93
|
+
workflow_key = nil
|
|
94
|
+
|
|
95
|
+
if manage_type == "git"
|
|
96
|
+
# manage_type 为 git 时,直接使用 git_workflow
|
|
97
|
+
workflow_key = 'git_workflow'
|
|
98
|
+
puts "[JPSConfig] 使用 git_workflow 配置" if ENV['DEBUG']
|
|
99
|
+
else
|
|
100
|
+
# 按 package_type 查找
|
|
101
|
+
workflow_key = case package_type
|
|
102
|
+
when 'ipa' then 'ipa_workflow'
|
|
103
|
+
when 'apk' then 'apk_workflow'
|
|
104
|
+
when 'zip' then 'webgl_workflow'
|
|
105
|
+
when 'app' then 'macos_workflow'
|
|
106
|
+
else
|
|
107
|
+
puts "[JPSConfig] 不支持的 package_type: #{package_type}"
|
|
108
|
+
return result
|
|
109
|
+
end
|
|
101
110
|
end
|
|
102
111
|
|
|
103
112
|
# 6. 验证工作流配置
|
|
@@ -118,7 +127,7 @@ module Pindo
|
|
|
118
127
|
manage_type: workflow['manage_type'] || ""
|
|
119
128
|
}
|
|
120
129
|
|
|
121
|
-
puts "[JPSConfig] 配置验证通过" if ENV['DEBUG']
|
|
130
|
+
puts "[JPSConfig] 配置验证通过 (#{workflow_key})" if ENV['DEBUG']
|
|
122
131
|
return result
|
|
123
132
|
end
|
|
124
133
|
|
|
@@ -127,8 +136,9 @@ module Pindo
|
|
|
127
136
|
# @param project_id [String] 项目ID
|
|
128
137
|
# @param package_type [String] 包类型
|
|
129
138
|
# @param working_directory [String] 工作目录
|
|
139
|
+
# @param manage_type [String] 管理类型(默认为空,"git" 时筛选 git 工作流)
|
|
130
140
|
# @return [Hash] 选择的工作流信息
|
|
131
|
-
def select_workflow_for_project(project_id:, package_type:, working_directory:)
|
|
141
|
+
def select_workflow_for_project(project_id:, package_type:, working_directory:, manage_type: "")
|
|
132
142
|
# 1. 从 JPS API 获取可用工作流列表
|
|
133
143
|
Funlog.instance.fancyinfo_start("正在获取可用工作流...")
|
|
134
144
|
|
|
@@ -146,37 +156,49 @@ module Pindo
|
|
|
146
156
|
|
|
147
157
|
Funlog.instance.fancyinfo_success("获取工作流列表成功,共 #{workflows.size} 个工作流")
|
|
148
158
|
|
|
149
|
-
# 2. 根据
|
|
150
|
-
|
|
151
|
-
#
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
# 2. 根据 manage_type 或 package_type 过滤工作流
|
|
160
|
+
if manage_type == "git"
|
|
161
|
+
# manage_type 为 git 时,只筛选 manage_type == "git" 的工作流,不看 package_type
|
|
162
|
+
# 严格筛选,不包括 manage_type 为空或其他类型的工作流
|
|
163
|
+
filtered_workflows = workflows.select do |w|
|
|
164
|
+
(w['manageType'] == 'git') || (w['manage_type'] == 'git')
|
|
165
|
+
end
|
|
166
|
+
type_desc = 'Git 管理类型'
|
|
167
|
+
# manage_type == "git" 时严格使用筛选结果,不降级
|
|
168
|
+
display_workflows = filtered_workflows
|
|
169
|
+
else
|
|
170
|
+
# 按 package_type 过滤工作流
|
|
171
|
+
filtered_workflows = workflows.select do |w|
|
|
172
|
+
# 如果工作流有 packageType 字段,进行过滤
|
|
173
|
+
if w['packageType']
|
|
174
|
+
case package_type
|
|
175
|
+
when 'ipa'
|
|
176
|
+
w['packageType'] == 'ipa'
|
|
177
|
+
when 'apk'
|
|
178
|
+
w['packageType'] == 'apk'
|
|
179
|
+
when 'zip'
|
|
180
|
+
w['packageType'] == 'zip'
|
|
181
|
+
else
|
|
182
|
+
true
|
|
183
|
+
end
|
|
160
184
|
else
|
|
185
|
+
# 如果没有 packageType 字段,显示所有工作流
|
|
161
186
|
true
|
|
162
187
|
end
|
|
163
|
-
else
|
|
164
|
-
# 如果没有 packageType 字段,显示所有工作流
|
|
165
|
-
true
|
|
166
188
|
end
|
|
167
|
-
end
|
|
168
189
|
|
|
169
|
-
|
|
170
|
-
|
|
190
|
+
type_desc = case package_type
|
|
191
|
+
when 'ipa' then 'iOS IPA'
|
|
192
|
+
when 'apk' then 'Android APK'
|
|
193
|
+
when 'zip' then 'WebGL'
|
|
194
|
+
else package_type
|
|
195
|
+
end
|
|
171
196
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
when 'ipa' then 'iOS IPA'
|
|
175
|
-
when 'apk' then 'Android APK'
|
|
176
|
-
when 'zip' then 'WebGL'
|
|
177
|
-
else package_type
|
|
197
|
+
# 非 git 模式下,如果过滤后没有结果,使用所有工作流
|
|
198
|
+
display_workflows = filtered_workflows.empty? ? workflows : filtered_workflows
|
|
178
199
|
end
|
|
179
200
|
|
|
201
|
+
# 3. 根据匹配数量决定选择方式
|
|
180
202
|
workflow = nil
|
|
181
203
|
|
|
182
204
|
if display_workflows.empty?
|
|
@@ -378,7 +400,7 @@ module Pindo
|
|
|
378
400
|
return app_info_obj, workflow_info
|
|
379
401
|
end
|
|
380
402
|
|
|
381
|
-
def prepare_upload(working_directory:nil, proj_name:nil, package_type:nil)
|
|
403
|
+
def prepare_upload(working_directory:nil, proj_name:nil, package_type:nil, manage_type: "")
|
|
382
404
|
upload_proj_name = proj_name
|
|
383
405
|
if upload_proj_name.nil? || upload_proj_name.empty?
|
|
384
406
|
upload_proj_name = @proj_name
|
|
@@ -396,7 +418,8 @@ module Pindo
|
|
|
396
418
|
if package_type
|
|
397
419
|
config_result = try_load_jps_build_config(
|
|
398
420
|
working_directory: working_directory,
|
|
399
|
-
package_type: package_type
|
|
421
|
+
package_type: package_type,
|
|
422
|
+
manage_type: manage_type
|
|
400
423
|
)
|
|
401
424
|
|
|
402
425
|
if config_result[:valid]
|
|
@@ -444,14 +467,16 @@ module Pindo
|
|
|
444
467
|
workflow_info = select_workflow_for_project(
|
|
445
468
|
project_id: app_info_obj["id"],
|
|
446
469
|
package_type: package_type,
|
|
447
|
-
working_directory: working_directory
|
|
470
|
+
working_directory: working_directory,
|
|
471
|
+
manage_type: manage_type
|
|
448
472
|
)
|
|
449
473
|
|
|
450
474
|
save_jps_build_config(
|
|
451
475
|
working_directory: working_directory,
|
|
452
476
|
app_info_obj: app_info_obj,
|
|
453
477
|
workflow_info: workflow_info,
|
|
454
|
-
package_type: package_type
|
|
478
|
+
package_type: package_type,
|
|
479
|
+
manage_type: manage_type
|
|
455
480
|
)
|
|
456
481
|
|
|
457
482
|
@proj_name = upload_proj_name
|
|
@@ -568,14 +593,16 @@ module Pindo
|
|
|
568
593
|
workflow_info = select_workflow_for_project(
|
|
569
594
|
project_id: app_info_obj["id"],
|
|
570
595
|
package_type: package_type,
|
|
571
|
-
working_directory: working_directory
|
|
596
|
+
working_directory: working_directory,
|
|
597
|
+
manage_type: manage_type
|
|
572
598
|
)
|
|
573
599
|
|
|
574
600
|
save_jps_build_config(
|
|
575
601
|
working_directory: working_directory,
|
|
576
602
|
app_info_obj: app_info_obj,
|
|
577
603
|
workflow_info: workflow_info,
|
|
578
|
-
package_type: package_type
|
|
604
|
+
package_type: package_type,
|
|
605
|
+
manage_type: manage_type
|
|
579
606
|
)
|
|
580
607
|
|
|
581
608
|
@proj_name = upload_proj_name
|
|
@@ -821,70 +848,120 @@ module Pindo
|
|
|
821
848
|
end
|
|
822
849
|
|
|
823
850
|
# 2. 根据 git_commit_id 查找对应的 commit_log 记录
|
|
824
|
-
Funlog.instance.fancyinfo_start("
|
|
851
|
+
Funlog.instance.fancyinfo_start("查找 JPS 提交记录...")
|
|
825
852
|
commit_log = find_commit_log_by_git_commit_id(git_commit_id, workflow_id)
|
|
826
853
|
|
|
827
854
|
if commit_log.nil?
|
|
828
|
-
Funlog.instance.fancyinfo_error("
|
|
829
|
-
Funlog.instance.warning("请确保该 commit
|
|
855
|
+
Funlog.instance.fancyinfo_error("未找到对应的 JPS 提交记录")
|
|
856
|
+
Funlog.instance.warning("请确保该 commit 已通过 JPS 发送过消息")
|
|
830
857
|
return result
|
|
831
858
|
end
|
|
832
859
|
|
|
833
860
|
commit_log_id = commit_log["id"]
|
|
834
861
|
result[:commit_log_id] = commit_log_id
|
|
835
862
|
|
|
836
|
-
Funlog.instance.fancyinfo_success("
|
|
837
|
-
puts "
|
|
838
|
-
puts " 工作流: #{commit_log["tabName"]}"
|
|
839
|
-
puts " 分支: #{commit_log["branch"]}"
|
|
840
|
-
puts
|
|
863
|
+
Funlog.instance.fancyinfo_success("找到提交记录 ##{commit_log_id}")
|
|
864
|
+
puts " #{commit_log["projectName"]} / #{commit_log["tabName"]} / #{commit_log["branch"]}"
|
|
841
865
|
|
|
842
866
|
# 3. 获取已存在的 fileUrls
|
|
843
867
|
if commit_log["fileUrls"] && commit_log["fileUrls"].any?
|
|
844
868
|
result[:existing_urls] = commit_log["fileUrls"]
|
|
845
|
-
puts "已有附件: #{result[:existing_urls].size} 个"
|
|
869
|
+
puts " 已有附件: #{result[:existing_urls].size} 个"
|
|
846
870
|
end
|
|
871
|
+
puts ""
|
|
872
|
+
|
|
873
|
+
# 4. 显示待上传的文件列表
|
|
874
|
+
puts " 📤 待上传文件(共 #{file_paths.size} 个)"
|
|
875
|
+
file_paths.each_with_index do |file_path, index|
|
|
876
|
+
if File.exist?(file_path)
|
|
877
|
+
size_bytes = File.size(file_path)
|
|
878
|
+
size_str = format_file_size(size_bytes)
|
|
879
|
+
file_name = File.basename(file_path)
|
|
880
|
+
puts " #{index + 1}. #{file_name} (#{size_str})"
|
|
881
|
+
end
|
|
882
|
+
end
|
|
883
|
+
puts ""
|
|
884
|
+
|
|
885
|
+
# 5. 使用 UploadMediaClient 并发上传文件
|
|
886
|
+
Funlog.instance.fancyinfo_start("正在上传...")
|
|
847
887
|
|
|
848
|
-
# 4. 使用 UploadMediaClient 并发上传文件
|
|
849
888
|
media_client = JPSClient::UploadMediaClient.new(@pgyer_client)
|
|
850
|
-
upload_result = media_client.upload_files(file_paths: file_paths)
|
|
851
889
|
|
|
852
|
-
#
|
|
890
|
+
# 在非调试模式下,临时重定向 JPSClient 的输出
|
|
891
|
+
if ENV['PINDO_DEBUG']
|
|
892
|
+
upload_result = media_client.upload_files(file_paths: file_paths)
|
|
893
|
+
else
|
|
894
|
+
# 保存原始的 stdout
|
|
895
|
+
original_stdout = $stdout.clone
|
|
896
|
+
# 临时重定向到 /dev/null
|
|
897
|
+
$stdout.reopen(File.new('/dev/null', 'w'))
|
|
898
|
+
begin
|
|
899
|
+
upload_result = media_client.upload_files(file_paths: file_paths)
|
|
900
|
+
ensure
|
|
901
|
+
# 恢复原始的 stdout
|
|
902
|
+
$stdout.reopen(original_stdout)
|
|
903
|
+
end
|
|
904
|
+
end
|
|
905
|
+
|
|
906
|
+
# 6. 提取上传结果
|
|
853
907
|
result[:success_urls] = upload_result["success_urls"]
|
|
854
908
|
result[:failed_files] = upload_result["failed_files"]
|
|
855
909
|
|
|
856
|
-
#
|
|
910
|
+
# 显示上传结果
|
|
911
|
+
if result[:failed_files].any?
|
|
912
|
+
Funlog.instance.fancyinfo_error("上传完成:成功 #{result[:success_urls].size} 个,失败 #{result[:failed_files].size} 个")
|
|
913
|
+
else
|
|
914
|
+
Funlog.instance.fancyinfo_success("上传完成:成功 #{result[:success_urls].size} 个")
|
|
915
|
+
end
|
|
916
|
+
|
|
917
|
+
# 7. 合并 URL 列表
|
|
857
918
|
result[:all_urls] = result[:existing_urls] + result[:success_urls]
|
|
858
919
|
|
|
859
|
-
#
|
|
920
|
+
# 8. 更新 commit_log
|
|
860
921
|
if result[:success_urls].any?
|
|
861
|
-
Funlog.instance.fancyinfo_start("
|
|
922
|
+
Funlog.instance.fancyinfo_start("更新提交记录...")
|
|
862
923
|
begin
|
|
863
924
|
update_result = @pgyer_client.update_commit_log(
|
|
864
925
|
id: commit_log_id,
|
|
865
926
|
params: { fileUrls: result[:all_urls] }
|
|
866
927
|
)
|
|
867
928
|
|
|
868
|
-
|
|
929
|
+
# 兼容两种响应格式:
|
|
930
|
+
# 1. 新格式:{"code": 0, "data": ..., "msg": ...}
|
|
931
|
+
# 2. 旧格式:{"meta": {"code": 0}, ...}
|
|
932
|
+
response_code = update_result&.dig("code") || update_result&.dig("meta", "code")
|
|
933
|
+
|
|
934
|
+
if update_result && (response_code == 0 || response_code == 200)
|
|
869
935
|
result[:update_success] = true
|
|
870
|
-
Funlog.instance.fancyinfo_success("
|
|
936
|
+
Funlog.instance.fancyinfo_success("附件已更新(共 #{result[:all_urls].size} 个)")
|
|
871
937
|
else
|
|
872
|
-
|
|
873
|
-
|
|
938
|
+
# 提取详细错误信息
|
|
939
|
+
error_code = update_result&.dig("code") || update_result&.dig("meta", "code")
|
|
940
|
+
error_msg = update_result&.dig("msg") || update_result&.dig("meta", "message") || update_result&.dig("message")
|
|
941
|
+
|
|
942
|
+
if ENV['PINDO_DEBUG']
|
|
943
|
+
puts "[PINDO_DEBUG] update_commit_log 返回结果: #{update_result.inspect}"
|
|
944
|
+
puts "[PINDO_DEBUG] commit_log_id: #{commit_log_id}"
|
|
945
|
+
puts "[PINDO_DEBUG] fileUrls: #{result[:all_urls].inspect}"
|
|
946
|
+
end
|
|
947
|
+
|
|
948
|
+
error_detail = error_msg || "未知错误"
|
|
949
|
+
error_detail = "#{error_detail} (错误码: #{error_code})" if error_code
|
|
950
|
+
Funlog.instance.fancyinfo_error("更新失败: #{error_detail}")
|
|
874
951
|
end
|
|
875
952
|
rescue => e
|
|
876
|
-
Funlog.instance.fancyinfo_error("
|
|
953
|
+
Funlog.instance.fancyinfo_error("更新失败: #{e.message}")
|
|
954
|
+
puts "[PINDO_DEBUG] 异常详情: #{e.class} - #{e.backtrace&.first}" if ENV['PINDO_DEBUG']
|
|
877
955
|
end
|
|
878
956
|
else
|
|
879
|
-
Funlog.instance.warning("
|
|
957
|
+
Funlog.instance.warning("没有成功上传的文件")
|
|
880
958
|
end
|
|
881
959
|
|
|
882
|
-
#
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
puts "
|
|
887
|
-
puts " 总附件: #{result[:all_urls].size} 个"
|
|
960
|
+
# 9. 输出统计(简化,因为上面已经显示了上传结果)
|
|
961
|
+
if result[:all_urls].size > result[:success_urls].size
|
|
962
|
+
puts " 总附件数: #{result[:all_urls].size} 个(包含之前已有的 #{result[:existing_urls].size} 个)"
|
|
963
|
+
end
|
|
964
|
+
puts ""
|
|
888
965
|
|
|
889
966
|
return result
|
|
890
967
|
end
|
|
@@ -1460,6 +1537,19 @@ module Pindo
|
|
|
1460
1537
|
|
|
1461
1538
|
end
|
|
1462
1539
|
|
|
1540
|
+
# 格式化文件大小
|
|
1541
|
+
# @param size [Integer] 字节数
|
|
1542
|
+
# @return [String] 格式化后的大小
|
|
1543
|
+
def format_file_size(size)
|
|
1544
|
+
if size < 1024
|
|
1545
|
+
"#{size}B"
|
|
1546
|
+
elsif size < 1024 * 1024
|
|
1547
|
+
"#{(size / 1024.0).round(1)}KB"
|
|
1548
|
+
else
|
|
1549
|
+
"#{(size / 1024.0 / 1024.0).round(1)}MB"
|
|
1550
|
+
end
|
|
1551
|
+
end
|
|
1552
|
+
|
|
1463
1553
|
private
|
|
1464
1554
|
|
|
1465
1555
|
# 确定 JPSBuildConfig.json 文件路径
|
|
@@ -1526,19 +1616,26 @@ module Pindo
|
|
|
1526
1616
|
# @param app_info_obj [Hash] 项目信息对象
|
|
1527
1617
|
# @param workflow_info [Hash] 工作流信息
|
|
1528
1618
|
# @param package_type [String] 包类型 ("ipa" | "apk" | "zip")
|
|
1529
|
-
def save_jps_build_config(working_directory:, app_info_obj:, workflow_info:, package_type:)
|
|
1530
|
-
return if working_directory.nil? || app_info_obj.nil? || workflow_info.nil?
|
|
1619
|
+
def save_jps_build_config(working_directory:, app_info_obj:, workflow_info:, package_type:, manage_type: "")
|
|
1620
|
+
return if working_directory.nil? || app_info_obj.nil? || workflow_info.nil?
|
|
1531
1621
|
|
|
1532
1622
|
# 1. 确定配置文件路径
|
|
1533
1623
|
config_file = determine_config_file_path(working_directory)
|
|
1534
1624
|
|
|
1535
|
-
# 2. 确定 workflow_key
|
|
1536
|
-
workflow_key =
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1625
|
+
# 2. 根据 manage_type 或 package_type 确定 workflow_key
|
|
1626
|
+
workflow_key = nil
|
|
1627
|
+
if manage_type == "git"
|
|
1628
|
+
# manage_type 为 git 时,使用 git_workflow
|
|
1629
|
+
workflow_key = 'git_workflow'
|
|
1630
|
+
else
|
|
1631
|
+
# 按 package_type 确定 workflow_key
|
|
1632
|
+
workflow_key = case package_type
|
|
1633
|
+
when 'ipa' then 'ipa_workflow'
|
|
1634
|
+
when 'apk' then 'apk_workflow'
|
|
1635
|
+
when 'zip' then 'webgl_workflow'
|
|
1636
|
+
when 'app' then 'macos_workflow'
|
|
1637
|
+
else raise Informative, "不支持的 package_type: #{package_type}"
|
|
1638
|
+
end
|
|
1542
1639
|
end
|
|
1543
1640
|
|
|
1544
1641
|
# 3. 准备新的项目基础信息
|