Skip to content

Commit 461f27b

Browse files
authored
Merge pull request #282 from DeployGate/work/support_apple_distribution
Support Apple Distribution Certificate
2 parents 355000b + b8043eb commit 461f27b

7 files changed

Lines changed: 65 additions & 22 deletions

File tree

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,6 @@ deploy:
2020
on:
2121
tags: true
2222
repo: DeployGate/deploygate-cli
23+
rvm: 2.4
2324
after_deploy:
2425
- 'curl -X POST --data-urlencode "payload={\"text\": \"Released a deploygate gem in <https://rubygems.org/gems/deploygate/|RubyGems>\"}" $SLACK_URL'

config/locales/en.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,16 +142,16 @@ en:
142142
choice: '%{team_name} %{team_id}'
143143
check_local_certificates:
144144
not_local_install_certificate:
145-
error_message: 'Error: No applicable iPhone Distribution certificate found on your Mac.'
145+
error_message: 'Error: No applicable iPhone Distribution or Apple Distribution certificate found on your Mac.'
146146
note: |
147-
No "iPhone Distribution" certificate and/or corresponding private key installed locally.
147+
No "iPhone Distribution" or "Apple Distribution" certificate and/or corresponding private key installed locally.
148148
To sign your application code, make sure you have installed them and available in your Keychain.
149149
150150
See also: https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/MaintainingCertificates/MaintainingCertificates.html
151151
conflict_certificate:
152152
error_message: 'Error: Too many certificates found.'
153153
note: |
154-
You have more than one "iPhone Distribution" certificate installed on your Mac.
154+
You have more than one "iPhone Distribution" or "Apple Distribution" certificate installed on your Mac.
155155
Please remove other unnecessary certificates from your Keychain.
156156
clean_provisioning_profiles:
157157
start: 'Cleaning local Provisioning Profiles...'
@@ -171,5 +171,5 @@ en:
171171
Note: Your password will be stored to your Keychain and never be sent to DeployGate.
172172
email: 'Email: '
173173
provisioning_profile:
174-
not_installed_certificate_error: 'No iPhone Distribution Certificate associated with private key was found in local Keychain'
174+
not_installed_certificate_error: 'No iPhone Distribution or Apple Distribution Certificate associated with private key was found in local Keychain'
175175
not_exist_uuid_provisioning_profile_error: 'No provisioning profile found for the specified UUID (%{uuid})'

lib/deploygate/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module DeployGate
2-
VERSION = '0.8.0'
2+
VERSION = '0.8.1'
33
end

lib/deploygate/xcode/analyze.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def code_sign_identity
5353
identity
5454
end
5555

56-
# Support Xcode7 more
56+
# TODO: Need to support UDID additions for watchOS and App Extension
5757
# @return [String]
5858
def target_bundle_identifier
5959
bundle_identifier = nil
@@ -96,7 +96,17 @@ def resolve_build_configuration(&block)
9696

9797
Xcodeproj::Project.open(@xcodeproj).targets.each do |target|
9898
target.build_configuration_list.build_configurations.each do |build_configuration|
99-
next if build_configuration.name != specified_configuration
99+
# Used the following code as an example
100+
# https://github.com/fastlane/fastlane/blob/2.148.1/gym/lib/gym/code_signing_mapping.rb#L138
101+
current = build_configuration.build_settings
102+
next if gym.test_target?(current)
103+
sdk_root = build_configuration.resolve_build_setting("SDKROOT", target)
104+
next unless gym.same_platform?(sdk_root)
105+
next unless specified_configuration == build_configuration.name
106+
107+
# If SKIP_INSTALL is true, it is an app extension or watch app
108+
next if current["SKIP_INSTALL"]
109+
100110
block.call(build_configuration, target)
101111
end
102112
end

lib/deploygate/xcode/export.rb

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def installed_distribution_certificate_ids
8080
certificates = installed_certificates()
8181
ids = []
8282
certificates.each do |current|
83-
next unless current.match(/iPhone Distribution:/)
83+
next unless current.match(/iPhone Distribution:/) || current.match(/Apple Distribution:/)
8484
begin
8585
(ids << current.match(/.*\) (.*) \".*/)[1])
8686
rescue
@@ -92,12 +92,12 @@ def installed_distribution_certificate_ids
9292
end
9393

9494
# @return [Array]
95-
def installed_distribution_conflicting_certificates
95+
def installed_distribution_conflicting_certificates_by(distribution_name)
9696
certificates = installed_certificates()
9797
names = []
9898
certificates.each do |current|
9999
begin
100-
names << current.match(/(iPhone Distribution:.*)/)[1]
100+
names << current.match(/(#{distribution_name}:.*)/)[1]
101101
rescue
102102
end
103103
end
@@ -106,7 +106,7 @@ def installed_distribution_conflicting_certificates
106106
conflicting_certificates = []
107107
certificates.each do |current|
108108
begin
109-
name = current.match(/(iPhone Distribution:.*)/)[1]
109+
name = current.match(/(#{distribution_name}:.*)/)[1]
110110
next unless conflicting_names.include?(name)
111111
conflicting_certificates << current
112112
rescue
@@ -255,12 +255,16 @@ def check_local_certificates
255255
exit
256256
end
257257

258-
conflicting_certificates = installed_distribution_conflicting_certificates
259-
if conflicting_certificates.count > 0
258+
iphone_conflicting_certificates = installed_distribution_conflicting_certificates_by('iPhone Distribution')
259+
apple_conflicting_certificates = installed_distribution_conflicting_certificates_by('Apple Distribution')
260+
if iphone_conflicting_certificates.count > 0 || apple_conflicting_certificates.count > 0
260261
puts HighLine.color(I18n.t('xcode.export.check_local_certificates.conflict_certificate.error_message'), HighLine::RED)
261262
puts ''
262263
puts I18n.t('xcode.export.check_local_certificates.conflict_certificate.note')
263-
conflicting_certificates.each do |certificate|
264+
iphone_conflicting_certificates.each do |certificate|
265+
puts certificate
266+
end
267+
apple_conflicting_certificates.each do |certificate|
264268
puts certificate
265269
end
266270
puts ""

lib/deploygate/xcode/member_centers/provisioning_profile.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,22 @@ def create!(uuid = nil)
3535

3636
# @return [Array]
3737
def all_create
38-
if @member_center.adhoc?
39-
prod_certs = @member_center.launcher.certificate.production.all
40-
else
41-
prod_certs = @member_center.launcher.certificate.all.reject{|cert| cert.class != Spaceship::Portal::Certificate::InHouse}
42-
end
38+
prod_certs = if @member_center.adhoc?
39+
@member_center.launcher.certificate.all.select{|cert|
40+
cert.class == Spaceship::Portal::Certificate::Production ||
41+
cert.class == Spaceship::Portal::Certificate::AppleDistribution
42+
}
43+
else
44+
@member_center.launcher.certificate.all.select{|cert|
45+
cert.class == Spaceship::Portal::Certificate::InHouse
46+
}
47+
end
4348

4449
# check local install certificate
4550
FileUtils.mkdir_p(CERTIFICATE_OUTPUT_PATH)
4651
distribution_cert_ids = []
4752
prod_certs.each do |cert|
53+
next if cert.expires < Time.now
4854
path = File.join(CERTIFICATE_OUTPUT_PATH, "#{cert.id}.cer")
4955
raw_data = cert.download_raw
5056
File.write(path, raw_data)

spec/deploygate/xcode/export_spec.rb

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
before do
6262
@distribution_certificate_id = 'distribution_certificate_id'
6363
@distribution_certificate = " 1) #{@distribution_certificate_id} \"iPhone Distribution: DeployGate Inc.\""
64+
@apple_distribution_certificate = " 1) #{@distribution_certificate_id} \"Apple Distribution: DeployGate Inc.\""
6465
@not_distribution_certificate = " 1) xxxxxxxxxxxxxx \"iPhone Developer: DeployGate Inc.\""
6566
end
6667
it "not installed distribution certificate" do
@@ -74,23 +75,44 @@
7475
ids = DeployGate::Xcode::Export.installed_distribution_certificate_ids
7576
expect(ids).to eql([@distribution_certificate_id])
7677
end
78+
79+
it "installed apple distribution certificate" do
80+
allow(DeployGate::Xcode::Export).to receive(:installed_certificates).and_return([@apple_distribution_certificate, @not_distribution_certificate])
81+
82+
ids = DeployGate::Xcode::Export.installed_distribution_certificate_ids
83+
expect(ids).to eql([@distribution_certificate_id])
84+
end
7785
end
7886

79-
describe "#installed_distribution_conflicting_certificates" do
87+
describe "#installed_distribution_conflicting_certificates_by" do
8088
before do
8189
@distribution_certificate = " 1) xxxxxxxxxx \"iPhone Distribution: DeployGate Inc.\""
8290
@distribution_certificate2 = " 2) yyyyyyyyyyyy \"iPhone Distribution: DeployGate Inc.\""
8391
@distribution_certificate3 = " 2) yyyyyyyyyyyy \"iPhone Distribution: DeployGate Inc2.\""
92+
93+
@apple_distribution_certificate = " 1) xxxxxxxxxxx \"Apple Distribution: DeployGate Inc.\""
94+
@apple_distribution_certificate2 = " 2) yyyyyyyyyyyy \"Apple Distribution: DeployGate Inc.\""
95+
@apple_distribution_certificate3 = " 2) yyyyyyyyyyyy \"Apple Distribution: DeployGate Inc2.\""
8496
end
8597

8698
it "conflicting" do
8799
allow(DeployGate::Xcode::Export).to receive(:installed_certificates).and_return([@distribution_certificate, @distribution_certificate2])
88-
expect(DeployGate::Xcode::Export.installed_distribution_conflicting_certificates.count).to eql 2
100+
expect(DeployGate::Xcode::Export.installed_distribution_conflicting_certificates_by('iPhone Distribution').count).to eql 2
101+
end
102+
103+
it "conflicting by apple" do
104+
allow(DeployGate::Xcode::Export).to receive(:installed_certificates).and_return([@apple_distribution_certificate, @apple_distribution_certificate2])
105+
expect(DeployGate::Xcode::Export.installed_distribution_conflicting_certificates_by('Apple Distribution').count).to eql 2
89106
end
90107

91108
it "not conflicting" do
92109
allow(DeployGate::Xcode::Export).to receive(:installed_certificates).and_return([@distribution_certificate, @distribution_certificate3])
93-
expect(DeployGate::Xcode::Export.installed_distribution_conflicting_certificates.count).to eql 0
110+
expect(DeployGate::Xcode::Export.installed_distribution_conflicting_certificates_by('iPhone Distribution').count).to eql 0
111+
end
112+
113+
it "not conflicting by apple" do
114+
allow(DeployGate::Xcode::Export).to receive(:installed_certificates).and_return([@apple_distribution_certificate, @apple_distribution_certificate3])
115+
expect(DeployGate::Xcode::Export.installed_distribution_conflicting_certificates_by('Apple Distribution').count).to eql 0
94116
end
95117
end
96118
end

0 commit comments

Comments
 (0)