fastlane 1.63.1 → 1.64.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.
- 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
|