deploygate 0.0.6 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. checksums.yaml +13 -5
  2. data/.gitignore +4 -0
  3. data/.travis.yml +4 -4
  4. data/README.md +3 -3
  5. data/lib/deploygate/android/gradle_deploy.rb +95 -0
  6. data/lib/deploygate/android/gradle_plugin_installer.rb +101 -0
  7. data/lib/deploygate/android/gradle_project.rb +14 -0
  8. data/lib/deploygate/commands/deploy/build.rb +15 -154
  9. data/lib/deploygate/{build.rb → project.rb} +3 -3
  10. data/lib/deploygate/version.rb +1 -1
  11. data/lib/deploygate/xcode/analyze.rb +116 -0
  12. data/lib/deploygate/xcode/export.rb +281 -0
  13. data/lib/deploygate/{builds → xcode}/ios.rb +13 -5
  14. data/lib/deploygate/xcode/member_center.rb +52 -0
  15. data/lib/deploygate/xcode/member_centers/app.rb +35 -0
  16. data/lib/deploygate/xcode/member_centers/provisioning_profile.rb +99 -0
  17. data/lib/deploygate.rb +14 -5
  18. data/spec/deploygate/project_spec.rb +39 -0
  19. data/spec/deploygate/xcode/analyze_spec.rb +3 -0
  20. data/spec/deploygate/{builds/ios → xcode}/export_spec.rb +21 -21
  21. data/spec/deploygate/{builds → xcode}/ios_spec.rb +12 -12
  22. data/spec/deploygate/xcode/member_center_spec.rb +21 -0
  23. data/spec/deploygate/xcode/member_centers/app_spec.rb +60 -0
  24. data/spec/deploygate/xcode/member_centers/provisioning_profile_spec.rb +3 -0
  25. metadata +70 -66
  26. data/lib/deploygate/builds/ios/analyze.rb +0 -111
  27. data/lib/deploygate/builds/ios/export.rb +0 -188
  28. data/lib/deploygate/builds/ios/set_profile.rb +0 -128
  29. data/spec/deploygate/build_spec.rb +0 -37
  30. data/spec/deploygate/builds/ios/analyze_spec.rb +0 -3
  31. data/spec/deploygate/builds/ios/set_profile_spec.rb +0 -3
@@ -1,188 +0,0 @@
1
- module DeployGate
2
- module Builds
3
- module Ios
4
- class Export
5
- AD_HOC = 'ad-hoc'
6
- ENTERPRISE = 'enterprise'
7
- SUPPORT_EXPORT_METHOD = [AD_HOC, ENTERPRISE]
8
- PROFILE_EXTNAME = '.mobileprovision'
9
-
10
- class << self
11
- # @param [String] bundle_identifier
12
- # @param [String] uuid
13
- # @return [Hash]
14
- def find_local_data(bundle_identifier, uuid = nil)
15
- result_profiles = {}
16
- teams = {}
17
- profile_paths = load_profile_paths
18
- profiles = profile_paths.map{|p| profile_to_plist(p)}
19
- profiles.reject! {|profile| profile['UUID'] != uuid} unless uuid.nil?
20
-
21
- profiles.each do |profile|
22
- entities = profile['Entitlements']
23
- unless entities['get-task-allow']
24
- team = entities['com.apple.developer.team-identifier']
25
- application_id = entities['application-identifier']
26
- application_id.slice!(/^#{team}\./)
27
- application_id = '.' + application_id if application_id == '*'
28
- if bundle_identifier.match(application_id) &&
29
- DateTime.now < profile['ExpirationDate'] &&
30
- installed_certificate?(profile['Path'])
31
-
32
- teams[team] = profile['TeamName'] if teams[team].nil?
33
- result_profiles[team] = [] if result_profiles[team].nil?
34
- result_profiles[team].push(profile['Path'])
35
- end
36
- end
37
- end
38
-
39
- {
40
- :teams => teams,
41
- :profiles => result_profiles
42
- }
43
- end
44
-
45
- # @param [String] profile_path
46
- # @return [Boolean]
47
- def installed_certificate?(profile_path)
48
- profile = profile_to_plist(profile_path)
49
- certs = profile['DeveloperCertificates'].map do |cert|
50
- certificate_str = cert.read
51
- certificate = OpenSSL::X509::Certificate.new certificate_str
52
- id = OpenSSL::Digest::SHA1.new(certificate.to_der).to_s.upcase!
53
- installed_distribution_certificate_ids.include?(id)
54
- end
55
- certs.include?(true)
56
- end
57
-
58
- # @return [Array]
59
- def installed_distribution_certificate_ids
60
- certificates = installed_certificates()
61
- ids = []
62
- certificates.each do |current|
63
- next unless current.match(/iPhone Distribution:/)
64
- begin
65
- (ids << current.match(/.*\) (.*) \".*/)[1])
66
- rescue
67
- # the last line does not match
68
- end
69
- end
70
-
71
- ids
72
- end
73
-
74
- # @return [Array]
75
- def installed_distribution_conflicting_certificates
76
- certificates = installed_certificates()
77
- names = []
78
- certificates.each do |current|
79
- begin
80
- names << current.match(/(iPhone Distribution:.*)/)[1]
81
- rescue
82
- end
83
- end
84
-
85
- conflicting_names = names.select{|e| names.index(e) != names.rindex(e)}.uniq
86
- conflicting_certificates = []
87
- certificates.each do |current|
88
- begin
89
- name = current.match(/(iPhone Distribution:.*)/)[1]
90
- next unless conflicting_names.include?(name)
91
- conflicting_certificates << current
92
- rescue
93
- end
94
- end
95
-
96
- conflicting_certificates
97
- end
98
-
99
- # @return [Array]
100
- def installed_certificates
101
- available = `security find-identity -v -p codesigning`
102
- certificates = []
103
- available.split("\n").each do |current|
104
- next if current.include? "REVOKED"
105
- certificates << current
106
- end
107
-
108
- certificates
109
- end
110
-
111
- # @param [Array] profile_paths
112
- # @return [String]
113
- def select_profile(profile_paths)
114
- select = nil
115
-
116
- profile_paths.each do |path|
117
- select = path if adhoc?(path) && select.nil?
118
- select = path if inhouse?(path)
119
- end
120
- select
121
- end
122
-
123
- # @param [String] profile_path
124
- # @return [String]
125
- def codesigning_identity(profile_path)
126
- profile = profile_to_plist(profile_path)
127
- identity = nil
128
-
129
- profile['DeveloperCertificates'].each do |cert|
130
- certificate_str = cert.read
131
- certificate = OpenSSL::X509::Certificate.new certificate_str
132
- id = OpenSSL::Digest::SHA1.new(certificate.to_der).to_s.upcase!
133
-
134
- available = `security find-identity -v -p codesigning`
135
- available.split("\n").each do |current|
136
- next if current.include? "REVOKED"
137
- begin
138
- search = current.match(/.*\) (.*) \"(.*)\"/)
139
- identity = search[2] if id == search[1]
140
- rescue
141
- end
142
- end
143
- end
144
-
145
- identity
146
- end
147
-
148
- # @param [String] profile_path
149
- # @return [String]
150
- def method(profile_path)
151
- adhoc?(profile_path) ? AD_HOC : ENTERPRISE
152
- end
153
-
154
- # @param [String] profile_path
155
- # @return [Boolean]
156
- def adhoc?(profile_path)
157
- profile = profile_to_plist(profile_path)
158
- !profile['Entitlements']['get-task-allow'] && profile['ProvisionsAllDevices'].nil?
159
- end
160
-
161
- # @param [String] profile_path
162
- # @return [Boolean]
163
- def inhouse?(profile_path)
164
- profile = profile_to_plist(profile_path)
165
- !profile['Entitlements']['get-task-allow'] && !profile['ProvisionsAllDevices'].nil?
166
- end
167
-
168
- def load_profile_paths
169
- profiles_path = File.expand_path("~") + "/Library/MobileDevice/Provisioning Profiles/*.mobileprovision"
170
- Dir[profiles_path]
171
- end
172
-
173
- # @param [String] profile_path
174
- # @return [Hash]
175
- def profile_to_plist(profile_path)
176
- File.open(profile_path) do |profile|
177
- asn1 = OpenSSL::ASN1.decode(profile.read)
178
- plist_str = asn1.value[1].value[0].value[2].value[1].value[0].value
179
- plist = Plist.parse_xml plist_str.force_encoding('UTF-8')
180
- plist['Path'] = profile_path
181
- return plist
182
- end
183
- end
184
- end
185
- end
186
- end
187
- end
188
- end
@@ -1,128 +0,0 @@
1
- module DeployGate
2
- module Builds
3
- module Ios
4
- class SetProfile
5
- attr_reader :method
6
-
7
- OUTPUT_PATH = '/tmp/dg/provisioning_profile/'
8
- CERTIFICATE_OUTPUT_PATH = '/tmp/dg/certificate/'
9
-
10
- # @param [String] username
11
- # @param [String] identifier
12
- # @return [DeployGate::Builds::Ios::SetProfile]
13
- def initialize(username, identifier)
14
- @username = username
15
- @identifier = identifier
16
- Spaceship.login(username)
17
- Spaceship.select_team
18
- if Spaceship.client.in_house?
19
- @method = Export::ENTERPRISE
20
- else
21
- @method = Export::AD_HOC
22
- end
23
- end
24
-
25
- # @return [Boolean]
26
- def app_id_create
27
- app_created = false
28
- Spaceship.app.all.collect do |app|
29
- if app.bundle_id == @identifier
30
- app_created = true
31
- break
32
- end
33
- end
34
- unless app_created
35
- Spaceship.app.create!(:bundle_id => @identifier, :name => "#{@identifier.split('.').join(' ')}")
36
- return true
37
- end
38
-
39
- false
40
- end
41
-
42
- # @param [String] uuid
43
- # @return [Array]
44
- def create_provisioning(uuid)
45
- FileUtils.mkdir_p(OUTPUT_PATH)
46
-
47
- if uuid.nil?
48
- return install_provisioning
49
- else
50
- return select_uuid_provisioning(uuid)
51
- end
52
- end
53
-
54
- private
55
-
56
- def select_uuid_provisioning(uuid)
57
- adhoc_profiles = Spaceship.provisioning_profile.ad_hoc.all
58
- inhouse_profiles = Spaceship.provisioning_profile.in_house.all
59
-
60
- adhoc_profiles.reject!{|p| p.uuid != uuid}
61
- inhouse_profiles.reject!{|p| p.uuid != uuid}
62
- select_profile = nil
63
- method = nil
64
- unless adhoc_profiles.empty?
65
- select_profile = adhoc_profiles.first
66
- method = Export::AD_HOC
67
- end
68
- unless inhouse_profiles.empty?
69
- select_profile = inhouse_profiles.first
70
- method = Export::ENTERPRISE
71
- end
72
- raise 'Not Xcode selected Provisioning Profile' if select_profile.nil?
73
-
74
- values = {
75
- :adhoc => method == Export::AD_HOC ? true : false,
76
- :app_identifier => @identifier,
77
- :username => @username,
78
- :output_path => OUTPUT_PATH,
79
- :provisioning_name => select_profile.name,
80
- :team_id => Spaceship.client.team_id
81
- }
82
- v = FastlaneCore::Configuration.create(Sigh::Options.available_options, values)
83
- Sigh.config = v
84
- download_profile_path = Sigh::Manager.start
85
-
86
- [download_profile_path]
87
- end
88
-
89
- def install_provisioning
90
- if @method == Export::AD_HOC
91
- prod_certs = Spaceship.certificate.production.all
92
- else
93
- prod_certs = Spaceship.certificate.all.reject{|cert| cert.class != Spaceship::Portal::Certificate::InHouse}
94
- end
95
-
96
- # check local install certificate
97
- FileUtils.mkdir_p(CERTIFICATE_OUTPUT_PATH)
98
- distribution_cert_ids = []
99
- prod_certs.each do |cert|
100
- path = File.join(CERTIFICATE_OUTPUT_PATH, "#{cert.id}.cer")
101
- raw_data = cert.download_raw
102
- File.write(path, raw_data)
103
- distribution_cert_ids.push(cert.id) if FastlaneCore::CertChecker.installed?(path)
104
- end
105
- raise 'Not local install certificate' if distribution_cert_ids.empty?
106
-
107
- provisionings = []
108
- distribution_cert_ids.each do |cert_id|
109
- values = {
110
- :adhoc => @method == Export::AD_HOC ? true : false,
111
- :app_identifier => @identifier,
112
- :username => @username,
113
- :output_path => OUTPUT_PATH,
114
- :cert_id => cert_id,
115
- :team_id => Spaceship.client.team_id
116
- }
117
- v = FastlaneCore::Configuration.create(Sigh::Options.available_options, values)
118
- Sigh.config = v
119
- download_profile_path = Sigh::Manager.start
120
- provisionings.push(download_profile_path)
121
- end
122
-
123
- provisionings
124
- end
125
- end
126
- end
127
- end
128
- end
@@ -1,37 +0,0 @@
1
- describe DeployGate::Build do
2
- describe "#ios?" do
3
- it "when select workspace" do
4
- allow(DeployGate::Builds::Ios).to receive(:ios_root?).and_return(false)
5
- allow(DeployGate::Builds::Ios).to receive(:workspace?).and_return(true)
6
- allow(DeployGate::Builds::Ios).to receive(:project?).and_return(false)
7
-
8
- result = DeployGate::Build.ios?('path')
9
- expect(result).to be_truthy
10
- end
11
-
12
- it "when workspaces" do
13
- allow(DeployGate::Builds::Ios).to receive(:ios_root?).and_return(false)
14
- allow(DeployGate::Builds::Ios).to receive(:workspace?).and_return(false)
15
- allow(DeployGate::Builds::Ios).to receive(:project?).and_return(true)
16
-
17
- result = DeployGate::Build.ios?('path')
18
- expect(result).to be_truthy
19
- end
20
-
21
- it "not ios" do
22
- allow(DeployGate::Builds::Ios).to receive(:ios_root?).and_return(false)
23
- allow(DeployGate::Builds::Ios).to receive(:workspace?).and_return(false)
24
- allow(DeployGate::Builds::Ios).to receive(:project?).and_return(false)
25
-
26
- result = DeployGate::Build.ios?('path')
27
- expect(result).to be_falsey
28
- end
29
- end
30
-
31
- describe "#android?" do
32
- it "android not support" do
33
- result = DeployGate::Build.android?('path')
34
- expect(result).to be_falsey
35
- end
36
- end
37
- end
@@ -1,3 +0,0 @@
1
- describe DeployGate::Builds::Ios::Analyze do
2
- # TODO: add test
3
- end
@@ -1,3 +0,0 @@
1
- describe DeployGate::Builds::Ios::SetProfile do
2
- # TODO: add test
3
- end