Class: Match::SpaceshipEnsure

Inherits:
Object
  • Object
show all
Defined in:
match/lib/match/spaceship_ensure.rb

Overview

Ensures the certificate and profiles are also available on App Store Connect

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user, team_id, team_name, api_token) ⇒ SpaceshipEnsure

Returns a new instance of SpaceshipEnsure.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'match/lib/match/spaceship_ensure.rb', line 9

def initialize(user, team_id, team_name, api_token)
  UI.message("Verifying that the certificate and profile are still valid on the Dev Portal...")

  if api_token
    UI.message("Creating authorization token for App Store Connect API")
    Spaceship::ConnectAPI.token = api_token
    self.team_id = team_id
  elsif !Spaceship::ConnectAPI.token.nil?
    UI.message("Using existing authorization token for App Store Connect API")
    self.team_id = team_id
  else
    # We'll try to manually fetch the password
    # to tell the user that a password is optional
    require 'credentials_manager/account_manager'

    keychain_entry = CredentialsManager::AccountManager.new(user: user)

    if keychain_entry.password(ask_if_missing: false).to_s.length == 0
      UI.important("You can also run `fastlane match` in readonly mode to not require any access to the")
      UI.important("Developer Portal. This way you only share the keys and credentials")
      UI.command("fastlane match --readonly")
      UI.important("More information https://docs.fastlane.tools/actions/match/#access-control")
    end

    # Prompts select team if multiple teams and none specified
    Spaceship::ConnectAPI.(user, use_portal: true, use_tunes: false, portal_team_id: team_id, team_name: team_name)
    self.team_id = Spaceship::ConnectAPI.client.portal_team_id
  end
end

Instance Attribute Details

#team_idObject

The team ID of the currently logged in team



40
41
42
# File 'match/lib/match/spaceship_ensure.rb', line 40

def team_id
  @team_id
end

Instance Method Details

#bundle_identifier_exists(username: nil, app_identifier: nil, platform: nil) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'match/lib/match/spaceship_ensure.rb', line 44

def bundle_identifier_exists(username: nil, app_identifier: nil, platform: nil)
  found = Spaceship::ConnectAPI::BundleId.find(app_identifier)
  return if found

  require 'sigh/runner'
  Sigh::Runner.new.print_produce_command({
    username: username,
    app_identifier: app_identifier
  })
  UI.error("An app with that bundle ID needs to exist in order to create a provisioning profile for it")
  UI.error("================================================================")
  available_apps = Spaceship::ConnectAPI::BundleId.all.collect { |a| "#{a.identifier} (#{a.name})" }
  UI.message("Available apps:\n- #{available_apps.join("\n- ")}")
  UI.error("Make sure to run `fastlane match` with the same user and team every time.")
  UI.user_error!("Couldn't find bundle identifier '#{app_identifier}' for the user '#{username}'")
end

#certificates_exists(username: nil, certificate_ids: []) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'match/lib/match/spaceship_ensure.rb', line 61

def certificates_exists(username: nil, certificate_ids: [])
  Spaceship::ConnectAPI::Certificate.all.each do |cert|
    certificate_ids.delete(cert.id)
  end
  return if certificate_ids.empty?

  certificate_ids.each do |certificate_id|
    UI.error("Certificate '#{certificate_id}' (stored in your storage) is not available on the Developer Portal")
  end
  UI.error("for the user #{username}")
  UI.error("Make sure to use the same user and team every time you run 'match' for this")
  UI.error("Git repository. This might be caused by revoking the certificate on the Dev Portal")
  UI.error("If missing certificate is a Developer ID Installer, you may need to auth with Apple ID instead of App Store API Key")
  UI.user_error!("To reset the certificates of your Apple account, you can use the `fastlane match nuke` feature, more information on https://docs.fastlane.tools/actions/match/")
end

#profile_exists(type: nil, username: nil, uuid: nil, platform: nil) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'match/lib/match/spaceship_ensure.rb', line 77

def profile_exists(type: nil, username: nil, uuid: nil, platform: nil)
  # App Store Connect API does not allow filter of profile by platform or uuid (as of 2020-07-30)
  # Need to fetch all profiles and search for uuid on client side
  # But we can filter provisioning profiles based on their type (this, in general way faster than getting all profiles)
  filter = { profileType: Match.profile_types(type).join(",") } if type
  found = Spaceship::ConnectAPI::Profile.all(filter: filter).find do |profile|
    profile.uuid == uuid
  end

  unless found
    UI.error("Provisioning profile '#{uuid}' is not available on the Developer Portal for the user #{username}, fixing this now for you 🔨")
    return false
  end

  if found.valid?
    return found
  else
    UI.important("'#{found.name}' is available on the Developer Portal, however it's 'Invalid', fixing this now for you 🔨")
    # it's easier to just create a new one, than to repair an existing profile
    # it has the same effects anyway, including a new UUID of the provisioning profile
    found.delete!
    # return nil to re-download the new profile in runner.rb
    return nil
  end
end