satorix 1.5.4 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9323c661fa826fece9f1ec0ddb247104ecf58fa2f1e7a389481e34103ebda9c3
4
- data.tar.gz: b34487181bf020bdcae6be431dedd0dd90b96c72a1ad6665def23c6757421d0e
3
+ metadata.gz: 766df77d244fc6eb21ef8a65feafa0206206aa91eb35696f02b70c2d72010b15
4
+ data.tar.gz: 3a87bb7c2d01099c13b95cde9032345852c4e3b067de18e3dabb56b1ac710d8c
5
5
  SHA512:
6
- metadata.gz: ae724530b77d22b700016addd80efe560de1d51755633006ecddc49858896674fb59cae9293eb8d7a4c4f9401ee76457182c484324078c02fa76688802c05b6a
7
- data.tar.gz: bd9df6a8695acdd5bffed7bd916c9c5c9de54fc896fa4df4830499588ff9711cdb1c50ecc61ad6f1839d53118e85e34a5e77b3770195e40616c29284e99bfca9
6
+ metadata.gz: 4a5de76581e290dc459c1e22fc7f8935c22cf4dcabaa8c47eeb8a110e1f1673125c3bbdf846d6872caa40081b8b6077cff1e0c8447f7fe9747d96cd4e5a2a4d1
7
+ data.tar.gz: 6aed96f512a225529885a976a6ba27fc5ed1436d68632c57405b49e5162305ddd3cdee8a4970fb723ed028ee985d071c6813e4eb1c54a6ee9ddc5f8b5aa7f430
@@ -39,7 +39,7 @@ rubocop:
39
39
  deploy_to_rubygems:
40
40
  stage: deploy
41
41
  only:
42
- - master
42
+ - tags
43
43
  except:
44
44
  - schedules
45
45
  <<: *satorix
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- satorix (1.5.4)
4
+ satorix (1.6.2)
5
5
  airbrake-ruby
6
6
  bundler (~> 1.13)
7
7
  rake
data/README.md CHANGED
@@ -44,6 +44,8 @@ Satorix is used to provide continuous integration and continuous deployment for
44
44
  CI is run against every push.
45
45
 
46
46
  CD is used to automatically build and deploy the gem for the master branch.
47
+ To initiate the deploy, first ensure you have advanced the version number appropriately. Then, create a new version tag
48
+ on the master branch. The tag should follow the format of v# (If we were releasing version 1.0.3, the tag should be v1.0.3).
47
49
 
48
50
  ## Environment Variables
49
51
 
@@ -5,12 +5,10 @@ require 'etc'
5
5
 
6
6
  module Satorix
7
7
 
8
-
9
8
  module Shared
10
9
  autoload :Console, 'satorix/shared/console'
11
10
  end
12
11
 
13
-
14
12
  module CI
15
13
 
16
14
  module Deploy
@@ -51,10 +49,8 @@ module Satorix
51
49
 
52
50
  end
53
51
 
54
-
55
52
  include Satorix::Shared::Console
56
53
 
57
-
58
54
  extend self
59
55
 
60
56
 
@@ -89,7 +85,7 @@ module Satorix
89
85
 
90
86
  def add_user(username)
91
87
  unless user_exists?(username)
92
- run_command ['useradd', '--user-group', '--comment', "'#{ username } user'", '--shell', '/bin/bash', '--home', app_dir, username], quiet: true
88
+ run_command(['useradd', '--user-group', '--comment', "'#{ username } user'", '--shell', '/bin/bash', '--home', app_dir, username], quiet: true)
93
89
  end
94
90
  end
95
91
 
@@ -342,5 +338,4 @@ module Satorix
342
338
  Dir[File.join(build_dir, '*.gemspec')].any?
343
339
  end
344
340
 
345
-
346
341
  end
@@ -3,7 +3,6 @@ module Satorix
3
3
  module Deploy
4
4
  module Flynn
5
5
 
6
-
7
6
  include Satorix
8
7
  include Satorix::Shared::Console
9
8
 
@@ -19,7 +18,6 @@ module Satorix
19
18
  require_relative 'flynn/scale'
20
19
  include Scale
21
20
 
22
-
23
21
  extend self
24
22
 
25
23
 
@@ -43,12 +41,12 @@ module Satorix
43
41
 
44
42
 
45
43
  def add_cluster
46
- run_command "flynn cluster add --force --default --tls-pin=#{ tls_pin } #{ cluster_name } #{ domain_for_cluster } #{ key }", filtered_text: [tls_pin, key]
44
+ run_command(['flynn', 'cluster', 'add', '--force', '--default', "--tls-pin=#{ tls_pin }", cluster_name, domain_for_cluster, key], filtered_text: [tls_pin, key])
47
45
  end
48
46
 
49
47
 
50
48
  def add_remote
51
- run_command "flynn -a #{ project_name } remote add #{ cluster_name } -y"
49
+ run_command(['flynn', '-a', project_name, 'remote', 'add', cluster_name, '-y'])
52
50
  end
53
51
 
54
52
 
@@ -58,21 +56,21 @@ module Satorix
58
56
 
59
57
 
60
58
  def configure_inactive_slug_releases
61
- run_command 'flynn meta set gc.max_inactive_slug_releases=2'
59
+ run_command(%w[flynn meta set gc.max_inactive_slug_releases=2])
62
60
  end
63
61
 
64
62
 
65
63
  def create_project
66
64
  if project_exists?
67
- log "Skipping - Flynn project '#{ project_name }' already exists."
65
+ log("Skipping - Flynn project '#{ project_name }' already exists.")
68
66
  else
69
- run_command "flynn create --remote=#{ cluster_name } -y #{ project_name }"
67
+ run_command(['flynn', 'create', "--remote=#{ cluster_name }", '-y', project_name])
70
68
  end
71
69
  end
72
70
 
73
71
 
74
72
  def deploy
75
- run_command "git push #{ cluster_name } HEAD:refs/heads/master"
73
+ run_command(['git', 'push', cluster_name, 'HEAD:refs/heads/master'])
76
74
  end
77
75
 
78
76
 
@@ -102,7 +100,7 @@ module Satorix
102
100
 
103
101
 
104
102
  def project_exists?
105
- `flynn apps`.split(/\R/).map { |a| a.split.last }.include? project_name
103
+ run_command(%w[flynn apps], quiet: true).split(/\R/).map { |a| a.split.last }.include? project_name
106
104
  end
107
105
 
108
106
 
@@ -115,8 +113,8 @@ module Satorix
115
113
  if desired_resource_provider_names.nil? || desired_resource_provider_names.empty?
116
114
  log 'Skipping migrations, no database has been defined. Please see the resources section of this log for more information.'
117
115
  else
118
- run_command('flynn run --enable-log bundle exec rake db:migrate') if rails_app?
119
- run_command('flynn run --enable-log python public/manage.py migrate') if django_app?
116
+ run_command(%w[flynn run --enable-log bundle exec rake db:migrate]) if rails_app?
117
+ run_command(%w[flynn run --enable-log python public/manage.py migrate]) if django_app?
120
118
  end
121
119
  end
122
120
 
@@ -125,7 +123,6 @@ module Satorix
125
123
  ENV["FLYNN_#{ current_branch }_TLSPIN"]
126
124
  end
127
125
 
128
-
129
126
  end
130
127
  end
131
128
  end
@@ -6,7 +6,6 @@ module Satorix
6
6
  module Flynn
7
7
  module EnvironmentVariables
8
8
 
9
-
10
9
  def adjust_env_vars
11
10
  ensure_required_env_vars_are_defined unless ENV["SATORIX_#{ current_branch }_ENFORCE_ENV_VAR_DEFINITION"] == 'false'
12
11
  env_unset
@@ -15,7 +14,7 @@ module Satorix
15
14
 
16
15
 
17
16
  def aeev_key_exists?
18
- !(run_command('flynn env', quiet: true) =~ /#{ exported_aeevs_key }=/mi).nil?
17
+ !(run_command(%w[flynn env], quiet: true) =~ /#{ exported_aeevs_key }=/mi).nil?
19
18
  end
20
19
 
21
20
 
@@ -35,7 +34,7 @@ module Satorix
35
34
 
36
35
 
37
36
  def current_flynn_keys
38
- aeev_key_exists? ? run_command("flynn env get #{ exported_aeevs_key }", quiet: true).split : []
37
+ aeev_key_exists? ? run_command(['flynn', 'env', 'get', exported_aeevs_key], quiet: true).split : []
39
38
  end
40
39
 
41
40
 
@@ -87,17 +86,17 @@ module Satorix
87
86
  if env_vars_to_unset.empty?
88
87
  log 'No existing environment variables to unset.'
89
88
  else
90
- run_command "flynn env unset #{ env_vars_to_unset.join(' ') }"
89
+ run_command(['flynn', 'env', 'unset', env_vars_to_unset])
91
90
  end
92
91
  end
93
92
 
94
93
 
95
94
  def env_vars
96
95
  @_env_vars ||= begin
97
- {}.tap do |vars|
98
- current_flynn_keys.each { |key| vars[key] = run_command("flynn env get #{ key }", quiet: true).chomp }
99
- end
100
- end
96
+ {}.tap do |vars|
97
+ current_flynn_keys.each { |key| vars[key] = run_command(['flynn', 'env', 'get', key], quiet: true).chomp }
98
+ end
99
+ end
101
100
  end
102
101
 
103
102
 
@@ -115,7 +114,6 @@ module Satorix
115
114
  'AEEV_KEYS'
116
115
  end
117
116
 
118
-
119
117
  end
120
118
  end
121
119
  end
@@ -4,12 +4,11 @@ module Satorix
4
4
  module Flynn
5
5
  module Resources
6
6
 
7
-
8
7
  def add_resources
9
8
  if resources_to_add.empty?
10
9
  log 'No resources to add.'
11
10
  else
12
- resources_to_add.each { |resource| run_command "flynn resource add #{ resource }" }
11
+ resources_to_add.each { |resource| run_command(['flynn', 'resource', 'add', resource]) }
13
12
  end
14
13
  end
15
14
 
@@ -47,7 +46,7 @@ module Satorix
47
46
 
48
47
 
49
48
  def resource
50
- run_command('flynn resource', quiet: true).chomp
49
+ run_command(%w[flynn resource], quiet: true).chomp
51
50
  end
52
51
 
53
52
 
@@ -71,7 +70,6 @@ module Satorix
71
70
  remove_resources
72
71
  end
73
72
 
74
-
75
73
  end
76
74
  end
77
75
  end
@@ -4,7 +4,6 @@ module Satorix
4
4
  module Flynn
5
5
  module Routes
6
6
 
7
-
8
7
  def find_or_create_route(domain)
9
8
  route_ids = route_ids(domain)
10
9
  if route_ids.empty?
@@ -134,22 +133,22 @@ module Satorix
134
133
 
135
134
 
136
135
  def fc_route
137
- run_command("flynn -a #{ project_name } route", quiet: true).chomp
136
+ run_command(['flynn', '-a', project_name, 'route'], quiet: true).chomp
138
137
  end
139
138
 
140
139
 
141
140
  def fc_route_add(domain)
142
- run_command("flynn route add http #{ domain } --sticky").chomp
141
+ run_command(['flynn', 'route', 'add', 'http', domain, '--sticky']).chomp
143
142
  end
144
143
 
145
144
 
146
145
  def fc_route_remove(route_id)
147
- run_command "flynn route remove #{ route_id }"
146
+ run_command(['flynn', 'route', 'remove', route_id])
148
147
  end
149
148
 
150
149
 
151
150
  def fc_route_update(route_id)
152
- run_command "flynn route update #{ route_id } --tls-cert=crt --tls-key=key --sticky", quiet: true
151
+ run_command(['flynn', 'route', 'update', route_id, '--tls-cert=crt', '--tls-key=key', '--sticky'], quiet: true)
153
152
  end
154
153
 
155
154
 
@@ -4,7 +4,6 @@ module Satorix
4
4
  module Flynn
5
5
  module Scale
6
6
 
7
-
8
7
  def adjust_scale
9
8
  cached_scale_options_to_set = scale_options_to_set
10
9
  log "No scale specified in #{ defined_scale_key }. Displaying current scale:" if cached_scale_options_to_set.empty?
@@ -27,8 +26,10 @@ module Satorix
27
26
  end
28
27
 
29
28
 
30
- def fc_scale(scale_options_to_set = nil)
31
- run_command "flynn scale#{ " #{ scale_options_to_set }" unless scale_options_to_set.nil? || scale_options_to_set.empty? }".chomp
29
+ def fc_scale(scale_options_to_set = [])
30
+ command = %w[flynn scale].concat(scale_options_to_set)
31
+
32
+ run_command(command)
32
33
  end
33
34
 
34
35
 
@@ -36,7 +37,7 @@ module Satorix
36
37
  [].tap do |scale|
37
38
  defined_scale.each { |job, workers| scale << "#{ job }=#{ workers }" }
38
39
  (current_scale.keys - defined_scale.keys).each { |job| scale << "#{ job }=0" } unless defined_scale.empty?
39
- end.join(' ')
40
+ end
40
41
  end
41
42
 
42
43
 
@@ -44,7 +45,6 @@ module Satorix
44
45
  {}.tap { |jobs| scale_string.split.map { |x| x.partition('=') }.each { |x| jobs[x.first.to_sym] = x.last } }
45
46
  end
46
47
 
47
-
48
48
  end
49
49
  end
50
50
  end
@@ -2,19 +2,15 @@ module Satorix
2
2
  module CI
3
3
  module Shared
4
4
 
5
-
6
5
  # This code was inspired by:
7
6
  # herokuish - https://github.com/gliderlabs/herokuish
8
7
  # flynn - https://github.com/flynn/flynn/blob/master/slugbuilder/builder/build.sh
9
8
  module BuildpackManager
10
9
 
11
-
12
10
  require 'fileutils'
13
11
 
14
-
15
12
  include Satorix::Shared::Console
16
13
 
17
-
18
14
  extend self
19
15
 
20
16
 
@@ -110,6 +106,11 @@ module Satorix
110
106
  end
111
107
 
112
108
 
109
+ def lsb_release
110
+ run_command(%w[lsb_release --release --short], quiet: true).chomp
111
+ end
112
+
113
+
113
114
  def prepare_buildpack_environment
114
115
  log_bench 'Preparing buildpack environment...' do
115
116
  set_buildpack_expectations
@@ -134,7 +135,7 @@ module Satorix
134
135
  profile_locations.each do |profile_location|
135
136
  Dir.glob(profile_location) do |shell_file|
136
137
  # Uncomment below to debug profile loading
137
- # run_command "cat #{ shell_file }"
138
+ # run_command(['cat', shell_file])
138
139
  source_env_from shell_file
139
140
  end
140
141
  end
@@ -172,7 +173,6 @@ module Satorix
172
173
  ENV['REQUEST_ID'] = "commit-#{ Satorix.ci_commit_sha }"
173
174
  ENV['STACK'] = stack_version
174
175
  ENV['DATABASE_URL'] = Satorix::CI::Test::Shared::Database.url
175
-
176
176
  ENV['CURL_CONNECT_TIMEOUT'] = '30'
177
177
  ENV['CURL_TIMEOUT'] = '600'
178
178
  end
@@ -186,17 +186,11 @@ module Satorix
186
186
 
187
187
 
188
188
  def stack_version
189
- if File.exists?('/etc/lsb-release')
190
- File.open('/etc/lsb-release', 'r').read.each_line do |line|
191
- if line =~ /DISTRIB_RELEASE=14.04/
192
- return 'cedar-14'
193
- elsif line =~ /DISTRIB_RELEASE=18.04/
194
- return 'heroku-18'
195
- end
196
- end
189
+ if lsb_release == '14.04'
190
+ return 'cedar-14'
191
+ else
192
+ return 'heroku-18'
197
193
  end
198
- # Fallback to heroku-18 if we can't determine a stack
199
- return 'heroku-18'
200
194
  end
201
195
 
202
196
 
@@ -213,7 +207,6 @@ module Satorix
213
207
  end
214
208
  end
215
209
 
216
-
217
210
  end
218
211
  end
219
212
  end
@@ -3,17 +3,13 @@ module Satorix
3
3
  module Shared
4
4
  module BuildpackManager
5
5
 
6
-
7
6
  class Buildpack
8
7
 
9
-
10
8
  require 'fileutils'
11
9
  require 'uri'
12
10
 
13
-
14
11
  include Satorix::Shared::Console
15
12
 
16
-
17
13
  attr_accessor :commit_sha_short,
18
14
  :url
19
15
 
@@ -30,10 +26,10 @@ module Satorix
30
26
 
31
27
  def compile
32
28
  log_bench "Building application using the #{ name } buildpack..." do
33
- run_command [compile_binary_path,
29
+ run_command([compile_binary_path,
34
30
  Satorix.build_dir,
35
31
  Satorix.paths[:cache],
36
- Satorix.paths[:env]]
32
+ Satorix.paths[:env]])
37
33
  end
38
34
  end
39
35
 
@@ -98,14 +94,14 @@ module Satorix
98
94
 
99
95
 
100
96
  def checkout_specific_version
101
- run_command ['git', 'clone', '--quiet', '--no-checkout', url, path], quiet: true
102
- Dir.chdir(path) { run_command ['git', 'checkout', '--quiet', commit_sha_short], quiet: true }
103
- Dir.chdir(path) { run_command ['git', 'submodule', 'update', '--init', '--recursive'], quiet: true }
97
+ run_command(['git', 'clone', '--quiet', '--no-checkout', url, path], quiet: true)
98
+ Dir.chdir(path) { run_command(['git', 'checkout', '--quiet', commit_sha_short], quiet: true) }
99
+ Dir.chdir(path) { run_command(%w[git submodule update --init --recursive], quiet: true) }
104
100
  end
105
101
 
106
102
 
107
103
  def checkout_newest_version
108
- run_command ['git', 'clone', '--quiet', '--recursive', '--depth', '1', url, path], quiet: true
104
+ run_command(['git', 'clone', '--quiet', '--recursive', '--depth', '1', url, path], quiet: true)
109
105
  end
110
106
 
111
107
 
@@ -149,10 +145,8 @@ module Satorix
149
145
  satorix_distrib_sha_version || git_sha_short
150
146
  end
151
147
 
152
-
153
148
  end
154
149
 
155
-
156
150
  end
157
151
  end
158
152
  end
@@ -38,7 +38,7 @@ module Satorix
38
38
  def restore_missing_gems(quiet = true)
39
39
  # The buildpack incorrectly removes gems that are included using add_development_dependency.
40
40
  # These gems must remain available for testing.
41
- run_command('bundle install --with development', quiet: quiet)
41
+ run_command(%w[bundle install --with development], quiet: quiet)
42
42
  end
43
43
 
44
44
 
@@ -64,12 +64,11 @@ module Satorix
64
64
 
65
65
 
66
66
  def regenerate_gemfile_lock(quiet = true)
67
- run_command('bundle config --local frozen false', quiet: quiet)
68
- run_command('bundle install', quiet: quiet)
67
+ run_command(%w[bundle config --local frozen false], quiet: quiet)
68
+ run_command(%w[bundle install], quiet: quiet)
69
69
  log "\n\n#{ File.read(File.join(Satorix.app_dir, 'Gemfile.lock')) }" unless quiet
70
70
  end
71
71
 
72
-
73
72
  end
74
73
  end
75
74
  end
@@ -4,20 +4,17 @@ module Satorix
4
4
 
5
5
  module YarnManager
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Installing yarn dependencies...') { run_command 'yarn install' }
13
+ log_bench('Installing yarn dependencies...') { run_command(%w[yarn install]) }
16
14
  end
17
15
 
18
16
 
19
- private ########################################################################################################
20
-
17
+ private
21
18
 
22
19
  end
23
20
  end
@@ -4,32 +4,29 @@ module Satorix
4
4
  module Python
5
5
  module DjangoTest
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Displaying current Python version...') { run_command 'python --version' }
13
+ log_bench('Displaying current Python version...') { run_command(%w[python --version]) }
16
14
  log_bench('Running tests...') { run_tests }
17
15
  end
18
16
 
19
17
 
20
18
  def run_tests
21
- run_command "#{ manage } collectstatic"
22
- run_command "#{ manage } test public"
19
+ run_command([manage, 'collectstatic'])
20
+ run_command([manage, 'test', 'public'])
23
21
  end
24
22
 
25
23
 
26
- private ######################################################################################################
24
+ private
27
25
 
28
26
 
29
- def manage
30
- File.join(Satorix.app_dir, 'public', 'manage.py')
31
- end
32
-
27
+ def manage
28
+ File.join(Satorix.app_dir, 'public', 'manage.py')
29
+ end
33
30
 
34
31
  end
35
32
  end
@@ -4,25 +4,22 @@ module Satorix
4
4
  module Python
5
5
  module Safety
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Displaying current Python version...') { run_command 'python --version' }
16
- log_bench('Installing Safety...') {run_command 'pip install safety'}
13
+ log_bench('Displaying current Python version...') { run_command(%w[python --version]) }
14
+ log_bench('Installing Safety...') { run_command(%w[pip install safety]) }
17
15
  log_bench('Auditing requirements.txt...') { run_scan }
18
16
  end
19
17
 
20
18
 
21
19
  def run_scan
22
- run_command "safety check -r requirements.txt"
20
+ run_command(%w[safety check -r requirements.txt])
23
21
  end
24
22
 
25
-
26
23
  end
27
24
  end
28
25
  end
@@ -4,30 +4,27 @@ module Satorix
4
4
  module Ruby
5
5
  module Brakeman
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Displaying current Ruby version...') { run_command 'ruby -v' }
13
+ log_bench('Displaying current Ruby version...') { run_command(%w[ruby -v]) }
16
14
  log_bench('Installing Brakeman...') { install_gem }
17
15
  log_bench('Running Brakeman scan...') { run_scan }
18
16
  end
19
17
 
20
18
 
21
19
  def install_gem
22
- run_command "gem install brakeman --no-document --bindir #{ Satorix.bin_dir }"
20
+ run_command(['gem', 'install', 'brakeman', '--no-document', '--bindir', Satorix.bin_dir])
23
21
  end
24
22
 
25
23
 
26
24
  def run_scan
27
- run_command "brakeman -z --table-width 1200 --exit-on-error --path #{ Satorix.app_dir }"
25
+ run_command(['brakeman', '-z', '--table-width', '1200', '--exit-on-error', '--path', Satorix.app_dir])
28
26
  end
29
27
 
30
-
31
28
  end
32
29
  end
33
30
  end
@@ -4,30 +4,27 @@ module Satorix
4
4
  module Ruby
5
5
  module BundlerAudit
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Displaying current Ruby version...') { run_command 'ruby -v' }
13
+ log_bench('Displaying current Ruby version...') { run_command(%w[ruby -v]) }
16
14
  log_bench('Installing bundler-audit...') { install_gem }
17
15
  log_bench('Auditing Gemfile.lock...') { run_scan }
18
16
  end
19
17
 
20
18
 
21
19
  def install_gem
22
- run_command "gem install bundler-audit --no-document --bindir #{ Satorix.bin_dir }"
20
+ run_command(['gem', 'install', 'bundler-audit', '--no-document', '--bindir', Satorix.bin_dir])
23
21
  end
24
22
 
25
23
 
26
24
  def run_scan
27
- run_command 'bundle-audit check --update'
25
+ run_command(%w[bundle-audit check --update])
28
26
  end
29
27
 
30
-
31
28
  end
32
29
  end
33
30
  end
@@ -4,24 +4,21 @@ module Satorix
4
4
  module Ruby
5
5
  module Cucumber
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Displaying current Ruby version...') { run_command 'ruby -v' }
13
+ log_bench('Displaying current Ruby version...') { run_command(%w[ruby -v]) }
16
14
  log_bench('Running Cucumber...') { run_cucumber }
17
15
  end
18
16
 
19
17
 
20
18
  def run_cucumber
21
- run_command 'bundle exec cucumber'
19
+ run_command(%w[bundle exec cucumber])
22
20
  end
23
21
 
24
-
25
22
  end
26
23
  end
27
24
  end
@@ -4,24 +4,21 @@ module Satorix
4
4
  module Ruby
5
5
  module RailsTest
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Displaying current Ruby version...') { run_command 'ruby -v' }
13
+ log_bench('Displaying current Ruby version...') { run_command(%w[ruby -v]) }
16
14
  log_bench('Running Rails test...') { run_scan }
17
15
  end
18
16
 
19
17
 
20
18
  def run_scan
21
- run_command 'rails test'
19
+ run_command(%w[rails test])
22
20
  end
23
21
 
24
-
25
22
  end
26
23
  end
27
24
  end
@@ -4,24 +4,21 @@ module Satorix
4
4
  module Ruby
5
5
  module Rspec
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Displaying current Ruby version...') { run_command 'ruby -v' }
13
+ log_bench('Displaying current Ruby version...') { run_command(%w[ruby -v]) }
16
14
  log_bench('Running specs...') { run_specs }
17
15
  end
18
16
 
19
17
 
20
18
  def run_specs
21
- run_command 'rspec spec'
19
+ run_command(%w[rspec spec])
22
20
  end
23
21
 
24
-
25
22
  end
26
23
  end
27
24
  end
@@ -4,15 +4,13 @@ module Satorix
4
4
  module Ruby
5
5
  module Rubocop
6
6
 
7
-
8
7
  include Satorix::Shared::Console
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
14
12
  def go
15
- log_bench('Displaying current Ruby version...') { run_command 'ruby -v' }
13
+ log_bench('Displaying current Ruby version...') { run_command(%w[ruby -v]) }
16
14
  log_bench('Installing Rubocop...') { install_gems }
17
15
  log_bench('Configuring Rubocop...') { create_rubocop_config }
18
16
  log_bench('Running Rubocop inspection...') { run_scan }
@@ -20,9 +18,9 @@ module Satorix
20
18
 
21
19
 
22
20
  def install_gems
23
- run_command "gem install rubocop --no-document --bindir #{ Satorix.bin_dir }"
24
- run_command "gem install rubocop-performance --no-document --bindir #{ Satorix.bin_dir }"
25
- run_command "gem install rubocop-rails_config --no-document --bindir #{ Satorix.bin_dir }" if Satorix.rails_app?
21
+ run_command(['gem', 'install', 'rubocop', '--no-document', '--bindir', Satorix.bin_dir])
22
+ run_command(['gem', 'install', 'rubocop-performance', '--no-document', '--bindir', Satorix.bin_dir])
23
+ run_command(['gem', 'install', 'rubocop-rails_config', '--no-document', '--bindir', Satorix.bin_dir]) if Satorix.rails_app?
26
24
  end
27
25
 
28
26
 
@@ -39,57 +37,59 @@ module Satorix
39
37
 
40
38
 
41
39
  def run_scan
42
- run_command "rubocop --require rubocop-performance #{ '--require rubocop-rails ' if Satorix.rails_app? }--display-cop-names --extra-details --display-style-guide --parallel"
43
- end
40
+ command = %w[rubocop --require rubocop-performance --display-cop-names --extra-details --display-style-guide --parallel]
41
+ command.concat(%w[--require rubocop-rails]) if Satorix.rails_app?
44
42
 
43
+ run_command(command)
44
+ end
45
45
 
46
- private ######################################################################################################
47
46
 
47
+ private
48
48
 
49
- def rubocop_config_file
50
- File.join(Satorix.app_dir, '.rubocop.yml')
51
- end
52
49
 
50
+ def rubocop_config_file
51
+ File.join(Satorix.app_dir, '.rubocop.yml')
52
+ end
53
53
 
54
- def save_rubocop_config(config)
55
- File.open(rubocop_config_file, 'w') { |f| f.write(config) }
56
- end
57
54
 
55
+ def save_rubocop_config(config)
56
+ File.open(rubocop_config_file, 'w') { |f| f.write(config) }
57
+ end
58
58
 
59
- def config_exist?
60
- File.exist? rubocop_config_file
61
- end
62
59
 
60
+ def config_exist?
61
+ File.exist? rubocop_config_file
62
+ end
63
63
 
64
- def ruby_version
65
- version = run_command 'bundle platform --ruby', quiet: true
66
- version.match(/\d+\.\d+\.\d+/)[0]
67
- end
68
64
 
65
+ def ruby_version
66
+ version = run_command(%w[bundle platform --ruby], quiet: true)
67
+ version.match(/\d+\.\d+\.\d+/)[0]
68
+ end
69
69
 
70
- def config_content_default
71
- <<~CONTENT
72
- AllCops:
73
- TargetRubyVersion: #{ ruby_version }
74
- Exclude:
75
- - '**/tmp/**/*'
76
- - '**/templates/**/*'
77
- - '**/vendor/**/*'
78
- CONTENT
79
- end
80
70
 
71
+ def config_content_default
72
+ <<~CONTENT
73
+ AllCops:
74
+ TargetRubyVersion: #{ ruby_version }
75
+ Exclude:
76
+ - '**/tmp/**/*'
77
+ - '**/templates/**/*'
78
+ - '**/vendor/**/*'
79
+ CONTENT
80
+ end
81
81
 
82
- def config_content_rails
83
- <<~CONTENT
84
- inherit_gem:
85
- rubocop-rails_config:
86
- - config/rails.yml
87
82
 
88
- AllCops:
89
- TargetRubyVersion: #{ ruby_version }
90
- CONTENT
91
- end
83
+ def config_content_rails
84
+ <<~CONTENT
85
+ inherit_gem:
86
+ rubocop-rails_config:
87
+ - config/rails.yml
92
88
 
89
+ AllCops:
90
+ TargetRubyVersion: #{ ruby_version }
91
+ CONTENT
92
+ end
93
93
 
94
94
  end
95
95
  end
@@ -2,15 +2,18 @@ module Satorix
2
2
  module Shared
3
3
  module Console
4
4
 
5
-
6
5
  require 'benchmark'
7
6
  require 'English' # http://ruby-doc.org/stdlib-2.0.0/libdoc/English/rdoc/English.html
8
7
  require 'shellwords'
9
8
 
10
-
11
9
  extend self
12
10
 
13
11
 
12
+ def colorize(text, color = nil)
13
+ "\033[#{ colors[color] }m#{ text }\033[0m"
14
+ end
15
+
16
+
14
17
  def colors
15
18
  Hash.new(39).merge(red: '0;31', light_red: '1;31',
16
19
  green: '0;32', light_green: '1;32',
@@ -22,8 +25,15 @@ module Satorix
22
25
  end
23
26
 
24
27
 
25
- def colorize(text, color = nil)
26
- "\033[#{ colors[color] }m#{ text }\033[0m"
28
+ def humanize_time(seconds)
29
+ return 'less than 1 second' if seconds < 1
30
+ [[60, :second], [60, :minute], [24, :hour], [1000, :day]].map do |count, name|
31
+ if seconds > 0
32
+ seconds, n = seconds.divmod(count)
33
+ n = n.to_i
34
+ "#{ n } #{ name }#{ 's' if n > 1 }" if n > 0
35
+ end
36
+ end.compact.reverse.join(' ')
27
37
  end
28
38
 
29
39
 
@@ -66,28 +76,31 @@ module Satorix
66
76
  end
67
77
 
68
78
 
69
- def humanize_time(seconds)
70
- return 'less than 1 second' if seconds < 1
71
- [[60, :second], [60, :minute], [24, :hour], [1000, :day]].map do |count, name|
72
- if seconds > 0
73
- seconds, n = seconds.divmod(count)
74
- n = n.to_i
75
- "#{ n } #{ name }#{ 's' if n > 1 }" if n > 0
76
- end
77
- end.compact.reverse.join(' ')
78
- end
79
-
80
-
81
- # This method is used *EVERYWHERE*.
82
- # Seemingly small changes can have far-ranging and extreme consequences.
83
- # Modify only with extreme caution.
79
+ # The preferred way to use this method is by passing an array containing the command.
80
+ # This will ensure that items are properly escaped.
81
+ # It is also possible to use nested arrays. See tests for example use cases.
82
+ #
83
+ # If you want to see how your string command translates into an arry, you can use shellsplit method.
84
84
  #
85
- # Note: Many applications (like echo and the Flynn CLI) append a newline to their output.
86
- # If you are using the command result, it may be desirable to chomp the trailing
87
- # newline. It is left to the implementing call to handle this, as it proved
88
- # cumbersome to handle in this method in a way that worked perfectly in all cases.
89
- def run_command(command, filtered_text: [], quiet: false)
90
- command = command.shelljoin if command.is_a?(Array)
85
+ # For example:
86
+ # 'ruby -v'.shellsplit
87
+ # => ["ruby", "-v"]
88
+ #
89
+ # If, for some reason, you need to supply a string that is already escaped or should not be escaped, it is
90
+ # possible to supply a string argument instead of an array. If you do this, you will need to supply
91
+ # an additional parameter of string_verified_safe, to ensure that the operation is deliberate.
92
+ def run_command(command, filtered_text: [], quiet: false, string_verified_safe: false)
93
+ # This method is used *EVERYWHERE*.
94
+ # Seemingly small changes can have far-ranging and extreme consequences.
95
+ # Modify only with extreme caution.
96
+ #
97
+ # Note: Many applications (like echo and the Flynn CLI) append a newline to their output.
98
+ # If you are using the command result, it may be desirable to chomp the trailing
99
+ # newline. It is left to the implementing call to handle this, as it proved
100
+ # cumbersome to handle in this method in a way that worked perfectly in all cases.
101
+ raise('Potentially unsafe or problematic command. Please refer to the method documentation for more information.') if command.is_a?(String) && !string_verified_safe
102
+
103
+ command = normalized_command(command)
91
104
  logged_command = logged_command(command, filtered_text)
92
105
  log_command(logged_command) unless quiet
93
106
 
@@ -114,43 +127,53 @@ module Satorix
114
127
  end
115
128
 
116
129
 
117
- private ##########################################################################################################
130
+ private
118
131
 
119
132
 
120
- def logged_command(command, filtered_text)
121
- filtered_text = [filtered_text].flatten.delete_if { |text| text.nil? || text.strip.empty? }
122
- command.gsub(Regexp.union(filtered_text), '[MASKED]')
123
- end
133
+ def bash(command)
134
+ ['bash -c', escaped_command(command), '2>&1'].join(' ')
135
+ end
124
136
 
125
137
 
126
- def bash(command)
127
- "bash -c #{ command.shellescape } 2>&1"
128
- end
138
+ def logged_command(command, filtered_text)
139
+ filtered_text = [filtered_text].flatten.delete_if { |text| text.nil? || text.strip.empty? }
140
+ unescaped_command = command.shellsplit.join(' ')
141
+ unescaped_command.gsub(Regexp.union(filtered_text.sort_by(&:length).reverse), '[MASKED]')
142
+ end
143
+
144
+
145
+ def escaped_command(command)
146
+ command.shellescape
147
+ end
148
+
149
+
150
+ def normalized_command(command)
151
+ command.is_a?(Array) ? command.flatten.shelljoin : command
152
+ end
153
+
154
+
155
+ def handle_run_command_error(logged_command, quiet)
156
+ error_message = "\nAn error has occurred while running the following command:\n#{ logged_command }\n"
157
+ quiet ? abort : log_error_and_abort(error_message)
158
+ end
129
159
 
130
160
 
131
161
  # http://stackoverflow.com/questions/1197224/source-shell-script-into-environment-within-a-ruby-script
132
162
  # TODO : reduce / consolidate?
133
163
  # Read in the bash environment, after an optional command. Returns Array of key/value pairs.
134
- def bash_env(cmd = nil)
135
- env_cmd = bash("#{ cmd + ';' if cmd } printenv")
136
- env = `#{ env_cmd }`
137
- env.split(/\n/).map { |l| l.split(/=/, 2) }
138
- end
164
+ def bash_env(cmd = nil)
165
+ env_cmd = bash("#{ cmd + ';' if cmd } printenv")
166
+ env = `#{ env_cmd }`
167
+ env.split(/\n/).map { |l| l.split(/=/, 2) }
168
+ end
139
169
 
140
170
 
141
171
  # http://stackoverflow.com/questions/1197224/source-shell-script-into-environment-within-a-ruby-script
142
172
  # TODO : reduce / consolidate?
143
173
  # Source a given file, and compare environment before and after. Returns Hash of any keys that have changed.
144
- def bash_source(file)
145
- Hash[bash_env("source #{ File.realpath file }") - bash_env]
146
- end
147
-
148
-
149
- def handle_run_command_error(logged_command, quiet)
150
- error_message = "\nAn error has occurred while running the following command:\n#{ logged_command }\n"
151
- quiet ? abort : log_error_and_abort(error_message)
152
- end
153
-
174
+ def bash_source(file)
175
+ Hash[bash_env("source #{ File.realpath file }") - bash_env]
176
+ end
154
177
 
155
178
  end
156
179
  end
@@ -1,3 +1,3 @@
1
1
  module Satorix
2
- VERSION = '1.5.4'.freeze
2
+ VERSION = '1.6.2'.freeze
3
3
  end
@@ -3,13 +3,10 @@ module Satorix
3
3
  module Deploy
4
4
  module IeGemServer
5
5
 
6
-
7
6
  require 'fileutils'
8
7
 
9
-
10
8
  include Satorix::Shared::Console
11
9
 
12
-
13
10
  extend self
14
11
 
15
12
 
@@ -22,7 +19,7 @@ module Satorix
22
19
 
23
20
 
24
21
  def build_gem
25
- run_command 'rake build'
22
+ run_command(%w[rake build])
26
23
  end
27
24
 
28
25
 
@@ -32,7 +29,7 @@ module Satorix
32
29
 
33
30
 
34
31
  def gem_build_directory
35
- File.join Satorix.app_dir, 'pkg'
32
+ File.join(Satorix.app_dir, 'pkg')
36
33
  end
37
34
 
38
35
 
@@ -42,37 +39,36 @@ module Satorix
42
39
 
43
40
 
44
41
  def install_geminabox_gem
45
- run_command "gem install geminabox --source https://gems.iexposure.com --no-document --bindir #{ Satorix.bin_dir }"
42
+ run_command(['gem', 'install', 'geminabox', '--source', 'https://gems.iexposure.com', '--no-document', '--bindir', Satorix.bin_dir])
46
43
  end
47
44
 
48
45
 
49
46
  def prepare_gem_build_directory
50
- run_command "rm -rf #{ gem_build_directory }", quiet: true
47
+ run_command(['rm', '-rf', gem_build_directory], quiet: true)
51
48
  FileUtils.mkdir_p gem_build_directory
52
49
  end
53
50
 
54
51
 
55
52
  def publish_gem(gem)
56
- run_command "gem inabox #{ gem } --host #{ ie_gem_server_host }",
57
- filtered_text: [ie_gem_server_user_name, ie_gem_server_password]
53
+ run_command(['gem', 'inabox', gem, '--host', ie_gem_server_host],
54
+ filtered_text: [ie_gem_server_user_name, ie_gem_server_password])
58
55
  rescue RuntimeError
59
56
  # To prevent the display of an ugly stacktrace.
60
57
  abort "\nGem was not published!"
61
58
  end
62
59
 
63
60
 
64
- private ########################################################################################################
61
+ private
65
62
 
66
63
 
67
- def ie_gem_server_password
68
- ENV['IE_GEM_SERVER_PASSWORD']
69
- end
70
-
64
+ def ie_gem_server_password
65
+ ENV['IE_GEM_SERVER_PASSWORD']
66
+ end
71
67
 
72
- def ie_gem_server_user_name
73
- ENV['IE_GEM_SERVER_USER_NAME']
74
- end
75
68
 
69
+ def ie_gem_server_user_name
70
+ ENV['IE_GEM_SERVER_USER_NAME']
71
+ end
76
72
 
77
73
  end
78
74
  end
@@ -3,13 +3,10 @@ module Satorix
3
3
  module Deploy
4
4
  module Rubygems
5
5
 
6
-
7
6
  require 'fileutils'
8
7
 
9
-
10
8
  include Satorix::Shared::Console
11
9
 
12
-
13
10
  extend self
14
11
 
15
12
 
@@ -21,59 +18,58 @@ module Satorix
21
18
  end
22
19
 
23
20
 
24
- private ########################################################################################################
21
+ private
25
22
 
26
23
 
27
- def build_gem
28
- Dir.chdir(Satorix.app_dir) do
29
- run_command 'bundle exec rake build'
24
+ def build_gem
25
+ Dir.chdir(Satorix.app_dir) do
26
+ run_command(%w[bundle exec rake build])
27
+ end
30
28
  end
31
- end
32
-
33
29
 
34
- def built_gems
35
- Dir.glob(File.join(gem_build_directory, '*.gem')).select { |e| File.file? e }
36
- end
37
30
 
31
+ def built_gems
32
+ Dir.glob(File.join(gem_build_directory, '*.gem')).select { |e| File.file? e }
33
+ end
38
34
 
39
- def gem_build_directory
40
- File.join Satorix.app_dir, 'pkg'
41
- end
42
35
 
36
+ def gem_build_directory
37
+ File.join(Satorix.app_dir, 'pkg')
38
+ end
43
39
 
44
- def generate_rubygems_configuration_file
45
- path = File.join(Dir.home, '.gem')
46
- FileUtils.mkdir_p(path) unless File.exist?(path)
47
40
 
48
- file = File.join(path, 'credentials')
49
- File.open(file, 'w') { |f| f.write rubygems_configuration_file_contents }
50
- FileUtils.chmod 0600, file
51
- end
41
+ def generate_rubygems_configuration_file
42
+ path = File.join(Dir.home, '.gem')
43
+ FileUtils.mkdir_p(path) unless File.exist?(path)
52
44
 
45
+ file = File.join(path, 'credentials')
46
+ File.open(file, 'w') { |f| f.write rubygems_configuration_file_contents }
47
+ FileUtils.chmod 0600, file
48
+ end
53
49
 
54
- def prepare_gem_build_directory
55
- run_command "rm -rf #{ gem_build_directory }"
56
- FileUtils.mkdir_p gem_build_directory
57
- end
58
50
 
51
+ def prepare_gem_build_directory
52
+ run_command(['rm', '-rf', gem_build_directory])
53
+ FileUtils.mkdir_p gem_build_directory
54
+ end
59
55
 
60
- def publish_gem(gem)
61
- run_command "gem push #{ gem } --config-file #{ File.join(Dir.home, '.gem', 'credentials') }"
62
- rescue RuntimeError
63
- # To prevent the display of an ugly stacktrace.
64
- abort "\nGem was not published!"
65
- end
66
56
 
57
+ def publish_gem(gem)
58
+ run_command(['gem', 'push', gem, '--config-file', File.join(Dir.home, '.gem', 'credentials')])
59
+ rescue RuntimeError
60
+ # To prevent the display of an ugly stacktrace.
61
+ abort "\nGem was not published!"
62
+ end
67
63
 
68
- def rubygems_api_key
69
- ENV['SATORIX_CI_RUBYGEMS_API_KEY']
70
- end
71
64
 
65
+ def rubygems_api_key
66
+ ENV['SATORIX_CI_RUBYGEMS_API_KEY']
67
+ end
72
68
 
73
- def rubygems_configuration_file_contents
74
- "---\n:rubygems_api_key: #{ rubygems_api_key }"
75
- end
76
69
 
70
+ def rubygems_configuration_file_contents
71
+ "---\n:rubygems_api_key: #{ rubygems_api_key }"
72
+ end
77
73
 
78
74
  end
79
75
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: satorix
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.4
4
+ version: 1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Satorix
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-23 00:00:00.000000000 Z
11
+ date: 2021-01-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: airbrake-ruby