fastlane 1.63.1 → 1.64.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fastlane/actions/badge.rb +16 -1
- data/lib/fastlane/actions/get_build_number_repository.rb +102 -0
- data/lib/fastlane/actions/gradle.rb +99 -43
- data/lib/fastlane/actions/latest_testflight_build_number.rb +13 -2
- data/lib/fastlane/actions/mailgun.rb +20 -7
- data/lib/fastlane/actions/oclint.rb +9 -3
- data/lib/fastlane/actions/s3.rb +11 -1
- data/lib/fastlane/actions/set_build_number_repository.rb +3 -49
- data/lib/fastlane/actions/update_icloud_container_identifiers.rb +80 -0
- data/lib/fastlane/actions/verify_build.rb +17 -10
- data/lib/fastlane/helper/gradle_helper.rb +4 -3
- data/lib/fastlane/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45dd5cf53c7177ddb32515a4ea523968bed241e7
|
4
|
+
data.tar.gz: 6180e4b81438d84dddd2a2c90a92c98693519f88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e345f385b400bfd8703fb8b65b5760a957e33d583e17f0c0439969e310cca79e7a13b0cf271da5095409e9cdbd21e349d20447689e17d63dbe7135596e64df0a
|
7
|
+
data.tar.gz: 6b14e133ff543454b3919295a6f67437636b817795bdcdc9718310ad68f30bdb3b9eb665c64261a745ae21bb770de897ca36d618257814b9350ee7616fe87af4
|
@@ -12,7 +12,9 @@ module Fastlane
|
|
12
12
|
alpha: params[:alpha],
|
13
13
|
shield_io_timeout: params[:shield_io_timeout],
|
14
14
|
glob: params[:glob],
|
15
|
-
alpha_channel: params[:alpha_channel]
|
15
|
+
alpha_channel: params[:alpha_channel],
|
16
|
+
shield_gravity: params[:shield_gravity],
|
17
|
+
shield_no_resize: params[:shield_no_resize]
|
16
18
|
}
|
17
19
|
Badge::Runner.new.run(params[:path], options)
|
18
20
|
end
|
@@ -100,6 +102,19 @@ module Fastlane
|
|
100
102
|
is_string: false,
|
101
103
|
verify_block: proc do |value|
|
102
104
|
raise "alpha_channel is only a flag and should always be true".red unless value == true
|
105
|
+
end),
|
106
|
+
FastlaneCore::ConfigItem.new(key: :shield_gravity,
|
107
|
+
env_name: "FL_BADGE_SHIELD_GRAVITY",
|
108
|
+
description: "Position of shield on icon. Default: North - Choices include: NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast",
|
109
|
+
optional: true,
|
110
|
+
is_string: true),
|
111
|
+
FastlaneCore::ConfigItem.new(key: :shield_no_resize,
|
112
|
+
env_name: "FL_BADGE_SHIELD_NO_RESIZE",
|
113
|
+
description: "Shield image will no longer be resized to aspect fill the full icon. Instead it will only be shrinked to not exceed the icon graphic",
|
114
|
+
optional: true,
|
115
|
+
is_string: false,
|
116
|
+
verify_block: proc do |value|
|
117
|
+
raise "shield_no_resize is only a flag and should always be true".red unless value == true
|
103
118
|
end)
|
104
119
|
]
|
105
120
|
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
module SharedValues
|
4
|
+
BUILD_NUMBER_REPOSITORY = :BUILD_NUMBER_REPOSITORY
|
5
|
+
end
|
6
|
+
|
7
|
+
class GetBuildNumberRepositoryAction < Action
|
8
|
+
def self.is_svn?
|
9
|
+
Actions.sh 'svn info'
|
10
|
+
return true
|
11
|
+
rescue
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.is_git?
|
16
|
+
Actions.sh 'git rev-parse HEAD'
|
17
|
+
return true
|
18
|
+
rescue
|
19
|
+
return false
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.is_git_svn?
|
23
|
+
Actions.sh 'git svn info'
|
24
|
+
return true
|
25
|
+
rescue
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.is_hg?
|
30
|
+
Actions.sh 'hg status'
|
31
|
+
return true
|
32
|
+
rescue
|
33
|
+
return false
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.command(use_hg_revision_number)
|
37
|
+
if is_svn?
|
38
|
+
UI.message "Detected repo: svn"
|
39
|
+
return 'svn info | grep Revision | egrep -o "[0-9]+"'
|
40
|
+
elsif is_git_svn?
|
41
|
+
UI.message "Detected repo: git-svn"
|
42
|
+
return 'git svn info | grep Revision | egrep -o "[0-9]+"'
|
43
|
+
elsif is_git?
|
44
|
+
UI.message "Detected repo: git"
|
45
|
+
return 'git rev-parse --short HEAD'
|
46
|
+
elsif is_hg?
|
47
|
+
UI.message "Detected repo: hg"
|
48
|
+
if use_hg_revision_number
|
49
|
+
return 'hg parent --template {rev}'
|
50
|
+
else
|
51
|
+
return 'hg parent --template "{node|short}"'
|
52
|
+
end
|
53
|
+
else
|
54
|
+
raise "No repository detected"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.run(params)
|
59
|
+
build_number = Action.sh command(params[:use_hg_revision_number])
|
60
|
+
Actions.lane_context[SharedValues::BUILD_NUMBER_REPOSITORY] = build_number
|
61
|
+
build_number
|
62
|
+
end
|
63
|
+
|
64
|
+
#####################################################
|
65
|
+
# @!group Documentation
|
66
|
+
#####################################################
|
67
|
+
|
68
|
+
def self.description
|
69
|
+
"Get the build number from the current repository"
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.available_options
|
73
|
+
[
|
74
|
+
FastlaneCore::ConfigItem.new(key: :use_hg_revision_number,
|
75
|
+
env_name: "USE_HG_REVISION_NUMBER",
|
76
|
+
description: "Use hg revision number instead of hash (ignored for non-hg repos)",
|
77
|
+
optional: true,
|
78
|
+
is_string: false,
|
79
|
+
default_value: false)
|
80
|
+
]
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.output
|
84
|
+
[
|
85
|
+
['BUILD_NUMBER_REPOSITORY', 'The build number from the current repository']
|
86
|
+
]
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.return_value
|
90
|
+
"The build number from the current repository"
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.authors
|
94
|
+
["bartoszj", "pbrooks", "armadsen"]
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.is_supported?(platform)
|
98
|
+
[:ios, :mac].include? platform
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -1,36 +1,71 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'shellwords'
|
3
|
+
|
1
4
|
module Fastlane
|
2
5
|
module Actions
|
3
6
|
module SharedValues
|
4
|
-
GRADLE_APK_OUTPUT_PATH = :
|
7
|
+
GRADLE_APK_OUTPUT_PATH = :GRADLE_APK_OUTPUT_PATH
|
8
|
+
GRADLE_ALL_APK_OUTPUT_PATHS = :GRADLE_ALL_APK_OUTPUT_PATHS
|
5
9
|
GRADLE_FLAVOR = :GRADLE_FLAVOR
|
10
|
+
GRADLE_BUILD_TYPE = :GRADLE_BUILD_TYPE
|
6
11
|
end
|
7
12
|
|
8
13
|
class GradleAction < Action
|
9
14
|
def self.run(params)
|
10
15
|
task = params[:task]
|
16
|
+
flavor = params[:flavor]
|
17
|
+
build_type = params[:build_type]
|
18
|
+
|
19
|
+
gradle_task = [task, flavor, build_type].join
|
20
|
+
|
21
|
+
project_dir = params[:project_dir]
|
22
|
+
|
23
|
+
gradle_path_param = params[:gradle_path] || './gradlew'
|
24
|
+
|
25
|
+
# Get the path to gradle, if it's an absolute path we take it as is, if it's relative we assume it's relative to the project_dir
|
26
|
+
gradle_path = if Pathname.new(gradle_path_param).absolute?
|
27
|
+
File.expand_path(gradle_path_param)
|
28
|
+
else
|
29
|
+
File.expand_path(File.join(project_dir, gradle_path_param))
|
30
|
+
end
|
31
|
+
|
32
|
+
# Ensure we ended up with a valid path to gradle
|
33
|
+
raise "Couldn't find gradlew at path '#{File.expand_path(gradle_path)}'".red unless File.exist?(gradle_path)
|
34
|
+
|
35
|
+
# Construct our flags
|
36
|
+
flags = []
|
37
|
+
flags << "-p #{project_dir.shellescape}"
|
38
|
+
flags << params[:properties].map { |k, v| "-P#{k}=#{v}" }.join(' ') unless params[:properties].nil?
|
39
|
+
flags << params[:flags] unless params[:flags].nil?
|
40
|
+
|
41
|
+
# Run the actual gradle task
|
42
|
+
gradle = Helper::GradleHelper.new(gradle_path: gradle_path)
|
43
|
+
|
44
|
+
# If these were set as properties, then we expose them back out as they might be useful to others
|
45
|
+
Actions.lane_context[SharedValues::GRADLE_BUILD_TYPE] = build_type if build_type
|
46
|
+
Actions.lane_context[SharedValues::GRADLE_FLAVOR] = flavor if flavor
|
47
|
+
|
48
|
+
# We run the actual gradle task
|
49
|
+
result = gradle.trigger(task: gradle_task, serial: params[:serial], flags: flags.join(' '))
|
50
|
+
|
51
|
+
# If we didn't build, then we return now, as it makes no sense to search for apk's in a non-`assemble` scenario
|
52
|
+
return result unless task.start_with?('assemble')
|
53
|
+
|
54
|
+
apk_search_path = File.join(project_dir, '*', 'build', 'outputs', 'apk', '*.apk')
|
55
|
+
|
56
|
+
# Our apk is now built, but there might actually be multiple ones that were built if a flavor was not specified in a multi-flavor project (e.g. `assembleRelease`), however we're not interested in unaligned apk's...
|
57
|
+
new_apks = Dir[apk_search_path].reject { |path| path =~ /^.*-unaligned.apk$/i}
|
58
|
+
new_apks = new_apks.map { |path| File.expand_path(path)}
|
11
59
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
flavor = flavor[1].downcase # Release => release
|
22
|
-
apk_path = Dir[File.join("app", "build", "outputs", "apk", "*-#{flavor}.apk")].last
|
23
|
-
if apk_path
|
24
|
-
Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] = File.expand_path(apk_path)
|
25
|
-
else
|
26
|
-
Helper.log.info "Couldn't find signed apk file at path '#{apk_path}'...".red
|
27
|
-
if flavor == 'release'
|
28
|
-
Helper.log.info "Make sure to enable code signing in your gradle task: ".red
|
29
|
-
Helper.log.info "https://stackoverflow.com/questions/18328730/how-to-create-a-release-signed-apk-file-using-gradle".red
|
30
|
-
end
|
31
|
-
end
|
32
|
-
Actions.lane_context[SharedValues::GRADLE_FLAVOR] = flavor
|
33
|
-
end
|
60
|
+
# We expose all of these new apk's
|
61
|
+
Actions.lane_context[SharedValues::GRADLE_ALL_APK_OUTPUT_PATHS] = new_apks
|
62
|
+
|
63
|
+
# We also take the most recent apk to return as SharedValues::GRADLE_APK_OUTPUT_PATH, this is the one that will be relevant for most projects that just build a single build variant (flavor + build type combo). In multi build variants this value is undefined
|
64
|
+
last_apk_path = new_apks.sort_by(&File.method(:mtime)).last
|
65
|
+
Actions.lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH] = File.expand_path(last_apk_path) if last_apk_path
|
66
|
+
|
67
|
+
# Give a helpful message in case there were no new apk's. Remember we're only running this code when assembling, in which case we certainly expect there to be an apk
|
68
|
+
Helper.log.info 'Couldn\'t find any new signed apk files...'.red if new_apks.empty?
|
34
69
|
|
35
70
|
return result
|
36
71
|
end
|
@@ -40,54 +75,75 @@ module Fastlane
|
|
40
75
|
#####################################################
|
41
76
|
|
42
77
|
def self.description
|
43
|
-
|
78
|
+
'All gradle related actions, including building and testing your Android app'
|
44
79
|
end
|
45
80
|
|
46
81
|
def self.details
|
47
82
|
[
|
48
|
-
|
83
|
+
'Run `./gradlew tasks` to get a list of all available gradle tasks for your project'
|
49
84
|
].join("\n")
|
50
85
|
end
|
51
86
|
|
52
87
|
def self.available_options
|
53
88
|
[
|
54
|
-
FastlaneCore::ConfigItem.new(key: :serial,
|
55
|
-
env_name: "FL_ANDROID_SERIAL",
|
56
|
-
description: "Android serial, wich device should be used for this command",
|
57
|
-
is_string: true,
|
58
|
-
default_value: ""),
|
59
89
|
FastlaneCore::ConfigItem.new(key: :task,
|
60
|
-
env_name:
|
61
|
-
description:
|
90
|
+
env_name: 'FL_GRADLE_TASK',
|
91
|
+
description: 'The gradle task you want to execute, e.g. `assemble` or `test`. For tasks such as `assembleMyFlavorRelease` you should use gradle(task: \'assemble\', flavor: \'Myflavor\', build_type: \'Release\')',
|
92
|
+
optional: false,
|
93
|
+
is_string: true),
|
94
|
+
FastlaneCore::ConfigItem.new(key: :flavor,
|
95
|
+
env_name: 'FL_GRADLE_FLAVOR',
|
96
|
+
description: 'The flavor that you want the task for, e.g. `MyFlavor`. If you are running the `assemble` task in a multi-flavor project, and you rely on Actions.lane_context[Actions.SharedValues::GRADLE_APK_OUTPUT_PATH] then you must specify a flavor here or else this value will be undefined',
|
97
|
+
optional: true,
|
98
|
+
is_string: true),
|
99
|
+
FastlaneCore::ConfigItem.new(key: :build_type,
|
100
|
+
env_name: 'FL_GRADLE_BUILD_TYPE',
|
101
|
+
description: 'The build type that you want the task for, e.g. `Release`. Useful for some tasks such as `assemble`',
|
102
|
+
optional: true,
|
62
103
|
is_string: true),
|
63
104
|
FastlaneCore::ConfigItem.new(key: :flags,
|
64
|
-
env_name:
|
65
|
-
description:
|
105
|
+
env_name: 'FL_GRADLE_FLAGS',
|
106
|
+
description: 'All parameter flags you want to pass to the gradle command, e.g. `--exitcode --xml file.xml`',
|
66
107
|
optional: true,
|
67
108
|
is_string: true),
|
109
|
+
FastlaneCore::ConfigItem.new(key: :project_dir,
|
110
|
+
env_name: 'FL_GRADLE_PROJECT_DIR',
|
111
|
+
description: 'The root directory of the gradle project. Defaults to `.`',
|
112
|
+
default_value: '.',
|
113
|
+
is_string: true),
|
68
114
|
FastlaneCore::ConfigItem.new(key: :gradle_path,
|
69
|
-
env_name:
|
70
|
-
description:
|
115
|
+
env_name: 'FL_GRADLE_PATH',
|
116
|
+
description: 'The path to your `gradlew`. If you specify a relative path, it is assumed to be relative to the `project_dir`',
|
117
|
+
optional: true,
|
118
|
+
is_string: true),
|
119
|
+
FastlaneCore::ConfigItem.new(key: :properties,
|
120
|
+
env_name: 'FL_GRADLE_PROPERTIES',
|
121
|
+
description: 'Gradle properties to be exposed to the gradle script',
|
122
|
+
optional: true,
|
123
|
+
is_string: false),
|
124
|
+
FastlaneCore::ConfigItem.new(key: :serial,
|
125
|
+
env_name: 'FL_ANDROID_SERIAL',
|
126
|
+
description: 'Android serial, wich device should be used for this command',
|
71
127
|
is_string: true,
|
72
|
-
default_value:
|
73
|
-
verify_block: proc do |value|
|
74
|
-
raise "Couldn't find gradlew at path '#{File.expand_path(value)}'".red unless File.exist?(value)
|
75
|
-
end)
|
128
|
+
default_value: '')
|
76
129
|
]
|
77
130
|
end
|
78
131
|
|
79
132
|
def self.output
|
80
133
|
[
|
81
|
-
['GRADLE_APK_OUTPUT_PATH', 'The path to the newly generated apk file']
|
134
|
+
['GRADLE_APK_OUTPUT_PATH', 'The path to the newly generated apk file. Undefined in a multi-variant assemble scenario'],
|
135
|
+
['GRADLE_ALL_APK_OUTPUT_PATHS', 'When running a multi-variant `assemble`, the array of signed apk\'s that were generated'],
|
136
|
+
['GRADLE_FLAVOR', 'The flavor, e.g. `MyFlavor`'],
|
137
|
+
['GRADLE_BUILD_TYPE', 'The build type, e.g. `Release`']
|
82
138
|
]
|
83
139
|
end
|
84
140
|
|
85
141
|
def self.return_value
|
86
|
-
|
142
|
+
'The output of running the gradle task'
|
87
143
|
end
|
88
144
|
|
89
145
|
def self.authors
|
90
|
-
[
|
146
|
+
['KrauseFx', 'lmirosevic']
|
91
147
|
end
|
92
148
|
|
93
149
|
def self.is_supported?(platform)
|
@@ -30,7 +30,12 @@ module Fastlane
|
|
30
30
|
Helper.log.info "Fetching the latest build number for version #{version_number}"
|
31
31
|
|
32
32
|
train = app.build_trains[version_number]
|
33
|
-
|
33
|
+
begin
|
34
|
+
build_number = train.builds.map(&:build_version).map(&:to_i).sort.last
|
35
|
+
rescue
|
36
|
+
raise "could not find a build on iTC - and 'initial_build_number' option is not set" unless params[:initial_build_number]
|
37
|
+
build_number = params[:initial_build_number]
|
38
|
+
end
|
34
39
|
|
35
40
|
Helper.log.info "Latest upload is build number: #{build_number}"
|
36
41
|
Actions.lane_context[SharedValues::LATEST_TESTFLIGHT_BUILD_NUMBER] = build_number
|
@@ -66,7 +71,13 @@ module Fastlane
|
|
66
71
|
FastlaneCore::ConfigItem.new(key: :version,
|
67
72
|
env_name: "LATEST_VERSION",
|
68
73
|
description: "The version number whose latest build number we want",
|
69
|
-
optional: true)
|
74
|
+
optional: true),
|
75
|
+
FastlaneCore::ConfigItem.new(key: :initial_build_number,
|
76
|
+
env_name: "INTITIAL_BUILD_NUMBER",
|
77
|
+
description: "sets the build number to given value if no build is in current train",
|
78
|
+
optional: true,
|
79
|
+
is_string: false)
|
80
|
+
|
70
81
|
]
|
71
82
|
end
|
72
83
|
|
@@ -75,6 +75,11 @@ module Fastlane
|
|
75
75
|
env_name: "MAILGUN_CI_BUILD_LINK",
|
76
76
|
description: "CI Build Link",
|
77
77
|
optional: true,
|
78
|
+
is_string: true),
|
79
|
+
FastlaneCore::ConfigItem.new(key: :template_path,
|
80
|
+
env_name: "MAILGUN_TEMPLATE_PATH",
|
81
|
+
description: "Mail HTML template",
|
82
|
+
optional: true,
|
78
83
|
is_string: true)
|
79
84
|
|
80
85
|
]
|
@@ -98,11 +103,11 @@ module Fastlane
|
|
98
103
|
from: "#{options[:from]}<#{options[:postmaster]}>",
|
99
104
|
to: "#{options[:to]}",
|
100
105
|
subject: options[:subject],
|
101
|
-
html:
|
102
|
-
|
106
|
+
html: mail_template(options)
|
107
|
+
mail_template(options)
|
103
108
|
end
|
104
109
|
|
105
|
-
def self.
|
110
|
+
def self.mail_template(options)
|
106
111
|
hash = {
|
107
112
|
author: Actions.git_author_email,
|
108
113
|
last_commit: Actions.last_git_commit_message,
|
@@ -111,10 +116,18 @@ module Fastlane
|
|
111
116
|
}
|
112
117
|
hash[:success] = options[:success]
|
113
118
|
hash[:ci_build_link] = options[:ci_build_link]
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
119
|
+
|
120
|
+
# grabs module
|
121
|
+
eth = Fastlane::ErbTemplateHelper
|
122
|
+
|
123
|
+
# create html from template
|
124
|
+
html_template_path = options[:template_path]
|
125
|
+
if html_template_path && File.exist?(html_template_path)
|
126
|
+
html_template = eth.load_from_path(html_template_path)
|
127
|
+
else
|
128
|
+
html_template = eth.load("mailgun_html_template")
|
129
|
+
end
|
130
|
+
eth.render(html_template, hash)
|
118
131
|
end
|
119
132
|
|
120
133
|
end
|
@@ -7,8 +7,9 @@ module Fastlane
|
|
7
7
|
|
8
8
|
class OclintAction < Action
|
9
9
|
def self.run(params)
|
10
|
-
|
11
|
-
|
10
|
+
oclint_path = params[:oclint_path]
|
11
|
+
if `which #{oclint_path}`.to_s.empty? and !Helper.test?
|
12
|
+
raise "You have to install oclint or provide path to oclint binary. Fore more details: ".red + "http://docs.oclint.org/en/stable/intro/installation.html".yellow
|
12
13
|
end
|
13
14
|
|
14
15
|
compile_commands = params[:compile_commands]
|
@@ -64,7 +65,7 @@ module Fastlane
|
|
64
65
|
|
65
66
|
command = [
|
66
67
|
command_prefix,
|
67
|
-
|
68
|
+
oclint_path,
|
68
69
|
oclint_args,
|
69
70
|
'"' + files.join('" "') + '"'
|
70
71
|
].join(' ')
|
@@ -84,6 +85,11 @@ module Fastlane
|
|
84
85
|
|
85
86
|
def self.available_options
|
86
87
|
[
|
88
|
+
FastlaneCore::ConfigItem.new(key: :oclint_path,
|
89
|
+
env_name: 'FL_OCLINT_PATH',
|
90
|
+
description: 'The path to oclint binary',
|
91
|
+
default_value: 'oclint',
|
92
|
+
optional: true),
|
87
93
|
FastlaneCore::ConfigItem.new(key: :compile_commands,
|
88
94
|
env_name: 'FL_OCLINT_COMPILE_COMMANDS',
|
89
95
|
description: 'The json compilation database, use xctool reporter \'json-compilation-database\'',
|
data/lib/fastlane/actions/s3.rb
CHANGED
@@ -231,6 +231,16 @@ module Fastlane
|
|
231
231
|
html_obj = bucket.objects.create(html_file_name, html_render.to_s, acl: :public_read)
|
232
232
|
version_obj = bucket.objects.create(version_file_name, version_render.to_s, acl: :public_read)
|
233
233
|
|
234
|
+
# When you enable versioning on a S3 bucket,
|
235
|
+
# writing to an object will create an object version
|
236
|
+
# instead of replacing the existing object.
|
237
|
+
# http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/ObjectVersion.html
|
238
|
+
if plist_obj.kind_of? AWS::S3::ObjectVersion
|
239
|
+
plist_obj = plist_obj.object
|
240
|
+
html_obj = html_obj.object
|
241
|
+
version_obj = version_obj.object
|
242
|
+
end
|
243
|
+
|
234
244
|
# Setting actionand environment variables
|
235
245
|
Actions.lane_context[SharedValues::S3_PLIST_OUTPUT_PATH] = plist_obj.public_url.to_s
|
236
246
|
ENV[SharedValues::S3_PLIST_OUTPUT_PATH.to_s] = plist_obj.public_url.to_s
|
@@ -241,7 +251,7 @@ module Fastlane
|
|
241
251
|
Actions.lane_context[SharedValues::S3_VERSION_OUTPUT_PATH] = version_obj.public_url.to_s
|
242
252
|
ENV[SharedValues::S3_VERSION_OUTPUT_PATH.to_s] = version_obj.public_url.to_s
|
243
253
|
|
244
|
-
Helper.log.info "Successfully uploaded ipa file to '#{
|
254
|
+
Helper.log.info "Successfully uploaded ipa file to '#{Actions.lane_context[SharedValues::S3_IPA_OUTPUT_PATH]}'".green
|
245
255
|
end
|
246
256
|
|
247
257
|
#
|
@@ -8,56 +8,10 @@ module Fastlane
|
|
8
8
|
[:ios, :mac].include? platform
|
9
9
|
end
|
10
10
|
|
11
|
-
def self.is_svn?
|
12
|
-
Actions.sh 'svn info'
|
13
|
-
return true
|
14
|
-
rescue
|
15
|
-
return false
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.is_git?
|
19
|
-
Actions.sh 'git rev-parse HEAD'
|
20
|
-
return true
|
21
|
-
rescue
|
22
|
-
return false
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.is_git_svn?
|
26
|
-
Actions.sh 'git svn info'
|
27
|
-
return true
|
28
|
-
rescue
|
29
|
-
return false
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.is_hg?
|
33
|
-
Actions.sh 'hg status'
|
34
|
-
return true
|
35
|
-
rescue
|
36
|
-
return false
|
37
|
-
end
|
38
|
-
|
39
11
|
def self.run(params)
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
elsif is_git_svn?
|
44
|
-
Helper.log.info "Detected repo: git-svn"
|
45
|
-
command = 'git svn info | grep Revision | egrep -o "[0-9]+"'
|
46
|
-
elsif is_git?
|
47
|
-
Helper.log.info "Detected repo: git"
|
48
|
-
command = 'git rev-parse --short HEAD'
|
49
|
-
elsif is_hg?
|
50
|
-
Helper.log.info "Detected repo: hg"
|
51
|
-
if params[:use_hg_revision_number]
|
52
|
-
command = 'hg parent --template {rev}'
|
53
|
-
else
|
54
|
-
command = 'hg parent --template "{node|short}"'
|
55
|
-
end
|
56
|
-
else
|
57
|
-
raise "No repository detected"
|
58
|
-
end
|
59
|
-
|
60
|
-
build_number = Actions.sh command
|
12
|
+
build_number = Fastlane::Actions::GetBuildNumberRepositoryAction.run(
|
13
|
+
use_hg_revision_number: params[:use_hg_revision_number]
|
14
|
+
)
|
61
15
|
|
62
16
|
Fastlane::Actions::IncrementBuildNumberAction.run(build_number: build_number)
|
63
17
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Fastlane
|
2
|
+
module Actions
|
3
|
+
module SharedValues
|
4
|
+
UPDATE_ICLOUD_CONTAINER_IDENTIFIERS = :UPDATE_ICLOUD_CONTAINER_IDENTIFIERS
|
5
|
+
end
|
6
|
+
|
7
|
+
class UpdateIcloudContainerIdentifiersAction < Action
|
8
|
+
require 'plist'
|
9
|
+
|
10
|
+
def self.run(params)
|
11
|
+
entitlements_file = params[:entitlements_file]
|
12
|
+
UI.message "Entitlements File: #{entitlements_file}"
|
13
|
+
|
14
|
+
# parse entitlements
|
15
|
+
result = Plist.parse_xml(entitlements_file)
|
16
|
+
UI.error "Entitlements file at '#{entitlements_file}' cannot be parsed." unless result
|
17
|
+
|
18
|
+
# get iCloud container field
|
19
|
+
icloud_container_key = 'com.apple.developer.icloud-container-identifiers'
|
20
|
+
icloud_container_value = result[icloud_container_key]
|
21
|
+
UI.error "No existing iCloud container field specified. Please specify an iCloud container in the entitlements file." unless icloud_container_value
|
22
|
+
|
23
|
+
# get uniquity container field
|
24
|
+
ubiquity_container_key = 'com.apple.developer.ubiquity-container-identifiers'
|
25
|
+
ubiquity_container_value = result[ubiquity_container_key]
|
26
|
+
UI.error "No existing ubiquity container field specified. Please specify an ubiquity container in the entitlements file." unless ubiquity_container_value
|
27
|
+
|
28
|
+
# set iCloud container identifiers
|
29
|
+
result[icloud_container_key] = params[:icloud_container_identifiers]
|
30
|
+
result[ubiquity_container_key] = params[:icloud_container_identifiers]
|
31
|
+
|
32
|
+
# save entitlements file
|
33
|
+
result.save_plist(entitlements_file)
|
34
|
+
|
35
|
+
UI.message "Old iCloud Container Identifiers: #{icloud_container_value}"
|
36
|
+
UI.message "Old Ubiquity Container Identifiers: #{ubiquity_container_value}"
|
37
|
+
|
38
|
+
UI.success "New iCloud Container Identifiers set: #{result[icloud_container_key]}"
|
39
|
+
UI.success "New Ubiquity Container Identifiers set: #{result[ubiquity_container_key]}"
|
40
|
+
|
41
|
+
Actions.lane_context[SharedValues::UPDATE_ICLOUD_CONTAINER_IDENTIFIERS] = result[icloud_container_key]
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.description
|
45
|
+
"This action changes the iCloud container identifiers in the entitlements file"
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.available_options
|
49
|
+
[
|
50
|
+
FastlaneCore::ConfigItem.new(key: :entitlements_file,
|
51
|
+
env_name: "FL_UPDATE_ICLOUD_CONTAINER_IDENTIFIERS_ENTITLEMENTS_FILE_PATH",
|
52
|
+
description: "The path to the entitlement file which contains the iCloud container identifiers",
|
53
|
+
verify_block: proc do |value|
|
54
|
+
UI.user_error!("Please pass a path to an entitlements file. ") unless value.include? ".entitlements"
|
55
|
+
UI.user_error!("Could not find entitlements file") if !File.exist?(value) and !Helper.is_test?
|
56
|
+
end),
|
57
|
+
FastlaneCore::ConfigItem.new(key: :icloud_container_identifiers,
|
58
|
+
env_name: "FL_UPDATE_ICLOUD_CONTAINER_IDENTIFIERS_IDENTIFIERS",
|
59
|
+
description: "An Array of unique identifiers for the iCloud containers. Eg. ['iCloud.com.test.testapp']",
|
60
|
+
is_string: false,
|
61
|
+
verify_block: proc do |value|
|
62
|
+
UI.user_error!("The parameter icloud_container_identifiers needs to be an Array.") unless value.kind_of? Array
|
63
|
+
end)
|
64
|
+
]
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.output
|
68
|
+
['UPDATE_ICLOUD_CONTAINER_IDENTIFIERS', 'The new iCloud Container Identifiers']
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.authors
|
72
|
+
["JamesKuang"]
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.is_supported?(platform)
|
76
|
+
platform == :ios
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -9,7 +9,7 @@ module Fastlane
|
|
9
9
|
class VerifyBuildAction < Action
|
10
10
|
def self.run(params)
|
11
11
|
Dir.mktmpdir do |dir|
|
12
|
-
app_path = self.app_path(dir)
|
12
|
+
app_path = self.app_path(params, dir)
|
13
13
|
|
14
14
|
values = self.gather_cert_info(app_path)
|
15
15
|
|
@@ -21,8 +21,8 @@ module Fastlane
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.app_path(dir)
|
25
|
-
ipa_path = Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] || ''
|
24
|
+
def self.app_path(params, dir)
|
25
|
+
ipa_path = params[:ipa_path] || Actions.lane_context[SharedValues::IPA_OUTPUT_PATH] || ''
|
26
26
|
raise "Unable to find ipa file '#{ipa_path}'." unless File.exist?(ipa_path)
|
27
27
|
ipa_path = File.expand_path(ipa_path)
|
28
28
|
|
@@ -67,7 +67,10 @@ module Fastlane
|
|
67
67
|
values['provisioning_uuid'] = plist['UUID']
|
68
68
|
values['team_name'] = plist['TeamName']
|
69
69
|
|
70
|
-
|
70
|
+
application_identifier_prefix = plist['ApplicationIdentifierPrefix'][0]
|
71
|
+
full_bundle_identifier = "#{application_identifier_prefix}.#{values['bundle_identifier']}"
|
72
|
+
|
73
|
+
raise "Inconsistent identifier found; #{plist['Entitlements']['application-identifier']}, found in the embedded.mobileprovision file, should match #{full_bundle_identifier}, which is embedded in the codesign identity" unless plist['Entitlements']['application-identifier'] == full_bundle_identifier
|
71
74
|
raise "Inconsistent identifier found" unless plist['Entitlements']['com.apple.developer.team-identifier'] == values['team_identifier']
|
72
75
|
|
73
76
|
values
|
@@ -100,22 +103,22 @@ module Fastlane
|
|
100
103
|
|
101
104
|
def self.evaulate(params, values)
|
102
105
|
if params[:provisioning_type]
|
103
|
-
raise "Mismatched provisioning_type '#{params[:provisioning_type]}'".red unless params[:provisioning_type] == values['provisioning_type']
|
106
|
+
raise "Mismatched provisioning_type. Required: '#{params[:provisioning_type]}''; Found: '#{values['provisioning_type']}'".red unless params[:provisioning_type] == values['provisioning_type']
|
104
107
|
end
|
105
108
|
if params[:provisioning_uuid]
|
106
|
-
raise "Mismatched provisioning_uuid '#{params[:provisioning_uuid]}'".red unless params[:provisioning_uuid] == values['provisioning_uuid']
|
109
|
+
raise "Mismatched provisioning_uuid. Required: '#{params[:provisioning_uuid]}'; Found: '#{values['provisioning_uuid']}'".red unless params[:provisioning_uuid] == values['provisioning_uuid']
|
107
110
|
end
|
108
111
|
if params[:team_identifier]
|
109
|
-
raise "Mismatched team_identifier '#{params[:team_identifier]}'".red unless params[:team_identifier] == values['team_identifier']
|
112
|
+
raise "Mismatched team_identifier. Required: '#{params[:team_identifier]}'; Found: '#{values['team_identifier']}'".red unless params[:team_identifier] == values['team_identifier']
|
110
113
|
end
|
111
114
|
if params[:team_name]
|
112
|
-
raise "Mismatched team_name '#{params[:team_name]}'".red unless params[:team_name] == values['team_name']
|
115
|
+
raise "Mismatched team_name. Required: '#{params[:team_name]}'; Found: 'values['team_name']'".red unless params[:team_name] == values['team_name']
|
113
116
|
end
|
114
117
|
if params[:app_name]
|
115
|
-
raise "Mismatched app_name '#{params[:app_name]}'".red unless params[:app_name] == values['app_name']
|
118
|
+
raise "Mismatched app_name. Required: '#{params[:app_name]}'; Found: '#{values['app_name']}'".red unless params[:app_name] == values['app_name']
|
116
119
|
end
|
117
120
|
if params[:bundle_identifier]
|
118
|
-
raise "Mismatched bundle_identifier '#{params[:bundle_identifier]}'".red unless params[:bundle_identifier] == values['bundle_identifier']
|
121
|
+
raise "Mismatched bundle_identifier. Required: '#{params[:bundle_identifier]}'; Found: '#{values['bundle_identifier']}'".red unless params[:bundle_identifier] == values['bundle_identifier']
|
119
122
|
end
|
120
123
|
|
121
124
|
UI.success "Build is verified, have a 🍪."
|
@@ -161,6 +164,10 @@ module Fastlane
|
|
161
164
|
FastlaneCore::ConfigItem.new(key: :bundle_identifier,
|
162
165
|
env_name: "FL_VERIFY_BUILD_BUNDLE_IDENTIFIER",
|
163
166
|
description: "Required bundle identifier",
|
167
|
+
optional: true),
|
168
|
+
FastlaneCore::ConfigItem.new(key: :ipa_path,
|
169
|
+
env_name: "FL_VERIFY_BUILD_IPA_PATH",
|
170
|
+
description: "Explicitly set the ipa path",
|
164
171
|
optional: true)
|
165
172
|
]
|
166
173
|
end
|
@@ -23,10 +23,11 @@ module Fastlane
|
|
23
23
|
end
|
24
24
|
|
25
25
|
# Run a certain action
|
26
|
-
def trigger(task: nil, flags: nil, serial:nil)
|
26
|
+
def trigger(task: nil, flags: nil, serial: nil)
|
27
27
|
# raise "Could not find gradle task '#{task}' in the list of available tasks".red unless task_available?(task)
|
28
|
-
|
29
|
-
|
28
|
+
|
29
|
+
android_serial = (serial != "") ? "ANDROID_SERIAL=#{serial}" : nil
|
30
|
+
command = [android_serial, gradle_path, task, flags].reject(&:nil?).join(" ")
|
30
31
|
Action.sh(command)
|
31
32
|
end
|
32
33
|
|
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: 1.
|
4
|
+
version: 1.64.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Krause
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: krausefx-shenzhen
|
@@ -673,6 +673,7 @@ files:
|
|
673
673
|
- lib/fastlane/actions/frameit.rb
|
674
674
|
- lib/fastlane/actions/gcovr.rb
|
675
675
|
- lib/fastlane/actions/get_build_number.rb
|
676
|
+
- lib/fastlane/actions/get_build_number_repository.rb
|
676
677
|
- lib/fastlane/actions/get_github_release.rb
|
677
678
|
- lib/fastlane/actions/get_info_plist_value.rb
|
678
679
|
- lib/fastlane/actions/get_ipa_info_plist_value.rb
|
@@ -763,6 +764,7 @@ files:
|
|
763
764
|
- lib/fastlane/actions/update_app_group_identifiers.rb
|
764
765
|
- lib/fastlane/actions/update_app_identifier.rb
|
765
766
|
- lib/fastlane/actions/update_fastlane.rb
|
767
|
+
- lib/fastlane/actions/update_icloud_container_identifiers.rb
|
766
768
|
- lib/fastlane/actions/update_info_plist.rb
|
767
769
|
- lib/fastlane/actions/update_project_code_signing.rb
|
768
770
|
- lib/fastlane/actions/update_project_provisioning.rb
|
@@ -828,7 +830,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
828
830
|
version: '0'
|
829
831
|
requirements: []
|
830
832
|
rubyforge_project:
|
831
|
-
rubygems_version: 2.
|
833
|
+
rubygems_version: 2.2.2
|
832
834
|
signing_key:
|
833
835
|
specification_version: 4
|
834
836
|
summary: Connect all iOS deployment tools into one streamlined workflow
|