fastlane 0.1.7 → 0.1.8
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.
- checksums.yaml +4 -4
- data/README.md +49 -6
- data/lib/fastlane/actions/actions_helper.rb +2 -3
- data/lib/fastlane/actions/crashlytics.rb +1 -1
- data/lib/fastlane/actions/deliver.rb +2 -2
- data/lib/fastlane/actions/deploygate.rb +87 -0
- data/lib/fastlane/actions/hipchat.rb +51 -10
- data/lib/fastlane/actions/hockey.rb +3 -0
- data/lib/fastlane/actions/ipa.rb +115 -0
- data/lib/fastlane/actions/slack.rb +23 -11
- data/lib/fastlane/actions/testmunk.rb +1 -1
- data/lib/fastlane/runner.rb +0 -1
- data/lib/fastlane/setup.rb +0 -8
- data/lib/fastlane/version.rb +1 -1
- metadata +4 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a3a2a536f09df1917c15ac5eb551e903fa0815a
|
4
|
+
data.tar.gz: b3ecbd749ccfd75580392fc72c840ef53e2a09a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61d77640d296490e31906cfd8d45d2ed879978b3bbab42cbdb8bcda580bea2085e75b1c0e896dfd484a3b5d3e721a24d5592fb8463371b6730fd71698aff7e02
|
7
|
+
data.tar.gz: e73b1d0d0c6ae17295abb670b49f9fe296312de7da4f2bfdabdd7d42a2d1a9e348ec956d94b876850facf90bbba7a7f0a1612dc491f4b0905281ac146c2b0d10
|
data/README.md
CHANGED
@@ -170,17 +170,36 @@ produce({
|
|
170
170
|
})
|
171
171
|
```
|
172
172
|
|
173
|
-
####
|
173
|
+
#### ipa
|
174
|
+
|
175
|
+
Build your app right inside `fastlane` and the path to the resulting ipa is automatically available to all other actions.
|
176
|
+
|
174
177
|
```ruby
|
175
|
-
|
178
|
+
ipa({
|
179
|
+
workspace: "MyApp.xcworkspace",
|
180
|
+
configuration: "Debug",
|
181
|
+
scheme: "Debug",
|
182
|
+
})
|
176
183
|
```
|
177
184
|
|
178
|
-
|
185
|
+
The path to the `ipa` is automatically used by `Crashlytics`, `Hockey` and `DeployGate`. To use also use it in `deliver` update your `Deliverfile`:
|
186
|
+
|
179
187
|
```ruby
|
180
|
-
|
188
|
+
ipa ENV["IPA_OUTPUT_PATH"]
|
189
|
+
beta_ipa ENV["IPA_OUTPUT_PATH"]
|
181
190
|
```
|
182
191
|
|
183
|
-
|
192
|
+
#### [deliver](https://github.com/KrauseFx/deliver)
|
193
|
+
```ruby
|
194
|
+
deliver
|
195
|
+
```
|
196
|
+
|
197
|
+
To upload a new build to TestFlight use ```deliver :beta```.
|
198
|
+
|
199
|
+
If you don't want a PDF report for App Store builds, append ```:force``` to the command. This is useful when running ```fastlane``` on your Continuous Integration server: `deliver :force`
|
200
|
+
|
201
|
+
Other options
|
202
|
+
|
184
203
|
- ```deliver :skip_deploy```: To don't submit the app for review (works with both App Store and beta builds)
|
185
204
|
- ```deliver :force, :skip_deploy```: Combine options using ```,```
|
186
205
|
|
@@ -227,6 +246,24 @@ crashlytics({
|
|
227
246
|
```
|
228
247
|
Additionally you can specify `notes_path`, `emails` and `groups`.
|
229
248
|
|
249
|
+
#### [DeployGate](https://deploygate.com/)
|
250
|
+
|
251
|
+
You can retrieve your username and API token on [your settings page](https://deploygate.com/settings).
|
252
|
+
|
253
|
+
```ruby
|
254
|
+
deploygate({
|
255
|
+
api_token: '...',
|
256
|
+
user: 'target username or organization name',
|
257
|
+
ipa: './ipa_file.ipa',
|
258
|
+
message: "Build #{Actions.lane_context[Actions::SharedValues::BUILD_NUMBER]}",
|
259
|
+
})
|
260
|
+
```
|
261
|
+
|
262
|
+
If you put `deploygate` after `ipa` action, you don't have to specify IPA file path, as it is extracted from the lane context automatically.
|
263
|
+
|
264
|
+
More information about the available options can be found in the [DeployGate Push API document](https://deploygate.com/docs/api).
|
265
|
+
|
266
|
+
|
230
267
|
#### [Slack](http://slack.com)
|
231
268
|
Send a message to **#channel** (by default) or a direct message to **@username** with success (green) or failure (red) status.
|
232
269
|
|
@@ -242,6 +279,9 @@ Send a message to **#channel** (by default) or a direct message to **@username**
|
|
242
279
|
Send a message to **room** (by default) or a direct message to **@username** with success (green) or failure (red) status.
|
243
280
|
|
244
281
|
```ruby
|
282
|
+
ENV["HIPCHAT_API_TOKEN"] = "Your API token"
|
283
|
+
ENV["HIPCHAT_API_VERSION"] = "1 for API version 1 or 2 for API version 2"
|
284
|
+
|
245
285
|
hipchat({
|
246
286
|
message: "App successfully released!",
|
247
287
|
channel: "Room or @username",
|
@@ -386,9 +426,12 @@ Available variables (put that inside the square brackets of the above snippet)
|
|
386
426
|
```ruby
|
387
427
|
Actions::SharedValues::BUILD_NUMBER # generated by `increment_build_number`
|
388
428
|
Actions::SharedValues::SNAPSHOT_SCREENSHOTS_PATH # generated by `snapshot`
|
389
|
-
Actions::SharedValues::
|
429
|
+
Actions::SharedValues::IPA_OUTPUT_PATH # generated by `ipa`
|
390
430
|
Actions::SharedValues::SIGH_PROFILE_PATH # generated by `sigh`
|
391
431
|
Actions::SharedValues::HOCKEY_DOWNLOAD_LINK #generated by `hockey`
|
432
|
+
Actions::SharedValues::DEPLOYGATE_URL # generated by `deploygate`
|
433
|
+
Actions::SharedValues::DEPLOYGATE_APP_REVISION # integer, generated by `deploygate`
|
434
|
+
Actions::SharedValues::DEPLOYGATE_APP_INFO # Hash, generated by `deploygate`
|
392
435
|
````
|
393
436
|
|
394
437
|
#### Complex Fastfile Example
|
@@ -4,7 +4,6 @@ module Fastlane
|
|
4
4
|
module Actions
|
5
5
|
module SharedValues
|
6
6
|
LANE_NAME = :LANE_NAME
|
7
|
-
START_TIME = :START_TIME
|
8
7
|
end
|
9
8
|
|
10
9
|
def self.executed_actions
|
@@ -67,10 +66,10 @@ module Fastlane
|
|
67
66
|
end
|
68
67
|
|
69
68
|
if $?.exitstatus.to_i != 0
|
70
|
-
raise "Exit status of command '#{command}' was #{$?.exitstatus.to_s} instead of 0.
|
69
|
+
raise "Exit status of command '#{command}' was #{$?.exitstatus.to_s} instead of 0. \n#{result}" # this will also append the output to the exception (for the Jenkins reports)
|
71
70
|
end
|
72
71
|
else
|
73
|
-
result << command # only
|
72
|
+
result << command # only for the tests
|
74
73
|
end
|
75
74
|
|
76
75
|
return result
|
@@ -16,7 +16,7 @@ module Fastlane
|
|
16
16
|
crashlytics_path = params[:crashlytics_path]
|
17
17
|
api_token = params[:api_token]
|
18
18
|
build_secret = params[:build_secret]
|
19
|
-
ipa_path = params[:ipa_path]
|
19
|
+
ipa_path = params[:ipa_path] || Actions.lane_context[SharedValues::IPA_OUTPUT_PATH]
|
20
20
|
notes_path = params[:notes_path]
|
21
21
|
emails = params[:emails]
|
22
22
|
groups = params[:groups]
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Fastlane
|
2
2
|
module Actions
|
3
3
|
module SharedValues
|
4
|
-
|
4
|
+
|
5
5
|
end
|
6
6
|
|
7
7
|
class DeliverAction
|
@@ -20,7 +20,7 @@ module Fastlane
|
|
20
20
|
is_beta_ipa: beta,
|
21
21
|
skip_deploy: skip_deploy)
|
22
22
|
|
23
|
-
|
23
|
+
Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] = ENV["DELIVER_IPA_PATH"] # deliver will store it in the environment
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# TODO: Workaround, since deploygate.rb from shenzhen includes the code for commander
|
2
|
+
def command(param)
|
3
|
+
end
|
4
|
+
|
5
|
+
module Fastlane
|
6
|
+
module Actions
|
7
|
+
module SharedValues
|
8
|
+
DEPLOYGATE_URL = :DEPLOYGATE_URL
|
9
|
+
DEPLOYGATE_REVISION = :DEPLOYGATE_REVISION # auto increment revision number
|
10
|
+
DEPLOYGATE_APP_INFO = :DEPLOYGATE_APP_INFO # contains app revision, bundle identifier, etc.
|
11
|
+
end
|
12
|
+
|
13
|
+
class DeploygateAction
|
14
|
+
DEPLOYGATE_URL_BASE = 'https://deploygate.com'
|
15
|
+
|
16
|
+
def self.run(params)
|
17
|
+
require 'shenzhen'
|
18
|
+
require 'shenzhen/plugins/deploygate'
|
19
|
+
|
20
|
+
# Available options: https://deploygate.com/docs/api
|
21
|
+
options = {
|
22
|
+
ipa: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH],
|
23
|
+
}.merge(params.first || {})
|
24
|
+
assert_options!(options)
|
25
|
+
|
26
|
+
Helper.log.info "Starting with ipa upload to DeployGate... this could take some time ⏳".green
|
27
|
+
client = Shenzhen::Plugins::DeployGate::Client.new(
|
28
|
+
options.delete(:api_token),
|
29
|
+
options.delete(:user)
|
30
|
+
)
|
31
|
+
|
32
|
+
return if Helper.is_test?
|
33
|
+
|
34
|
+
response = client.upload_build(options.delete(:ipa), options)
|
35
|
+
if parse_response(response)
|
36
|
+
Helper.log.info "DeployGate URL: #{Actions.lane_context[SharedValues::DEPLOYGATE_URL]}"
|
37
|
+
Helper.log.info "Build successfully uploaded to DeployGate as revision \##{Actions.lane_context[SharedValues::DEPLOYGATE_REVISION]}!".green
|
38
|
+
else
|
39
|
+
raise "Error when trying to upload ipa to DeployGate".red
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def self.assert_options!(options)
|
46
|
+
raise "No API Token for DeployGate given, pass using `api_token: 'token'`".red unless options[:api_token].to_s.length > 0
|
47
|
+
raise "No User for app given, pass using `user: 'user'`".red unless options[:user].to_s.length > 0
|
48
|
+
raise "No IPA file given or found, pass using `ipa: 'path.ipa'`".red unless options[:ipa]
|
49
|
+
raise "IPA file on path '#{File.expand_path(options[:ipa])}' not found".red unless File.exists?(options[:ipa])
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.parse_response(response)
|
53
|
+
if response.body && response.body.key?('error')
|
54
|
+
unless response.body['error']
|
55
|
+
res = response.body['results']
|
56
|
+
url = DEPLOYGATE_URL_BASE + res['path']
|
57
|
+
|
58
|
+
Actions.lane_context[SharedValues::DEPLOYGATE_URL] = url
|
59
|
+
Actions.lane_context[SharedValues::DEPLOYGATE_REVISION] = res['revision']
|
60
|
+
Actions.lane_context[SharedValues::DEPLOYGATE_APP_INFO] = res
|
61
|
+
else
|
62
|
+
Helper.log.error "Error uploading to DeployGate: #{response.body['message']}".red
|
63
|
+
help_message(response)
|
64
|
+
return
|
65
|
+
end
|
66
|
+
else
|
67
|
+
Helper.log.fatal "Error uploading to DeployGate: #{response.body}".red
|
68
|
+
return
|
69
|
+
end
|
70
|
+
true
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.help_message(response)
|
74
|
+
message =
|
75
|
+
case response.body['message']
|
76
|
+
when 'you are not authenticated'
|
77
|
+
"Invalid API Token specified."
|
78
|
+
when 'application create error: permit'
|
79
|
+
"Access denied: May be trying to upload to wrong user or updating app you join as a tester?"
|
80
|
+
when 'application create error: limit'
|
81
|
+
"Plan limit: You have reached to the limit of current plan or your plan was expired."
|
82
|
+
end
|
83
|
+
Helper.log.error message.red if message
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -11,30 +11,71 @@ module Fastlane
|
|
11
11
|
channel: nil
|
12
12
|
}.merge(params.first || {})
|
13
13
|
|
14
|
-
require '
|
14
|
+
require 'net/http'
|
15
|
+
require 'uri'
|
15
16
|
|
16
17
|
api_token = ENV["HIPCHAT_API_TOKEN"]
|
18
|
+
api_version = ENV["HIPCHAT_API_VERSION"]
|
17
19
|
|
18
20
|
unless api_token
|
19
21
|
Helper.log.fatal "Please add 'ENV[\"HIPCHAT_API_TOKEN\"] = \"your token\"' to your Fastfile's `before_all` section.".red
|
20
22
|
raise "No HIPCHAT_API_TOKEN given.".red
|
21
23
|
end
|
24
|
+
if api_version.nil? or ![1,2].include?api_version[0].to_i
|
25
|
+
Helper.log.fatal "Please add 'ENV[\"HIPCHAT_API_VERSION\"] = \"1 or 2\"' to your Fastfile's `before_all` section.".red
|
26
|
+
raise "No HIPCHAT_API_VERSION given.".red
|
27
|
+
end
|
22
28
|
|
23
|
-
client = HipChat::Client.new(api_token, :api_version => 'v2')
|
24
29
|
channel = options[:channel]
|
25
30
|
color = (options[:success] ? 'green' : 'red')
|
31
|
+
message = "<table><tr><td><img src=\"https://s3-eu-west-1.amazonaws.com/fastlane.tools/fastlane.png\" style=\"width:50px;height:auto\"></td><td>" + options[:message] + "</td></tr></table>"
|
26
32
|
|
27
|
-
if
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
33
|
+
if api_version.to_i == 1
|
34
|
+
########## running on V1 ##########
|
35
|
+
if isUser(channel)
|
36
|
+
raise "HipChat private message not working with API V1 please use API V2 instead".red
|
37
|
+
else
|
38
|
+
uri = URI.parse('https://api.hipchat.com/v1/rooms/message')
|
39
|
+
response = Net::HTTP.post_form(uri, {"from" => "fastlane", "auth_token" => api_token, "color" => color, "message_format" => "html", "room_id" => channel, "message" => message})
|
40
|
+
checkResponseCodeForRoom(response, channel)
|
41
|
+
end
|
32
42
|
else
|
33
|
-
|
34
|
-
|
35
|
-
|
43
|
+
########## running on V2 ##########
|
44
|
+
if isUser(channel)
|
45
|
+
channel.slice!(0)
|
46
|
+
params = {'message' => message, 'message_format' => 'html'}
|
47
|
+
json_headers = {"Content-Type" => "application/json",
|
48
|
+
"Accept" => "application/json", "Authorization" => "Bearer #{api_token}"}
|
49
|
+
|
50
|
+
uri = URI.parse("https://api.hipchat.com/v2/user/#{channel}/message")
|
51
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
52
|
+
http.use_ssl = true
|
53
|
+
|
54
|
+
response = http.post(uri.path, params.to_json, json_headers)
|
55
|
+
checkResponseCode(response, channel)
|
56
|
+
else
|
57
|
+
uri = URI.parse("https://api.hipchat.com/v2/room/#{channel}/notification")
|
58
|
+
response = Net::HTTP.post_form(uri, {"from" => "fastlane", "auth_token" => api_token, "color" => color, "message_format" => "html", "message" => message})
|
59
|
+
checkResponseCode(response, channel)
|
60
|
+
end
|
36
61
|
end
|
62
|
+
end
|
37
63
|
|
64
|
+
def self.isUser(channel)
|
65
|
+
return channel.to_s.start_with?('@')
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.checkResponseCode(response, channel)
|
69
|
+
case response.code.to_i
|
70
|
+
when 200, 204
|
71
|
+
true
|
72
|
+
when 404
|
73
|
+
raise "Unknown #{channel}".red
|
74
|
+
when 401
|
75
|
+
raise "Access denied #{channel}".red
|
76
|
+
else
|
77
|
+
raise "Unexpected #{response.code} for `#{channel}'".red
|
78
|
+
end
|
38
79
|
end
|
39
80
|
end
|
40
81
|
end
|
@@ -18,6 +18,9 @@ module Fastlane
|
|
18
18
|
notify: 1
|
19
19
|
}.merge(params.first)
|
20
20
|
|
21
|
+
options[:ipa] ||= Actions.lane_context[SharedValues::IPA_OUTPUT_PATH]
|
22
|
+
options[:dsym] ||= Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH]
|
23
|
+
|
21
24
|
require 'shenzhen'
|
22
25
|
require 'shenzhen/plugins/hockeyapp'
|
23
26
|
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
|
4
|
+
module SharedValues
|
5
|
+
IPA_OUTPUT_PATH = :IPA_OUTPUT_PATH
|
6
|
+
DSYM_OUTPUT_PATH = :DSYM_OUTPUT_PATH
|
7
|
+
end
|
8
|
+
|
9
|
+
# -w, --workspace WORKSPACE Workspace (.xcworkspace) file to use to build app (automatically detected in current directory)
|
10
|
+
# -p, --project PROJECT Project (.xcodeproj) file to use to build app (automatically detected in current directory, overridden by --workspace option, if passed)
|
11
|
+
# -c, --configuration CONFIGURATION Configuration used to build
|
12
|
+
# -s, --scheme SCHEME Scheme used to build app
|
13
|
+
# --xcconfig XCCONFIG use an extra XCCONFIG file to build the app
|
14
|
+
# --xcargs XCARGS pass additional arguments to xcodebuild when building the app. Be sure to quote multiple args.
|
15
|
+
# --[no-]clean Clean project before building
|
16
|
+
# --[no-]archive Archive project after building
|
17
|
+
# -d, --destination DESTINATION Destination. Defaults to current directory
|
18
|
+
# -m, --embed PROVISION Sign .ipa file with .mobileprovision
|
19
|
+
# -i, --identity IDENTITY Identity to be used along with --embed
|
20
|
+
# --sdk SDK use SDK as the name or path of the base SDK when building the project
|
21
|
+
# --ipa IPA specify the name of the .ipa file to generate (including file extension)
|
22
|
+
|
23
|
+
ARGS_MAP = {
|
24
|
+
workspace: '-w',
|
25
|
+
project: '-p',
|
26
|
+
configuration: '-c',
|
27
|
+
scheme: '-s',
|
28
|
+
clean: '--clean',
|
29
|
+
archive: '--archive',
|
30
|
+
destination: '-d',
|
31
|
+
embed: '-m',
|
32
|
+
identity: '-i',
|
33
|
+
sdk: '--sdk',
|
34
|
+
ipa: '--ipa'
|
35
|
+
}
|
36
|
+
|
37
|
+
class IpaAction
|
38
|
+
def self.run(params)
|
39
|
+
|
40
|
+
# The args we will build with
|
41
|
+
build_args = nil
|
42
|
+
|
43
|
+
# The output directory of the IPA and dSYM
|
44
|
+
absolute_dest_directory = nil
|
45
|
+
|
46
|
+
# Allows for a whole variety of configurations
|
47
|
+
if params.first.is_a? Hash
|
48
|
+
|
49
|
+
# Used to get the final path of the IPA and dSYM
|
50
|
+
if dest = params.first[:destination]
|
51
|
+
absolute_dest_directory = Dir.glob(dest).map(&File.method(:realpath)).first
|
52
|
+
end
|
53
|
+
|
54
|
+
# Maps nice developer build parameters to Shenzhen args
|
55
|
+
build_args = params_to_build_args(params.first)
|
56
|
+
|
57
|
+
else
|
58
|
+
build_args = params
|
59
|
+
end
|
60
|
+
|
61
|
+
# If no dest directory given, default to current directory
|
62
|
+
absolute_dest_directory ||= Dir.pwd
|
63
|
+
|
64
|
+
if Helper.is_test?
|
65
|
+
Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] = File.join(absolute_dest_directory, "test.ipa")
|
66
|
+
Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH] = File.join(absolute_dest_directory, "test.app.dSYM.zip")
|
67
|
+
return build_args
|
68
|
+
end
|
69
|
+
|
70
|
+
# Joins args into space delimited string
|
71
|
+
build_args = build_args.join(' ')
|
72
|
+
|
73
|
+
command = "ipa build #{build_args}"
|
74
|
+
Helper.log.debug command
|
75
|
+
Actions.sh command
|
76
|
+
|
77
|
+
# Finds absolute path of IPA and dSYM
|
78
|
+
absolute_ipa_path = find_ipa_file(absolute_dest_directory)
|
79
|
+
absolute_dsym_path = find_dsym_file(absolute_dest_directory)
|
80
|
+
|
81
|
+
# Sets shared values to use after this action is performed
|
82
|
+
Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] = absolute_ipa_path
|
83
|
+
Actions.lane_context[SharedValues::DSYM_OUTPUT_PATH] = absolute_dsym_path
|
84
|
+
ENV[SharedValues::IPA_OUTPUT_PATH.to_s] = absolute_ipa_path # for deliver
|
85
|
+
ENV[SharedValues::DSYM_OUTPUT_PATH.to_s] = absolute_dsym_path
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.params_to_build_args(params)
|
89
|
+
# Remove nil value params unless :clean or :archive
|
90
|
+
params = params.delete_if { |k, v| (k != :clean && k != :archive ) && v.nil? }
|
91
|
+
|
92
|
+
# Maps nice developer param names to Shenzhen's `ipa build` arguments
|
93
|
+
params.collect do |k,v|
|
94
|
+
v ||= ''
|
95
|
+
if args = ARGS_MAP[k]
|
96
|
+
value = (v.to_s.length > 0 ? "\"#{v}\"" : "")
|
97
|
+
"#{ARGS_MAP[k]} #{value}".strip
|
98
|
+
end
|
99
|
+
end.compact
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.find_ipa_file(dir)
|
103
|
+
# Finds last modified .ipa in the destination directory
|
104
|
+
Dir[File.join(dir, "*.ipa")].sort { |a,b| File.mtime(b) <=> File.mtime(a) }.first
|
105
|
+
end
|
106
|
+
|
107
|
+
def self.find_dsym_file(dir)
|
108
|
+
# Finds last modified .dSYM.zip in the destination directory
|
109
|
+
Dir[File.join(dir, "*.dSYM.zip")].sort { |a,b| File.mtime(b) <=> File.mtime(a) }.first
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
@@ -6,10 +6,10 @@ module Fastlane
|
|
6
6
|
|
7
7
|
class SlackAction
|
8
8
|
def self.git_branch
|
9
|
-
return
|
10
|
-
|
11
|
-
|
12
|
-
|
9
|
+
return ENV['GIT_BRANCH'] if ENV['GIT_BRANCH'].to_s.length > 0 # set by Jenkins
|
10
|
+
s = `git rev-parse --abbrev-ref HEAD`
|
11
|
+
return s if s.to_s.length > 0
|
12
|
+
return nil
|
13
13
|
end
|
14
14
|
|
15
15
|
def self.git_author
|
@@ -21,12 +21,12 @@ module Fastlane
|
|
21
21
|
return nil
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.
|
25
|
-
|
24
|
+
def self.last_git_commit
|
25
|
+
s = `git log -1 --pretty=%B`.strip
|
26
|
+
return s if s.to_s.length > 0
|
27
|
+
return nil
|
26
28
|
end
|
27
29
|
|
28
|
-
|
29
|
-
|
30
30
|
def self.run(params)
|
31
31
|
options = { message: '',
|
32
32
|
success: true,
|
@@ -79,10 +79,22 @@ module Fastlane
|
|
79
79
|
end
|
80
80
|
|
81
81
|
if git_author
|
82
|
+
if ENV["FASTLANE_SLACK_HIDE_AUTHOR_ON_SUCCESS"] and success
|
83
|
+
# We only show the git author if the build failed
|
84
|
+
else
|
85
|
+
test_result[:fields] << {
|
86
|
+
title: "Git Author",
|
87
|
+
value: git_author,
|
88
|
+
short: true
|
89
|
+
}
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
if last_git_commit
|
82
94
|
test_result[:fields] << {
|
83
|
-
title: "Git
|
84
|
-
value:
|
85
|
-
short:
|
95
|
+
title: "Git Commit",
|
96
|
+
value: last_git_commit,
|
97
|
+
short: false
|
86
98
|
}
|
87
99
|
end
|
88
100
|
|
@@ -21,7 +21,7 @@ module Fastlane
|
|
21
21
|
raise "Please pass your Testmunk API Key using `ENV['TESTMUNK_API'] = 'value'`" unless ENV['TESTMUNK_API']
|
22
22
|
raise "Please pass your Testmunk app name using `ENV['TESTMUNK_APP'] = 'value'`" unless ENV['TESTMUNK_APP']
|
23
23
|
|
24
|
-
ipa_path = ENV['TESTMUNK_IPA'] || ENV[Actions::SharedValues::
|
24
|
+
ipa_path = ENV['TESTMUNK_IPA'] || ENV[Actions::SharedValues::IPA_OUTPUT_PATH.to_s]
|
25
25
|
raise "Please pass a path to your ipa file using `ENV['TESTMUNK_IPA'] = 'value'`" unless ipa_path
|
26
26
|
|
27
27
|
Helper.log.info "Testmunk: Uploading the .ipa and starting your tests".green
|
data/lib/fastlane/runner.rb
CHANGED
data/lib/fastlane/setup.rb
CHANGED
@@ -103,14 +103,6 @@ module Fastlane
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
if @tools[:snapshot] and @tools[:deliver]
|
107
|
-
# Deliver is already installed
|
108
|
-
Helper.log.info "The 'screenshots' folder inside the 'deliver' folder will not be used.".yellow
|
109
|
-
Helper.log.info "Instead the 'screenshots' folder inside the 'fastlane' folder will be used.".yellow
|
110
|
-
Helper.log.info "Click Enter to confirm".green
|
111
|
-
STDIN.gets
|
112
|
-
end
|
113
|
-
|
114
106
|
if agree("Do you want to use 'sigh', which will maintain and download the provisioning profile for your app? (y/n)".yellow, true)
|
115
107
|
@tools[:sigh] = true
|
116
108
|
end
|
data/lib/fastlane/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -108,20 +108,6 @@ dependencies:
|
|
108
108
|
- - ~>
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '1.0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: hipchat
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ~>
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '1.4'
|
118
|
-
type: :runtime
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ~>
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '1.4'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
112
|
name: credentials_manager
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -337,11 +323,13 @@ files:
|
|
337
323
|
- lib/fastlane/actions/actions_helper.rb
|
338
324
|
- lib/fastlane/actions/crashlytics.rb
|
339
325
|
- lib/fastlane/actions/deliver.rb
|
326
|
+
- lib/fastlane/actions/deploygate.rb
|
340
327
|
- lib/fastlane/actions/frameit.rb
|
341
328
|
- lib/fastlane/actions/hipchat.rb
|
342
329
|
- lib/fastlane/actions/hockey.rb
|
343
330
|
- lib/fastlane/actions/increment_build_number.rb
|
344
331
|
- lib/fastlane/actions/install_cocapods.rb
|
332
|
+
- lib/fastlane/actions/ipa.rb
|
345
333
|
- lib/fastlane/actions/produce.rb
|
346
334
|
- lib/fastlane/actions/say.rb
|
347
335
|
- lib/fastlane/actions/sigh.rb
|