thrust 0.3.1 → 0.4.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/config/android_example.yml +1 -1
- data/lib/config/ios_example.yml +6 -2
- data/lib/tasks/autotag.rake +14 -0
- data/lib/tasks/cedar.rake +9 -50
- data/lib/tasks/testflight.rake +2 -17
- data/lib/tasks/version.rake +6 -5
- data/lib/thrust/android/deploy.rb +21 -17
- data/lib/thrust/android/deploy_provider.rb +13 -9
- data/lib/thrust/android/tools.rb +28 -24
- data/lib/thrust/app_config.rb +57 -0
- data/lib/thrust/config.rb +33 -29
- data/lib/thrust/deployment_target.rb +21 -0
- data/lib/thrust/execution_helper.rb +17 -0
- data/lib/thrust/executor.rb +36 -21
- data/lib/thrust/git.rb +54 -47
- data/lib/thrust/ios/agv_tool.rb +13 -10
- data/lib/thrust/ios/cedar.rb +33 -18
- data/lib/thrust/ios/deploy.rb +34 -21
- data/lib/thrust/ios/deploy_provider.rb +16 -12
- data/lib/thrust/ios/x_code_tools.rb +131 -96
- data/lib/thrust/ios/x_code_tools_provider.rb +10 -7
- data/lib/thrust/ios_spec_target.rb +23 -0
- data/lib/thrust/tasks/autotag/create.rb +15 -0
- data/lib/thrust/tasks/autotag/list.rb +17 -0
- data/lib/thrust/tasks/clean.rb +20 -0
- data/lib/thrust/tasks/focused_specs.rb +17 -0
- data/lib/thrust/tasks/ios_specs.rb +37 -0
- data/lib/thrust/tasks/nof.rb +20 -0
- data/lib/thrust/tasks/trim.rb +24 -0
- data/lib/thrust/tasks.rb +4 -3
- data/lib/thrust/testflight.rb +32 -31
- data/lib/thrust/testflight_credentials.rb +11 -0
- data/lib/thrust/user_prompt.rb +11 -9
- data/lib/thrust.rb +9 -4
- metadata +35 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb3c733a86a1d3a7d7aec4521cc0c746713b8225
|
4
|
+
data.tar.gz: e9b1773c0d258a7aa9409b6cb0e07fd72eda7157
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b498bcb659a91cbfd17fabef26e3a7b26e109a034e86475526d5255321ff049395e75675dc76212c43afbb1a9092ea33c5b6ef42445eb3476c14e863ef96d486
|
7
|
+
data.tar.gz: 6579b916c3db7a727960a744147773d10e438ff97f20ec940837f33e24db7868f9529b515166379e1a2efda12ba92feec5a6dc6a2404bb66b171cf80f7571de0
|
data/lib/config/ios_example.yml
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
thrust_version: 0.
|
1
|
+
thrust_version: 0.4
|
2
2
|
project_name: My Great Project # do not use if building with an xcode workspace
|
3
3
|
# workspace_name: My Workspace # use if building with an xcode workspace
|
4
|
+
# path_to_xcodeproj: 'App/MyApp.xcodeproj' # use if xcodeproj is not in the same directory as this yaml file. Optional.
|
4
5
|
app_name: My Great App
|
5
6
|
ios_distribution_certificate: 'Name of Distribution Signing Certificate'
|
6
7
|
ios_sim_binary: 'ios-sim' # or wax-sim. iOS only.
|
@@ -17,6 +18,7 @@ deployment_targets:
|
|
17
18
|
ios_target: MyGreatAppTarget # Name of the build target. Optional, defaults to app name. iOS only.
|
18
19
|
ios_build_configuration: Release # iOS only
|
19
20
|
ios_provisioning_search_query: 'query to find Provisioning Profile' # iOS only. Optional.
|
21
|
+
versioning_method: 'none' # Optional. Leave blank to use Git commit sha's for build numbers.
|
20
22
|
|
21
23
|
demo:
|
22
24
|
distribution_list: Beta Testers
|
@@ -26,10 +28,12 @@ ios_spec_targets:
|
|
26
28
|
specs: # This is the name of the rake task: `rake specs`
|
27
29
|
target: UISpecs # name of the build target
|
28
30
|
# scheme: Specs (My Great App) # use in addition to target when you want to use a scheme (necessary if you are building with an xcode workspace)
|
31
|
+
type: app # Spec target type: app or bundle. Optional, defaults to app.
|
29
32
|
build_configuration: Debug # name of the build configuration
|
30
33
|
build_sdk: iphonesimulator7.0 # SDK used to build the target. Optional, defaults to latest iphonesimulator.
|
31
34
|
runtime_sdk: 7.0 # SDK used to run the target. Not optional.
|
32
|
-
device: ipad # Device to run the specs on.
|
35
|
+
# device: ipad # Device to run the specs on. Deprecated in ios-sim 3.0+, use device_type_id instead.
|
36
|
+
device_type_id: com.apple.CoreSimulator.SimDeviceType.iPad-Retina, 7.0 # required if using ios-sim 3.0
|
33
37
|
|
34
38
|
integration:
|
35
39
|
target: IntegrationSpecs
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative '../thrust'
|
2
|
+
|
3
|
+
@thrust = Thrust::Config.make(Dir.getwd, File.join(Dir.getwd, 'thrust.yml'))
|
4
|
+
|
5
|
+
namespace :autotag do
|
6
|
+
task :create, :stage do |_, args|
|
7
|
+
Thrust::Tasks::Autotag::Create.new.run(args[:stage])
|
8
|
+
end
|
9
|
+
|
10
|
+
desc 'Show the commit that is currently deployed to each environment'
|
11
|
+
task :list do
|
12
|
+
Thrust::Tasks::Autotag::List.new.run(@thrust)
|
13
|
+
end
|
14
|
+
end
|
data/lib/tasks/cedar.rake
CHANGED
@@ -1,74 +1,33 @@
|
|
1
|
-
|
2
|
-
require 'tmpdir'
|
3
|
-
require File.expand_path('../../thrust', __FILE__)
|
1
|
+
require_relative '../thrust'
|
4
2
|
|
5
3
|
@thrust = Thrust::Config.make(Dir.getwd, File.join(Dir.getwd, 'thrust.yml'))
|
6
|
-
@xcode_tools_provider = Thrust::IOS::XCodeToolsProvider.new
|
7
|
-
@executor = Thrust::Executor.new
|
8
4
|
|
9
5
|
desc 'Trim whitespace'
|
10
6
|
task :trim do
|
11
|
-
|
12
|
-
{
|
13
|
-
if ($1 == "RM" || $1 == "R")
|
14
|
-
print $4;
|
15
|
-
else if ($1 != "D")
|
16
|
-
print $2;
|
17
|
-
}
|
18
|
-
AWK
|
19
|
-
awk_statement.gsub!(%r{\s+}, " ")
|
20
|
-
|
21
|
-
@executor.system_or_exit %Q[git status --porcelain | awk '#{awk_statement}' | grep -e '.*\.[cmh]$' | xargs sed -i '' -e 's/ / /g;s/ *$//g;']
|
7
|
+
Thrust::Tasks::Trim.new.run
|
22
8
|
end
|
23
9
|
|
24
10
|
desc 'Remove any focus from specs'
|
25
11
|
task :nof do
|
26
|
-
|
27
|
-
unfocused_method = method.sub(/^f/, '')
|
28
|
-
"-e 's/#{method}/#{unfocused_method}/g;'"
|
29
|
-
end
|
30
|
-
|
31
|
-
@executor.system_or_exit %Q[ rake focused_specs | xargs -I filename sed -i '' #{substitutions.join(' ')} "filename" ]
|
12
|
+
Thrust::Tasks::Nof.new.run
|
32
13
|
end
|
33
14
|
|
34
15
|
desc 'Print out names of files containing focused specs'
|
35
16
|
task :focused_specs do
|
36
|
-
|
37
|
-
directories = @thrust.app_config['ios_spec_targets'].values.map {|h| h['target']}.join(' ')
|
38
|
-
@executor.system_or_exit %Q[ grep -l -r -e "\\(#{pattern}\\)" #{directories} | grep -v 'Frameworks' ; exit 0 ]
|
17
|
+
Thrust::Tasks::FocusedSpecs.new.run(@thrust)
|
39
18
|
end
|
40
19
|
|
41
20
|
desc 'Clean all targets'
|
42
21
|
task :clean do
|
43
|
-
|
22
|
+
Thrust::Tasks::Clean.new.run(@thrust)
|
44
23
|
end
|
45
24
|
|
46
25
|
desc 'Clean all targets (deprecated, use "clean")'
|
47
26
|
task :clean_build => :clean
|
48
27
|
|
49
|
-
|
50
|
-
desc target_info
|
51
|
-
task
|
52
|
-
|
53
|
-
target = target_info['target']
|
54
|
-
scheme = target_info['scheme']
|
55
|
-
build_sdk = target_info['build_sdk'] || 'iphonesimulator' #build sdk - version you compile the code with
|
56
|
-
runtime_sdk = args[:runtime_sdk] || target_info['runtime_sdk'] #runtime sdk
|
57
|
-
|
58
|
-
xcode_tools = xcode_tools_instance(build_configuration)
|
59
|
-
xcode_tools.build_scheme_or_target(scheme || target, build_sdk, 'i386')
|
60
|
-
|
61
|
-
cedar_success = Thrust::IOS::Cedar.new.run($stdout, build_configuration, target, runtime_sdk, build_sdk, target_info['device'], @thrust.build_dir, @thrust.app_config['ios_sim_binary'])
|
62
|
-
|
63
|
-
exit(1) unless cedar_success
|
28
|
+
@thrust.app_config.ios_spec_targets.each do |target_name, target_info|
|
29
|
+
desc target_info.scheme ? "Run the #{target_info.scheme} scheme" : "Run the #{target_info.target} target"
|
30
|
+
task target_name, :runtime_sdk do |_, args|
|
31
|
+
exit(1) unless Thrust::Tasks::IOSSpecs.new.run(@thrust, target_info, args)
|
64
32
|
end
|
65
33
|
end
|
66
|
-
|
67
|
-
def focused_methods
|
68
|
-
%w(fit fcontext fdescribe).map { |method| "#{method}(@" }
|
69
|
-
end
|
70
|
-
|
71
|
-
def xcode_tools_instance(build_configuration)
|
72
|
-
tools_options = { project_name: @thrust.app_config['project_name'], workspace_name: @thrust.app_config['workspace_name'] }
|
73
|
-
@xcode_tools_provider.instance($stdout, build_configuration, @thrust.build_dir, tools_options)
|
74
|
-
end
|
data/lib/tasks/testflight.rake
CHANGED
@@ -1,13 +1,11 @@
|
|
1
|
-
|
2
|
-
require 'tempfile'
|
3
|
-
require File.expand_path('../../thrust', __FILE__)
|
1
|
+
require_relative '../thrust'
|
4
2
|
|
5
3
|
@thrust = Thrust::Config.make(Dir.getwd, File.join(Dir.getwd, 'thrust.yml'))
|
6
4
|
|
7
5
|
namespace :testflight do
|
8
6
|
android_project = File.exists?('AndroidManifest.xml')
|
9
7
|
|
10
|
-
@thrust.app_config
|
8
|
+
@thrust.app_config.deployment_targets.each do |task_name, deployment_config|
|
11
9
|
if android_project
|
12
10
|
desc "Deploy Android build to #{task_name} (use NOTIFY=false to prevent team notification)"
|
13
11
|
task task_name do |_, _|
|
@@ -25,16 +23,3 @@ namespace :testflight do
|
|
25
23
|
end
|
26
24
|
end
|
27
25
|
end
|
28
|
-
|
29
|
-
namespace :autotag do
|
30
|
-
task :create, :stage do |_, args|
|
31
|
-
`autotag create #{args[:stage]}`
|
32
|
-
end
|
33
|
-
|
34
|
-
desc 'Show the commit that is currently deployed to each environment'
|
35
|
-
task :list do
|
36
|
-
@thrust.app_config['deployment_targets'].each do |deployment_target, _|
|
37
|
-
puts Thrust::Git.new(Thrust::Executor.new, $stdout).commit_summary_for_last_deploy(deployment_target)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
data/lib/tasks/version.rake
CHANGED
@@ -1,12 +1,13 @@
|
|
1
|
-
|
1
|
+
require_relative '../thrust'
|
2
|
+
|
3
|
+
@thrust = Thrust::Config.make(Dir.getwd, File.join(Dir.getwd, 'thrust.yml'))
|
2
4
|
|
3
5
|
desc 'Set build number'
|
4
6
|
task :set_build_number, :build_number do |_, args|
|
5
|
-
executor = Thrust::Executor.new
|
6
|
-
|
7
7
|
if File.exists?('AndroidManifest.xml')
|
8
|
-
Thrust::Android::Tools.new
|
8
|
+
Thrust::Android::Tools.new.change_build_number(Time.now.utc.strftime('%y%m%d%H%M'), args[:build_number])
|
9
9
|
else
|
10
|
-
|
10
|
+
path_to_xcodeproj = @thrust.app_config.path_to_xcodeproj
|
11
|
+
Thrust::IOS::AgvTool.new.change_build_number(args[:build_number], path_to_xcodeproj)
|
11
12
|
end
|
12
13
|
end
|
@@ -1,22 +1,26 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
module Thrust
|
2
|
+
module Android
|
3
|
+
class Deploy
|
4
|
+
def initialize(out, tools, git, testflight, notify, distribution_list, autogenerate_notes, deployment_target)
|
5
|
+
@out = out
|
6
|
+
@tools = tools
|
7
|
+
@git = git
|
8
|
+
@testflight = testflight
|
9
|
+
@notify = notify
|
10
|
+
@distribution_list = distribution_list
|
11
|
+
@deployment_target = deployment_target
|
12
|
+
@autogenerate_notes = autogenerate_notes
|
13
|
+
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
def run
|
16
|
+
@git.ensure_clean
|
17
|
+
@tools.change_build_number(Time.now.utc.strftime('%y%m%d%H%M'), @git.current_commit)
|
18
|
+
apk_path = @tools.build_signed_release
|
17
19
|
|
18
|
-
|
20
|
+
@testflight.upload(apk_path, @notify, @distribution_list, @autogenerate_notes, @deployment_target)
|
19
21
|
|
20
|
-
|
22
|
+
@git.reset
|
23
|
+
end
|
24
|
+
end
|
21
25
|
end
|
22
26
|
end
|
@@ -1,13 +1,17 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module Thrust
|
2
|
+
module Android
|
3
|
+
class DeployProvider
|
4
|
+
def instance(thrust_config, deployment_config, deployment_target)
|
5
|
+
thrust_executor = Thrust::Executor.new
|
6
|
+
tools = Thrust::Android::Tools.new($stdout, thrust_executor)
|
7
|
+
git = Thrust::Git.new($stdout, thrust_executor)
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
+
testflight_config = thrust_config.app_config.testflight
|
10
|
+
testflight = Thrust::Testflight.new(thrust_executor, $stdout, $stdin, testflight_config.api_token, testflight_config.team_token)
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
+
autogenerate_notes = deployment_config.note_generation_method == 'autotag'
|
13
|
+
Thrust::Android::Deploy.new($stdout, tools, git, testflight, deployment_config.notify, deployment_config.distribution_list, autogenerate_notes, deployment_target)
|
14
|
+
end
|
15
|
+
end
|
12
16
|
end
|
13
17
|
end
|
data/lib/thrust/android/tools.rb
CHANGED
@@ -1,38 +1,42 @@
|
|
1
1
|
require 'colorize'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module Thrust
|
4
|
+
module Android
|
5
|
+
class Tools
|
6
|
+
def initialize(out = $stdout, thrust_executor = Thrust::Executor.new)
|
7
|
+
@thrust_executor = thrust_executor
|
8
|
+
@out = out
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
def change_build_number(version_code, version_name)
|
12
|
+
@thrust_executor.system_or_exit(
|
13
|
+
"sed -i ''" +
|
12
14
|
" -e 's/android:versionCode=\"[0-9]*\"/android:versionCode=\"#{version_code}\"/'" +
|
13
15
|
" -e 's/android:versionName=\"\\([^ \"]*\\)[^\"]*\"/android:versionName=\"\\1 (#{version_name})\"/'" +
|
14
16
|
" AndroidManifest.xml")
|
15
|
-
|
16
|
-
|
17
|
+
@thrust_executor.system_or_exit(
|
18
|
+
"sed -i ''" +
|
17
19
|
" '1,/<version>/s/<version>\\([^- <]*\\)[^<]*<\\/version>/<version>\\1 (#{version_name})<\\/version>/'" +
|
18
20
|
" pom.xml")
|
19
|
-
|
21
|
+
end
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
23
|
+
def build_signed_release
|
24
|
+
verify_android_installed!
|
25
|
+
@thrust_executor.system_or_exit('mvn clean package -Prelease')
|
26
|
+
Dir.glob('target/*-signed-aligned.apk').first or raise 'Signed APK was not generated'
|
27
|
+
end
|
26
28
|
|
27
|
-
|
29
|
+
private
|
28
30
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
def verify_android_installed!
|
32
|
+
if ENV['ANDROID_HOME'].nil?
|
33
|
+
if File.directory?('/usr/local/opt/android-sdk')
|
34
|
+
@out.puts 'Setting /usr/local/opt/android-sdk as ANDROID_HOME...'.magenta
|
35
|
+
ENV['ANDROID_HOME'] = '/usr/local/opt/android-sdk'
|
36
|
+
else
|
37
|
+
raise('**********Android is not installed. Run `brew install android`.**********')
|
38
|
+
end
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end
|
38
42
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative 'deployment_target'
|
2
|
+
require_relative 'ios_spec_target'
|
3
|
+
require_relative 'testflight_credentials'
|
4
|
+
|
5
|
+
module Thrust
|
6
|
+
class AppConfig
|
7
|
+
attr_reader :app_name,
|
8
|
+
:deployment_targets,
|
9
|
+
:ios_distribution_certificate,
|
10
|
+
:ios_sim_binary,
|
11
|
+
:ios_spec_targets,
|
12
|
+
:project_name,
|
13
|
+
:testflight,
|
14
|
+
:thrust_version,
|
15
|
+
:workspace_name,
|
16
|
+
:path_to_xcodeproj
|
17
|
+
|
18
|
+
def initialize(attributes)
|
19
|
+
@app_name = attributes['app_name']
|
20
|
+
@deployment_targets = generate_deployment_targets(attributes['deployment_targets'])
|
21
|
+
@ios_distribution_certificate = attributes['ios_distribution_certificate']
|
22
|
+
@ios_sim_binary = attributes['ios_sim_binary']
|
23
|
+
@ios_spec_targets = generate_ios_spec_targets(attributes['ios_spec_targets'])
|
24
|
+
@project_name = attributes['project_name']
|
25
|
+
@testflight = generate_testflight_credentials(attributes['testflight'])
|
26
|
+
@thrust_version = attributes['thrust_version'].to_s
|
27
|
+
@workspace_name = attributes['workspace_name']
|
28
|
+
@path_to_xcodeproj = attributes['path_to_xcodeproj']
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def generate_ios_spec_targets(ios_spec_targets_hash)
|
34
|
+
return {} if ios_spec_targets_hash.nil?
|
35
|
+
|
36
|
+
ios_spec_targets_hash.inject({}) do |existing, (key, value)|
|
37
|
+
existing[key] = IOSSpecTarget.new(value)
|
38
|
+
existing
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def generate_deployment_targets(deployment_targets_hash)
|
43
|
+
return {} if deployment_targets_hash.nil?
|
44
|
+
|
45
|
+
deployment_targets_hash.inject({}) do |existing, (key, value)|
|
46
|
+
existing[key] = DeploymentTarget.new(value)
|
47
|
+
existing
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def generate_testflight_credentials(testflight_credentials_hash)
|
52
|
+
return if testflight_credentials_hash.nil?
|
53
|
+
|
54
|
+
TestflightCredentials.new(testflight_credentials_hash)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/thrust/config.rb
CHANGED
@@ -1,39 +1,43 @@
|
|
1
1
|
require 'colorize'
|
2
|
+
require_relative 'app_config'
|
3
|
+
require 'yaml'
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
THRUST_ROOT = File.expand_path('../..', __FILE__)
|
5
|
+
module Thrust
|
6
|
+
class Config
|
7
|
+
attr_reader :project_root, :app_config, :build_dir
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
9
|
+
THRUST_VERSION = '0.4'
|
10
|
+
THRUST_ROOT = File.expand_path('../..', __FILE__)
|
11
|
+
|
12
|
+
def self.make(relative_project_root, config_file)
|
13
|
+
begin
|
14
|
+
config_file_contents = YAML.load_file(config_file)
|
15
|
+
rescue Errno::ENOENT
|
16
|
+
puts ""
|
17
|
+
puts " Missing thrust.yml. Create by running:\n".red
|
18
|
+
puts " cp thrust.example.yml thrust.yml".blue
|
19
|
+
exit 1
|
20
|
+
rescue Psych::SyntaxError
|
21
|
+
puts ""
|
22
|
+
puts " Malformed thrust.yml.".red
|
23
|
+
exit 1
|
24
|
+
end
|
25
|
+
new(relative_project_root, config_file_contents)
|
20
26
|
end
|
21
|
-
new(relative_project_root, config_file_contents)
|
22
|
-
end
|
23
27
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
28
|
+
def initialize(relative_project_root, config)
|
29
|
+
@project_root = File.expand_path(relative_project_root)
|
30
|
+
@build_dir = File.join(project_root, 'build')
|
31
|
+
@app_config = Thrust::AppConfig.new(config)
|
32
|
+
verify_configuration
|
33
|
+
end
|
30
34
|
|
31
|
-
|
35
|
+
private
|
32
36
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
+
def verify_configuration
|
38
|
+
if @app_config.thrust_version != THRUST_VERSION
|
39
|
+
fail "Invalid configuration. Have you updated thrust recently? Your thrust.yml specifies an out-of-date version, and thrust is at version: #{THRUST_VERSION}. See README for details.".red
|
40
|
+
end
|
37
41
|
end
|
38
42
|
end
|
39
43
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Thrust
|
2
|
+
class DeploymentTarget
|
3
|
+
attr_reader :distribution_list,
|
4
|
+
:ios_build_configuration,
|
5
|
+
:ios_provisioning_search_query,
|
6
|
+
:ios_target,
|
7
|
+
:note_generation_method,
|
8
|
+
:notify,
|
9
|
+
:versioning_method
|
10
|
+
|
11
|
+
def initialize(attributes)
|
12
|
+
@distribution_list = attributes['distribution_list']
|
13
|
+
@ios_build_configuration = attributes['ios_build_configuration']
|
14
|
+
@ios_provisioning_search_query = attributes['ios_provisioning_search_query']
|
15
|
+
@ios_target = attributes['ios_target']
|
16
|
+
@note_generation_method = attributes['note_generation_method']
|
17
|
+
@notify = attributes['notify']
|
18
|
+
@versioning_method = attributes['versioning_method']
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Thrust
|
2
|
+
class ExecutionHelper
|
3
|
+
def capture_status_from_command(command, env = {})
|
4
|
+
system(env, command)
|
5
|
+
end
|
6
|
+
|
7
|
+
def capture_status_and_output_from_command(command, env = {})
|
8
|
+
env_string = ''
|
9
|
+
for key in env.keys
|
10
|
+
env_string += "#{key}=#{env[key]} "
|
11
|
+
end
|
12
|
+
|
13
|
+
output = `#{env_string}#{command}`
|
14
|
+
{ success: $?.exitstatus == 0, output: output }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/thrust/executor.rb
CHANGED
@@ -1,29 +1,44 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Thrust
|
2
|
+
class Executor
|
3
|
+
CommandFailed = Class.new(StandardError)
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
def initialize(out = STDERR, execution_helper = Thrust::ExecutionHelper.new)
|
6
|
+
@execution_helper = execution_helper
|
7
|
+
@out = out
|
8
|
+
end
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
Kernel::system(cmd)
|
12
|
-
end
|
10
|
+
def system_or_exit(cmd, output_file = nil, env = {})
|
11
|
+
@out.puts "Executing #{cmd}"
|
12
|
+
cmd += " > #{output_file}" if output_file
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
unless @execution_helper.capture_status_from_command(cmd, env)
|
15
|
+
raise(CommandFailed, '******** Build failed ********')
|
16
|
+
end
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
19
|
+
def system(cmd, output_file = nil)
|
20
|
+
@out.puts "Executing #{cmd}"
|
21
|
+
cmd += " > #{output_file}" if output_file
|
22
|
+
|
23
|
+
@execution_helper.capture_status_from_command(cmd)
|
24
|
+
end
|
25
|
+
|
26
|
+
def capture_output_from_system(cmd, env = {})
|
27
|
+
execution = @execution_helper.capture_status_and_output_from_command(cmd, env)
|
28
|
+
|
29
|
+
raise(CommandFailed, '******** Build failed ********') unless execution[:success]
|
30
|
+
|
31
|
+
execution[:output]
|
32
|
+
end
|
20
33
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
34
|
+
def check_command_for_failure(cmd, env = {})
|
35
|
+
@out.puts "Executing #{cmd} and checking for FAILURE"
|
36
|
+
execution = @execution_helper.capture_status_and_output_from_command("#{cmd} 2>&1", env)
|
37
|
+
result = execution[:output]
|
38
|
+
@out.puts "Results:"
|
39
|
+
@out.puts result
|
26
40
|
|
27
|
-
|
41
|
+
result.include?("Finished") && !result.include?("FAILURE") && !result.include?("EXCEPTION")
|
42
|
+
end
|
28
43
|
end
|
29
44
|
end
|