module Flappy::BuildIpa

Public Instance Methods

build_ipa(*args, options) click to toggle source
# File lib/flappy/util/build_ipa.rb, line 6
def build_ipa(*args, options)
  initialize_output_path(options)
  initialize_app_output_archive_info_path(args)
  initialize_iOS_logger(options)
  initialize_work_dir(args, options)

  update_pod_if_needed(args, options)
  writeEnvToPlist(args, options)

  @build_cmd = initialize_ipa_build_cmd(args, options)

  unless @build_cmd.blank?
    remove_build_cache

    log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Build......')
    log_iOS("build cmd: #{@build_cmd}")

    log_iOS_build(@build_cmd)

    if $?.to_i != 0
      log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Build failed')
      exit 1
    else
      log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Build succeed')
    end
  end


  initialize_ipa_output_path
  @xcrun_cmd = archive_ipa_with_path(@build_dir, @temp_ipa_path)

  unless @xcrun_cmd.blank?
    log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Archiving......')
    log_iOS("archive cmd: #{@xcrun_cmd}")

    log_iOS_archive(@xcrun_cmd)
    if $?.to_i != 0
      log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Archive failed')
      exit 1
    else
      log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Archive succeed')
    end

    rename_ipa  # 重命名
  end


  log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Saving dSYM file...')
  save_dSYM_file
  log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Saving dSYM file Succeed')

  if options[:open]
    system("open -R \"#{@app_output_archive_info_path}\"") if File.exists?(@app_output_archive_info_path)
  end

  unless options[:firToken].blank?
    log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Uploading app to fir...')
    publish(@ipa_path, options)

    if $?.to_i != 0
      log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Upload app failed')
    else
      log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Upload app succeed')
    end
  end
end
git_clone_work_dir(args, options) click to toggle source
# File lib/flappy/util/build_ipa.rb, line 120
def git_clone_work_dir(args, options)
  git_url = args.first.to_s
  branch = options[:branch].blank? ? 'master' : options[:branch]  # 分支名不指定则默认为master

  repo_path = File.join(@app_output_archive_info_path, @start_time + "_#{@app_dir_name}")
  git_cmd   = "git clone --depth=50 --branch=#{branch} #{git_url} #{repo_path}"

  log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cloning......')
  log_iOS("git cmd: #{git_cmd}")

  system(git_cmd)
  if $?.to_i != 0
    log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Clone failed')
    exit 1
  else
    log_iOS('>>>>>>>>>>>>>>>>>>>>>>>>>>>> Clone succeed')
    repo_path
  end

end
initialize_app_output_archive_info_path(args) click to toggle source
# File lib/flappy/util/build_ipa.rb, line 88
def initialize_app_output_archive_info_path(args)
  @start_time = Time.now.strftime('%Y%m%d%H%M%S')

  work_dir = args.first.to_s
  if File.extname(work_dir) == '.git'             # git地址
    @app_dir_name = File.basename(work_dir, '.git')  # git名字
  elsif work_dir.blank? || !File.exist?(work_dir)       # 为空
    @app_dir_name =  File.basename(Dir.pwd)          # 当前目录
  else
    @app_dir_name = File.basename(work_dir)
  end

  @app_output_archive_info_path = File.join(@output_path, @app_dir_name, @start_time)
  @app_output_archive_log_path = File.join(@app_output_archive_info_path, "#{@start_time}_Log")
  FileUtils.mkdir_p(@app_output_archive_info_path) unless File.exist?(@app_output_archive_info_path)   # 创建本次打包的存储目录
  FileUtils.mkdir_p(@app_output_archive_log_path) unless File.exist?(@app_output_archive_log_path)   # 创建本次打包的logger目录
end
initialize_ipa_build_cmd(args, options) click to toggle source
# File lib/flappy/util/build_ipa.rb, line 184
def initialize_ipa_build_cmd(args, options)
  @workspace_path = ''
  @workspace_name = ''
  @workspace = ''

  @project_path = ''
  @project_name = ''
  @project = ''

  @build_scheme_name   = options[:scheme]
  @build_target_name   = options[:target]
  @build_configuration = options[:configuration]

  @build_dir = ''
  @build_SYMROOT_dir = ''

  @codesign = options[:codesign]
  @provision_name  = options[:provision]

  if check_and_find_ios_xcworkspace(@work_dir)
    check_condition(@build_dir, 'build dir is empty!')

    unless @workspace.blank?
      if @build_scheme_name.blank?
        log_iOS('该工程为workspace,编译workspace必须同时指定一个scheme,可以使用`xcodebuild --list`来查看该workspace的scheme列表')
        exit 1
      end
    end

    build_cmd =  "cd #{@build_dir}; xcodebuild"
    build_cmd += " -workspace '#{@workspace}'" unless @workspace.blank?
    build_cmd += " -scheme '#{@build_scheme_name}'" unless @build_scheme_name.blank?

  elsif check_and_find_ios_xcodeproj(@work_dir)
    check_condition(@build_dir, 'build dir is empty!')

    build_cmd =  "cd #{@build_dir}; xcodebuild"
    build_cmd += " -target '#{@build_target_name}'" unless @build_target_name.blank?
  else
    log_iOS('No xcworkspace or xcodeproj found')
    exit 1
  end

  build_cmd += " -configuration '#{@build_configuration}'" unless @build_configuration.blank?

  check_condition(@build_SYMROOT_dir, 'SYMROOT_dir is empty!')
  build_cmd += " clean build SYMROOT=\"#{@build_SYMROOT_dir}\""

  unless @codesign.blank?
    logger_iOS.info 'Use custom certificate'
    build_cmd += " CODE_SIGN_IDENTITY=\"#{@codesign}\" PROVISIONING_PROFILE=\"#{@provision_name}\""
  else
    log_iOS('Use project certificate')
  end

  build_cmd
end
initialize_ipa_output_path() click to toggle source
# File lib/flappy/util/build_ipa.rb, line 142
def initialize_ipa_output_path
  @temp_ipa_path = "#{@app_output_archive_info_path}/#{@start_time}.ipa"  # ipa包路径
end
initialize_output_path(options) click to toggle source
# File lib/flappy/util/build_ipa.rb, line 74
def initialize_output_path(options)
  output_path = File.expand_path(options[:output]) unless options[:output].blank?
  default_output_path = File.expand_path('~/Documents/Flappy-Archives/iOS')

  unless output_path.blank?
    @output_path = File.join(output_path, 'Flappy-Archives', 'iOS')
  else
    log_iOS("Output path is empty, use default output path #{default_output_path}")
    @output_path = default_output_path
  end

  FileUtils.mkdir_p(@output_path) unless File.exist?(@output_path)
end
initialize_work_dir(args, options) click to toggle source
# File lib/flappy/util/build_ipa.rb, line 107
def initialize_work_dir(args, options)
  work_dir = args.first.to_s

  if File.extname(work_dir) == '.git'         # git地址
    @work_dir = git_clone_work_dir(args, options)  # clone好work dir即为clone后的项目路径
  elsif work_dir.blank? || !File.exist?(work_dir)   # 为空
    @work_dir = Dir.pwd                     # 当前目录
  else
    @work_dir = File.expand_path(work_dir)
  end
end
ipa_info(ipa_path, options = {}) click to toggle source
# File lib/flappy/util/build_ipa.rb, line 146
def ipa_info(ipa_path, options = {})
  ipa  = Flappy::IpaInfo::Ipa.new(ipa_path)
  app  = ipa.app
  info = app.full_info(options)

  ipa.cleanup
  info
end
remove_build_cache() click to toggle source
# File lib/flappy/util/build_ipa.rb, line 179
def remove_build_cache
  FileUtils.rm_rf(@build_SYMROOT_dir) if File.exists?(@build_SYMROOT_dir)
end
rename_ipa() click to toggle source
# File lib/flappy/util/build_ipa.rb, line 168
def rename_ipa
  ipa_info  = ipa_info(@temp_ipa_path)

  @ipa_name = "#{@start_time}_#{ipa_info[:name]}.ipa"
  @ipa_path = File.join(@app_output_archive_info_path, "#{@ipa_name}")

  if File.exist?(@temp_ipa_path)
    FileUtils.mv(@temp_ipa_path, @ipa_path, force: true)
  end
end
save_dSYM_file() click to toggle source
# File lib/flappy/util/build_ipa.rb, line 156
def save_dSYM_file
  dSYM_file_to_copy = ''
  Dir.glob("#{@build_dir}/**/*.app.dSYM").each do |path|
    dSYM_file_to_copy = path
    basename = File.basename(dSYM_file_to_copy)
    @dSYM_file_path = File.join(@app_output_archive_info_path, "#{@start_time}_#{basename}")
  end

  FileUtils.cp_r(dSYM_file_to_copy, @dSYM_file_path) if File.exists?(dSYM_file_to_copy)
end