pindo 5.13.1 → 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/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 +9 -6
- 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_config_helper.rb +9 -5
- 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/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 -40
- 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,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]
|
|
@@ -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 Google Play 模式构建任务
|
|
13
|
+
# 使用 Release 模式编译 Android 工程用于 Google Play 发布
|
|
14
|
+
class AndroidBuildGPlayTask < 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, :release, options)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
protected
|
|
31
|
+
|
|
32
|
+
def build_task_name
|
|
33
|
+
"构建 APK (Release)"
|
|
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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require_relative '../build_task'
|
|
2
|
+
|
|
3
|
+
module Pindo
|
|
4
|
+
module TaskSystem
|
|
5
|
+
# Android 构建任务基类
|
|
6
|
+
# 所有 Android 平台构建任务的抽象基类
|
|
7
|
+
# 子类包括:AndroidBuildDevTask、AndroidBuildAdhocTask、AndroidBuildGPlayTask
|
|
8
|
+
class AndroidBuildTask < BuildTask
|
|
9
|
+
# 空基类,仅用于类型标识
|
|
10
|
+
# 所有具体实现由子类完成
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
require_relative 'ios_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/xcode/xcode_build_config'
|
|
6
|
+
require 'pindo/module/xcode/xcode_build_helper'
|
|
7
|
+
require 'pindo/module/pgyer/pgyerhelper'
|
|
8
|
+
|
|
9
|
+
module Pindo
|
|
10
|
+
module TaskSystem
|
|
11
|
+
# iOS AdHoc 模式构建任务
|
|
12
|
+
# 使用 AdHoc 证书编译 iOS 工程
|
|
13
|
+
class IosBuildAdhocTask < IosBuildTask
|
|
14
|
+
def initialize(options = {})
|
|
15
|
+
@bundle_id = options[:bundle_id]
|
|
16
|
+
|
|
17
|
+
@proj_name = options[:proj_name]
|
|
18
|
+
|
|
19
|
+
@upload_flag = options[:upload] || false
|
|
20
|
+
@send_flag = options[:send] || false
|
|
21
|
+
@macos_flag = false
|
|
22
|
+
|
|
23
|
+
# 接收外部传入的 JPS 配置
|
|
24
|
+
@app_info_obj = options[:app_info_obj]
|
|
25
|
+
@workflow_info = options[:workflow_info]
|
|
26
|
+
|
|
27
|
+
# 保存 Unity 根目录路径(用于查找 config.json)
|
|
28
|
+
@unity_root_path = options[:unity_root_path]
|
|
29
|
+
|
|
30
|
+
super(:ios, :adhoc, options)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
protected
|
|
34
|
+
|
|
35
|
+
def build_task_name
|
|
36
|
+
"构建 IPA (AdHoc)"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def prepare_build
|
|
40
|
+
|
|
41
|
+
Dir.chdir(@project_path)
|
|
42
|
+
cleanup_firebase_shell
|
|
43
|
+
update_project_config
|
|
44
|
+
update_version_info
|
|
45
|
+
pull_config
|
|
46
|
+
handle_cocoapods
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def execute_build
|
|
50
|
+
configure_certificate
|
|
51
|
+
update_url_schemes_final
|
|
52
|
+
build_ios_project
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def find_output
|
|
56
|
+
build_path = File.join(@project_path, "build", "*.{ipa,app}")
|
|
57
|
+
ipa_files = Dir.glob(build_path)
|
|
58
|
+
|
|
59
|
+
if ipa_files.any?
|
|
60
|
+
latest_ipa = ipa_files.max_by { |f| File.mtime(f) }
|
|
61
|
+
puts " 找到 IPA 文件: #{latest_ipa}"
|
|
62
|
+
latest_ipa
|
|
63
|
+
else
|
|
64
|
+
puts " 警告: 未找到 IPA 文件"
|
|
65
|
+
nil
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# 清理 Firebase Shell Script
|
|
74
|
+
def cleanup_firebase_shell
|
|
75
|
+
project_fullname = Dir.glob(File.join(@project_path, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
|
|
76
|
+
if !project_fullname.nil? && File.exist?(project_fullname)
|
|
77
|
+
Pindo::XcodeBuildHelper.delete_libtarget_firebase_shell(@project_path)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# 更新工程配置
|
|
82
|
+
def update_project_config
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# 更新版本号
|
|
88
|
+
def update_version_info
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# 拉取配置
|
|
93
|
+
def pull_config
|
|
94
|
+
return unless @bundle_id
|
|
95
|
+
|
|
96
|
+
build_helper = Pindo::BuildHelper.share_instance
|
|
97
|
+
build_helper.pull_appconfig_with_reponame(
|
|
98
|
+
repo_name: @bundle_id,
|
|
99
|
+
target_dir: @project_path
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# 重新加载配置到 IosConfigParser
|
|
103
|
+
config_file = File.join(@project_path, "config.json")
|
|
104
|
+
if File.exist?(config_file)
|
|
105
|
+
Pindo::IosConfigParser.instance.load_config(config_file: config_file)
|
|
106
|
+
else
|
|
107
|
+
raise Informative, "配置文件不存在: #{config_file}"
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# 处理 CocoaPods
|
|
113
|
+
def handle_cocoapods
|
|
114
|
+
return unless File.exist?(File.join(@project_path, "Podfile"))
|
|
115
|
+
|
|
116
|
+
Dir.chdir(@project_path)
|
|
117
|
+
Pindo::Command::Ios::Podupdate::run([])
|
|
118
|
+
|
|
119
|
+
begin
|
|
120
|
+
# 清理现有 Pods
|
|
121
|
+
FileUtils.rm_rf(File.join(@project_path, "Podfile.lock")) if File.exist?(File.join(@project_path, "Podfile.lock"))
|
|
122
|
+
FileUtils.rm_rf(File.join(@project_path, "Pods")) if File.exist?(File.join(@project_path, "Pods"))
|
|
123
|
+
|
|
124
|
+
puts "正在执行 pod deintegrate..."
|
|
125
|
+
system 'pod deintegrate'
|
|
126
|
+
|
|
127
|
+
puts "正在执行 pod install..."
|
|
128
|
+
system 'pod install'
|
|
129
|
+
rescue => error
|
|
130
|
+
puts(error.to_s)
|
|
131
|
+
raise Informative, "pod install 失败!!先 pod install 完成后再编译!"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# 检查 pod install 是否成功
|
|
135
|
+
pod_lock_file = File.join(@project_path, "Podfile.lock")
|
|
136
|
+
unless File.exist?(pod_lock_file)
|
|
137
|
+
raise Informative, "pod install 失败!!先 pod install 完成后再编译!"
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# 配置证书
|
|
142
|
+
def configure_certificate
|
|
143
|
+
detect_macos_platform
|
|
144
|
+
|
|
145
|
+
# 使用新的证书安装方法
|
|
146
|
+
# config.json 已经通过 pull_config 方法拉取到 @project_path 目录
|
|
147
|
+
require 'pindo/module/cert/xcode_cert_helper'
|
|
148
|
+
Pindo::XcodeCertHelper.install_and_config_certs(
|
|
149
|
+
build_type: 'adhoc',
|
|
150
|
+
platform_type: @macos_flag ? 'macos' : 'ios',
|
|
151
|
+
project_dir: @project_path
|
|
152
|
+
)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# 检测是否为 macOS 平台
|
|
156
|
+
def detect_macos_platform
|
|
157
|
+
project_fullname = Dir.glob(File.join(@project_path, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
|
|
158
|
+
return if project_fullname.nil?
|
|
159
|
+
|
|
160
|
+
require 'xcodeproj'
|
|
161
|
+
project_obj = Xcodeproj::Project.open(project_fullname)
|
|
162
|
+
project_build_platform = project_obj.root_object.build_configuration_list.get_setting("SDKROOT")["Release"]
|
|
163
|
+
|
|
164
|
+
if !project_build_platform.nil? && project_build_platform.eql?("macosx")
|
|
165
|
+
@macos_flag = true
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# 更新 URL Schemes(基于最终 Bundle ID)
|
|
170
|
+
def update_url_schemes_final
|
|
171
|
+
workflow_packname = @workflow_info[:package_name]
|
|
172
|
+
Pindo::XcodeBuildConfig.update_url_schemes_with_bundleid(
|
|
173
|
+
project_dir: @project_path,
|
|
174
|
+
package_name: workflow_packname
|
|
175
|
+
)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# 编译 iOS 工程
|
|
179
|
+
def build_ios_project
|
|
180
|
+
Dir.chdir(@project_path)
|
|
181
|
+
|
|
182
|
+
# 使用 XcodeBuildHelper 进行构建
|
|
183
|
+
ipa_file = Pindo::XcodeBuildHelper.build_project(
|
|
184
|
+
project_dir: @project_path,
|
|
185
|
+
icloud_id: nil
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
if ipa_file.nil?
|
|
189
|
+
raise Informative, "构建失败:未生成 IPA 文件"
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
puts "构建成功:#{ipa_file}"
|
|
193
|
+
ipa_file
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|