fastlane-plugin-yalantis_ci 0.2.4 → 0.3.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/lib/fastlane/plugin/yalantis_ci/actions/app_store_connect_api_key_add_to_remote.rb +1 -1
- data/lib/fastlane/plugin/yalantis_ci/actions/app_store_connect_api_key_remove_from_remote.rb +1 -1
- data/lib/fastlane/plugin/yalantis_ci/actions/app_store_connect_api_key_set_from_remote.rb +1 -1
- data/lib/fastlane/plugin/yalantis_ci/actions/build_number_get_from_xcconfig.rb +45 -0
- data/lib/fastlane/plugin/yalantis_ci/actions/build_number_set_to_xcconfig.rb +56 -0
- data/lib/fastlane/plugin/yalantis_ci/actions/build_number_sync.rb +136 -0
- data/lib/fastlane/plugin/yalantis_ci/actions/ci_setup.rb +3 -1
- data/lib/fastlane/plugin/yalantis_ci/helper/git_helper.rb +4 -5
- data/lib/fastlane/plugin/yalantis_ci/version.rb +1 -1
- metadata +11 -10
- data/lib/fastlane/plugin/yalantis_ci/actions/yalantis_ci_action.rb +0 -47
- data/lib/fastlane/plugin/yalantis_ci/helper/ci_helper.rb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58cd3b0ec5fef22e15fa882c7ca44203708e8856c0564f576fe7663abfc831b1
|
4
|
+
data.tar.gz: c3a33707d3a0bebdfba4226401c9152e46eb8176c9884a588d058554447d0ecf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90b56e0a44ac82f76ec2c06c66b64c11d5f6f7b479c8fbbde46613731ed684337275c9ceaa100df5c7afdac7f4af5a0aada08000cdc1eeb407e6e4dc7c95ed81
|
7
|
+
data.tar.gz: 34b52c767b66eb3d92b1616a005b95ee47e56962067e830148248afe06d5a4aaf1e20ecf4e388d5c090547f5b78a484e8a9151c5a1020f71c357b1c2deef0af9
|
@@ -17,7 +17,7 @@ module Fastlane
|
|
17
17
|
UI.user_error!(":key_content or :key_filepath is required")
|
18
18
|
end
|
19
19
|
|
20
|
-
Helper::GitHelper.clone_repo_in_tmp(git_repo_url, git_repo_branch, true) do |dir|
|
20
|
+
Helper::GitHelper.clone_repo_in_tmp(repo_url: git_repo_url, branch: git_repo_branch, create_branch: true) do |dir|
|
21
21
|
target_filename = "#{key_id}.p8"
|
22
22
|
target_filepath = File.join(dir, target_filename)
|
23
23
|
|
data/lib/fastlane/plugin/yalantis_ci/actions/app_store_connect_api_key_remove_from_remote.rb
CHANGED
@@ -10,7 +10,7 @@ module Fastlane
|
|
10
10
|
git_repo_branch = options[:git_repo_branch]
|
11
11
|
key_id = options[:key_id]
|
12
12
|
|
13
|
-
Helper::GitHelper.clone_repo_in_tmp(git_repo_url, git_repo_branch
|
13
|
+
Helper::GitHelper.clone_repo_in_tmp(repo_url: git_repo_url, branch: git_repo_branch) do |dir|
|
14
14
|
target_filename = "#{key_id}.p8"
|
15
15
|
target_filepath = File.join(dir, target_filename)
|
16
16
|
|
@@ -12,7 +12,7 @@ module Fastlane
|
|
12
12
|
issuer_id = options[:issuer_id]
|
13
13
|
in_house = options[:in_house]
|
14
14
|
|
15
|
-
Helper::GitHelper.clone_repo_in_tmp(git_repo_url, git_repo_branch) do |dir|
|
15
|
+
Helper::GitHelper.clone_repo_in_tmp(repo_url: git_repo_url, branch: git_repo_branch) do |dir|
|
16
16
|
target_filename = "#{key_id}.p8"
|
17
17
|
target_filepath = Pathname.new File.join(dir, target_filename)
|
18
18
|
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module Fastlane
|
4
|
+
module Actions
|
5
|
+
class BuildNumberGetFromXcconfigAction < Action
|
6
|
+
def self.run(options)
|
7
|
+
path = options[:xcconfig_path]
|
8
|
+
contents = File.read(path)
|
9
|
+
|
10
|
+
match = /(?<=\bCURRENT_PROJECT_VERSION\s=\s)(?<value>[\d]+)/.match(contents)
|
11
|
+
return match[:value] unless match.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.description
|
15
|
+
"Read Build Number from the passed xcconfig"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.available_options
|
19
|
+
[
|
20
|
+
FastlaneCore::ConfigItem.new(
|
21
|
+
key: :xcconfig_path,
|
22
|
+
env_name: "BUILD_NUMBER_XCCONFIG_PATH",
|
23
|
+
description: "Path to the xcconfig file with Build Number",
|
24
|
+
type: String,
|
25
|
+
verify_block: proc do |value|
|
26
|
+
UI.user_error!("Couldn't find .xcconfig file at path '#{value}'") unless File.exist?(File.expand_path(value))
|
27
|
+
end
|
28
|
+
)
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.output
|
33
|
+
[]
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.authors
|
37
|
+
["Dima Vorona", "Yalantis"]
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.is_supported?(platform)
|
41
|
+
[:ios, :mac].include?(platform)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module Fastlane
|
4
|
+
module Actions
|
5
|
+
class BuildNumberSetToXcconfigAction < Action
|
6
|
+
def self.run(options)
|
7
|
+
build_number = options[:build_number] || Actions.lane_context[SharedValues::BUILD_NUMBER]
|
8
|
+
path = options[:xcconfig_path]
|
9
|
+
|
10
|
+
if build_number.nil?
|
11
|
+
UI.error("build_number can't be nil")
|
12
|
+
else
|
13
|
+
contents = File.readlines(path).join.gsub!(/(?<=\bCURRENT_PROJECT_VERSION\s=\s)([\d]+)/, build_number.to_s)
|
14
|
+
File.write(path, contents) unless contents.nil?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.description
|
19
|
+
"Stores a specified Build Number in the passed xcconfig"
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.available_options
|
23
|
+
[
|
24
|
+
FastlaneCore::ConfigItem.new(
|
25
|
+
key: :build_number,
|
26
|
+
env_name: "BUILD_NUMBER",
|
27
|
+
description: "Build number to be set to the .xcconfig",
|
28
|
+
optional: true,
|
29
|
+
type: Integer
|
30
|
+
),
|
31
|
+
FastlaneCore::ConfigItem.new(
|
32
|
+
key: :xcconfig_path,
|
33
|
+
env_name: "BUILD_NUMBER_XCCONFIG_PATH",
|
34
|
+
description: "Path to the xcconfig file with Build Number",
|
35
|
+
type: String,
|
36
|
+
verify_block: proc do |value|
|
37
|
+
UI.user_error!("Couldn't find .xcconfig file at path '#{value}'") unless File.exist?(File.expand_path(value))
|
38
|
+
end
|
39
|
+
)
|
40
|
+
]
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.output
|
44
|
+
[]
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.authors
|
48
|
+
["Dima Vorona", "Yalantis"]
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.is_supported?(platform)
|
52
|
+
[:ios, :mac].include?(platform)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require_relative '../helper/git_helper'
|
3
|
+
require 'json'
|
4
|
+
require 'securerandom'
|
5
|
+
|
6
|
+
module Fastlane
|
7
|
+
module Actions
|
8
|
+
class BuildNumberSyncAction < Action
|
9
|
+
def self.run(options)
|
10
|
+
build_number = read_from_remote(
|
11
|
+
git_repo_url: options[:git_repo_url],
|
12
|
+
git_repo_branch: options[:git_repo_branch],
|
13
|
+
payload_filepath: options[:git_filepath],
|
14
|
+
mutation_callback: options[:mutation_callback]
|
15
|
+
)
|
16
|
+
Actions.lane_context[SharedValues::BUILD_NUMBER] = build_number unless build_number.nil?
|
17
|
+
return build_number
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.read_from_remote(git_repo_url:, git_repo_branch:, payload_filepath:, mutation_callback: nil)
|
21
|
+
build_number = nil
|
22
|
+
attempts = 0
|
23
|
+
total_attempts = 5
|
24
|
+
|
25
|
+
pwd = ENV['PWD']
|
26
|
+
pwd_managed_by_git = system("git -C \"#{pwd}\" rev-parse") == true
|
27
|
+
pwd_git_username = pwd_managed_by_git ? `git config --local --get user.name`.strip : nil
|
28
|
+
pwd_git_email = pwd_managed_by_git ? `git config --local --get user.email`.strip : nil
|
29
|
+
|
30
|
+
while build_number.nil? && attempts < total_attempts
|
31
|
+
Helper::GitHelper.clone_repo_in_tmp(repo_url: git_repo_url, branch: git_repo_branch, create_branch: true) do |dir|
|
32
|
+
attempts += 1
|
33
|
+
|
34
|
+
UI.message("Attempt #{attempts} out of #{total_attempts} to get build number")
|
35
|
+
|
36
|
+
filepath = File.join(dir, payload_filepath)
|
37
|
+
if File.exist?(filepath)
|
38
|
+
begin
|
39
|
+
remote_build_number = JSON.parse(File.read(filepath))['build_number']
|
40
|
+
rescue
|
41
|
+
remote_build_number = 1
|
42
|
+
end
|
43
|
+
else
|
44
|
+
remote_build_number = 1
|
45
|
+
end
|
46
|
+
|
47
|
+
build_number = mutation_callback != nil ? mutation_callback.call(remote_build_number) : remote_build_number
|
48
|
+
|
49
|
+
if build_number.kind_of?(Integer) && build_number > remote_build_number
|
50
|
+
payload_contents = JSON.pretty_generate({ 'build_number' => build_number, 'generation' => SecureRandom.uuid })
|
51
|
+
File.open(filepath, 'w+') { |file| file.write(payload_contents) }
|
52
|
+
|
53
|
+
add_user_config_if_needed(pwd_git_username: pwd_git_username, pwd_git_email: pwd_git_email)
|
54
|
+
|
55
|
+
Actions.sh("git add #{filepath} && git commit -m '[Build Number] Update Build Number to: #{build_number}'")
|
56
|
+
Actions.sh("git push #{git_repo_url} #{git_repo_branch}", error_callback: ->(result) { build_number = nil })
|
57
|
+
elsif build_number.kind_of?(Integer) && build_number < remote_build_number
|
58
|
+
UI.user_error!("It is unexpected to return build number less than a proposed one: #{build_number} vs #{remote_build_number}")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
build_number
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.add_user_config_if_needed(pwd_git_username:, pwd_git_email:)
|
67
|
+
variables = {'email' => pwd_git_email, 'name' => pwd_git_username }
|
68
|
+
variables.each do |key, value|
|
69
|
+
if `git config --local --get user.#{key}`.strip.empty?
|
70
|
+
`git config --local user.#{key} #{value}` unless value.empty?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#####################################################
|
76
|
+
# @!group Documentation
|
77
|
+
#####################################################
|
78
|
+
|
79
|
+
def self.description
|
80
|
+
"Read and increment version stored in a specified repo"
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.available_options
|
84
|
+
[
|
85
|
+
FastlaneCore::ConfigItem.new(
|
86
|
+
key: :git_repo_url,
|
87
|
+
env_name: "BUILD_NUMBER_GIT_REPO_URL",
|
88
|
+
description: "Git repo URL where Build Number is being stored",
|
89
|
+
type: String
|
90
|
+
),
|
91
|
+
FastlaneCore::ConfigItem.new(
|
92
|
+
key: :git_repo_branch,
|
93
|
+
env_name: "BUILD_NUMBER_GIT_REPO_BRANCH",
|
94
|
+
description: "Git repo branch where Build Number is being stored",
|
95
|
+
type: String,
|
96
|
+
default_value: 'main'
|
97
|
+
),
|
98
|
+
FastlaneCore::ConfigItem.new(
|
99
|
+
key: :increment,
|
100
|
+
description: 'Whether value from remote should be incremented or not',
|
101
|
+
default_value: true,
|
102
|
+
verify_block: proc do |value|
|
103
|
+
UI.user_error!("Only `true` and `false` are allowed") unless value == true || value == false
|
104
|
+
end
|
105
|
+
),
|
106
|
+
FastlaneCore::ConfigItem.new(
|
107
|
+
key: :git_filepath,
|
108
|
+
env_name: "BUILD_NUMBER_GIT_FILEPATH",
|
109
|
+
description: "Relative filepath to the file that contains build number",
|
110
|
+
type: String,
|
111
|
+
default_value: 'payload.json'
|
112
|
+
),
|
113
|
+
FastlaneCore::ConfigItem.new(
|
114
|
+
key: :mutation_callback,
|
115
|
+
description: 'A callback invoked with the build number from remote and expected build number to be returned',
|
116
|
+
optional: true,
|
117
|
+
type: Proc,
|
118
|
+
default_value: nil
|
119
|
+
)
|
120
|
+
]
|
121
|
+
end
|
122
|
+
|
123
|
+
def self.output
|
124
|
+
['BUILD_NUMBER', 'The new build number']
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.authors
|
128
|
+
["Dima Vorona", "Yalantis"]
|
129
|
+
end
|
130
|
+
|
131
|
+
def self.is_supported?(platform)
|
132
|
+
[:ios, :mac].include?(platform)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -80,7 +80,9 @@ module Fastlane
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def self.setup_temp_keychain(id)
|
83
|
-
|
83
|
+
job_id = ENV['CI_JOBENV_ID'] || ''
|
84
|
+
|
85
|
+
name = "#{id}-#{job_id}-fastlane"
|
84
86
|
password = "#{name}-password"
|
85
87
|
path = File.expand_path("~/Library/Keychains/#{name}.keychain-db")
|
86
88
|
|
@@ -5,16 +5,15 @@ module Fastlane
|
|
5
5
|
|
6
6
|
module Helper
|
7
7
|
class GitHelper
|
8
|
-
|
9
|
-
def self.clone_repo_in_tmp(repo_url, branch = 'master', create_branch_if_needed = false)
|
8
|
+
def self.clone_repo_in_tmp(repo_url:, branch: 'master', create_branch: false)
|
10
9
|
temp_directory = `mktemp -d`.tr("\n", "")
|
11
10
|
|
12
11
|
begin
|
13
12
|
Dir.chdir(temp_directory) do
|
14
13
|
Actions.sh("git clone -b #{branch} #{repo_url} #{Dir.pwd}") do |status, result, cmd|
|
15
|
-
if status.success? != true &&
|
16
|
-
Actions.sh("git clone #{repo_url} #{Dir.pwd} && git checkout -b #{branch}") do |status, result, cmd
|
17
|
-
if status.success? != true
|
14
|
+
if status.success? != true && create_branch
|
15
|
+
Actions.sh("git clone #{repo_url} #{Dir.pwd} && git checkout -b #{branch}") do |status, result, cmd|
|
16
|
+
if status.success? != true
|
18
17
|
raise StandardError.new result
|
19
18
|
end
|
20
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-yalantis_ci
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dima Vorona
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fastlane-plugin-firebase_app_distribution
|
@@ -150,7 +150,7 @@ dependencies:
|
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '2.0'
|
153
|
-
description:
|
153
|
+
description:
|
154
154
|
email: dmytro.vorona@yalantis.net
|
155
155
|
executables: []
|
156
156
|
extensions: []
|
@@ -162,19 +162,20 @@ files:
|
|
162
162
|
- lib/fastlane/plugin/yalantis_ci/actions/app_store_connect_api_key_add_to_remote.rb
|
163
163
|
- lib/fastlane/plugin/yalantis_ci/actions/app_store_connect_api_key_remove_from_remote.rb
|
164
164
|
- lib/fastlane/plugin/yalantis_ci/actions/app_store_connect_api_key_set_from_remote.rb
|
165
|
+
- lib/fastlane/plugin/yalantis_ci/actions/build_number_get_from_xcconfig.rb
|
166
|
+
- lib/fastlane/plugin/yalantis_ci/actions/build_number_set_to_xcconfig.rb
|
167
|
+
- lib/fastlane/plugin/yalantis_ci/actions/build_number_sync.rb
|
165
168
|
- lib/fastlane/plugin/yalantis_ci/actions/ci_setup.rb
|
166
169
|
- lib/fastlane/plugin/yalantis_ci/actions/ci_teardown.rb
|
167
170
|
- lib/fastlane/plugin/yalantis_ci/actions/firebase_distribution_setup.rb
|
168
171
|
- lib/fastlane/plugin/yalantis_ci/actions/install_brew_dependencies.rb
|
169
|
-
- lib/fastlane/plugin/yalantis_ci/actions/yalantis_ci_action.rb
|
170
|
-
- lib/fastlane/plugin/yalantis_ci/helper/ci_helper.rb
|
171
172
|
- lib/fastlane/plugin/yalantis_ci/helper/git_helper.rb
|
172
173
|
- lib/fastlane/plugin/yalantis_ci/version.rb
|
173
|
-
homepage:
|
174
|
+
homepage:
|
174
175
|
licenses:
|
175
176
|
- MIT
|
176
177
|
metadata: {}
|
177
|
-
post_install_message:
|
178
|
+
post_install_message:
|
178
179
|
rdoc_options: []
|
179
180
|
require_paths:
|
180
181
|
- lib
|
@@ -189,8 +190,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
189
190
|
- !ruby/object:Gem::Version
|
190
191
|
version: '0'
|
191
192
|
requirements: []
|
192
|
-
rubygems_version: 3.
|
193
|
-
signing_key:
|
193
|
+
rubygems_version: 3.1.6
|
194
|
+
signing_key:
|
194
195
|
specification_version: 4
|
195
196
|
summary: Set of utilities and useful actions to help setup CI for Yalantis projects
|
196
197
|
test_files: []
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'fastlane/action'
|
2
|
-
require_relative '../helper/ci_helper'
|
3
|
-
|
4
|
-
module Fastlane
|
5
|
-
module Actions
|
6
|
-
class YalantisCiAction < Action
|
7
|
-
def self.run(params)
|
8
|
-
UI.message("The yalantis_ci plugin is working!")
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.description
|
12
|
-
"Set of utilities and useful actions to help setup CI for Yalantis projects"
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.authors
|
16
|
-
["Dima Vorona"]
|
17
|
-
end
|
18
|
-
|
19
|
-
def self.return_value
|
20
|
-
# If your method provides a return value, you can describe here what it does
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.details
|
24
|
-
# Optional:
|
25
|
-
"This plugin provides tools that setup Firebase, setup proper match repo branch name based on the project Unique ID (based on Team ID and a project name), syncs AppStore Connect API keys, kbridges cocoapod keys plugin to sync and share keys, stored in an encrypted repo just as Match does"
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.available_options
|
29
|
-
[
|
30
|
-
# FastlaneCore::ConfigItem.new(key: :your_option,
|
31
|
-
# env_name: "YALANTIS_CI_YOUR_OPTION",
|
32
|
-
# description: "A description of your option",
|
33
|
-
# optional: false,
|
34
|
-
# type: String)
|
35
|
-
]
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.is_supported?(platform)
|
39
|
-
# Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
|
40
|
-
# See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
|
41
|
-
#
|
42
|
-
# [:ios, :mac, :android].include?(platform)
|
43
|
-
true
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'fastlane_core/ui/ui'
|
2
|
-
|
3
|
-
module Fastlane
|
4
|
-
UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
|
5
|
-
|
6
|
-
module Helper
|
7
|
-
class CiHelper
|
8
|
-
|
9
|
-
# class methods that you define here become available in your action
|
10
|
-
# as `Helper::CiHelper.your_method`
|
11
|
-
#
|
12
|
-
def self.show_message
|
13
|
-
UI.message("Hello from the yalantis_ci plugin helper!")
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|