Class: DeployGate::Commands::Deploy::Build

Inherits:
Object
  • Object
show all
Defined in:
lib/deploygate/commands/deploy/build.rb

Class Method Summary collapse

Class Method Details

.check_local_certificatesObject



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
# File 'lib/deploygate/commands/deploy/build.rb', line 161

def check_local_certificates
  if DeployGate::Builds::Ios::Export.installed_distribution_certificate_ids.count == 0
    # not local install certificate
    DeployGate::Message::Error.print("Error: Not local install distribution certificate")
    puts "\nNot local install iPhone Distribution certificates.\nPlease install certificate.\n\nDocs: https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html\n\n"
    exit
  end

  conflicting_certificates = DeployGate::Builds::Ios::Export.installed_distribution_conflicting_certificates
  if conflicting_certificates.count > 0
    DeployGate::Message::Error.print("Error: Conflicting local install certificates")
    puts "\nConflicting local install certificates.\nPlease uninstall certificates.\n"
    conflicting_certificates.each do |certificate|
      puts certificate
    end
    puts ""

    exit
  end
end

.create_provisioning(identifier, uuid) ⇒ String

Parameters:

  • identifier (String)
  • uuid (String)

Returns:

  • (String)


110
111
112
113
114
115
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
# File 'lib/deploygate/commands/deploy/build.rb', line 110

def create_provisioning(identifier, uuid)
  puts "\nNo suitable provisioning profile found to export the app.\n\nPlease enter your email and password for Apple Developer Center\nto set up/download provisioning profile automatically so you can\nexport the app without any extra steps.\n\nNote: Your password will be stored to Keychain and never be sent to DeployGate.\n\n"
  print 'Email: '
  username = STDIN.gets.chop

  begin
    set_profile = DeployGate::Builds::Ios::SetProfile.new(username, identifier)
  rescue => e
    DeployGate::Message::Error.print("Error: Please try login again")
    raise e
  end

  begin
    if set_profile.app_id_create
      puts "App ID #{identifier} was created"
    end
  rescue => e
    DeployGate::Message::Error.print("Error: Failed to create App ID")
    raise e
  end

  begin
    provisioning_profiles = set_profile.create_provisioning(uuid)
  rescue => e
    DeployGate::Message::Error.print("Error: Failed to create provisioning profile")
    raise e
  end

  DeployGate::Builds::Ios::Export.select_profile(provisioning_profiles)
end

.input_bundle_identifierObject



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/deploygate/commands/deploy/build.rb', line 70

def input_bundle_identifier
  print 'bundle identifier: '
  identifier = STDIN.gets.chop

  if identifier == '' || identifier.nil?
    puts 'You must input bundle identifier'
    return input_bundle_identifier
  end

  identifier
end

.ios(workspaces, options) ⇒ void

This method returns an undefined value.

Parameters:

  • workspaces (Array)
  • options (Hash)


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/deploygate/commands/deploy/build.rb', line 30

def ios(workspaces, options)
  analyze = DeployGate::Builds::Ios::Analyze.new(workspaces)
  target_scheme = analyze.scheme
  begin
    identifier = analyze.target_bundle_identifier
  rescue
    # not found bundle identifier
    puts 'Please input bundle identifier'
    puts 'Example: com.example.ios'
    identifier = input_bundle_identifier
  end
  uuid = analyze.target_xcode_setting_provisioning_profile_uuid

  data = DeployGate::Builds::Ios::Export.find_local_data(identifier, uuid)
  profiles = data[:profiles]
  teams = data[:teams]

  target_provisioning_profile = nil
  if teams.empty?
    target_provisioning_profile = create_provisioning(identifier, uuid)
  elsif teams.count == 1
    target_provisioning_profile = DeployGate::Builds::Ios::Export.select_profile(profiles[teams.keys.first])
  elsif teams.count >= 2
    target_provisioning_profile = select_teams(teams, profiles)
  end
  method = DeployGate::Builds::Ios::Export.method(target_provisioning_profile)
  codesigning_identity = DeployGate::Builds::Ios::Export.codesigning_identity(target_provisioning_profile)

  begin
    ipa_path = DeployGate::Builds::Ios.build(analyze, target_scheme, codesigning_identity, method)
  rescue => e
    # TODO: build error handling
    use_xcode_path = `xcode-select -p`
    DeployGate::Message::Error.print("Current Xcode used to build: #{use_xcode_path} (via xcode-select)")
    raise e
  end

  Push.upload([ipa_path], options)
end


151
152
153
154
155
156
157
158
159
# File 'lib/deploygate/commands/deploy/build.rb', line 151

def print_no_target
  message = "\nNo deploy target found.\nPlease run on the root directory of iOS project or specify .apk/.ipa file to deploy.\n\n"
  DeployGate::Message::Warning.print(message)
end

.run(args, options) ⇒ void

This method returns an undefined value.

Parameters:

  • args (Array)
  • options (Hash)


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/deploygate/commands/deploy/build.rb', line 10

def run(args, options)
  # android/ios build
  work_dir = args.first

  if DeployGate::Build.ios?(work_dir)
    check_local_certificates()
    root_path = DeployGate::Builds::Ios.project_root_path(work_dir)
    workspaces = DeployGate::Builds::Ios.find_workspaces(root_path)
    ios(workspaces, options)
  elsif DeployGate::Build.android?(work_dir)
    # TODO: support android build
    print_no_target
  else
    print_no_target
  end
end

.select_teams(teams, profiles) ⇒ String

Parameters:

  • teams (Hash)
  • profiles (Hash)

Returns:

  • (String)


85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/deploygate/commands/deploy/build.rb', line 85

def select_teams(teams, profiles)
  result = nil
  puts 'Select team:'
  teams.each_with_index do |team, index|
    puts "#{index + 1}. #{team[1]} (#{team[0]})"
  end
  print '? '
  select = STDIN.gets.chop
  begin
    team = teams.keys[Integer(select) - 1]
    team_profiles = profiles[team].first
    raise 'not select' if team_profiles.nil?

    result = DeployGate::Builds::Ios::Export.select_profile(profiles[team])
  rescue => e
    puts 'Please select team number'
    return select_teams(teams, profiles)
  end

  result
end