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.



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

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

命令的选项列表



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

def self.options
    [
        ['--bundleid', '指定打包的bundleID'],
        # 指定上传到蒲公英的项目
        ['--proj',   '指定上传到测试平台的项目名称'],
        # 上传编译包
        ['--upload', '上传编译后的ipa到测试平台(上传成功后会自动发送消息给自己)'],
        # 发送通知
        ['--send',   '发送消息到项目群(注意:不带此参数也会发送给自己)']
    ].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



116
117
118
119
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
# File 'lib/pindo/command/ios/autobuild.rb', line 116

def ios_autobuild

    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
    if @args_upload_flag 
        proj_name = @args_proj_name
        app_info_obj = PgyerHelper.share_instace.prepare_upload(working_directory:Dir.pwd, proj_name:proj_name)
    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")
    
    scheme_name = @args_proj_name if @args_proj_name
    if !app_info_obj.nil? && !app_info_obj["projectName"].nil? && !app_info_obj["projectName"].empty?
        scheme_name = app_info_obj["projectName"]
    end
    if scheme_name.nil? || scheme_name.empty? && is_git_directory?(local_repo_dir:pindo_project_dir)
        current_git_root_path = git_root_directory(local_repo_dir: pindo_project_dir)
        if current_git_root_path && !current_git_root_path.empty?
          git_repo_name = File.basename(current_git_root_path)
          if !git_repo_name.nil? && !git_repo_name.empty?
            scheme_name = git_repo_name
          end
        end
    end

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

    # 添加URL Schemes
    Pindo::XcodeBuildConfig.add_url_schemes(project_dir: pindo_project_dir, scheme_name: scheme_name)

    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)

    # 更新版本号和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
        puts "非Git仓库,保持工程原有版本号"
    end

    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? 
        description = nil
        result_data = PgyerHelper.share_instace.start_upload(app_info_obj:app_info_obj, ipa_file_upload:ipa_file_upload, description:description)
        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
    
    system "open #{pindo_project_dir}"

end

#runObject



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

def run
    pindo_project_dir = Dir.pwd

    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 android build"

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

end

#validate!Object



86
87
88
89
# File 'lib/pindo/command/ios/autobuild.rb', line 86

def validate!
    
    super
end