pindo 5.13.9 → 5.13.10
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 +247 -42
- data/lib/pindo/command/android/autobuild.rb +72 -30
- data/lib/pindo/command/android/autoresign.rb +23 -322
- data/lib/pindo/command/android/keystore.rb +7 -130
- data/lib/pindo/command/appstore/adhocbuild.rb +5 -14
- data/lib/pindo/command/appstore/autobuild.rb +64 -14
- data/lib/pindo/command/appstore/autoresign.rb +1 -3
- data/lib/pindo/command/ios/autobuild.rb +71 -53
- data/lib/pindo/command/ios/build.rb +8 -186
- data/lib/pindo/command/jps/media.rb +146 -0
- data/lib/pindo/command/jps/upload.rb +48 -20
- data/lib/pindo/command/jps.rb +1 -0
- data/lib/pindo/command/unity/autobuild.rb +99 -27
- data/lib/pindo/command/unity/packpush.rb +5 -8
- data/lib/pindo/command/utils/repoinit.rb +0 -2
- data/lib/pindo/command/utils/tag.rb +58 -26
- data/lib/pindo/command/utils.rb +0 -1
- data/lib/pindo/command/web/autobuild.rb +71 -37
- data/lib/pindo/command.rb +0 -56
- data/lib/pindo/config/build_info_manager.rb +7 -8
- data/lib/pindo/module/android/android_config_helper.rb +2 -11
- data/lib/pindo/module/appselect.rb +15 -41
- data/lib/pindo/module/appstore/itcapp_helper.rb +3 -6
- data/lib/pindo/module/build/build_helper.rb +28 -18
- data/lib/pindo/module/build/git_repo_helper.rb +284 -405
- data/lib/pindo/module/cert/pem_helper.rb +3 -6
- data/lib/pindo/module/pgyer/pgyerhelper.rb +193 -25
- data/lib/pindo/module/task/model/appstore/appstore_task.rb +5 -0
- data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +13 -187
- data/lib/pindo/module/task/model/build/android_build_dev_task.rb +36 -34
- data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +13 -187
- data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +9 -6
- data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +9 -6
- data/lib/pindo/module/task/model/build/ios_build_dev_task.rb +37 -32
- data/lib/pindo/module/task/model/build/web_build_dev_task.rb +7 -5
- data/lib/pindo/module/task/model/build_task.rb +8 -11
- data/lib/pindo/module/task/model/git/git_commit_task.rb +118 -0
- data/lib/pindo/module/task/model/git/git_tag_task.rb +125 -0
- data/lib/pindo/module/task/model/git_task.rb +75 -0
- data/lib/pindo/module/task/model/jps/jps_message_task.rb +178 -0
- data/lib/pindo/module/task/model/{resign → jps}/jps_resign_task.rb +13 -22
- data/lib/pindo/module/task/model/jps/jps_upload_media_task.rb +248 -0
- data/lib/pindo/module/task/model/jps/jps_upload_task.rb +38 -93
- data/lib/pindo/module/task/model/jps_task.rb +43 -0
- data/lib/pindo/module/task/model/resign/ipa_local_resign_task.rb +5 -0
- data/lib/pindo/module/task/model/unity/unity_config_task.rb +0 -4
- data/lib/pindo/module/task/model/unity/unity_export_task.rb +8 -7
- data/lib/pindo/module/task/model/unity/unity_update_task.rb +4 -3
- data/lib/pindo/module/task/model/unity/unity_yoo_asset_task.rb +8 -7
- data/lib/pindo/module/task/model/unity_task.rb +7 -2
- data/lib/pindo/module/task/pindo_task.rb +101 -1
- data/lib/pindo/module/task/task_manager.rb +29 -32
- data/lib/pindo/module/unity/nuget_helper.rb +7 -7
- data/lib/pindo/options/core/global_options_state.rb +96 -26
- data/lib/pindo/options/core/option_configuration.rb +3 -0
- data/lib/pindo/options/core/option_item.rb +36 -0
- data/lib/pindo/options/groups/build_options.rb +23 -6
- data/lib/pindo/options/groups/git_options.rb +115 -0
- data/lib/pindo/options/groups/jps_options.rb +7 -0
- data/lib/pindo/options/groups/option_group.rb +15 -0
- data/lib/pindo/options/groups/unity_options.rb +49 -0
- data/lib/pindo/options/options.rb +2 -0
- data/lib/pindo/version.rb +2 -2
- metadata +15 -11
- data/lib/pindo/base/githelper.rb +0 -686
- data/lib/pindo/base/pindocontext.rb +0 -602
- data/lib/pindo/command/utils/feishu.rb +0 -134
- data/lib/pindo/module/build/version_helper.rb +0 -146
- data/lib/pindo/module/task/model/git_tag_task.rb +0 -80
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
require 'pindo/module/task/model/jps_task'
|
|
2
|
+
require 'pindo/module/task/task_config'
|
|
3
|
+
require 'pindo/module/pgyer/pgyerhelper'
|
|
4
|
+
|
|
5
|
+
module Pindo
|
|
6
|
+
module TaskSystem
|
|
7
|
+
# JPS Media 上传任务
|
|
8
|
+
# 上传图片、视频等 media 文件到 JPS 并关联到提交记录
|
|
9
|
+
#
|
|
10
|
+
# 支持两种模式:
|
|
11
|
+
# 1. 指定模式:传入 file_paths 和 git_commit_id
|
|
12
|
+
# 2. 自动模式:只传入 project_path,自动查找 JPSMedia/ 目录和 git HEAD 信息
|
|
13
|
+
class JPSUploadMediaTask < JPSTask
|
|
14
|
+
attr_reader :file_paths, :git_commit_id, :git_commit_time, :git_commit_desc
|
|
15
|
+
attr_reader :workflow_id, :project_path
|
|
16
|
+
|
|
17
|
+
# 支持的媒体文件扩展名
|
|
18
|
+
MEDIA_EXTENSIONS = %w[png jpg jpeg gif bmp webp mp4 mov avi mkv webm].freeze
|
|
19
|
+
|
|
20
|
+
# 任务键
|
|
21
|
+
def self.task_key
|
|
22
|
+
:jps_upload_media
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# 初始化 Media 上传任务
|
|
26
|
+
# @param file_paths [Array<String>] 要上传的文件路径列表(可选,为空时自动查找)
|
|
27
|
+
# @param options [Hash] 选项
|
|
28
|
+
# @option options [String] :git_commit_id Git commit SHA(可选,为空时自动获取 HEAD)
|
|
29
|
+
# @option options [String] :git_commit_time Git commit 时间(可选)
|
|
30
|
+
# @option options [String] :git_commit_desc Git commit 描述(可选)
|
|
31
|
+
# @option options [Integer] :workflow_id 工作流ID(可选,用于筛选 commit_log)
|
|
32
|
+
# @option options [String] :project_name 项目名称(可选)
|
|
33
|
+
# @option options [String] :project_path 项目路径(必需,用于查找 git 仓库和 JPSMedia 目录)
|
|
34
|
+
def initialize(file_paths, options = {})
|
|
35
|
+
@file_paths = file_paths || [] # 要上传的文件路径列表
|
|
36
|
+
@git_commit_id = options[:git_commit_id] # Git commit SHA
|
|
37
|
+
@git_commit_time = options[:git_commit_time] # Git commit 时间
|
|
38
|
+
@git_commit_desc = options[:git_commit_desc] # Git commit 描述
|
|
39
|
+
@workflow_id = options[:workflow_id] # 工作流ID
|
|
40
|
+
@project_path = options[:project_path] # 项目路径
|
|
41
|
+
|
|
42
|
+
# 设置任务优先级为 LOW,确保在其他任务之后执行
|
|
43
|
+
options[:priority] ||= TaskPriority::LOW
|
|
44
|
+
|
|
45
|
+
name = "上传 Media 附件"
|
|
46
|
+
|
|
47
|
+
super(name, options)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def validate
|
|
51
|
+
# 验证 project_path(必需参数)
|
|
52
|
+
unless @project_path && !@project_path.empty? && Dir.exist?(@project_path)
|
|
53
|
+
@error = "缺少必需参数: project_path(项目路径)或路径不存在"
|
|
54
|
+
return false
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
true
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Media 上传任务重试配置
|
|
61
|
+
def self.default_retry_mode
|
|
62
|
+
RetryMode::DELAYED
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def self.default_retry_count
|
|
66
|
+
2 # Media 上传重试次数较少
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.default_retry_delay
|
|
70
|
+
5 # 延迟 5 秒
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
protected
|
|
74
|
+
|
|
75
|
+
# 构建任务参数(供其他任务使用)
|
|
76
|
+
def build_task_param
|
|
77
|
+
return {} unless @status == TaskStatus::SUCCESS && @result
|
|
78
|
+
|
|
79
|
+
{
|
|
80
|
+
success_urls: @result[:success_urls],
|
|
81
|
+
failed_files: @result[:failed_files],
|
|
82
|
+
all_urls: @result[:all_urls],
|
|
83
|
+
commit_log_id: @result[:commit_log_id],
|
|
84
|
+
git_commit_id: @result[:git_commit_id]
|
|
85
|
+
}
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def do_work
|
|
89
|
+
# 1. 查找 git 仓库根目录
|
|
90
|
+
git_root = find_git_root(@project_path)
|
|
91
|
+
unless git_root
|
|
92
|
+
raise "未找到 git 仓库,请确保 project_path 在 git 仓库内"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# 2. 如果没有提供 git_commit_id,自动获取 HEAD 信息
|
|
96
|
+
if @git_commit_id.nil? || @git_commit_id.empty?
|
|
97
|
+
git_info = get_git_head_info(git_root)
|
|
98
|
+
@git_commit_id = git_info[:commit_id]
|
|
99
|
+
@git_commit_time = git_info[:commit_time]
|
|
100
|
+
@git_commit_desc = git_info[:commit_desc]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# 验证 git_commit_id
|
|
104
|
+
if @git_commit_id.nil? || @git_commit_id.empty?
|
|
105
|
+
raise "无法获取 git commit id,请确保在 git 仓库中运行"
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# 3. 打印 git commit 信息
|
|
109
|
+
puts
|
|
110
|
+
puts " ===== Git Commit 信息 ====="
|
|
111
|
+
puts " Commit ID: #{@git_commit_id}"
|
|
112
|
+
puts " Commit Time: #{@git_commit_time}" if @git_commit_time
|
|
113
|
+
puts " Commit Desc: #{@git_commit_desc}" if @git_commit_desc
|
|
114
|
+
puts " " + "=" * 28
|
|
115
|
+
puts
|
|
116
|
+
|
|
117
|
+
# 4. 如果 file_paths 为空,自动查找 JPSMedia 目录
|
|
118
|
+
if @file_paths.nil? || @file_paths.empty?
|
|
119
|
+
@file_paths = find_media_files(git_root)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# 过滤存在的文件
|
|
123
|
+
existing_files = @file_paths.select { |f| File.exist?(f) }
|
|
124
|
+
if existing_files.empty?
|
|
125
|
+
puts " 没有找到有效的 media 文件"
|
|
126
|
+
puts " 提示: 请在项目根目录创建 JPSMedia/ 目录并放入要上传的图片或视频文件"
|
|
127
|
+
return {
|
|
128
|
+
success: false,
|
|
129
|
+
success_urls: [],
|
|
130
|
+
failed_files: @file_paths,
|
|
131
|
+
existing_urls: [],
|
|
132
|
+
all_urls: [],
|
|
133
|
+
commit_log_id: nil,
|
|
134
|
+
git_commit_id: @git_commit_id,
|
|
135
|
+
update_success: false
|
|
136
|
+
}
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
puts " 准备上传 #{existing_files.size} 个文件"
|
|
140
|
+
existing_files.each_with_index do |file, index|
|
|
141
|
+
puts " #{index + 1}. #{File.basename(file)}"
|
|
142
|
+
end
|
|
143
|
+
puts
|
|
144
|
+
|
|
145
|
+
# 5. 确保 PgyerHelper 已登录
|
|
146
|
+
pgyer_helper = PgyerHelper.share_instace
|
|
147
|
+
unless pgyer_helper.login
|
|
148
|
+
raise "JPS 登录失败"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# 6. 调用 PgyerHelper 的 start_media_upload 方法
|
|
152
|
+
upload_result = pgyer_helper.start_media_upload(
|
|
153
|
+
file_paths: existing_files,
|
|
154
|
+
git_commit_id: @git_commit_id,
|
|
155
|
+
workflow_id: @workflow_id
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
# 7. 判断是否成功
|
|
159
|
+
if upload_result[:success_urls].any?
|
|
160
|
+
# 上传成功后,将重试次数设为 0
|
|
161
|
+
@retry_count = 0
|
|
162
|
+
|
|
163
|
+
{
|
|
164
|
+
success: true,
|
|
165
|
+
success_urls: upload_result[:success_urls],
|
|
166
|
+
failed_files: upload_result[:failed_files],
|
|
167
|
+
existing_urls: upload_result[:existing_urls],
|
|
168
|
+
all_urls: upload_result[:all_urls],
|
|
169
|
+
commit_log_id: upload_result[:commit_log_id],
|
|
170
|
+
git_commit_id: upload_result[:git_commit_id],
|
|
171
|
+
update_success: upload_result[:update_success]
|
|
172
|
+
}
|
|
173
|
+
elsif upload_result[:commit_log_id].nil?
|
|
174
|
+
# 未找到 commit_log 记录,不重试
|
|
175
|
+
@retry_count = 0
|
|
176
|
+
raise "未找到 git commit id 对应的 JPS 提交记录"
|
|
177
|
+
else
|
|
178
|
+
raise "所有文件上传失败"
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
private
|
|
183
|
+
|
|
184
|
+
# 查找 git 仓库根目录
|
|
185
|
+
# @param path [String] 起始路径
|
|
186
|
+
# @return [String, nil] git 仓库根目录路径,未找到返回 nil
|
|
187
|
+
def find_git_root(path)
|
|
188
|
+
current = File.expand_path(path)
|
|
189
|
+
while current != '/'
|
|
190
|
+
if File.exist?(File.join(current, '.git'))
|
|
191
|
+
return current
|
|
192
|
+
end
|
|
193
|
+
current = File.dirname(current)
|
|
194
|
+
end
|
|
195
|
+
nil
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
# 获取 git HEAD 信息
|
|
199
|
+
# @param git_root [String] git 仓库根目录
|
|
200
|
+
# @return [Hash] 包含 :commit_id, :commit_time, :commit_desc
|
|
201
|
+
def get_git_head_info(git_root)
|
|
202
|
+
result = {
|
|
203
|
+
commit_id: nil,
|
|
204
|
+
commit_time: nil,
|
|
205
|
+
commit_desc: nil
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
Dir.chdir(git_root) do
|
|
209
|
+
# 获取 HEAD commit id
|
|
210
|
+
commit_id = `git rev-parse HEAD 2>/dev/null`.strip
|
|
211
|
+
result[:commit_id] = commit_id unless commit_id.empty?
|
|
212
|
+
|
|
213
|
+
# 获取 commit time (ISO 8601 格式)
|
|
214
|
+
commit_time = `git log -1 --format=%ci 2>/dev/null`.strip
|
|
215
|
+
result[:commit_time] = commit_time unless commit_time.empty?
|
|
216
|
+
|
|
217
|
+
# 获取 commit message (第一行)
|
|
218
|
+
commit_desc = `git log -1 --format=%s 2>/dev/null`.strip
|
|
219
|
+
result[:commit_desc] = commit_desc unless commit_desc.empty?
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
result
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# 在 JPSMedia 目录下查找 media 文件
|
|
226
|
+
# @param git_root [String] git 仓库根目录
|
|
227
|
+
# @return [Array<String>] 找到的文件路径列表
|
|
228
|
+
def find_media_files(git_root)
|
|
229
|
+
jps_media_dir = File.join(git_root, 'JPSMedia')
|
|
230
|
+
|
|
231
|
+
unless File.directory?(jps_media_dir)
|
|
232
|
+
puts " 未找到 JPSMedia/ 目录: #{jps_media_dir}"
|
|
233
|
+
return []
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
puts " 在 #{jps_media_dir} 目录查找 media 文件..."
|
|
237
|
+
|
|
238
|
+
# 使用 glob 查找所有支持的媒体文件
|
|
239
|
+
pattern = File.join(jps_media_dir, "**", "*.{#{MEDIA_EXTENSIONS.join(',')}}")
|
|
240
|
+
files = Dir.glob(pattern, File::FNM_CASEFOLD)
|
|
241
|
+
|
|
242
|
+
# 过滤有效文件并去重
|
|
243
|
+
files.uniq.select { |f| File.file?(f) }
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require 'pindo/module/task/
|
|
1
|
+
require 'pindo/module/task/model/jps_task'
|
|
2
2
|
require 'pindo/module/task/task_config'
|
|
3
3
|
require 'pindo/module/pgyer/pgyerhelper'
|
|
4
4
|
|
|
@@ -6,24 +6,12 @@ module Pindo
|
|
|
6
6
|
module TaskSystem
|
|
7
7
|
# JPS 上传任务
|
|
8
8
|
# 上传构建产物到 JPS 测试平台
|
|
9
|
-
class JPSUploadTask <
|
|
9
|
+
class JPSUploadTask < JPSTask
|
|
10
10
|
attr_reader :file_type, :upload_path, :upload_file
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
# 重试配置
|
|
17
|
-
def self.default_retry_mode
|
|
18
|
-
RetryMode::DELAYED # 延迟重试
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def self.default_retry_count
|
|
22
|
-
3 # 默认可以重试 3 次
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def self.default_retry_delay
|
|
26
|
-
10 # 默认延迟 10 秒
|
|
12
|
+
# 任务键
|
|
13
|
+
def self.task_key
|
|
14
|
+
:jps_upload
|
|
27
15
|
end
|
|
28
16
|
|
|
29
17
|
# 初始化上传任务
|
|
@@ -39,11 +27,6 @@ module Pindo
|
|
|
39
27
|
@file_type = file_type # 'ipa' | 'apk' | 'html' | 'app'
|
|
40
28
|
@upload_path = upload_path # 搜索文件的路径
|
|
41
29
|
@upload_file = upload_file # 要上传的文件(nil 表示自动查找)
|
|
42
|
-
|
|
43
|
-
# 可选参数(如果为 nil,在 do_work 中延迟获取)
|
|
44
|
-
@app_info_obj = options[:app_info_obj]
|
|
45
|
-
@workflow_info = options[:workflow_info]
|
|
46
|
-
@project_name = options[:project_name]
|
|
47
30
|
@upload_desc = options[:upload_desc] # 上传描述
|
|
48
31
|
|
|
49
32
|
# 设置上传任务的优先级为 LOW,确保在构建任务之后执行
|
|
@@ -87,6 +70,19 @@ module Pindo
|
|
|
87
70
|
|
|
88
71
|
protected
|
|
89
72
|
|
|
73
|
+
# 构建任务参数(供其他任务使用)
|
|
74
|
+
def build_task_param
|
|
75
|
+
# 只有在任务成功完成后才返回有效数据
|
|
76
|
+
return {} unless @status == TaskStatus::SUCCESS && @result
|
|
77
|
+
|
|
78
|
+
{
|
|
79
|
+
app_version_info: @result[:app_version_info],
|
|
80
|
+
app_info_obj: @result[:app_info_obj],
|
|
81
|
+
file_type: @result[:file_type],
|
|
82
|
+
file_path: @result[:file_path]
|
|
83
|
+
}
|
|
84
|
+
end
|
|
85
|
+
|
|
90
86
|
def do_work
|
|
91
87
|
# 1. 确定上传文件
|
|
92
88
|
if @upload_file && !@upload_file.empty? && File.exist?(@upload_file)
|
|
@@ -106,16 +102,22 @@ module Pindo
|
|
|
106
102
|
|
|
107
103
|
# 2. 如果没有 JPS 配置,延迟获取
|
|
108
104
|
if @app_info_obj.nil? || @workflow_info.nil?
|
|
109
|
-
|
|
105
|
+
package_type = @file_type == 'html' ? 'zip' : @file_type
|
|
106
|
+
@app_info_obj, @workflow_info = fetch_jps_config(
|
|
107
|
+
working_directory: @upload_path,
|
|
108
|
+
package_type: package_type
|
|
109
|
+
)
|
|
110
110
|
end
|
|
111
111
|
|
|
112
112
|
# 3. 上传到 JPS
|
|
113
|
-
upload_to_jps(file_to_upload)
|
|
113
|
+
app_version_info = upload_to_jps(file_to_upload)
|
|
114
114
|
|
|
115
115
|
{
|
|
116
116
|
success: true,
|
|
117
117
|
file_type: @file_type,
|
|
118
|
-
file_path: file_to_upload
|
|
118
|
+
file_path: file_to_upload,
|
|
119
|
+
app_version_info: app_version_info,
|
|
120
|
+
app_info_obj: @app_info_obj
|
|
119
121
|
}
|
|
120
122
|
end
|
|
121
123
|
|
|
@@ -152,18 +154,15 @@ module Pindo
|
|
|
152
154
|
end
|
|
153
155
|
end
|
|
154
156
|
|
|
155
|
-
# 延迟获取 JPS
|
|
156
|
-
|
|
157
|
+
# 延迟获取 JPS 配置(上传任务专用)
|
|
158
|
+
# @return [Array] 返回 [app_info_obj, workflow_info]
|
|
159
|
+
def fetch_jps_config(working_directory: Dir.pwd, package_type: nil)
|
|
157
160
|
puts " 获取 JPS 配置..."
|
|
158
161
|
|
|
159
|
-
|
|
160
|
-
package_type = @file_type == 'html' ? 'zip' : @file_type
|
|
161
|
-
|
|
162
|
-
# 获取项目目录(从文件路径推断)
|
|
163
|
-
working_directory = @upload_path
|
|
162
|
+
pgyer_helper = PgyerHelper.share_instace
|
|
164
163
|
|
|
165
|
-
#
|
|
166
|
-
@app_info_obj, @workflow_info =
|
|
164
|
+
# 上传任务需要 package_type 和 workflow_info
|
|
165
|
+
@app_info_obj, @workflow_info = pgyer_helper.prepare_upload(
|
|
167
166
|
working_directory: working_directory,
|
|
168
167
|
proj_name: @project_name,
|
|
169
168
|
package_type: package_type
|
|
@@ -172,9 +171,12 @@ module Pindo
|
|
|
172
171
|
unless @app_info_obj && @workflow_info
|
|
173
172
|
raise "无法获取 JPS 配置"
|
|
174
173
|
end
|
|
174
|
+
|
|
175
|
+
[@app_info_obj, @workflow_info]
|
|
175
176
|
end
|
|
176
177
|
|
|
177
178
|
# 上传到 JPS 测试平台
|
|
179
|
+
# @return [Hash] 应用版本信息
|
|
178
180
|
def upload_to_jps(file_path)
|
|
179
181
|
pgyer_helper = PgyerHelper.share_instace
|
|
180
182
|
|
|
@@ -197,67 +199,10 @@ module Pindo
|
|
|
197
199
|
|
|
198
200
|
app_version_info = result_data["data"]
|
|
199
201
|
|
|
200
|
-
#
|
|
201
|
-
|
|
202
|
+
# 返回版本信息,由外部创建 JPSMessageTask 处理消息发送
|
|
203
|
+
app_version_info
|
|
202
204
|
end
|
|
203
205
|
|
|
204
|
-
# 处理上传成功后的操作
|
|
205
|
-
# @param app_version_info [Hash] 应用版本信息
|
|
206
|
-
def handle_post_upload_actions(app_version_info)
|
|
207
|
-
puts "\n 📋 开始处理上传后续操作..."
|
|
208
|
-
|
|
209
|
-
begin
|
|
210
|
-
pgyer_helper = PgyerHelper.share_instace
|
|
211
|
-
|
|
212
|
-
# 打印应用版本信息(失败只警告,不中断)
|
|
213
|
-
begin
|
|
214
|
-
puts " 📝 打印应用版本信息..."
|
|
215
|
-
pgyer_helper.print_app_version_info(
|
|
216
|
-
app_info_obj: @app_info_obj,
|
|
217
|
-
app_version_info_obj: app_version_info
|
|
218
|
-
)
|
|
219
|
-
puts " ✓ 应用版本信息打印成功"
|
|
220
|
-
rescue => e
|
|
221
|
-
puts " ⚠️ 打印应用版本信息失败: #{e.message}"
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
# 发送消息给自己(失败只警告,不中断)
|
|
225
|
-
begin
|
|
226
|
-
puts " 📨 发送消息给自己..."
|
|
227
|
-
pgyer_helper.send_apptest_msg(
|
|
228
|
-
app_info_obj: @app_info_obj,
|
|
229
|
-
app_version_info_obj: app_version_info,
|
|
230
|
-
receiveType: "self"
|
|
231
|
-
)
|
|
232
|
-
puts " ✓ 消息发送成功"
|
|
233
|
-
rescue => e
|
|
234
|
-
puts " ⚠️ 发送消息给自己失败: #{e.message}"
|
|
235
|
-
end
|
|
236
|
-
|
|
237
|
-
# 如果需要发送到测试群(失败只警告,不中断)
|
|
238
|
-
if @context[:send_to_chat]
|
|
239
|
-
begin
|
|
240
|
-
puts " 📢 发送消息到测试群..."
|
|
241
|
-
pgyer_helper.send_apptest_msg(
|
|
242
|
-
app_info_obj: @app_info_obj,
|
|
243
|
-
app_version_info_obj: app_version_info,
|
|
244
|
-
chatEnv: "DevTest",
|
|
245
|
-
receiveType: "chat"
|
|
246
|
-
)
|
|
247
|
-
puts " ✓ 测试群消息发送成功"
|
|
248
|
-
rescue => e
|
|
249
|
-
puts " ⚠️ 发送消息到测试群失败: #{e.message}"
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
puts " ✅ 上传后续操作全部完成\n"
|
|
254
|
-
rescue => e
|
|
255
|
-
# 外层错误保护:任何未预期的错误都不应影响上传任务的成功状态
|
|
256
|
-
puts " ⚠️ 上传后续操作发生未预期错误: #{e.message}"
|
|
257
|
-
puts " ⚠️ 错误堆栈: #{e.backtrace.first(3).join("\n ")}" if e.backtrace
|
|
258
|
-
puts " ℹ️ 上传已成功,后续操作失败不影响上传结果\n"
|
|
259
|
-
end
|
|
260
|
-
end
|
|
261
206
|
end
|
|
262
207
|
end
|
|
263
208
|
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'pindo/module/task/pindo_task'
|
|
2
|
+
require 'pindo/module/pgyer/pgyerhelper'
|
|
3
|
+
|
|
4
|
+
module Pindo
|
|
5
|
+
module TaskSystem
|
|
6
|
+
# JPS 任务基类
|
|
7
|
+
# 所有 JPS 相关任务的父类,提供通用的 JPS 操作和配置
|
|
8
|
+
class JPSTask < PindoTask
|
|
9
|
+
attr_reader :app_info_obj, :workflow_info, :project_name
|
|
10
|
+
|
|
11
|
+
def initialize(name, options = {})
|
|
12
|
+
@app_info_obj = options[:app_info_obj]
|
|
13
|
+
@workflow_info = options[:workflow_info]
|
|
14
|
+
@project_name = options[:project_name]
|
|
15
|
+
|
|
16
|
+
super(name, options)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# JPS 任务类型
|
|
20
|
+
def self.task_type
|
|
21
|
+
:jps
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# JPS 任务类型显示名称
|
|
25
|
+
def self.task_type_name
|
|
26
|
+
"JPS操作"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# JPS 任务默认重试配置
|
|
30
|
+
def self.default_retry_mode
|
|
31
|
+
RetryMode::DELAYED # 延迟重试
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.default_retry_count
|
|
35
|
+
3 # 默认重试 3 次
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.default_retry_delay
|
|
39
|
+
10 # 默认延迟 10 秒
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -8,10 +8,6 @@ module Pindo
|
|
|
8
8
|
class UnityConfigTask < UnityTask
|
|
9
9
|
attr_reader :deploy_mode
|
|
10
10
|
|
|
11
|
-
def self.task_type
|
|
12
|
-
:unity_config
|
|
13
|
-
end
|
|
14
|
-
|
|
15
11
|
# @param deploy_mode [String] 部署模式 ('dev', 'adhoc', 'release')
|
|
16
12
|
# @param options [Hash] 额外选项
|
|
17
13
|
# - :project_path [String] Unity 项目路径(默认当前目录)
|
|
@@ -8,7 +8,8 @@ module Pindo
|
|
|
8
8
|
class UnityExportTask < UnityTask
|
|
9
9
|
attr_reader :platform, :export_path, :deploy_mode, :is_library_mode
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
# 任务键
|
|
12
|
+
def self.task_key
|
|
12
13
|
:unity_export
|
|
13
14
|
end
|
|
14
15
|
|
|
@@ -28,18 +29,18 @@ module Pindo
|
|
|
28
29
|
|
|
29
30
|
name = case platform
|
|
30
31
|
when 'ios', 'ipa'
|
|
31
|
-
"Unity
|
|
32
|
+
"Unity导出iOS平台"
|
|
32
33
|
when 'android', 'apk'
|
|
33
|
-
"Unity
|
|
34
|
+
"Unity导出Android平台"
|
|
34
35
|
when 'web', 'html'
|
|
35
|
-
"Unity
|
|
36
|
+
"Unity导出WebGL平台"
|
|
36
37
|
else
|
|
37
|
-
"Unity
|
|
38
|
+
"Unity导出#{platform.upcase}平台"
|
|
38
39
|
end
|
|
39
40
|
|
|
40
41
|
# 传递 project_path 给基类
|
|
41
|
-
|
|
42
|
-
super(name,
|
|
42
|
+
options[:project_path] ||= Dir.pwd
|
|
43
|
+
super(name, options)
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
def validate
|
|
@@ -6,7 +6,8 @@ module Pindo
|
|
|
6
6
|
# Unity 更新必备库任务
|
|
7
7
|
# 用于强制更新 Unity 项目的必备库(NugetForUnity)
|
|
8
8
|
class UnityUpdateTask < UnityTask
|
|
9
|
-
|
|
9
|
+
# 任务键
|
|
10
|
+
def self.task_key
|
|
10
11
|
:unity_update
|
|
11
12
|
end
|
|
12
13
|
|
|
@@ -16,8 +17,8 @@ module Pindo
|
|
|
16
17
|
@unity_exe_path = nil # 将在 do_work 中自动查找
|
|
17
18
|
|
|
18
19
|
# 传递 project_path 给基类
|
|
19
|
-
|
|
20
|
-
super("Unity工具库更新",
|
|
20
|
+
options[:project_path] ||= Dir.pwd
|
|
21
|
+
super("Unity工具库更新", options)
|
|
21
22
|
end
|
|
22
23
|
|
|
23
24
|
def validate
|
|
@@ -8,7 +8,8 @@ module Pindo
|
|
|
8
8
|
class UnityYooAssetTask < UnityTask
|
|
9
9
|
attr_reader :platform
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
# 任务键
|
|
12
|
+
def self.task_key
|
|
12
13
|
:unity_yoo_asset
|
|
13
14
|
end
|
|
14
15
|
|
|
@@ -21,18 +22,18 @@ module Pindo
|
|
|
21
22
|
|
|
22
23
|
name = case platform
|
|
23
24
|
when 'ios', 'ipa'
|
|
24
|
-
"
|
|
25
|
+
"YooAsset打包iOS平台资源"
|
|
25
26
|
when 'android', 'apk'
|
|
26
|
-
"
|
|
27
|
+
"YooAsset打包Android平台资源"
|
|
27
28
|
when 'web', 'html'
|
|
28
|
-
"
|
|
29
|
+
"YooAsset打包WebGL平台资源"
|
|
29
30
|
else
|
|
30
|
-
"
|
|
31
|
+
"YooAsset打包#{platform.upcase}资源"
|
|
31
32
|
end
|
|
32
33
|
|
|
33
34
|
# 传递 project_path 给基类
|
|
34
|
-
|
|
35
|
-
super(name,
|
|
35
|
+
options[:project_path] ||= Dir.pwd
|
|
36
|
+
super(name, options)
|
|
36
37
|
end
|
|
37
38
|
|
|
38
39
|
def validate
|
|
@@ -9,8 +9,8 @@ module Pindo
|
|
|
9
9
|
class UnityTask < PindoTask
|
|
10
10
|
attr_reader :project_path, :unity_root_path
|
|
11
11
|
|
|
12
|
-
def initialize(name,
|
|
13
|
-
@project_path = File.expand_path(project_path)
|
|
12
|
+
def initialize(name, options = {})
|
|
13
|
+
@project_path = options[:project_path] ? File.expand_path(options[:project_path]) : nil
|
|
14
14
|
@unity_root_path = options[:unity_root_path] || @project_path
|
|
15
15
|
|
|
16
16
|
super(name, options)
|
|
@@ -21,6 +21,11 @@ module Pindo
|
|
|
21
21
|
:unity
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
# Unity 任务类型显示名称
|
|
25
|
+
def self.task_type_name
|
|
26
|
+
"Unity操作"
|
|
27
|
+
end
|
|
28
|
+
|
|
24
29
|
# Unity 任务默认重试配置
|
|
25
30
|
def self.default_retry_mode
|
|
26
31
|
RetryMode::DELAYED
|