Class: Pindo::Command::Ios::Autobuild

Inherits:
Pindo::Command::Ios show all
Includes:
Appselect, Githelper
Defined in:
lib/pindo/command/ios/autobuild.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Githelper

#add_branch, #add_tag, #add_tag_with_check, #clone_clang_repo, #clone_devclang_repo, #clone_pindo_common_config_repo, #clone_pindo_env_config_repo, #clong_buildconfig_repo, #get_repo_base_name, #getcode_to_dir, #git_addpush_repo, #git_latest_commit_id, #git_root_directory, #is_git_directory?, #local_branch_exists?, #local_tag_exists?, #prepare_gitenv, #process_need_add_files, #remote_branch_exists?, #remote_tag_exists?, #remove_branch, #remove_tag

Methods included from Executable

capture_command, #executable, execute_command, which, which!

Methods included from Appselect

#all_dev_bundleid, #all_itc_bundleid, #all_release_bundleid, #all_tool_bundleid, #deploy_build_setting_json, #dev_build_setting_json, #get_deploy_repo_with_modul_name, #get_deploy_setting_repo, #get_dev_setting_repo, #get_selected_deploy_bundleid, #get_selected_dev_bundleid, #get_setting_bundleid_withdir, #load_setting, #select_main_app

Constructor Details

#initialize(argv) ⇒ Autobuild

Returns a new instance of Autobuild.



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/pindo/command/ios/autobuild.rb', line 66

def initialize(argv)

    @args_deploy_flag = argv.flag?('deploy', false)
    @args_adhoc_flag = argv.flag?('adhoc', false)  
    @args_upload_flag = argv.flag?('upload', false)  
    @args_send_flag = argv.flag?('send', false)  
    @args_proj_name = argv.option('proj')  
    @args_bundle_id = argv.option('bundleid')

    if @args_send_flag
        @args_upload_flag = true
    end

    super
    @additional_args = argv.remainder!
end

Class Method Details

.optionsObject

命令的选项列表



55
56
57
58
59
60
61
62
63
64
# File 'lib/pindo/command/ios/autobuild.rb', line 55

def self.options
    [
        ['--bundleid=ID', '指定打包的Bundle ID'],
        ['--proj=NAME',   '指定上传到测试平台的项目名称'],
        ['--upload',      '编译后上传到测试平台(上传成功后自动发送给自己)'],
        ['--send',        '发送通知到测试群组(同时也会发送给自己)'],
        ['--adhoc',       '使用AdHoc证书打包(默认使用Dev证书)'],
        ['--deploy',      '使用发布证书打包']
    ].concat(super)
end

.use_cache?Boolean

启用缓存机制

Returns:

  • (Boolean)


22
23
24
# File 'lib/pindo/command/ios/autobuild.rb', line 22

def self.use_cache?
    true  # 此命令启用缓存
end

Instance Method Details

#ios_autobuildObject



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
# File 'lib/pindo/command/ios/autobuild.rb', line 120

def ios_autobuild
    # 记录构建开始时间
    build_start_time = Time.now

    pindo_project_dir = Dir.pwd
    build_helper = Pindo::BuildHelper.share_instance
    if @args_upload_flag
      is_need_add_tag,tag_action_parms = build_helper.check_is_need_add_tag?(pindo_project_dir)
      if is_need_add_tag
          Pindo::Command::Dev::Tag::run(tag_action_parms)
      end
    end
    new_project_fullname = Dir.glob(File.join(pindo_project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
    if !new_project_fullname.nil? && File.exist?(new_project_fullname)
        build_helper.delete_libtarget_firebase_shell(pindo_project_dir)
    end
    
    
    mainapp_bundleid= nil
    puts "args_bundle_id: #{@args_bundle_id}"
    if @args_bundle_id
        mainapp_bundleid = @args_bundle_id
    else
        if @args_deploy_flag
            mainapp_bundleid = get_selected_deploy_bundleid()
        else
            mainapp_bundleid = get_selected_dev_bundleid()
        end
    end

    app_info_obj = nil
    workflow_info = nil
    proj_name = @args_proj_name
    # 传入 package_type 获取 workflow_info
    app_info_obj, workflow_info = PgyerHelper.share_instace.prepare_upload(
      working_directory: Dir.pwd,
      proj_name: proj_name,
      package_type: 'ipa'
    )

    # ===== 使用 workflow 配置更新项目 =====
    if workflow_info && workflow_info[:package_name]
      package_name = workflow_info[:package_name]
      project_id = app_info_obj ? app_info_obj["id"] : nil

      puts "\n使用工作流配置更新 iOS 项目:"
      puts "  Package Name: #{package_name}"

      # 一次性更新 Display Name、Bundle ID、URL Schemes 和 JPS 快捷操作
      Pindo::XcodeBuildConfig.update_project_with_packagename(
        project_dir: pindo_project_dir,
        package_name: package_name,
        project_id: project_id
      )
    else
      raise Informative, "未获取到工作流信息"
    end

    # ===== 从 JPS 下载并替换项目 Icon =====
    if app_info_obj && app_info_obj["projectIcon"] && !app_info_obj["projectIcon"].empty?
      icon_replace_success = Pindo::XcodeBuildConfig.download_and_replace_icon_from_url(
        project_dir: pindo_project_dir,
        icon_url: app_info_obj["projectIcon"]
      )

      # 如果 projectIcon 不为空且下载失败,抛出异常终止执行
      unless icon_replace_success
        raise Informative, "Icon 下载或替换失败,请检查 Icon URL 是否有效: #{app_info_obj["projectIcon"]}"
      end
    else
      Funlog.warning("未配置 Icon URL,跳过 Icon 替换")
    end

    # ===== 更新版本号和Build号(仅在Git仓库中)=====
    version_helper = Pindo::VersionHelper.share_instance
    version_info = version_helper.get_version_info(project_dir: pindo_project_dir)

    if version_info[:is_git_repo]
        # 更新iOS工程版本
        Pindo::XcodeBuildConfig.update_ios_project_version(
            project_dir: pindo_project_dir,
            version: version_info[:version],
            build_number: version_info[:build_number]
        )
    else
        Funlog.warning("非Git仓库,保持工程原有版本号")
    end

    args_temp = []
    args_temp << mainapp_bundleid
    Pindo::Command::Deploy::Pullconfig::run(args_temp)

    Dir.chdir(pindo_project_dir)
    config_json_file = File.join(pindo_project_dir,"config.json")

    # 处理entitlements配置
    Pindo::XcodeBuildConfig.update_entitlements_config(project_dir: pindo_project_dir, config_file: config_json_file)

    if File.exist?(File.join(pindo_project_dir, "Podfile"))
        
        args_temp = []
        args_temp << config_json_file
        Pindo::Command::Lib::Update::run([])

        begin
            if File.exist?(File.join(pindo_project_dir, "Podfile.lock"))
                FileUtils.rm_rf(File.join(pindo_project_dir, "Podfile.lock"))    
            end
            if File.exist?(File.join(pindo_project_dir,"Pods"))
                FileUtils.rm_rf(File.join(pindo_project_dir, "Pods"))    
            end
            puts "正在执行pod deintegrate..."
            system 'pod deintegrate'
            puts "正在执行pod install..."
            system 'pod install'
        rescue => error
            puts(error.to_s)
            raise Informative, "pod install失败!!先pod install 完成后成编译 !"
        end

        Dir.chdir(pindo_project_dir)
        pod_lock_file = File.join(pindo_project_dir, "Podfile.lock")
        if !File.exist?(pod_lock_file)
            raise Informative, "pod install失败!!先pod install 完成后成编译 !"
        end

    end
    

    args_temp = []
    if @args_adhoc_flag
        args_temp << "--adhoc"
    else
        args_temp << "--dev"
    end

    project_fullname = Dir.glob(File.join(pindo_project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
    if !project_fullname.nil?
        project_obj = Xcodeproj::Project.open(project_fullname)
        project_build_platform = project_obj.root_object.build_configuration_list.get_setting("SDKROOT")["Release"]
        if !project_build_platform.nil? && project_build_platform.eql?("macosx")
            @args_macos_flag = true
        end
    end

    if @args_macos_flag
        args_temp << "--macos"
    end

    Pindo::Command::Deploy::Cert::run(args_temp)

    # 根据证书配置后的实际 Bundle ID 重新更新 URL Schemes
    # 因为 Cert::run 可能会修改 PRODUCT_BUNDLE_IDENTIFIER
    Pindo::XcodeBuildConfig.update_url_schemes_with_bundleid(
        project_dir: pindo_project_dir,
        package_name: package_name
    )

    Dir.chdir(pindo_project_dir)
    Pindo::Command::Deploy::Build::run(args_temp)

    build_path = File.join(pindo_project_dir, "build", "*.{ipa,app}")
    ipa_file_upload = Dir.glob(build_path).max_by {|f| File.mtime(f)}
    
    if !ipa_file_upload.nil? && !app_info_obj.nil?  && @args_upload_flag
        description = nil
        result_data = PgyerHelper.share_instace.start_upload(
            app_info_obj: app_info_obj,
            ipa_file_upload: ipa_file_upload,
            description: description,
            workflow_info: workflow_info
        )
        if !result_data.nil? && !result_data["data"].nil? && !result_data["data"]["id"].nil?
            PgyerHelper.share_instace.print_app_version_info(
                app_info_obj: app_info_obj,
                app_version_info_obj: result_data["data"]
            )
            # 始终发送给自己
            PgyerHelper.share_instace.send_apptest_msg(
                app_info_obj: app_info_obj,
                app_version_info_obj: result_data["data"],
                receiveType: "self"
            )

            # 如果有 --send 参数,额外发送到测试群
            if @args_send_flag
                PgyerHelper.share_instace.send_apptest_msg(
                    app_info_obj: app_info_obj,
                    app_version_info_obj: result_data["data"],
                    chatEnv: "DevTest",
                    receiveType: "chat"
                )
            end
        end
    end
    
    # 计算并显示总耗时
    total_time = Time.now - build_start_time
    minutes = (total_time / 60).to_i
    seconds = (total_time % 60).to_i
    
    if minutes > 0
      puts "\e[32m构建完成!总耗时: #{minutes}#{seconds}秒\e[0m"
    else
      puts "\e[32m构建完成!总耗时: #{seconds}秒\e[0m"
    end
    
    puts "\e[32m正在打开目标文件夹...\e[0m"
    system "open #{pindo_project_dir}"

end

#runObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/pindo/command/ios/autobuild.rb', line 88

def run
    pindo_project_dir = Dir.pwd

    # 加载 JPS 配置(如果存在)
    context = Pindo::PindoContext.instance
    context.load_and_apply_jps_config(pindo_project_dir)

    # 确认并应用缓存(如果有)
    context.confirm_and_apply_cache

    build_helper = Pindo::BuildHelper.share_instance
    project_type = build_helper.project_type(pindo_project_dir)

    args_temp = []
    args_temp << "--proj=#{@args_proj_name}" if @args_proj_name
    args_temp << "--upload" if @args_upload_flag
    args_temp << "--send" if @args_send_flag
    args_temp << "--bundleid=#{@args_bundle_id}" if @args_bundle_id
    case project_type
    when :ios
        ios_autobuild
    when :android
        puts "Android 工程, 请使用 pindo and build"

    when :unity
        Pindo::Command::Unity::Ipa::run(args_temp)
    else
        raise Informative, "当前目录不是工程目录,不能编译"
    end

end

#validate!Object



83
84
85
86
# File 'lib/pindo/command/ios/autobuild.rb', line 83

def validate!
    
    super
end