flow-cli 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.reek +5 -0
- data/README.md +2 -1
- data/lib/flow/cli/cmd_manager.rb +9 -12
- data/lib/flow/cli/commands/remote.rb +81 -29
- data/lib/flow/cli/project_analytics.rb +0 -2
- data/lib/flow/cli/utils/all.rb +1 -0
- data/lib/flow/cli/utils/api/flow_api_manager.rb +10 -0
- data/lib/flow/cli/utils/cmd_helper.rb +57 -0
- data/lib/flow/cli/utils/db_manager.rb +4 -0
- data/lib/flow/cli/version.rb +1 -1
- data/lib/flow/cli/yaml_builders/all.rb +3 -0
- data/lib/flow/cli/yaml_builders/flow_yaml_builder.rb +81 -0
- data/lib/flow/cli/yaml_builders/ios_build_step_generator.rb +39 -0
- data/lib/flow/cli/yaml_builders/ios_yaml_builder.rb +21 -0
- data/lib/flow/cli.rb +1 -2
- metadata +8 -5
- data/.flow.yml +0 -21
- data/lib/flow/cli/flow_yaml_builder.rb +0 -70
- data/lib/flow/cli/ios_build_step_generator.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbcb5bcae47d4673d9db2c6ccde08c12254061c9
|
4
|
+
data.tar.gz: bb10fb044569cac4a529197a0f171f6ec134dac1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d673f1c6c05b792493422c6313175a1e2626a1fca5a7a10e1179ca036f76d82de1af38750344cbe8ed4321859059c1459431438d0bbef463dda979d31b3b99d8
|
7
|
+
data.tar.gz: e90a96a7b7d56d34f93a34954b879ae7a7a9dbbed500db6a859bbd3c4b3a25d3f783420d5a7496103085b848aa6319d15df722ef34307a130debb0f88b6a3875
|
data/.gitignore
CHANGED
data/.reek
ADDED
data/README.md
CHANGED
data/lib/flow/cli/cmd_manager.rb
CHANGED
@@ -7,14 +7,11 @@ module Flow::Cli
|
|
7
7
|
class CmdManager < Thor
|
8
8
|
def initialize(*args)
|
9
9
|
super(*args)
|
10
|
-
@prompt = TTY::Prompt.new
|
11
|
-
@pastel = Pastel.new
|
12
|
-
@error = @pastel.red.bold.detach
|
13
|
-
@warning = @pastel.yellow.detach
|
14
10
|
@db_manager = Utils::DbManager
|
11
|
+
@cmd_helper = Utils::CmdHelper.instance
|
15
12
|
end
|
16
13
|
|
17
|
-
desc "remote ...ARGS", "
|
14
|
+
desc "remote ...ARGS", "operations about flow ci."
|
18
15
|
subcommand "remote", Commands::Remote
|
19
16
|
|
20
17
|
desc "build_yaml_file", "build flow ci project yaml"
|
@@ -24,12 +21,12 @@ module Flow::Cli
|
|
24
21
|
# TODO: 优化点,以后放到其他地方
|
25
22
|
config[:gym_config] = ask_gym_build_options if config[:flow_language] == "objc" && ENV["FLOW_CLI_TEST"] != "TRUE"
|
26
23
|
|
27
|
-
str = FlowYamlBuilder.
|
24
|
+
str = YamlBuilders::FlowYamlBuilder.init_yaml_builder(config).build_yaml
|
28
25
|
raise YamlError, "存在 #{FLOW_YML_NAME}, 删除后才能重新生成" if File.file?(FLOW_YML_NAME)
|
29
26
|
File.open(FLOW_YML_NAME, "wb") do |file|
|
30
27
|
file.write(str)
|
31
28
|
end
|
32
|
-
@
|
29
|
+
@cmd_helper.puts_warning "yaml created...\n#{str}"
|
33
30
|
end
|
34
31
|
|
35
32
|
desc "run_build_script", "run flow yml build script"
|
@@ -41,7 +38,7 @@ module Flow::Cli
|
|
41
38
|
desc "show_build_script", "show flow yml build script"
|
42
39
|
def show_build_script
|
43
40
|
script = yml_build_script
|
44
|
-
puts @
|
41
|
+
puts @cmd_helper.puts_warning "This is the build script in yaml"
|
45
42
|
print_line
|
46
43
|
puts script
|
47
44
|
print_line
|
@@ -62,7 +59,7 @@ module Flow::Cli
|
|
62
59
|
map Thor::HELP_MAPPINGS => :help
|
63
60
|
def help(command = nil, subcommand = false)
|
64
61
|
print_line
|
65
|
-
puts @
|
62
|
+
puts @cmd_helper.puts_error("VERSION ALPHA\n Support IOS project ONLY, temporarily.")
|
66
63
|
print_line
|
67
64
|
super
|
68
65
|
end
|
@@ -96,7 +93,7 @@ module Flow::Cli
|
|
96
93
|
|
97
94
|
def yml_build_script
|
98
95
|
if File.file?(FLOW_YML_NAME) == false
|
99
|
-
return unless @
|
96
|
+
return unless @cmd_helper.yes?('no flow.yml found, need to build . y/n')
|
100
97
|
build_yaml_file
|
101
98
|
end
|
102
99
|
scripts = get_scripts(select_yml_steps("build"))
|
@@ -115,8 +112,8 @@ module Flow::Cli
|
|
115
112
|
|
116
113
|
def ask_gym_build_options
|
117
114
|
user_gym_config = {}
|
118
|
-
user_gym_config[:export_method] = @
|
119
|
-
user_gym_config[:silent] = "" if @
|
115
|
+
user_gym_config[:export_method] = @cmd_helper.select("export_method? ", %w[development app-store ad-hoc package enterprise developer-id])
|
116
|
+
user_gym_config[:silent] = "" if @cmd_helper.yes?("less log?")
|
120
117
|
|
121
118
|
user_gym_config
|
122
119
|
end
|
@@ -8,41 +8,63 @@ module Flow::Cli
|
|
8
8
|
class Remote < Thor
|
9
9
|
def initialize(*args, &proc)
|
10
10
|
super(*args)
|
11
|
-
@prompt = TTY::Prompt.new
|
12
|
-
@pastel = Pastel.new
|
13
|
-
@warning = @pastel.yellow.detach
|
14
|
-
@error = @pastel.red.bold.detach
|
15
11
|
@db_manager = Utils::DbManager
|
16
12
|
@api_manager = Utils::FlowApiManager.load_from_db(&proc)
|
13
|
+
@cmd_helper = Utils::CmdHelper.instance
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "help_ios_init", 'how to fetch provisions, p12 files'
|
17
|
+
def help_ios_init
|
18
|
+
@cmd_helper.echo_warning %(when you build ios project, you should upload p12 and provision to flow ci project
|
19
|
+
followed this website to build p12 and provision files
|
20
|
+
http://docs.flow.ci/en/upload_certificate_and_provisioning_profiles.html (EN)
|
21
|
+
http://docs.flow.ci/zh/upload_certificate_and_provisioning_profiles.html (中文)
|
22
|
+
|
23
|
+
finally,
|
24
|
+
run `flow-cli remote upload_p12 FILE` and `flow-cli remote upload_provision FILE` to upload the files.
|
25
|
+
)
|
17
26
|
end
|
18
27
|
|
19
28
|
desc "login", "bind flow ci account to flow cli."
|
20
29
|
def login
|
21
|
-
email = @
|
22
|
-
password = @
|
30
|
+
email = @cmd_helper.ask("email?")
|
31
|
+
password = @cmd_helper.mask("password?")
|
23
32
|
Utils::FlowApiManager.login(email, password)
|
24
|
-
|
33
|
+
@cmd_helper.echo_warning "you info saved to ~/.flow_cli_config.yml"
|
34
|
+
@cmd_helper.echo "login success..."
|
25
35
|
end
|
26
36
|
|
37
|
+
option :branch, default: "master"
|
38
|
+
desc "run_manual_job", 'run manual job(default branch master) using --branch to specify branch'
|
39
|
+
def run_manual_job
|
40
|
+
choosed_project_check
|
41
|
+
answer = @api_manager.run_manual_job(
|
42
|
+
current_flow_id,
|
43
|
+
current_project_id,
|
44
|
+
options[:branch]
|
45
|
+
)
|
46
|
+
@cmd_helper.echo("job started. click ( cmd + click ) url to visit on browser")
|
47
|
+
@cmd_helper.echo("https://dashboard.flow.ci/projects/#{current_project_id}/jobs/#{answer[:id]}")
|
48
|
+
end
|
27
49
|
desc "reset", "reset flow api info data"
|
28
50
|
def reset
|
29
|
-
@db_manager.
|
30
|
-
|
51
|
+
@db_manager.reset
|
52
|
+
@cmd_helper.echo_warning "reset ok"
|
31
53
|
end
|
32
54
|
|
33
55
|
desc "project_init", "set a project from flow ci to operation"
|
34
56
|
def project_init
|
35
57
|
projects = current_api_manager.fetch_projects
|
36
|
-
begin
|
37
|
-
|
38
|
-
rescue
|
39
|
-
|
40
|
-
end
|
58
|
+
# begin
|
59
|
+
# file_origin = `git remote -v`.to_s.match("git.*.git").first
|
60
|
+
# rescue
|
61
|
+
# cmd_helper.echo_warning "read git origin fail..."
|
62
|
+
# end
|
41
63
|
|
42
64
|
dict = {}
|
43
65
|
dict = Hash[projects.map { |p| [p[:name].to_s, p[:id]] }]
|
44
66
|
|
45
|
-
current_project_id = @
|
67
|
+
current_project_id = @cmd_helper.select("Choose your project?", dict)
|
46
68
|
|
47
69
|
@db_manager.save_attribute(:current_project_id, current_project_id)
|
48
70
|
|
@@ -53,7 +75,7 @@ module Flow::Cli
|
|
53
75
|
else
|
54
76
|
dict = {}
|
55
77
|
flows.each { |p| dict[(p[:name]).to_s] = p[:id] }
|
56
|
-
@
|
78
|
+
@cmd_helper.select("Choose your flow?", dict)
|
57
79
|
end
|
58
80
|
@db_manager.save_attribute(:current_flow_id, current_flow_id)
|
59
81
|
puts "project_id = #{current_project_id}, flow_id = #{current_flow_id}. saved this info..."
|
@@ -68,45 +90,67 @@ module Flow::Cli
|
|
68
90
|
api_p12s = current_api_manager.load_p12s(@db_manager.read_attribute(:current_flow_id))
|
69
91
|
old_p12 = api_p12s.find { |p12| p12[:filename] == basename }
|
70
92
|
unless old_p12.nil?
|
71
|
-
if @
|
93
|
+
if @cmd_helper.yes? "found a same name file, override?"
|
72
94
|
current_api_manager.delete_p12(old_p12[:id], @db_manager.read_attribute(:current_flow_id))
|
73
95
|
else
|
74
|
-
return
|
96
|
+
return @cmd_helper.echo_warning "canceled..."
|
75
97
|
end
|
76
98
|
end
|
77
99
|
current_api_manager.upload_p12(@db_manager.read_attribute(:current_flow_id), file_path, password)
|
78
|
-
puts "uploaded."
|
100
|
+
puts "uploaded. you can run `flow-cli remote list_p12s` to check the operation."
|
79
101
|
end
|
80
102
|
|
81
103
|
desc "list_p12s", "list_p12s"
|
82
104
|
def list_p12s
|
83
105
|
choosed_project_check
|
84
|
-
|
106
|
+
dict = current_api_manager.load_p12s(current_flow_id)
|
107
|
+
if dict.count.zero?
|
108
|
+
@cmd_helper.echo_warning("no p12 found in project #{current_project_id}")
|
109
|
+
else
|
110
|
+
@cmd_helper.puts_table(dict)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
desc "fetch_latest_jobs", "fetch_latest_jobs"
|
115
|
+
def fetch_latest_jobs
|
116
|
+
choosed_project_check
|
117
|
+
list = @api_manager.fetch_latest_jobs(current_flow_id, current_project_id)
|
118
|
+
show_data = list.map do |item|
|
119
|
+
tmp = item.slice(:id, :status, :event_type, :number, :branch, :commit_log)
|
120
|
+
tmp[:created_at_str] = Time.at(item[:created_at]).to_s
|
121
|
+
tmp[:url] = "https://dashboard.flow.ci/projects/#{current_project_id}/jobs/#{tmp[:id]}"
|
122
|
+
tmp
|
123
|
+
end
|
124
|
+
@cmd_helper.puts_table(show_data, %i[number event_type branch status commit_log created_at_str url])
|
85
125
|
end
|
86
126
|
|
87
|
-
desc "upload_provision", "upload_provision"
|
127
|
+
desc "upload_provision FILE_PATH", "upload_provision"
|
88
128
|
def upload_provision(file_path)
|
89
129
|
choosed_project_check
|
90
130
|
basename = File.basename file_path
|
91
|
-
project_init unless @db_manager.read_attribute(:current_flow_id)
|
92
131
|
|
93
|
-
api_provisions = current_api_manager.load_provisions(
|
132
|
+
api_provisions = current_api_manager.load_provisions(current_flow_id)
|
94
133
|
old_provision = api_provisions.find { |provision| provision[:filename] == basename }
|
95
134
|
unless old_provision.nil?
|
96
|
-
if @
|
97
|
-
current_api_manager.delete_provision(old_provision[:id],
|
135
|
+
if @cmd_helper.yes? "found a same name file, override?"
|
136
|
+
current_api_manager.delete_provision(old_provision[:id], current_flow_id)
|
98
137
|
else
|
99
138
|
return puts "canceled.."
|
100
139
|
end
|
101
140
|
end
|
102
|
-
current_api_manager.upload_provision(
|
103
|
-
puts "uploaded."
|
141
|
+
current_api_manager.upload_provision(current_flow_id, file_path)
|
142
|
+
puts "uploaded. you can run `flow-cli remote list_provisions` to check the operation."
|
104
143
|
end
|
105
144
|
|
106
145
|
desc "list_provisions", "list provisions"
|
107
146
|
def list_provisions
|
108
147
|
choosed_project_check
|
109
|
-
|
148
|
+
dict = current_api_manager.load_provisions(current_flow_id)
|
149
|
+
if dict.count.zero?
|
150
|
+
@cmd_helper.echo_warning("no p12 found in project #{current_project_id}")
|
151
|
+
else
|
152
|
+
@cmd_helper.puts_table(dict)
|
153
|
+
end
|
110
154
|
end
|
111
155
|
|
112
156
|
no_commands do
|
@@ -115,12 +159,20 @@ module Flow::Cli
|
|
115
159
|
def current_api_manager
|
116
160
|
return @current_api_manager unless @current_api_manager.nil?
|
117
161
|
@api_manager.refresh_login do
|
118
|
-
[@
|
162
|
+
[@cmd_helper.ask("email?"), @cmd_helper.mask("password?")]
|
119
163
|
end
|
120
164
|
@current_api_manager = @api_manager
|
121
165
|
@current_api_manager
|
122
166
|
end
|
123
167
|
|
168
|
+
def current_project_id
|
169
|
+
@current_project_id ||= @db_manager.read_attribute(:current_project_id)
|
170
|
+
end
|
171
|
+
|
172
|
+
def current_flow_id
|
173
|
+
@current_flow_id ||= @db_manager.read_attribute(:current_flow_id)
|
174
|
+
end
|
175
|
+
|
124
176
|
def choosed_project_check
|
125
177
|
project_init if @db_manager.read_attribute(:current_project_id).nil?
|
126
178
|
end
|
data/lib/flow/cli/utils/all.rb
CHANGED
@@ -71,6 +71,16 @@ module Flow::Cli
|
|
71
71
|
send_to_api(:get, "/flows/#{flow_id}", project_id: project_id)
|
72
72
|
end
|
73
73
|
|
74
|
+
def fetch_latest_jobs(flow_id, project_id)
|
75
|
+
answer = send_to_api(:get, "/projects/#{project_id}/jobs", flow_id: flow_id)
|
76
|
+
answer[:list] || []
|
77
|
+
end
|
78
|
+
|
79
|
+
def run_manual_job(flow_id, project_id, branch)
|
80
|
+
send_to_api(:post, "/projects/#{project_id}/manual_hook", flow_id: flow_id, branch: branch)
|
81
|
+
end
|
82
|
+
|
83
|
+
|
74
84
|
def send_to_api(action, url, params = {}, slice_items = nil, need_access_token = true)
|
75
85
|
params[:access_token] = user_access_token if need_access_token
|
76
86
|
params.compact!
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'byebug'
|
3
|
+
|
4
|
+
module Flow::Cli
|
5
|
+
module Utils
|
6
|
+
class CmdHelper
|
7
|
+
extend Forwardable
|
8
|
+
attr_accessor :prompt
|
9
|
+
def initialize
|
10
|
+
@pastel = Pastel.new
|
11
|
+
self.prompt = TTY::Prompt.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def_delegators :prompt, :ask, :yes?, :mask, :select
|
15
|
+
|
16
|
+
def echo(log)
|
17
|
+
@green ||= @pastel.green.bold.detach
|
18
|
+
puts @green.call log
|
19
|
+
end
|
20
|
+
|
21
|
+
def puts_table(arr_dict, sorted_titles = nil)
|
22
|
+
sorted_titles = arr_dict.first.keys if sorted_titles.nil?
|
23
|
+
table = TTY::Table.new header: sorted_titles
|
24
|
+
arr_dict.each do |item|
|
25
|
+
show_item = []
|
26
|
+
sorted_titles.each do |key|
|
27
|
+
show_item << item[key]
|
28
|
+
end
|
29
|
+
table << show_item
|
30
|
+
end
|
31
|
+
puts table.render(:unicode)
|
32
|
+
end
|
33
|
+
|
34
|
+
def puts_error(log)
|
35
|
+
@error ||= @pastel.red.bold.detach
|
36
|
+
puts @error.call(log)
|
37
|
+
end
|
38
|
+
|
39
|
+
def puts_warning(log)
|
40
|
+
@warning ||= @pastel.yellow.detach
|
41
|
+
puts @warning.call(log)
|
42
|
+
end
|
43
|
+
|
44
|
+
alias error puts_error
|
45
|
+
alias echo_error puts_error
|
46
|
+
alias warning puts_warning
|
47
|
+
alias echo_warning puts_warning
|
48
|
+
alias warn puts_warning
|
49
|
+
|
50
|
+
class << self
|
51
|
+
def instance
|
52
|
+
new
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/flow/cli/version.rb
CHANGED
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
module Flow::Cli
|
3
|
+
module YamlBuilders
|
4
|
+
class FlowYamlBuilder
|
5
|
+
attr_accessor :flow_cli_config
|
6
|
+
def initialize(flow_cli_config = {})
|
7
|
+
self.flow_cli_config = flow_cli_config
|
8
|
+
end
|
9
|
+
|
10
|
+
def build_yaml
|
11
|
+
build_yaml_hash.deep_stringify_keys.to_yaml
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_yaml_hash
|
15
|
+
yaml_hash = {
|
16
|
+
env: ["FLOW_YAML_FROM=flow-cli"],
|
17
|
+
flows: [create_default_flow_dict]
|
18
|
+
}
|
19
|
+
yaml_hash
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_default_flow_dict
|
23
|
+
flow = {}
|
24
|
+
flow[:name] = flow_cli_config[:flow_name] || 'default_flow_by_cli'
|
25
|
+
flow[:language] = flow_cli_config[:flow_language]
|
26
|
+
flow[:version] = flow_cli_config[:flow_version]
|
27
|
+
flow[:env] = flow_cli_config[:env]
|
28
|
+
flow[:trigger] = {
|
29
|
+
push: %w[develop master]
|
30
|
+
}
|
31
|
+
flow[:steps] = generate_steps
|
32
|
+
flow
|
33
|
+
end
|
34
|
+
|
35
|
+
def generate_steps
|
36
|
+
steps = []
|
37
|
+
generate_normal_steps.each { |step| steps << step }
|
38
|
+
steps << generate_custom_build_step
|
39
|
+
end
|
40
|
+
|
41
|
+
# 创建一些标准的steps
|
42
|
+
def generate_normal_steps
|
43
|
+
steps = []
|
44
|
+
steps << generate_step_dict("init", name: "#{flow_cli_config[:flow_language]}_init")
|
45
|
+
steps << generate_step_dict("git")
|
46
|
+
steps << generate_step_dict("install", name: "#{flow_cli_config[:flow_language]}_init")
|
47
|
+
steps
|
48
|
+
end
|
49
|
+
|
50
|
+
# 生成编译脚本
|
51
|
+
def generate_custom_build_step
|
52
|
+
# script = IosBuildStepGenerator.new(flow_cli_config).generate_gym_script
|
53
|
+
# {
|
54
|
+
# name: "build",
|
55
|
+
# scripts: [script]
|
56
|
+
# }
|
57
|
+
end
|
58
|
+
|
59
|
+
def generate_step_dict(name, plugin_config = nil)
|
60
|
+
step_dict = {
|
61
|
+
name: name,
|
62
|
+
plugin: {
|
63
|
+
name: name
|
64
|
+
}
|
65
|
+
}
|
66
|
+
step_dict[:plugin].merge!(plugin_config) if plugin_config
|
67
|
+
step_dict
|
68
|
+
end
|
69
|
+
|
70
|
+
class << self
|
71
|
+
def init_yaml_builder(flow_cli_config)
|
72
|
+
if flow_cli_config[:flow_language] == "objc"
|
73
|
+
IosYamlBuilder.new(flow_cli_config)
|
74
|
+
else
|
75
|
+
new(flow_cli_config)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'fastlane'
|
2
|
+
require 'gym'
|
3
|
+
|
4
|
+
module Flow::Cli
|
5
|
+
module YamlBuilders
|
6
|
+
class IosBuildStepGenerator
|
7
|
+
attr_accessor :cli_config
|
8
|
+
def initialize(cli_config = {})
|
9
|
+
self.cli_config = cli_config
|
10
|
+
if ENV["FLOW_CLI_TEST"] != "TRUE"
|
11
|
+
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, {})
|
12
|
+
config = Gym.config.values(ask: false).reject { |_k, v| v.nil? }
|
13
|
+
allowed_params = %i[workspace project scheme clean output_name configuration
|
14
|
+
codesigning_identity include_symbols include_bitcode
|
15
|
+
export_method export_options export_xcargs]
|
16
|
+
@gym_config = config.select { |k, _v| allowed_params.include? k }
|
17
|
+
else
|
18
|
+
@gym_config = {}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def generate_gym_script
|
23
|
+
merge_user_cli_gym_config
|
24
|
+
"fastlane gym build #{build_gym_params}"
|
25
|
+
end
|
26
|
+
|
27
|
+
# 返回 由 gym 调用的 core 的生成的相关参数
|
28
|
+
def merge_user_cli_gym_config
|
29
|
+
user_gym_config = { export_method: 'ad-hoc' }.merge(cli_config[:gym_config] || {})
|
30
|
+
@gym_config.merge!(user_gym_config)
|
31
|
+
@gym_config
|
32
|
+
end
|
33
|
+
|
34
|
+
def build_gym_params
|
35
|
+
@gym_config.map { |k, v| "--#{k} #{v}".rstrip }.join(' ')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative './flow_yaml_builder'
|
2
|
+
require_relative './ios_build_step_generator'
|
3
|
+
require 'yaml'
|
4
|
+
module Flow::Cli
|
5
|
+
module YamlBuilders
|
6
|
+
class IosYamlBuilder < FlowYamlBuilder
|
7
|
+
def initialize(cli_config = {})
|
8
|
+
super
|
9
|
+
cli_config[:flow_version] = "Xcode8"
|
10
|
+
end
|
11
|
+
|
12
|
+
def generate_custom_build_step
|
13
|
+
script = IosBuildStepGenerator.new(flow_cli_config).generate_gym_script
|
14
|
+
{
|
15
|
+
name: "build",
|
16
|
+
scripts: [script]
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/flow/cli.rb
CHANGED
@@ -5,8 +5,7 @@ require_relative "./cli/utils/all"
|
|
5
5
|
require_relative "./cli/exception"
|
6
6
|
|
7
7
|
require_relative "./cli/project_analytics"
|
8
|
-
require_relative "./cli/
|
9
|
-
require_relative "./cli/ios_build_step_generator"
|
8
|
+
require_relative "./cli/yaml_builders/all"
|
10
9
|
require_relative './cli/cmd_manager'
|
11
10
|
|
12
11
|
module Flow
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flow-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- atpking
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -172,8 +172,8 @@ executables:
|
|
172
172
|
extensions: []
|
173
173
|
extra_rdoc_files: []
|
174
174
|
files:
|
175
|
-
- ".flow.yml"
|
176
175
|
- ".gitignore"
|
176
|
+
- ".reek"
|
177
177
|
- ".rspec"
|
178
178
|
- ".travis.yml"
|
179
179
|
- CODE_OF_CONDUCT.md
|
@@ -190,17 +190,20 @@ files:
|
|
190
190
|
- lib/flow/cli/commands/remote.rb
|
191
191
|
- lib/flow/cli/constant.rb
|
192
192
|
- lib/flow/cli/exception.rb
|
193
|
-
- lib/flow/cli/flow_yaml_builder.rb
|
194
|
-
- lib/flow/cli/ios_build_step_generator.rb
|
195
193
|
- lib/flow/cli/project_analytics.rb
|
196
194
|
- lib/flow/cli/utils/all.rb
|
197
195
|
- lib/flow/cli/utils/api/flow_api_manager.rb
|
196
|
+
- lib/flow/cli/utils/cmd_helper.rb
|
198
197
|
- lib/flow/cli/utils/db_manager.rb
|
199
198
|
- lib/flow/cli/utils/flow_api_rest.rb
|
200
199
|
- lib/flow/cli/utils/local_service_rest.rb
|
201
200
|
- lib/flow/cli/vendors/all.rb
|
202
201
|
- lib/flow/cli/vendors/hash.rb
|
203
202
|
- lib/flow/cli/version.rb
|
203
|
+
- lib/flow/cli/yaml_builders/all.rb
|
204
|
+
- lib/flow/cli/yaml_builders/flow_yaml_builder.rb
|
205
|
+
- lib/flow/cli/yaml_builders/ios_build_step_generator.rb
|
206
|
+
- lib/flow/cli/yaml_builders/ios_yaml_builder.rb
|
204
207
|
homepage: https://flow.ci
|
205
208
|
licenses:
|
206
209
|
- MIT
|
data/.flow.yml
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
---
|
2
|
-
env:
|
3
|
-
- FLOW_YAML_FROM=flow-cli
|
4
|
-
flows:
|
5
|
-
- name: default_flow_by_cli
|
6
|
-
language:
|
7
|
-
env:
|
8
|
-
trigger:
|
9
|
-
push:
|
10
|
-
- develop
|
11
|
-
- master
|
12
|
-
steps:
|
13
|
-
- name: init
|
14
|
-
plugin:
|
15
|
-
name: _init
|
16
|
-
- name: git
|
17
|
-
plugin:
|
18
|
-
name: git
|
19
|
-
- name: build
|
20
|
-
scripts:
|
21
|
-
- echo "hello world"
|
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
module Flow::Cli
|
3
|
-
class FlowYamlBuilder
|
4
|
-
attr_accessor :flow_cli_config
|
5
|
-
def initialize(flow_cli_config = {})
|
6
|
-
self.flow_cli_config = flow_cli_config
|
7
|
-
end
|
8
|
-
|
9
|
-
def build_yaml
|
10
|
-
build_yaml_hash.deep_stringify_keys.to_yaml
|
11
|
-
end
|
12
|
-
|
13
|
-
def build_yaml_hash
|
14
|
-
yaml_hash = {
|
15
|
-
env: ["FLOW_YAML_FROM=flow-cli"],
|
16
|
-
flows: [create_default_flow_dict]
|
17
|
-
}
|
18
|
-
yaml_hash
|
19
|
-
end
|
20
|
-
|
21
|
-
def create_default_flow_dict
|
22
|
-
flow = {}
|
23
|
-
|
24
|
-
flow[:name] = flow_cli_config[:flow_name] || 'default_flow_by_cli'
|
25
|
-
flow[:language] = flow_cli_config[:language]
|
26
|
-
|
27
|
-
flow[:env] = flow_cli_config[:env]
|
28
|
-
flow[:trigger] = {
|
29
|
-
push: %w[develop master]
|
30
|
-
}
|
31
|
-
flow[:steps] = generate_steps
|
32
|
-
flow
|
33
|
-
end
|
34
|
-
|
35
|
-
def generate_steps
|
36
|
-
steps = []
|
37
|
-
generate_normal_steps.each { |step| steps << step }
|
38
|
-
steps << generate_custom_build_step
|
39
|
-
end
|
40
|
-
|
41
|
-
# 创建一些标准的steps
|
42
|
-
def generate_normal_steps
|
43
|
-
steps = []
|
44
|
-
steps << generate_step_dict("init", name: "#{flow_cli_config[:flow_language]}_init")
|
45
|
-
steps << generate_step_dict("git")
|
46
|
-
|
47
|
-
steps
|
48
|
-
end
|
49
|
-
|
50
|
-
# 生成编译脚本
|
51
|
-
def generate_custom_build_step
|
52
|
-
script = IosBuildStepGenerator.new(flow_cli_config).generate_gym_script
|
53
|
-
{
|
54
|
-
name: "build",
|
55
|
-
scripts: [script]
|
56
|
-
}
|
57
|
-
end
|
58
|
-
|
59
|
-
def generate_step_dict(name, plugin_config = nil)
|
60
|
-
step_dict = {
|
61
|
-
name: name,
|
62
|
-
plugin: {
|
63
|
-
name: name
|
64
|
-
}
|
65
|
-
}
|
66
|
-
step_dict[:plugin].merge!(plugin_config) if plugin_config
|
67
|
-
step_dict
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
require 'fastlane'
|
2
|
-
require 'gym'
|
3
|
-
|
4
|
-
module Flow::Cli
|
5
|
-
class IosBuildStepGenerator
|
6
|
-
attr_accessor :cli_config
|
7
|
-
def initialize(cli_config = {})
|
8
|
-
self.cli_config = cli_config
|
9
|
-
if ENV["FLOW_CLI_TEST"] != "TRUE"
|
10
|
-
Gym.config = FastlaneCore::Configuration.create(Gym::Options.available_options, {})
|
11
|
-
config = Gym.config.values(ask: false).reject { |_k, v| v.nil? }
|
12
|
-
allowed_params = %i[workspace project scheme clean output_name configuration
|
13
|
-
codesigning_identity include_symbols include_bitcode
|
14
|
-
export_method export_options export_xcargs]
|
15
|
-
@gym_config = config.select { |k, _v| allowed_params.include? k }
|
16
|
-
else
|
17
|
-
@gym_config = {}
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def generate_gym_script
|
22
|
-
merge_user_cli_gym_config
|
23
|
-
"fastlane gym build #{build_gym_params}"
|
24
|
-
end
|
25
|
-
|
26
|
-
# 返回 由 gym 调用的 core 的生成的相关参数
|
27
|
-
def merge_user_cli_gym_config
|
28
|
-
user_gym_config = { export_method: 'ad-hoc' }.merge(cli_config[:gym_config] || {} )
|
29
|
-
@gym_config.merge!(user_gym_config)
|
30
|
-
@gym_config
|
31
|
-
end
|
32
|
-
|
33
|
-
def build_gym_params
|
34
|
-
@gym_config.map { |k, v| "--#{k} #{v}".rstrip }.join(' ')
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|