fastlane 2.225.0 → 2.227.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +98 -98
  3. data/cert/lib/cert/options.rb +7 -2
  4. data/cert/lib/cert/runner.rb +23 -11
  5. data/deliver/lib/deliver/options.rb +1 -1
  6. data/fastlane/lib/fastlane/actions/app_store_build_number.rb +1 -1
  7. data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +1 -1
  8. data/fastlane/lib/fastlane/actions/import_from_git.rb +11 -4
  9. data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +1 -1
  10. data/fastlane/lib/fastlane/actions/notarize.rb +4 -0
  11. data/fastlane/lib/fastlane/actions/onesignal.rb +1 -1
  12. data/fastlane/lib/fastlane/actions/register_device.rb +1 -1
  13. data/fastlane/lib/fastlane/actions/register_devices.rb +1 -1
  14. data/fastlane/lib/fastlane/actions/setup_ci.rb +14 -4
  15. data/fastlane/lib/fastlane/actions/testfairy.rb +41 -4
  16. data/fastlane/lib/fastlane/actions/unlock_keychain.rb +6 -1
  17. data/fastlane/lib/fastlane/fast_file.rb +9 -6
  18. data/fastlane/lib/fastlane/version.rb +1 -1
  19. data/fastlane/swift/Actions.swift +1 -1
  20. data/fastlane/swift/Appfile.swift +1 -1
  21. data/fastlane/swift/ArgumentProcessor.swift +1 -1
  22. data/fastlane/swift/Atomic.swift +1 -1
  23. data/fastlane/swift/ControlCommand.swift +1 -1
  24. data/fastlane/swift/Deliverfile.swift +2 -2
  25. data/fastlane/swift/DeliverfileProtocol.swift +2 -2
  26. data/fastlane/swift/Fastlane.swift +39 -13
  27. data/fastlane/swift/Gymfile.swift +2 -2
  28. data/fastlane/swift/GymfileProtocol.swift +2 -2
  29. data/fastlane/swift/LaneFileProtocol.swift +1 -1
  30. data/fastlane/swift/MainProcess.swift +1 -1
  31. data/fastlane/swift/Matchfile.swift +2 -2
  32. data/fastlane/swift/MatchfileProtocol.swift +2 -2
  33. data/fastlane/swift/OptionalConfigValue.swift +1 -1
  34. data/fastlane/swift/Plugins.swift +1 -1
  35. data/fastlane/swift/Precheckfile.swift +2 -2
  36. data/fastlane/swift/PrecheckfileProtocol.swift +2 -2
  37. data/fastlane/swift/RubyCommand.swift +1 -1
  38. data/fastlane/swift/RubyCommandable.swift +1 -1
  39. data/fastlane/swift/Runner.swift +1 -1
  40. data/fastlane/swift/RunnerArgument.swift +1 -1
  41. data/fastlane/swift/Scanfile.swift +2 -2
  42. data/fastlane/swift/ScanfileProtocol.swift +2 -2
  43. data/fastlane/swift/Screengrabfile.swift +2 -2
  44. data/fastlane/swift/ScreengrabfileProtocol.swift +2 -2
  45. data/fastlane/swift/Snapshotfile.swift +2 -2
  46. data/fastlane/swift/SnapshotfileProtocol.swift +2 -2
  47. data/fastlane/swift/SocketClient.swift +1 -1
  48. data/fastlane/swift/SocketClientDelegateProtocol.swift +1 -1
  49. data/fastlane/swift/SocketResponse.swift +1 -1
  50. data/fastlane/swift/main.swift +1 -1
  51. data/fastlane_core/lib/fastlane_core/helper.rb +6 -1
  52. data/match/lib/assets/READMETemplate.md +2 -2
  53. data/match/lib/match/generator.rb +2 -2
  54. data/match/lib/match/runner.rb +1 -1
  55. data/precheck/lib/precheck/options.rb +1 -1
  56. data/produce/lib/produce/options.rb +1 -1
  57. data/spaceship/lib/spaceship/connect_api/models/certificate.rb +1 -0
  58. data/supply/lib/supply/uploader.rb +22 -11
  59. data/trainer/lib/trainer/legacy_xcresult.rb +586 -0
  60. data/trainer/lib/trainer/options.rb +5 -0
  61. data/trainer/lib/trainer/plist_test_summary_parser.rb +84 -0
  62. data/trainer/lib/trainer/test_parser.rb +12 -293
  63. data/trainer/lib/trainer/xcresult/helper.rb +53 -0
  64. data/trainer/lib/trainer/xcresult/repetition.rb +39 -0
  65. data/trainer/lib/trainer/xcresult/test_case.rb +221 -0
  66. data/trainer/lib/trainer/xcresult/test_case_attributes.rb +49 -0
  67. data/trainer/lib/trainer/xcresult/test_plan.rb +91 -0
  68. data/trainer/lib/trainer/xcresult/test_suite.rb +134 -0
  69. data/trainer/lib/trainer/xcresult.rb +31 -388
  70. data/trainer/lib/trainer.rb +3 -1
  71. metadata +31 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a1e77f8938ff5841875b3034ae791bdb74735771a039be4e5da709c92b49268b
4
- data.tar.gz: 5aebfce31f8424bd6012576c361269061b0aece5040af945ef29849fcb233cd3
3
+ metadata.gz: dd8ce422d952c22cd384e6459133d3d668178a6237168e59c2902f3e0b35fcbe
4
+ data.tar.gz: 55220418b3abab5621d41ab450f870b588f30cf566e01f71b7e4c993abc60c06
5
5
  SHA512:
6
- metadata.gz: eff23b206daaf4616253f90a657b30ddc8dc135f6bb60f8a0880b21fcd5919da487d4b3aa799a024a60cc0324be9cbf556bc90f3f90e55b685f28fa3d5737a16
7
- data.tar.gz: f31da0896a7cf725d9bf29e22129fd1b6f9d73b383bd5048475c01fbf206a32642f2ef93252f91e0872dbb49dd18ca9365cf4a1e4b604f4802194bcdb24663f1
6
+ metadata.gz: d10309c76cd22469932971ad8372617ccd997e5c21b53af5ed871ba58029f75ba362ca2ff61573ec44cf5e10e19bd7b34743a955c438a7a9dbd286aa5f599865
7
+ data.tar.gz: 7da6fcdff81271b64632d11e8da1f7937249061776263b72244c925c27060d4022842953a8e78b7435e7df11ed78f34c1935b058da3dbc973ba3389e797e5973
data/README.md CHANGED
@@ -35,11 +35,23 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
35
35
  <!-- This table is regenerated and resorted on each release -->
36
36
  <table id='team'>
37
37
  <tr>
38
- <td id='olivier-halligon'>
39
- <a href='https://github.com/AliSoftware'>
40
- <img src='https://github.com/AliSoftware.png' width='140px;'>
38
+ <td id='roger-oba'>
39
+ <a href='https://github.com/rogerluan'>
40
+ <img src='https://github.com/rogerluan.png' width='140px;'>
41
41
  </a>
42
- <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
42
+ <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
43
+ </td>
44
+ <td id='aaron-brager'>
45
+ <a href='https://github.com/getaaron'>
46
+ <img src='https://github.com/getaaron.png' width='140px;'>
47
+ </a>
48
+ <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
49
+ </td>
50
+ <td id='iulian-onofrei'>
51
+ <a href='https://github.com/revolter'>
52
+ <img src='https://github.com/revolter.png' width='140px;'>
53
+ </a>
54
+ <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
43
55
  </td>
44
56
  <td id='stefan-natchev'>
45
57
  <a href='https://github.com/snatchev'>
@@ -47,17 +59,25 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
47
59
  </a>
48
60
  <h4 align='center'><a href='https://twitter.com/snatchev'>Stefan Natchev</a></h4>
49
61
  </td>
50
- <td id='felix-krause'>
51
- <a href='https://github.com/KrauseFx'>
52
- <img src='https://github.com/KrauseFx.png' width='140px;'>
62
+ <td id='jimmy-dee'>
63
+ <a href='https://github.com/jdee'>
64
+ <img src='https://github.com/jdee.png' width='140px;'>
53
65
  </a>
54
- <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
66
+ <h4 align='center'>Jimmy Dee</h4>
55
67
  </td>
56
- <td id='kohki-miki'>
57
- <a href='https://github.com/giginet'>
58
- <img src='https://github.com/giginet.png' width='140px;'>
68
+ </tr>
69
+ <tr>
70
+ <td id='manish-rathi'>
71
+ <a href='https://github.com/crazymanish'>
72
+ <img src='https://github.com/crazymanish.png' width='140px;'>
59
73
  </a>
60
- <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
74
+ <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
75
+ </td>
76
+ <td id='fumiya-nakamura'>
77
+ <a href='https://github.com/nafu'>
78
+ <img src='https://github.com/nafu.png' width='140px;'>
79
+ </a>
80
+ <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
61
81
  </td>
62
82
  <td id='luka-mirosevic'>
63
83
  <a href='https://github.com/lmirosevic'>
@@ -65,141 +85,121 @@ If the above doesn't help, please [submit an issue](https://github.com/fastlane/
65
85
  </a>
66
86
  <h4 align='center'><a href='https://twitter.com/lmirosevic'>Luka Mirosevic</a></h4>
67
87
  </td>
68
- </tr>
69
- <tr>
70
- <td id='matthew-ellis'>
71
- <a href='https://github.com/matthewellis'>
72
- <img src='https://github.com/matthewellis.png' width='140px;'>
88
+ <td id='felix-krause'>
89
+ <a href='https://github.com/KrauseFx'>
90
+ <img src='https://github.com/KrauseFx.png' width='140px;'>
73
91
  </a>
74
- <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
92
+ <h4 align='center'><a href='https://twitter.com/KrauseFx'>Felix Krause</a></h4>
75
93
  </td>
76
- <td id='iulian-onofrei'>
77
- <a href='https://github.com/revolter'>
78
- <img src='https://github.com/revolter.png' width='140px;'>
94
+ <td id='jan-piotrowski'>
95
+ <a href='https://github.com/janpio'>
96
+ <img src='https://github.com/janpio.png' width='140px;'>
79
97
  </a>
80
- <h4 align='center'><a href='https://twitter.com/Revolt666'>Iulian Onofrei</a></h4>
98
+ <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
81
99
  </td>
100
+ </tr>
101
+ <tr>
82
102
  <td id='jérôme-lacoste'>
83
103
  <a href='https://github.com/lacostej'>
84
104
  <img src='https://github.com/lacostej.png' width='140px;'>
85
105
  </a>
86
106
  <h4 align='center'><a href='https://twitter.com/lacostej'>Jérôme Lacoste</a></h4>
87
107
  </td>
88
- <td id='fumiya-nakamura'>
89
- <a href='https://github.com/nafu'>
90
- <img src='https://github.com/nafu.png' width='140px;'>
91
- </a>
92
- <h4 align='center'><a href='https://twitter.com/nafu003'>Fumiya Nakamura</a></h4>
93
- </td>
94
- <td id='maksym-grebenets'>
95
- <a href='https://github.com/mgrebenets'>
96
- <img src='https://github.com/mgrebenets.png' width='140px;'>
97
- </a>
98
- <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
99
- </td>
100
- </tr>
101
- <tr>
102
- <td id='jimmy-dee'>
103
- <a href='https://github.com/jdee'>
104
- <img src='https://github.com/jdee.png' width='140px;'>
108
+ <td id='łukasz-grabowski'>
109
+ <a href='https://github.com/lucgrabowski'>
110
+ <img src='https://github.com/lucgrabowski.png' width='140px;'>
105
111
  </a>
106
- <h4 align='center'>Jimmy Dee</h4>
112
+ <h4 align='center'>Łukasz Grabowski</h4>
107
113
  </td>
108
- <td id='manu-wallner'>
109
- <a href='https://github.com/milch'>
110
- <img src='https://github.com/milch.png' width='140px;'>
114
+ <td id='satoshi-namai'>
115
+ <a href='https://github.com/ainame'>
116
+ <img src='https://github.com/ainame.png' width='140px;'>
111
117
  </a>
112
- <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
118
+ <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
113
119
  </td>
114
- <td id='josh-holtz'>
115
- <a href='https://github.com/joshdholtz'>
116
- <img src='https://github.com/joshdholtz.png' width='140px;'>
120
+ <td id='kohki-miki'>
121
+ <a href='https://github.com/giginet'>
122
+ <img src='https://github.com/giginet.png' width='140px;'>
117
123
  </a>
118
- <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
124
+ <h4 align='center'><a href='https://twitter.com/giginet'>Kohki Miki</a></h4>
119
125
  </td>
120
- <td id='joshua-liebowitz'>
121
- <a href='https://github.com/taquitos'>
122
- <img src='https://github.com/taquitos.png' width='140px;'>
126
+ <td id='max-ott'>
127
+ <a href='https://github.com/max-ott'>
128
+ <img src='https://github.com/max-ott.png' width='140px;'>
123
129
  </a>
124
- <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
130
+ <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
125
131
  </td>
132
+ </tr>
133
+ <tr>
126
134
  <td id='jorge-revuelta-h'>
127
135
  <a href='https://github.com/minuscorp'>
128
136
  <img src='https://github.com/minuscorp.png' width='140px;'>
129
137
  </a>
130
138
  <h4 align='center'><a href='https://twitter.com/minuscorp'>Jorge Revuelta H</a></h4>
131
139
  </td>
132
- </tr>
133
- <tr>
134
- <td id='jan-piotrowski'>
135
- <a href='https://github.com/janpio'>
136
- <img src='https://github.com/janpio.png' width='140px;'>
137
- </a>
138
- <h4 align='center'><a href='https://twitter.com/Sujan'>Jan Piotrowski</a></h4>
139
- </td>
140
- <td id='satoshi-namai'>
141
- <a href='https://github.com/ainame'>
142
- <img src='https://github.com/ainame.png' width='140px;'>
140
+ <td id='maksym-grebenets'>
141
+ <a href='https://github.com/mgrebenets'>
142
+ <img src='https://github.com/mgrebenets.png' width='140px;'>
143
143
  </a>
144
- <h4 align='center'><a href='https://twitter.com/ainame'>Satoshi Namai</a></h4>
144
+ <h4 align='center'><a href='https://twitter.com/mgrebenets'>Maksym Grebenets</a></h4>
145
145
  </td>
146
- <td id='helmut-januschka'>
147
- <a href='https://github.com/hjanuschka'>
148
- <img src='https://github.com/hjanuschka.png' width='140px;'>
146
+ <td id='matthew-ellis'>
147
+ <a href='https://github.com/matthewellis'>
148
+ <img src='https://github.com/matthewellis.png' width='140px;'>
149
149
  </a>
150
- <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
150
+ <h4 align='center'><a href='https://twitter.com/mellis1995'>Matthew Ellis</a></h4>
151
151
  </td>
152
- <td id='manish-rathi'>
153
- <a href='https://github.com/crazymanish'>
154
- <img src='https://github.com/crazymanish.png' width='140px;'>
152
+ <td id='joshua-liebowitz'>
153
+ <a href='https://github.com/taquitos'>
154
+ <img src='https://github.com/taquitos.png' width='140px;'>
155
155
  </a>
156
- <h4 align='center'><a href='https://twitter.com/iammanishrathi'>Manish Rathi</a></h4>
156
+ <h4 align='center'><a href='https://twitter.com/taquitos'>Joshua Liebowitz</a></h4>
157
157
  </td>
158
- <td id='daniel-jankowski'>
159
- <a href='https://github.com/mollyIV'>
160
- <img src='https://github.com/mollyIV.png' width='140px;'>
158
+ <td id='josh-holtz'>
159
+ <a href='https://github.com/joshdholtz'>
160
+ <img src='https://github.com/joshdholtz.png' width='140px;'>
161
161
  </a>
162
- <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
162
+ <h4 align='center'><a href='https://twitter.com/joshdholtz'>Josh Holtz</a></h4>
163
163
  </td>
164
164
  </tr>
165
165
  <tr>
166
- <td id='aaron-brager'>
167
- <a href='https://github.com/getaaron'>
168
- <img src='https://github.com/getaaron.png' width='140px;'>
169
- </a>
170
- <h4 align='center'><a href='https://twitter.com/getaaron'>Aaron Brager</a></h4>
171
- </td>
172
166
  <td id='danielle-tomlinson'>
173
167
  <a href='https://github.com/endocrimes'>
174
168
  <img src='https://github.com/endocrimes.png' width='140px;'>
175
169
  </a>
176
170
  <h4 align='center'><a href='https://twitter.com/endocrimes'>Danielle Tomlinson</a></h4>
177
171
  </td>
178
- <td id='roger-oba'>
179
- <a href='https://github.com/rogerluan'>
180
- <img src='https://github.com/rogerluan.png' width='140px;'>
181
- </a>
182
- <h4 align='center'><a href='https://twitter.com/rogerluan_'>Roger Oba</a></h4>
183
- </td>
184
- <td id='łukasz-grabowski'>
185
- <a href='https://github.com/lucgrabowski'>
186
- <img src='https://github.com/lucgrabowski.png' width='140px;'>
187
- </a>
188
- <h4 align='center'>Łukasz Grabowski</h4>
189
- </td>
190
172
  <td id='andrew-mcburney'>
191
173
  <a href='https://github.com/armcburney'>
192
174
  <img src='https://github.com/armcburney.png' width='140px;'>
193
175
  </a>
194
176
  <h4 align='center'><a href='https://twitter.com/armcburney'>Andrew McBurney</a></h4>
195
177
  </td>
178
+ <td id='daniel-jankowski'>
179
+ <a href='https://github.com/mollyIV'>
180
+ <img src='https://github.com/mollyIV.png' width='140px;'>
181
+ </a>
182
+ <h4 align='center'><a href='https://twitter.com/mollyIV'>Daniel Jankowski</a></h4>
183
+ </td>
184
+ <td id='helmut-januschka'>
185
+ <a href='https://github.com/hjanuschka'>
186
+ <img src='https://github.com/hjanuschka.png' width='140px;'>
187
+ </a>
188
+ <h4 align='center'><a href='https://twitter.com/hjanuschka'>Helmut Januschka</a></h4>
189
+ </td>
190
+ <td id='olivier-halligon'>
191
+ <a href='https://github.com/AliSoftware'>
192
+ <img src='https://github.com/AliSoftware.png' width='140px;'>
193
+ </a>
194
+ <h4 align='center'><a href='https://twitter.com/aligatr'>Olivier Halligon</a></h4>
195
+ </td>
196
196
  </tr>
197
197
  <tr>
198
- <td id='max-ott'>
199
- <a href='https://github.com/max-ott'>
200
- <img src='https://github.com/max-ott.png' width='140px;'>
198
+ <td id='manu-wallner'>
199
+ <a href='https://github.com/milch'>
200
+ <img src='https://github.com/milch.png' width='140px;'>
201
201
  </a>
202
- <h4 align='center'><a href='https://twitter.com/ott_max'>Max Ott</a></h4>
202
+ <h4 align='center'><a href='https://twitter.com/acrooow'>Manu Wallner</a></h4>
203
203
  </td>
204
204
  </table>
205
205
 
@@ -100,9 +100,11 @@ module Cert
100
100
  env_name: "CERT_KEYCHAIN_PATH",
101
101
  description: "Path to a custom keychain",
102
102
  code_gen_sensitive: true,
103
- default_value: Dir["#{Dir.home}/Library/Keychains/login.keychain", "#{Dir.home}/Library/Keychains/login.keychain-db"].last,
103
+ default_value: Helper.mac? ? Dir["#{Dir.home}/Library/Keychains/login.keychain", "#{Dir.home}/Library/Keychains/login.keychain-db"].last : nil,
104
104
  default_value_dynamic: true,
105
+ optional: true,
105
106
  verify_block: proc do |value|
107
+ UI.user_error!("Keychain is not supported on platforms other than macOS") if !Helper.mac? && value
106
108
  value = File.expand_path(value)
107
109
  UI.user_error!("Keychain not found at path '#{value}'") unless File.exist?(value)
108
110
  end),
@@ -111,7 +113,10 @@ module Cert
111
113
  env_name: "CERT_KEYCHAIN_PASSWORD",
112
114
  sensitive: true,
113
115
  description: "This might be required the first time you access certificates on a new mac. For the login/default keychain this is your macOS account password",
114
- optional: true),
116
+ optional: true,
117
+ verify_block: proc do |value|
118
+ UI.user_error!("Keychain is not supported on platforms other than macOS") unless Helper.mac?
119
+ end),
115
120
  FastlaneCore::ConfigItem.new(key: :skip_set_partition_list,
116
121
  short_option: "-P",
117
122
  env_name: "CERT_SKIP_SET_PARTITION_LIST",
@@ -12,10 +12,14 @@ module Cert
12
12
  def launch
13
13
  run
14
14
 
15
- installed = FastlaneCore::CertChecker.installed?(ENV["CER_FILE_PATH"], in_keychain: ENV["CER_KEYCHAIN_PATH"])
16
- UI.message("Verifying the certificate is properly installed locally...")
17
- UI.user_error!("Could not find the newly generated certificate installed", show_github_issues: true) unless installed
18
- UI.success("Successfully installed certificate #{ENV['CER_CERTIFICATE_ID']}")
15
+ if Helper.mac?
16
+ UI.message("Verifying the certificate is properly installed locally...")
17
+ installed = FastlaneCore::CertChecker.installed?(ENV["CER_FILE_PATH"], in_keychain: ENV["CER_KEYCHAIN_PATH"])
18
+ UI.user_error!("Could not find the newly generated certificate installed", show_github_issues: true) unless installed
19
+ UI.success("Successfully installed certificate #{ENV['CER_CERTIFICATE_ID']}")
20
+ else
21
+ UI.message("Skipping verifying certificates as it would not work on this operating system.")
22
+ end
19
23
  return ENV["CER_FILE_PATH"]
20
24
  end
21
25
 
@@ -45,7 +49,7 @@ module Cert
45
49
 
46
50
  should_create = Cert.config[:force]
47
51
  unless should_create
48
- cert_path = find_existing_cert
52
+ cert_path = find_existing_cert if Helper.mac?
49
53
  should_create = cert_path.nil?
50
54
  end
51
55
 
@@ -223,17 +227,25 @@ module Cert
223
227
 
224
228
  cert_path = store_certificate(certificate, Cert.config[:filename])
225
229
 
226
- # Import all the things into the Keychain
227
- keychain = File.expand_path(Cert.config[:keychain_path])
228
- password = Cert.config[:keychain_password]
229
- FastlaneCore::KeychainImporter.import_file(private_key_path, keychain, keychain_password: password, skip_set_partition_list: Cert.config[:skip_set_partition_list])
230
- FastlaneCore::KeychainImporter.import_file(cert_path, keychain, keychain_password: password, skip_set_partition_list: Cert.config[:skip_set_partition_list])
230
+ if Helper.mac?
231
+ # Import all the things into the Keychain
232
+ keychain = File.expand_path(Cert.config[:keychain_path])
233
+ password = Cert.config[:keychain_password]
234
+ FastlaneCore::KeychainImporter.import_file(private_key_path, keychain, keychain_password: password, skip_set_partition_list: Cert.config[:skip_set_partition_list])
235
+ FastlaneCore::KeychainImporter.import_file(cert_path, keychain, keychain_password: password, skip_set_partition_list: Cert.config[:skip_set_partition_list])
236
+ else
237
+ UI.message("Skipping importing certificates as it would not work on this operating system.")
238
+ end
231
239
 
232
240
  # Environment variables for the fastlane action
233
241
  ENV["CER_CERTIFICATE_ID"] = certificate.id
234
242
  ENV["CER_FILE_PATH"] = cert_path
235
243
 
236
- UI.success("Successfully generated #{certificate.id} which was imported to the local machine.")
244
+ if Helper.mac?
245
+ UI.success("Successfully generated #{certificate.id} which was imported to the local machine.")
246
+ else
247
+ UI.success("Successfully generated #{certificate.id}")
248
+ end
237
249
 
238
250
  return cert_path
239
251
  end
@@ -99,7 +99,7 @@ module Deliver
99
99
  optional: true,
100
100
  default_value: "ios",
101
101
  verify_block: proc do |value|
102
- UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %('ios', 'appletvos', 'xros', 'osx').include?(value)
102
+ UI.user_error!("The platform can only be ios, appletvos/tvos, xros or osx") unless %w(ios appletvos tvos xros osx).include?(value)
103
103
  end),
104
104
 
105
105
  # live version
@@ -186,7 +186,7 @@ module Fastlane
186
186
  optional: true,
187
187
  default_value: "ios",
188
188
  verify_block: proc do |value|
189
- UI.user_error!("The platform can only be ios, appletvos, xros or osx") unless %('ios', 'appletvos', 'xros', 'osx').include?(value)
189
+ UI.user_error!("The platform can only be ios, appletvos/tvos, xros or osx") unless %w(ios appletvos tvos xros osx).include?(value)
190
190
  end),
191
191
  FastlaneCore::ConfigItem.new(key: :team_name,
192
192
  short_option: "-e",
@@ -564,7 +564,7 @@ What's the worst that could happen for each of the profile types?
564
564
 
565
565
  #### App Store Profiles
566
566
 
567
- An App Store profile can't be used for anything as long as it's not re-signed by Apple. The only way to get an app resigned is to submit an app for review which could take anywhere from 24 hours to a few days (checkout [appreviewtimes.com](http://appreviewtimes.com) for up-to-date expectations). Attackers could only submit an app for review, if they also got access to your App Store Connect credentials (which are not stored in git, but in your local keychain). Additionally you get an email notification every time a build gets uploaded to cancel the submission even before your app gets into the review stage.
567
+ An App Store profile can't be used for anything as long as it's not re-signed by Apple. The only way to get an app resigned is to submit an app for review which could take anywhere from 24 hours to a few days. Attackers could only submit an app for review, if they also got access to your App Store Connect credentials (which are not stored in git, but in your local keychain). Additionally you get an email notification every time a build gets uploaded to cancel the submission even before your app gets into the review stage.
568
568
 
569
569
  #### Development and Ad Hoc Profiles
570
570
 
@@ -30,9 +30,10 @@ module Fastlane
30
30
  default_value: 'HEAD',
31
31
  optional: true),
32
32
  FastlaneCore::ConfigItem.new(key: :dependencies,
33
- description: "The array of additional Fastfiles in the repository",
34
- default_value: [],
35
- optional: true),
33
+ description: "The array of additional Fastfiles in the repository",
34
+ default_value: [],
35
+ type: Array,
36
+ optional: true),
36
37
  FastlaneCore::ConfigItem.new(key: :path,
37
38
  description: "The path of the Fastfile in the repository",
38
39
  default_value: 'fastlane/Fastfile',
@@ -43,6 +44,11 @@ module Fastlane
43
44
  optional: true),
44
45
  FastlaneCore::ConfigItem.new(key: :cache_path,
45
46
  description: "The path to a directory where the repository should be cloned into. Defaults to `nil`, which causes the repository to be cloned on every call, to a temporary directory",
47
+ optional: true),
48
+ FastlaneCore::ConfigItem.new(key: :git_extra_headers,
49
+ description: "An optional list of custom HTTP headers to access the git repo (`Authorization: Basic <YOUR BASE64 KEY>`, `Cache-Control: no-cache`, etc.)",
50
+ default_value: [],
51
+ type: Array,
46
52
  optional: true)
47
53
  ]
48
54
  end
@@ -68,7 +74,8 @@ module Fastlane
68
74
  branch: "HEAD", # The branch to checkout on the repository.
69
75
  path: "fastlane/Fastfile", # The path of the Fastfile in the repository.
70
76
  version: [">= 1.1.0", "< 2.0.0"], # The version to checkout on the repository. Multiple conditions can be used to select the latest version within constraints.
71
- cache_path: "~/.cache/fastlane/imported" # A directory in which the repository will be added, which means that it will not be cloned again on subsequent calls.
77
+ cache_path: "~/.cache/fastlane/imported", # A directory in which the repository will be added, which means that it will not be cloned again on subsequent calls.
78
+ git_extra_headers: ["Authorization: Basic <YOUR BASE64 KEY>", "Cache-Control: no-cache"]
72
79
  )'
73
80
  ]
74
81
  end
@@ -83,7 +83,7 @@ module Fastlane
83
83
  optional: true,
84
84
  default_value: "ios",
85
85
  verify_block: proc do |value|
86
- UI.user_error!("The platform can only be ios, osx, xros or appletvos") unless %('osx', ios', 'appletvos', 'xros').include?(value)
86
+ UI.user_error!("The platform can only be ios, osx, xros or appletvos/tvos") unless %w(ios osx xros appletvos tvos).include?(value)
87
87
  end),
88
88
  FastlaneCore::ConfigItem.new(key: :initial_build_number,
89
89
  env_name: "INITIAL_BUILD_NUMBER",
@@ -73,6 +73,10 @@ module Fastlane
73
73
  "--wait"
74
74
  ] + auth_parts
75
75
 
76
+ if verbose
77
+ submit_command << "--verbose"
78
+ end
79
+
76
80
  submit_command = submit_parts.join(' ')
77
81
  submit_response = Actions.sh(
78
82
  submit_command,
@@ -53,7 +53,7 @@ module Fastlane
53
53
  payload["organization_id"] = organization_id unless organization_id.nil?
54
54
 
55
55
  # here's the actual lifting - POST or PUT to OneSignal
56
- json_headers = { 'Content-Type' => 'application/json', 'Authorization' => "Basic #{auth_token}" }
56
+ json_headers = { 'Content-Type' => 'application/json', 'Authorization' => "Key #{auth_token}" }
57
57
  url = +'https://api.onesignal.com/apps'
58
58
  url << '/' + app_id if is_update
59
59
  uri = URI.parse(url)
@@ -58,7 +58,7 @@ module Fastlane
58
58
  optional: true,
59
59
  default_value: platform.empty? ? "ios" : platform,
60
60
  verify_block: proc do |value|
61
- UI.user_error!("The platform can only be ios or mac") unless %('ios', 'mac').include?(value)
61
+ UI.user_error!("The platform can only be ios or mac") unless %w(ios mac).include?(value)
62
62
  end),
63
63
  FastlaneCore::ConfigItem.new(key: :udid,
64
64
  env_name: "FL_REGISTER_DEVICE_UDID",
@@ -160,7 +160,7 @@ module Fastlane
160
160
  optional: true,
161
161
  default_value: platform.empty? ? "ios" : platform,
162
162
  verify_block: proc do |value|
163
- UI.user_error!("The platform can only be ios or mac") unless %('ios', 'mac').include?(value)
163
+ UI.user_error!("The platform can only be ios or mac") unless %w(ios mac).include?(value)
164
164
  end)
165
165
  ]
166
166
  end
@@ -8,7 +8,7 @@ module Fastlane
8
8
  end
9
9
 
10
10
  case detect_provider(params)
11
- when 'circleci'
11
+ when 'circleci', 'codebuild'
12
12
  setup_output_paths
13
13
  end
14
14
 
@@ -20,7 +20,7 @@ module Fastlane
20
20
  end
21
21
 
22
22
  def self.detect_provider(params)
23
- params[:provider] || (Helper.is_circle_ci? ? 'circleci' : nil)
23
+ params[:provider] || (Helper.is_circle_ci? ? 'circleci' : nil) || (Helper.is_codebuild? ? 'codebuild' : nil)
24
24
  end
25
25
 
26
26
  def self.setup_keychain(params)
@@ -34,7 +34,7 @@ module Fastlane
34
34
  return
35
35
  end
36
36
 
37
- keychain_name = "fastlane_tmp_keychain"
37
+ keychain_name = params[:keychain_name]
38
38
  ENV["MATCH_KEYCHAIN_NAME"] = keychain_name
39
39
  ENV["MATCH_KEYCHAIN_PASSWORD"] = ""
40
40
 
@@ -108,7 +108,12 @@ module Fastlane
108
108
  env_name: "FL_SETUP_CI_TIMEOUT",
109
109
  description: "Set a custom timeout in seconds for keychain. Set `0` if you want to specify 'no time-out'",
110
110
  type: Integer,
111
- default_value: 3600)
111
+ default_value: 3600),
112
+ FastlaneCore::ConfigItem.new(key: :keychain_name,
113
+ env_name: "FL_SETUP_CI_KEYCHAIN_NAME",
114
+ description: "Set a custom keychain name",
115
+ type: String,
116
+ default_value: "fastlane_tmp_keychain")
112
117
  ]
113
118
  end
114
119
 
@@ -128,6 +133,11 @@ module Fastlane
128
133
  'setup_ci(
129
134
  provider: "circleci",
130
135
  timeout: 0
136
+ )',
137
+ 'setup_ci(
138
+ provider: "circleci",
139
+ timeout: 0,
140
+ keychain_name: "custom_keychain_name"
131
141
  )'
132
142
  ]
133
143
  end
@@ -98,6 +98,14 @@ module Fastlane
98
98
  [key, value]
99
99
  when :tags
100
100
  [key, value.join(',')]
101
+ when :folder_name
102
+ [key, value]
103
+ when :landing_page_mode
104
+ [key, value]
105
+ when :upload_to_saucelabs
106
+ [key, value]
107
+ when :platform
108
+ [key, value]
101
109
  else
102
110
  UI.user_error!("Unknown parameter: #{key}")
103
111
  end
@@ -143,11 +151,14 @@ module Fastlane
143
151
  private_class_method :parse_response
144
152
 
145
153
  def self.description
146
- 'Upload a new build to [TestFairy](https://www.testfairy.com/)'
154
+ 'Upload a new build to SauceLabs\' TestFairy'
147
155
  end
148
156
 
149
157
  def self.details
150
- "You can retrieve your API key on [your settings page](https://free.testfairy.com/settings/)"
158
+ <<~DETAILS
159
+ Upload a new build to [TestFairy](https://saucelabs.com/products/mobile-testing/app-betas).
160
+ You can retrieve your API key on [your settings page](https://app.testfairy.com/settings/access-key)
161
+ DETAILS
151
162
  end
152
163
 
153
164
  def self.available_options
@@ -237,7 +248,7 @@ module Fastlane
237
248
  FastlaneCore::ConfigItem.new(key: :custom,
238
249
  optional: true,
239
250
  env_name: "FL_TESTFAIRY_CUSTOM",
240
- description: "Array of custom options. Contact support@testfairy.com for more information",
251
+ description: "Array of custom options. Contact support for more information",
241
252
  default_value: ''),
242
253
  FastlaneCore::ConfigItem.new(key: :timeout,
243
254
  env_name: "FL_TESTFAIRY_TIMEOUT",
@@ -249,7 +260,33 @@ module Fastlane
249
260
  env_name: "FL_TESTFAIRY_TAGS",
250
261
  description: "Custom tags that can be used to organize your builds",
251
262
  type: Array,
252
- default_value: [])
263
+ default_value: []),
264
+ FastlaneCore::ConfigItem.new(key: :folder_name,
265
+ optional: true,
266
+ env_name: "FL_TESTFAIRY_FOLDER_NAME",
267
+ description: "Name of the dashboard folder that contains this app",
268
+ default_value: ''),
269
+ FastlaneCore::ConfigItem.new(key: :landing_page_mode,
270
+ optional: true,
271
+ env_name: "FL_TESTFAIRY_LANDING_PAGE_MODE",
272
+ description: "Visibility of build landing after upload. Can be 'open' or 'closed'",
273
+ default_value: 'open',
274
+ verify_block: proc do |value|
275
+ UI.user_error!("The landing page mode can only be open or closed") unless %w(open closed).include?(value)
276
+ end),
277
+ FastlaneCore::ConfigItem.new(key: :upload_to_saucelabs,
278
+ optional: true,
279
+ env_name: "FL_TESTFAIRY_UPLOAD_TO_SAUCELABS",
280
+ description: "Upload file directly to Sauce Labs. It can be 'on' or 'off'",
281
+ default_value: 'off',
282
+ verify_block: proc do |value|
283
+ UI.user_error!("The upload to Sauce Labs can only be on or off") unless %w(on off).include?(value)
284
+ end),
285
+ FastlaneCore::ConfigItem.new(key: :platform,
286
+ optional: true,
287
+ env_name: "FL_TESTFAIRY_PLATFORM",
288
+ description: "Use if upload build is not iOS or Android. Contact support for more information",
289
+ default_value: '')
253
290
  ]
254
291
  end
255
292