fastlane 2.128.0.beta.20190722200021 → 2.128.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: de826ad1328636023b2f7cbc0c6c1fe2739ca805
4
- data.tar.gz: d8b553ff8d9b03f6e24a41f4d0ed50d0580ab62f
2
+ SHA256:
3
+ metadata.gz: cfbcd2e9eb321099998ee88a73eb4d57b48835bbfda6f1e463f5116099ca43e6
4
+ data.tar.gz: f0013718dfe75e9282d2917642754498ad73486244ba32d804500f88889dcf25
5
5
  SHA512:
6
- metadata.gz: 0cb46da4e3d7b7979dc6ab3001976f521823b1da6048dbffdec2d6fd7c3113fb8c107d3cf405d50aea84f9c0aa4f1c4051c4e910f930411ffd2ce9d057e4aaa5
7
- data.tar.gz: 84b9b8c2c0440624c3d3a9633d433c8f16cfea5548d23a2a9a455738dadd44bb9214ccf275adf65975b992b5d933d63e459a5c0aec317d8c999e63e94422c48b
6
+ metadata.gz: b2cbd0d9169e59413d82340364983e036d1a90ffc73cf8062f67b1278265f4464554d9a35ee9285c3df1bfa20f21b3dec1d9617f1c04744d41c48ef8e39f5fcd
7
+ data.tar.gz: 0362bbb52b555bc5036c4be2261f1e3549d8eba8b827f3956e6c7af1a01d522dcee20fbb5a27c7cf3970b4a2f381ef4caba136e59cfba4bfde1d9a697beaf318
data/README.md CHANGED
@@ -34,17 +34,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
34
34
  <!-- This table is regenerated and resorted on each release -->
35
35
  <table id='team'>
36
36
  <tr>
37
- <td id='helmut-januschka'>
38
- <a href='https://github.com/hjanuschka'>
39
- <img src='https://github.com/hjanuschka.png?size=140'>
40
- </a>
41
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
42
- </td>
43
- <td id='danielle-tomlinson'>
44
- <a href='https://github.com/endocrimes'>
45
- <img src='https://github.com/endocrimes.png?size=140'>
37
+ <td id='iulian-onofrei'>
38
+ <a href='https://github.com/revolter'>
39
+ <img src='https://github.com/revolter.png?size=140'>
46
40
  </a>
47
- <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
41
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
48
42
  </td>
49
43
  <td id='andrew-mcburney'>
50
44
  <a href='https://github.com/armcburney'>
@@ -52,11 +46,17 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
52
46
  </a>
53
47
  <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
54
48
  </td>
55
- <td id='jérôme-lacoste'>
56
- <a href='https://github.com/lacostej'>
57
- <img src='https://github.com/lacostej.png?size=140'>
49
+ <td id='fumiya-nakamura'>
50
+ <a href='https://github.com/nafu'>
51
+ <img src='https://github.com/nafu.png?size=140'>
58
52
  </a>
59
- <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
53
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
54
+ </td>
55
+ <td id='helmut-januschka'>
56
+ <a href='https://github.com/hjanuschka'>
57
+ <img src='https://github.com/hjanuschka.png?size=140'>
58
+ </a>
59
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
60
60
  </td>
61
61
  <td id='felix-krause'>
62
62
  <a href='https://github.com/KrauseFx'>
@@ -66,11 +66,11 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
66
66
  </td>
67
67
  </tr>
68
68
  <tr>
69
- <td id='manu-wallner'>
70
- <a href='https://github.com/milch'>
71
- <img src='https://github.com/milch.png?size=140'>
69
+ <td id='aaron-brager'>
70
+ <a href='https://github.com/getaaron'>
71
+ <img src='https://github.com/getaaron.png?size=140'>
72
72
  </a>
73
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
73
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
74
74
  </td>
75
75
  <td id='stefan-natchev'>
76
76
  <a href='https://github.com/snatchev'>
@@ -78,43 +78,49 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
78
78
  </a>
79
79
  <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
80
80
  </td>
81
- <td id='jan-piotrowski'>
82
- <a href='https://github.com/janpio'>
83
- <img src='https://github.com/janpio.png?size=140'>
84
- </a>
85
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
86
- </td>
87
- <td id='aaron-brager'>
88
- <a href='https://github.com/getaaron'>
89
- <img src='https://github.com/getaaron.png?size=140'>
81
+ <td id='maksym-grebenets'>
82
+ <a href='https://github.com/mgrebenets'>
83
+ <img src='https://github.com/mgrebenets.png?size=140'>
90
84
  </a>
91
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
85
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
92
86
  </td>
93
- <td id='fumiya-nakamura'>
94
- <a href='https://github.com/nafu'>
95
- <img src='https://github.com/nafu.png?size=140'>
87
+ <td id='olivier-halligon'>
88
+ <a href='https://github.com/AliSoftware'>
89
+ <img src='https://github.com/AliSoftware.png?size=140'>
96
90
  </a>
97
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
91
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
98
92
  </td>
99
- </tr>
100
- <tr>
101
93
  <td id='jimmy-dee'>
102
94
  <a href='https://github.com/jdee'>
103
95
  <img src='https://github.com/jdee.png?size=140'>
104
96
  </a>
105
97
  <h4 align='center'>Jimmy Dee</h4>
106
98
  </td>
107
- <td id='iulian-onofrei'>
108
- <a href='https://github.com/revolter'>
109
- <img src='https://github.com/revolter.png?size=140'>
99
+ </tr>
100
+ <tr>
101
+ <td id='kohki-miki'>
102
+ <a href='https://github.com/giginet'>
103
+ <img src='https://github.com/giginet.png?size=140'>
110
104
  </a>
111
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
105
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
112
106
  </td>
113
- <td id='jorge-revuelta-h'>
114
- <a href='https://github.com/minuscorp'>
115
- <img src='https://github.com/minuscorp.png?size=140'>
107
+ <td id='josh-holtz'>
108
+ <a href='https://github.com/joshdholtz'>
109
+ <img src='https://github.com/joshdholtz.png?size=140'>
116
110
  </a>
117
- <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
111
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
112
+ </td>
113
+ <td id='matthew-ellis'>
114
+ <a href='https://github.com/matthewellis'>
115
+ <img src='https://github.com/matthewellis.png?size=140'>
116
+ </a>
117
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
118
+ </td>
119
+ <td id='manu-wallner'>
120
+ <a href='https://github.com/milch'>
121
+ <img src='https://github.com/milch.png?size=140'>
122
+ </a>
123
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
118
124
  </td>
119
125
  <td id='joshua-liebowitz'>
120
126
  <a href='https://github.com/taquitos'>
@@ -122,12 +128,6 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
122
128
  </a>
123
129
  <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
124
130
  </td>
125
- <td id='kohki-miki'>
126
- <a href='https://github.com/giginet'>
127
- <img src='https://github.com/giginet.png?size=140'>
128
- </a>
129
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
130
- </td>
131
131
  </tr>
132
132
  <tr>
133
133
  <td id='luka-mirosevic'>
@@ -136,29 +136,29 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
136
136
  </a>
137
137
  <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
138
138
  </td>
139
- <td id='maksym-grebenets'>
140
- <a href='https://github.com/mgrebenets'>
141
- <img src='https://github.com/mgrebenets.png?size=140'>
139
+ <td id='jan-piotrowski'>
140
+ <a href='https://github.com/janpio'>
141
+ <img src='https://github.com/janpio.png?size=140'>
142
142
  </a>
143
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
143
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
144
144
  </td>
145
- <td id='matthew-ellis'>
146
- <a href='https://github.com/matthewellis'>
147
- <img src='https://github.com/matthewellis.png?size=140'>
145
+ <td id='danielle-tomlinson'>
146
+ <a href='https://github.com/endocrimes'>
147
+ <img src='https://github.com/endocrimes.png?size=140'>
148
148
  </a>
149
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
149
+ <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
150
150
  </td>
151
- <td id='josh-holtz'>
152
- <a href='https://github.com/joshdholtz'>
153
- <img src='https://github.com/joshdholtz.png?size=140'>
151
+ <td id='jorge-revuelta-h'>
152
+ <a href='https://github.com/minuscorp'>
153
+ <img src='https://github.com/minuscorp.png?size=140'>
154
154
  </a>
155
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
155
+ <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
156
156
  </td>
157
- <td id='olivier-halligon'>
158
- <a href='https://github.com/AliSoftware'>
159
- <img src='https://github.com/AliSoftware.png?size=140'>
157
+ <td id='jérôme-lacoste'>
158
+ <a href='https://github.com/lacostej'>
159
+ <img src='https://github.com/lacostej.png?size=140'>
160
160
  </a>
161
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
161
+ <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
162
162
  </td>
163
163
  </tr>
164
164
  </table>
@@ -407,6 +407,16 @@ fastlane match change_password
407
407
 
408
408
  You'll be asked for the new password on all your machines on the next run.
409
409
 
410
+ ### Import
411
+
412
+ To import and encrypt a certificate (`.cer`) and the private key (`.p12`) into the _match_ repo run:
413
+
414
+ ```no-highlight
415
+ fastlane match import
416
+ ```
417
+
418
+ You'll be prompted for the certificate (`.cer`) and the private key (`.p12`) paths. _match_ will first validate the certificate (`.cer`) against the Developer Portal before importing the certificate (`.cer`) and the private key (`.p12`).
419
+
410
420
  ### Manual Decrypt
411
421
 
412
422
  If you want to manually decrypt a file you can.
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
- VERSION = '2.128.0.beta.20190722200021'.freeze
2
+ VERSION = '2.128.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  MINIMUM_XCODE_RELEASE = "7.0".freeze
5
5
  RUBOCOP_REQUIREMENT = '0.49.1'.freeze
@@ -18,4 +18,4 @@ class Deliverfile: DeliverfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.127.2
21
+ // Generated with fastlane 2.128.0
@@ -1406,7 +1406,7 @@ func downloadDsyms(username: String,
1406
1406
  _ = runner.executeCommand(command)
1407
1407
  }
1408
1408
  func downloadFromPlayStore(packageName: String,
1409
- metadataPath: String = "./metadata",
1409
+ metadataPath: String? = nil,
1410
1410
  key: String? = nil,
1411
1411
  issuer: String? = nil,
1412
1412
  jsonKey: String? = nil,
@@ -3498,7 +3498,7 @@ func ssh(username: String,
3498
3498
  func supply(packageName: String,
3499
3499
  track: String = "production",
3500
3500
  rollout: String? = nil,
3501
- metadataPath: String = "./metadata",
3501
+ metadataPath: String? = nil,
3502
3502
  key: String? = nil,
3503
3503
  issuer: String? = nil,
3504
3504
  jsonKey: String? = nil,
@@ -4034,7 +4034,7 @@ func uploadToAppStore(username: String,
4034
4034
  func uploadToPlayStore(packageName: String,
4035
4035
  track: String = "production",
4036
4036
  rollout: String? = nil,
4037
- metadataPath: String = "./metadata",
4037
+ metadataPath: String? = nil,
4038
4038
  key: String? = nil,
4039
4039
  issuer: String? = nil,
4040
4040
  jsonKey: String? = nil,
@@ -4285,7 +4285,7 @@ func xcov(workspace: String? = nil,
4285
4285
  coverallsServiceJobId: String? = nil,
4286
4286
  coverallsRepoToken: String? = nil,
4287
4287
  xcconfig: String? = nil,
4288
- ideFoundationPath: String = "/Applications/Xcode-10.2.1.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
4288
+ ideFoundationPath: String = "/Applications/Xcode10.1.app/Contents/Developer/../Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation",
4289
4289
  legacySupport: Bool = false) {
4290
4290
  let command = RubyCommand(commandID: "", methodName: "xcov", className: nil, args: [RubyCommand.Argument(name: "workspace", value: workspace),
4291
4291
  RubyCommand.Argument(name: "project", value: project),
@@ -4395,4 +4395,4 @@ let screengrabfile: Screengrabfile = Screengrabfile()
4395
4395
  let snapshotfile: Snapshotfile = Snapshotfile()
4396
4396
  // Please don't remove the lines below
4397
4397
  // They are used to detect outdated files
4398
- // FastlaneRunnerAPIVersion [0.9.52]
4398
+ // FastlaneRunnerAPIVersion [0.9.53]
@@ -18,4 +18,4 @@ class Gymfile: GymfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.127.2
21
+ // Generated with fastlane 2.128.0
@@ -18,4 +18,4 @@ class Matchfile: MatchfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.127.2
21
+ // Generated with fastlane 2.128.0
@@ -18,4 +18,4 @@ class Precheckfile: PrecheckfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.127.2
21
+ // Generated with fastlane 2.128.0
@@ -18,4 +18,4 @@ class Scanfile: ScanfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.127.2
21
+ // Generated with fastlane 2.128.0
@@ -18,4 +18,4 @@ class Screengrabfile: ScreengrabfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.127.2
21
+ // Generated with fastlane 2.128.0
@@ -18,4 +18,4 @@ class Snapshotfile: SnapshotfileProtocol {
18
18
 
19
19
 
20
20
 
21
- // Generated with fastlane 2.127.2
21
+ // Generated with fastlane 2.128.0
@@ -8,6 +8,7 @@ require_relative 'match/setup'
8
8
  require_relative 'match/spaceship_ensure'
9
9
  require_relative 'match/change_password'
10
10
  require_relative 'match/migrate'
11
+ require_relative 'match/importer'
11
12
  require_relative 'match/storage'
12
13
  require_relative 'match/encryption'
13
14
  require_relative 'match/module'
@@ -8,6 +8,7 @@ require_relative 'setup'
8
8
  require_relative 'runner'
9
9
  require_relative 'options'
10
10
  require_relative 'migrate'
11
+ require_relative 'importer'
11
12
 
12
13
  require_relative 'storage'
13
14
  require_relative 'encryption'
@@ -132,6 +133,19 @@ module Match
132
133
  end
133
134
  end
134
135
 
136
+ command :import do |c|
137
+ c.syntax = "fastlane match import"
138
+ c.description = "Imports certificates and profiles into the encrypted repository"
139
+
140
+ FastlaneCore::CommanderGenerator.new.generate(Match::Options.available_options, command: c)
141
+
142
+ c.action do |args, options|
143
+ params = FastlaneCore::Configuration.create(Match::Options.available_options, options.__hash__)
144
+ params.load_configuration_file("Matchfile") # this has to be done *before* overwriting the value
145
+ Match::Importer.new.import_cert(params)
146
+ end
147
+ end
148
+
135
149
  command :migrate do |c|
136
150
  c.syntax = "fastlane match migrate"
137
151
  c.description = "Migrate from one storage backend to another one"
@@ -41,7 +41,7 @@ module Match
41
41
  end
42
42
 
43
43
  # @return (String) The UUID of the newly generated profile
44
- def self.generate_provisioning_profile(params: nil, prov_type: nil, certificate_id: nil, app_identifier: nil, working_directory: nil)
44
+ def self.generate_provisioning_profile(params: nil, prov_type: nil, certificate_id: nil, app_identifier: nil, force: true, working_directory: nil)
45
45
  require 'sigh/manager'
46
46
  require 'sigh/options'
47
47
 
@@ -59,7 +59,7 @@ module Match
59
59
  app_identifier: app_identifier,
60
60
  output_path: File.join(working_directory, "profiles", prov_type.to_s),
61
61
  username: params[:username],
62
- force: true,
62
+ force: force,
63
63
  cert_id: certificate_id,
64
64
  provisioning_name: profile_name,
65
65
  ignore_profiles_with_different_name: true,
@@ -0,0 +1,92 @@
1
+ require_relative 'spaceship_ensure'
2
+ require_relative 'encryption'
3
+ require_relative 'storage'
4
+ require_relative 'module'
5
+ require 'fileutils'
6
+
7
+ module Match
8
+ class Importer
9
+ def import_cert(params, cert_path: nil, p12_path: nil)
10
+ # Get and verify cert and p12 path
11
+ cert_path ||= UI.input("Certificate (.cer) path:")
12
+ p12_path ||= UI.input("Private key (.p12) path:")
13
+
14
+ cert_path = File.absolute_path(cert_path)
15
+ p12_path = File.absolute_path(p12_path)
16
+
17
+ UI.user_error!("Certificate does not exist at path: #{cert_path}") unless File.exist?(cert_path)
18
+ UI.user_error!("Private key does not exist at path: #{p12_path}") unless File.exist?(p12_path)
19
+
20
+ # Base64 encrypt contents to find match from API to find a cert ID
21
+ cert_contents_base_64 = Base64.strict_encode64(File.open(cert_path).read)
22
+
23
+ # Storage
24
+ storage = Storage.for_mode(params[:storage_mode], {
25
+ git_url: params[:git_url],
26
+ shallow_clone: params[:shallow_clone],
27
+ skip_docs: params[:skip_docs],
28
+ git_branch: params[:git_branch],
29
+ git_full_name: params[:git_full_name],
30
+ git_user_email: params[:git_user_email],
31
+ clone_branch_directly: params[:clone_branch_directly],
32
+ type: params[:type].to_s,
33
+ platform: params[:platform].to_s,
34
+ google_cloud_bucket_name: params[:google_cloud_bucket_name].to_s,
35
+ google_cloud_keys_file: params[:google_cloud_keys_file].to_s,
36
+ google_cloud_project_id: params[:google_cloud_project_id].to_s,
37
+ readonly: params[:readonly],
38
+ username: params[:username],
39
+ team_id: params[:team_id],
40
+ team_name: params[:team_name]
41
+ })
42
+ storage.download
43
+
44
+ # Encryption
45
+ encryption = Encryption.for_storage_mode(params[:storage_mode], {
46
+ git_url: params[:git_url],
47
+ working_directory: storage.working_directory
48
+ })
49
+ encryption.decrypt_files if encryption
50
+ UI.success("Repo is at: '#{storage.working_directory}'")
51
+
52
+ # Map match type into Spaceship::ConnectAPI::Certificate::CertificateType
53
+ cert_type = Match.cert_type_sym(params[:type])
54
+
55
+ case cert_type
56
+ when :development
57
+ certificate_type = Spaceship::ConnectAPI::Certificate::CertificateType::IOS_DEVELOPMENT
58
+ when :distribution, :enterprise
59
+ certificate_type = Spaceship::ConnectAPI::Certificate::CertificateType::IOS_DISTRIBUTION
60
+ else
61
+ UI.user_error!("Cert type '#{cert_type}' is not supported")
62
+ end
63
+
64
+ output_dir = File.join(storage.prefixed_working_directory, "certs", cert_type.to_s)
65
+
66
+ # Need to get the cert id by comparing base64 encoded cert content with certificate content from the API responses
67
+ Spaceship::Portal.login(params[:username])
68
+ Spaceship::Portal.select_team(team_id: params[:team_id], team_name: params[:team_name])
69
+ certs = Spaceship::ConnectAPI::Certificate.all(filter: { certificateType: certificate_type })
70
+
71
+ matching_cert = certs.find do |cert|
72
+ cert.certificate_content == cert_contents_base_64
73
+ end
74
+
75
+ UI.error!("This certificate cannot be imported - the certificate contents did not match with any available on the Developer Portal") if matching_cert.nil?
76
+
77
+ # Make dir if doesn't exist
78
+ FileUtils.mkdir_p(output_dir)
79
+ dest_cert_path = File.join(output_dir, "#{matching_cert.id}.cer")
80
+ dest_p12_path = File.join(output_dir, "#{matching_cert.id}.p12")
81
+
82
+ # Copy files
83
+ IO.copy_stream(cert_path, dest_cert_path)
84
+ IO.copy_stream(p12_path, dest_p12_path)
85
+ files_to_commit = [dest_cert_path, dest_p12_path]
86
+
87
+ # Encrypt and commit
88
+ encryption.encrypt_files if encryption
89
+ storage.save_changes!(files_to_commit: files_to_commit)
90
+ end
91
+ end
92
+ end
@@ -16,11 +16,7 @@ module Match
16
16
  attr_accessor :files_to_commit
17
17
  attr_accessor :spaceship
18
18
 
19
- attr_accessor :storage_mode
20
-
21
- # The Team ID that was fetched
22
- # This will always be `nil` in readonly mode
23
- attr_accessor :currently_used_team_id
19
+ attr_accessor :storage
24
20
 
25
21
  def run(params)
26
22
  self.files_to_commit = []
@@ -32,10 +28,8 @@ module Match
32
28
 
33
29
  update_optional_values_depending_on_storage_type(params)
34
30
 
35
- self.storage_mode = params[:storage_mode]
36
-
37
31
  # Choose the right storage and encryption implementations
38
- storage = Storage.for_mode(params[:storage_mode], {
32
+ self.storage = Storage.for_mode(params[:storage_mode], {
39
33
  git_url: params[:git_url],
40
34
  shallow_clone: params[:shallow_clone],
41
35
  skip_docs: params[:skip_docs],
@@ -47,7 +41,11 @@ module Match
47
41
  platform: params[:platform].to_s,
48
42
  google_cloud_bucket_name: params[:google_cloud_bucket_name].to_s,
49
43
  google_cloud_keys_file: params[:google_cloud_keys_file].to_s,
50
- google_cloud_project_id: params[:google_cloud_project_id].to_s
44
+ google_cloud_project_id: params[:google_cloud_project_id].to_s,
45
+ readonly: params[:readonly],
46
+ username: params[:username],
47
+ team_id: params[:team_id],
48
+ team_name: params[:team_name]
51
49
  })
52
50
  storage.download
53
51
 
@@ -58,14 +56,8 @@ module Match
58
56
  })
59
57
  encryption.decrypt_files if encryption
60
58
 
61
- if params[:readonly]
62
- # In readonly mode, we still want to see if the user provided a team_id
63
- # see `prefixed_working_directory` comments for more details
64
- self.currently_used_team_id = params[:team_id]
65
- else
59
+ unless params[:readonly]
66
60
  self.spaceship = SpaceshipEnsure.new(params[:username], params[:team_id], params[:team_name])
67
- self.currently_used_team_id = self.spaceship.team_id
68
-
69
61
  if params[:type] == "enterprise" && !Spaceship.client.in_house?
70
62
  UI.user_error!("You defined the profile type 'enterprise', but your Apple account doesn't support In-House profiles")
71
63
  end
@@ -124,25 +116,8 @@ module Match
124
116
  end
125
117
 
126
118
  # Used when creating a new certificate or profile
127
- def prefixed_working_directory(working_directory)
128
- if self.storage_mode == "git"
129
- return working_directory
130
- elsif self.storage_mode == "google_cloud"
131
- # We fall back to "*", which means certificates and profiles
132
- # from all teams that use this bucket would be installed. This is not ideal, but
133
- # unless the user provides a `team_id`, we can't know which one to use
134
- # This only happens if `readonly` is activated, and no `team_id` was provided
135
- @_folder_prefix ||= self.currently_used_team_id
136
- if @_folder_prefix.nil?
137
- # We use a `@_folder_prefix` variable, to keep state between multiple calls of this
138
- # method, as the value won't change. This way the warning is only printed once
139
- UI.important("Looks like you run `match` in `readonly` mode, and didn't provide a `team_id`. This will still work, however it is recommended to provide a `team_id` in your Appfile or Matchfile")
140
- @_folder_prefix = "*"
141
- end
142
- return File.join(working_directory, @_folder_prefix)
143
- else
144
- UI.crash!("No implementation for `prefixed_working_directory`")
145
- end
119
+ def prefixed_working_directory
120
+ return self.storage.prefixed_working_directory
146
121
  end
147
122
 
148
123
  # Be smart about optional values here
@@ -156,13 +131,13 @@ module Match
156
131
  def fetch_certificate(params: nil, working_directory: nil)
157
132
  cert_type = Match.cert_type_sym(params[:type])
158
133
 
159
- certs = Dir[File.join(prefixed_working_directory(working_directory), "certs", cert_type.to_s, "*.cer")]
160
- keys = Dir[File.join(prefixed_working_directory(working_directory), "certs", cert_type.to_s, "*.p12")]
134
+ certs = Dir[File.join(prefixed_working_directory, "certs", cert_type.to_s, "*.cer")]
135
+ keys = Dir[File.join(prefixed_working_directory, "certs", cert_type.to_s, "*.p12")]
161
136
 
162
137
  if certs.count == 0 || keys.count == 0
163
138
  UI.important("Couldn't find a valid code signing identity for #{cert_type}... creating one for you now")
164
139
  UI.crash!("No code signing identity found and can not create a new one because you enabled `readonly`") if params[:readonly]
165
- cert_path = Generator.generate_certificate(params, cert_type, prefixed_working_directory(working_directory))
140
+ cert_path = Generator.generate_certificate(params, cert_type, prefixed_working_directory)
166
141
  private_key_path = cert_path.gsub(".cer", ".p12")
167
142
 
168
143
  self.files_to_commit << cert_path
@@ -221,7 +196,7 @@ module Match
221
196
  end
222
197
 
223
198
  profile_name = names.join("_").gsub("*", '\*') # this is important, as it shouldn't be a wildcard
224
- base_dir = File.join(prefixed_working_directory(working_directory), "profiles", prov_type.to_s)
199
+ base_dir = File.join(prefixed_working_directory, "profiles", prov_type.to_s)
225
200
  profiles = Dir[File.join(base_dir, "#{profile_name}.mobileprovision")]
226
201
  if Helper.mac?
227
202
  keychain_path = FastlaneCore::Helper.keychain_path(params[:keychain_name]) unless params[:keychain_name].nil?
@@ -229,10 +204,11 @@ module Match
229
204
 
230
205
  # Install the provisioning profiles
231
206
  profile = profiles.last
207
+ force = params[:force]
232
208
 
233
209
  if params[:force_for_new_devices] && !params[:readonly]
234
- if prov_type != :appstore
235
- params[:force] = device_count_different?(profile: profile, keychain_path: keychain_path, platform: params[:platform].to_sym) unless params[:force]
210
+ if prov_type != :appstore && !params[:force]
211
+ force = device_count_different?(profile: profile, keychain_path: keychain_path, platform: params[:platform].to_sym)
236
212
  else
237
213
  # App Store provisioning profiles don't contain device identifiers and
238
214
  # thus shouldn't be renewed if the device count has changed.
@@ -253,11 +229,13 @@ module Match
253
229
  UI.error("If you are certain that a profile should exist, double-check the recent changes to your match repository")
254
230
  UI.user_error!("No matching provisioning profiles found and can not create a new one because you enabled `readonly`. Check the output above for more information.")
255
231
  end
232
+
256
233
  profile = Generator.generate_provisioning_profile(params: params,
257
234
  prov_type: prov_type,
258
235
  certificate_id: certificate_id,
259
236
  app_identifier: app_identifier,
260
- working_directory: prefixed_working_directory(working_directory))
237
+ force: force,
238
+ working_directory: prefixed_working_directory)
261
239
  self.files_to_commit << profile
262
240
  end
263
241
 
@@ -53,6 +53,10 @@ module Match
53
53
  self.platform = platform if platform
54
54
  end
55
55
 
56
+ def prefixed_working_directory
57
+ return working_directory
58
+ end
59
+
56
60
  def download
57
61
  # Check if we already have a functional working_directory
58
62
  return if @working_directory
@@ -4,6 +4,7 @@ require 'google/cloud/storage'
4
4
 
5
5
  require_relative '../options'
6
6
  require_relative '../module'
7
+ require_relative '../spaceship_ensure'
7
8
  require_relative './interface'
8
9
 
9
10
  module Match
@@ -18,6 +19,10 @@ module Match
18
19
  attr_reader :bucket_name
19
20
  attr_reader :google_cloud_keys_file
20
21
  attr_reader :google_cloud_project_id
22
+ attr_reader :readonly
23
+ attr_reader :username
24
+ attr_reader :team_id
25
+ attr_reader :team_name
21
26
 
22
27
  # Managed values
23
28
  attr_accessor :gc_storage
@@ -35,7 +40,11 @@ module Match
35
40
  platform: params[:platform].to_s,
36
41
  google_cloud_bucket_name: params[:google_cloud_bucket_name],
37
42
  google_cloud_keys_file: params[:google_cloud_keys_file],
38
- google_cloud_project_id: params[:google_cloud_project_id]
43
+ google_cloud_project_id: params[:google_cloud_project_id],
44
+ readonly: params[:readonly],
45
+ username: params[:username],
46
+ team_id: params[:team_id],
47
+ team_name: params[:team_name]
39
48
  )
40
49
  end
41
50
 
@@ -43,12 +52,21 @@ module Match
43
52
  platform: nil,
44
53
  google_cloud_bucket_name: nil,
45
54
  google_cloud_keys_file: nil,
46
- google_cloud_project_id: nil)
55
+ google_cloud_project_id: nil,
56
+ readonly: nil,
57
+ username: nil,
58
+ team_id: nil,
59
+ team_name: nil)
47
60
  @type = type if type
48
61
  @platform = platform if platform
49
62
  @google_cloud_project_id = google_cloud_project_id if google_cloud_project_id
50
63
  @bucket_name = google_cloud_bucket_name
51
64
 
65
+ @readonly = readonly
66
+ @username = username
67
+ @team_id = team_id
68
+ @team_name = team_name
69
+
52
70
  @google_cloud_keys_file = ensure_keys_file_exists(google_cloud_keys_file, google_cloud_project_id)
53
71
 
54
72
  if self.google_cloud_keys_file.to_s.length > 0
@@ -81,6 +99,32 @@ module Match
81
99
  ensure_bucket_is_selected
82
100
  end
83
101
 
102
+ def currently_used_team_id
103
+ if self.readonly
104
+ # In readonly mode, we still want to see if the user provided a team_id
105
+ # see `prefixed_working_directory` comments for more details
106
+ return self.team_id
107
+ else
108
+ spaceship = SpaceshipEnsure.new(self.username, self.team_id, self.team_name)
109
+ return spaceship.team_id
110
+ end
111
+ end
112
+
113
+ def prefixed_working_directory
114
+ # We fall back to "*", which means certificates and profiles
115
+ # from all teams that use this bucket would be installed. This is not ideal, but
116
+ # unless the user provides a `team_id`, we can't know which one to use
117
+ # This only happens if `readonly` is activated, and no `team_id` was provided
118
+ @_folder_prefix ||= currently_used_team_id
119
+ if @_folder_prefix.nil?
120
+ # We use a `@_folder_prefix` variable, to keep state between multiple calls of this
121
+ # method, as the value won't change. This way the warning is only printed once
122
+ UI.important("Looks like you run `match` in `readonly` mode, and didn't provide a `team_id`. This will still work, however it is recommended to provide a `team_id` in your Appfile or Matchfile")
123
+ @_folder_prefix = "*"
124
+ end
125
+ return File.join(working_directory, @_folder_prefix)
126
+ end
127
+
84
128
  def download
85
129
  # Check if we already have a functional working_directory
86
130
  return if @working_directory
@@ -8,6 +8,11 @@ module Match
8
8
  # and decrypt/encrypt them
9
9
  attr_accessor :working_directory
10
10
 
11
+ # To make debugging easier, we have a custom exception here
12
+ def prefixed_working_directory
13
+ not_implemented(__method__)
14
+ end
15
+
11
16
  # To make debugging easier, we have a custom exception here
12
17
  def working_directory
13
18
  if @working_directory.nil?
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.128.0.beta.20190722200021
4
+ version: 2.128.0
5
5
  platform: ruby
6
6
  authors:
7
- - Danielle Tomlinson
8
- - Joshua Liebowitz
9
- - Andrew McBurney
10
- - Jimmy Dee
11
- - Jorge Revuelta H
12
- - Josh Holtz
13
7
  - Helmut Januschka
14
- - Jan Piotrowski
15
- - Aaron Brager
16
8
  - Kohki Miki
17
- - Matthew Ellis
9
+ - Jimmy Dee
10
+ - Josh Holtz
18
11
  - Fumiya Nakamura
19
12
  - Jérôme Lacoste
20
- - Manu Wallner
13
+ - Danielle Tomlinson
14
+ - Matthew Ellis
21
15
  - Felix Krause
16
+ - Maksym Grebenets
17
+ - Joshua Liebowitz
18
+ - Stefan Natchev
22
19
  - Luka Mirosevic
20
+ - Jorge Revuelta H
21
+ - Andrew McBurney
23
22
  - Olivier Halligon
24
- - Stefan Natchev
25
- - Maksym Grebenets
26
23
  - Iulian Onofrei
24
+ - Aaron Brager
25
+ - Jan Piotrowski
26
+ - Manu Wallner
27
27
  autorequire:
28
28
  bindir: bin
29
29
  cert_chain: []
@@ -1441,6 +1441,7 @@ files:
1441
1441
  - match/lib/match/encryption/interface.rb
1442
1442
  - match/lib/match/encryption/openssl.rb
1443
1443
  - match/lib/match/generator.rb
1444
+ - match/lib/match/importer.rb
1444
1445
  - match/lib/match/migrate.rb
1445
1446
  - match/lib/match/module.rb
1446
1447
  - match/lib/match/nuke.rb
@@ -1741,24 +1742,24 @@ metadata:
1741
1742
  post_install_message:
1742
1743
  rdoc_options: []
1743
1744
  require_paths:
1744
- - fastlane/lib
1745
- - spaceship/lib
1746
- - sigh/lib
1747
- - fastlane_core/lib
1748
- - supply/lib
1749
- - gym/lib
1750
- - screengrab/lib
1751
- - match/lib
1752
- - frameit/lib
1745
+ - credentials_manager/lib
1746
+ - pem/lib
1753
1747
  - snapshot/lib
1748
+ - frameit/lib
1749
+ - match/lib
1750
+ - fastlane_core/lib
1754
1751
  - deliver/lib
1755
1752
  - scan/lib
1753
+ - supply/lib
1756
1754
  - cert/lib
1757
- - precheck/lib
1758
- - pem/lib
1755
+ - fastlane/lib
1756
+ - spaceship/lib
1759
1757
  - pilot/lib
1758
+ - gym/lib
1759
+ - precheck/lib
1760
+ - screengrab/lib
1761
+ - sigh/lib
1760
1762
  - produce/lib
1761
- - credentials_manager/lib
1762
1763
  required_ruby_version: !ruby/object:Gem::Requirement
1763
1764
  requirements:
1764
1765
  - - ">="
@@ -1766,12 +1767,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
1766
1767
  version: 2.0.0
1767
1768
  required_rubygems_version: !ruby/object:Gem::Requirement
1768
1769
  requirements:
1769
- - - ">"
1770
+ - - ">="
1770
1771
  - !ruby/object:Gem::Version
1771
- version: 1.3.1
1772
+ version: '0'
1772
1773
  requirements: []
1773
- rubyforge_project:
1774
- rubygems_version: 2.6.8
1774
+ rubygems_version: 3.0.1
1775
1775
  signing_key:
1776
1776
  specification_version: 4
1777
1777
  summary: The easiest way to automate beta deployments and releases for your iOS and