soaring 0.1.10 → 0.1.11

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 471e1eb732ebb5967e82a6be99293fa78bf15254
4
- data.tar.gz: 8d69151eb93db088ff40f9f759ddd88b98e5b443
3
+ metadata.gz: 8a12653a876a7027f53549f4a67afad4fe70ecbc
4
+ data.tar.gz: 2494d103023713962850494cbc297d3721dcd958
5
5
  SHA512:
6
- metadata.gz: 2cd69d74a630585aa6a8e43b3fb0ca5cbef0465d61f26988a416d3322c42bb8896f8b42da3ee64d8fc966d9e722e6c47f1c98753b8fbdbbade372c5ad484da18
7
- data.tar.gz: c4119109f8e71669a714b46e13892c6147d4273b92f45bac5ff9c43948b17342a3107649a1ce63728c3bdab0d88715e7356658a94f99eec9e562cc1cac987e70
6
+ metadata.gz: 3903c7eab3cdd2475f9b8cf32b6c57b5dc1a5434e39674c107a7ea635be34040ea5b474e23c2440eb3f630d325bbf3ac574cc12362e32491f4905994c8918614
7
+ data.tar.gz: e9f941396a3bef6f5edfaed144d2bb5065d8c4729509c903aafd053b38a34347405c5de844fb431e5df60ba03af86e5c20e7fff481ebf4931746c1ee093b5602
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in soar_sc_core.gemspec
4
+ gemspec
data/README.md CHANGED
@@ -36,7 +36,7 @@ Create an environment.yml file by copying the example and updating to your needs
36
36
 
37
37
  Start up a local instance of the service component to check that all is well
38
38
  ```bash
39
- soaring run
39
+ soaring start
40
40
  ```
41
41
 
42
42
  This will default to a MRI ruby rack application running with the following defaults:
@@ -45,9 +45,14 @@ This will default to a MRI ruby rack application running with the following defa
45
45
  environment = 'development'
46
46
  ```
47
47
 
48
+ To stop you can simply send a CTRL-C or programmatically kill it using the stop command from another terminal
49
+ ```bash
50
+ soaring stop
51
+ ```
52
+
48
53
  These defaults can be overriden using parameters passed to soaring. View the command line options:
49
54
  ```bash
50
- soaring -h
55
+ soaring help
51
56
  ```
52
57
 
53
58
  ## Packaging the service component for deployment
data/bin/soaring CHANGED
@@ -4,4 +4,4 @@ bin_file = Pathname.new(__FILE__).realpath
4
4
  $:.unshift File.expand_path("../../lib", bin_file)
5
5
 
6
6
  require 'soaring'
7
- Soaring::CLI.start(ARGV)
7
+ Soaring::SoaringCLI.start(ARGV)
data/lib/soaring/cli.rb CHANGED
@@ -1,82 +1,49 @@
1
- require 'optparse'
1
+ require 'thor'
2
2
 
3
3
  module Soaring
4
- class CLI
5
- def self.start(argv)
6
- @project_folder = Dir.pwd
7
- command, options = self.parse
8
- puts "#{command} with #{options}" if options[:verbose]
9
- self.send("execute_#{command}",options)
4
+ class SoaringCLI < Thor
5
+ desc "init [OPTIONS]", "initialize the folder with soar_sc template"
6
+ option :verbose, :aliases => '-v', :desc => 'Verbose logging'
7
+ option :project_root, :default => Dir.pwd, :desc => 'Root folder of the soar project, defaults to current folder'
8
+ option :soar_sc_refspec, :aliases => '-r', :default => 'STABLE', :desc => 'Reference spec (Tag) of soar_sc repo to use for template, defaults to STABLE'
9
+ def init
10
+ initializer = Initializer.new(options)
11
+ initializer.initialize_project
10
12
  end
11
13
 
12
- private
13
-
14
- def self.execute_init(options)
14
+ desc "update [OPTIONS]", "update the folder with soar_sc template"
15
+ option :verbose, :aliases => '-v', :desc => 'Verbose logging'
16
+ option :project_root, :default => Dir.pwd, :desc => 'Root folder of the soar project, defaults to current folder'
17
+ option :soar_sc_refspec, :aliases => '-r', :default => 'STABLE', :desc => 'Reference spec (Tag) of soar_sc repo to use for template, defaults to STABLE'
18
+ def update
15
19
  initializer = Initializer.new(options)
16
- initializer.initialize_project(@project_folder)
20
+ initializer.initialize_project
17
21
  end
18
22
 
19
- def self.execute_run(options)
23
+ desc "start [OPTIONS]", "start the service component with OPTIONS"
24
+ option :verbose, :aliases => '-v', :desc => 'Verbose logging'
25
+ option :project_root, :default => Dir.pwd, :desc => 'Root folder of the soar project, defaults to current folder'
26
+ option :environment, :aliases => '-e', :default => 'development', :desc => 'Environment in which to execute [development,production]'
27
+ option :port, :aliases => '-p', :default => '9393', :desc => 'Bind service component server to this port for local run, defaults to 9393'
28
+ def start
20
29
  runner = Runner.new(options)
21
- runner.run(@project_folder)
30
+ runner.run
22
31
  end
23
32
 
24
- def self.execute_package(options)
25
- packager = Packager.new(options)
26
- packager.package(@project_folder)
33
+ desc "stop [OPTIONS]", "stop running rackup instances"
34
+ option :verbose, :aliases => '-v', :desc => 'Verbose logging'
35
+ option :killsignal, :aliases => '-k', :default => '9', :desc => 'The signal to send rackup instances INT signal is graceful, defaults to 9 which is not,'
36
+ def stop
37
+ exec("for f in $(ps aux | grep rackup | grep -v grep | tr -s ' ' ' ' | cut -d ' ' -f2); do echo killed $f; kill -#{options[:killsignal]} $f; done")
27
38
  end
28
39
 
29
- def self.parse
30
- options = {}
31
-
32
- opt_parser = OptionParser.new do |opt|
33
- opt.banner = "Usage: soaring COMMAND [OPTIONS]"
34
- opt.separator ""
35
- opt.separator "Release #{Soaring::VERSION}"
36
- opt.separator ""
37
- opt.separator "Commands"
38
- opt.separator " init: create/update a new soar service component in the current folder"
39
- opt.separator " run: run soar service locally"
40
- opt.separator " package: package the service component for deployment"
41
- opt.separator ""
42
- opt.separator "Options"
43
-
44
- opt.on("-v","--verbose","more verbose output of the process") do
45
- options[:verbose] = true
46
- end
47
-
48
- opt.on("-e","--environment ENVIRONMENT","environment you want the service to run in") do |environment|
49
- options[:environment] = environment
50
- end
51
-
52
- opt.on("-p","--port PORT","port to which the service component run must bind to") do |port|
53
- options[:port] = port
54
- end
55
-
56
- opt.on("-r","--soar_sc_refspec REF_SPEC","git reference spec for the soar_sc to base your init on") do |soar_sc_refspec|
57
- options[:soar_sc_refspec] = soar_sc_refspec
58
- end
59
-
60
- opt.on("-i","--ignore_git_checks","ignore checks ensuring your repo is up to date") do
61
- options[:ignore_git_checks] = true
62
- puts "Warning: Ignoring git repo checks"
63
- end
64
-
65
- opt.on("-h","--help","help") do
66
- puts opt_parser
67
- exit 0
68
- end
69
- end
70
- opt_parser.parse!
71
-
72
- command = ARGV[0]
73
- valid_commands = ['init', 'run', 'package']
74
- if not valid_commands.include?(command)
75
- puts 'Invalid command'
76
- puts opt_parser
77
- exit 1
78
- end
79
- [command, options]
40
+ desc "package [OPTIONS]", "package the service component for deployment with OPTIONS"
41
+ option :verbose, :aliases => '-v', :desc => 'Verbose logging'
42
+ option :project_root, :default => Dir.pwd, :desc => 'Root folder of the soar project, defaults to current folder'
43
+ option :ignore_git_checks, :aliases => '-i', :desc => 'Ignore git check to ensure local git repo is committed, defaults to false'
44
+ def package
45
+ packager = Packager.new(options)
46
+ packager.package
80
47
  end
81
48
  end
82
49
  end
@@ -4,25 +4,21 @@ module Soaring
4
4
  @options = options
5
5
  end
6
6
 
7
- def initialize_project(project_folder)
8
- @project_folder = project_folder
9
- git_refspec = 'STABLE' #default to STABLE if not specified
10
- git_refspec = @options[:soar_sc_refspec] if @options[:soar_sc_refspec]
11
-
7
+ def initialize_project
12
8
  Dir.mktmpdir { |dir|
13
9
  temporary_folder = dir
14
10
  temporary_soar_sc_folder = "#{temporary_folder}/soar_sc"
15
- `git --git-dir=/dev/null clone --quiet --progress --branch #{git_refspec} --depth=1 git@gitlab.host-h.net:hetznerZA/soar_sc.git #{temporary_soar_sc_folder}`
11
+ `git --git-dir=/dev/null clone --quiet --progress --branch #{@options[:soar_sc_refspec]} --depth=1 git@gitlab.host-h.net:hetznerZA/soar_sc.git #{temporary_soar_sc_folder}`
16
12
 
17
- `yes | cp -rf #{temporary_soar_sc_folder}/config #{@project_folder}`
18
- `yes | cp -rf #{temporary_soar_sc_folder}/docker #{@project_folder}`
19
- `yes | cp -rf #{temporary_soar_sc_folder}/lib #{@project_folder}`
20
- `yes | cp -rf #{temporary_soar_sc_folder}/smaak #{@project_folder}`
21
- `yes | cp -rf #{temporary_soar_sc_folder}/config.ru #{@project_folder}`
22
- `yes | cp -rf #{temporary_soar_sc_folder}/Gemfile #{@project_folder}`
23
- `yes | cp -rf #{temporary_soar_sc_folder}/.ruby-gemset #{@project_folder}`
24
- `yes | cp -rf #{temporary_soar_sc_folder}/.ruby-version #{@project_folder}`
25
- `yes | cp -rf #{temporary_soar_sc_folder}/.gitignore #{@project_folder}`
13
+ `yes | cp -rf #{temporary_soar_sc_folder}/config #{@options[:project_root]}`
14
+ `yes | cp -rf #{temporary_soar_sc_folder}/docker #{@options[:project_root]}`
15
+ `yes | cp -rf #{temporary_soar_sc_folder}/lib #{@options[:project_root]}`
16
+ `yes | cp -rf #{temporary_soar_sc_folder}/smaak #{@options[:project_root]}`
17
+ `yes | cp -rf #{temporary_soar_sc_folder}/config.ru #{@options[:project_root]}`
18
+ `yes | cp -rf #{temporary_soar_sc_folder}/Gemfile #{@options[:project_root]}`
19
+ `yes | cp -rf #{temporary_soar_sc_folder}/.ruby-gemset #{@options[:project_root]}`
20
+ `yes | cp -rf #{temporary_soar_sc_folder}/.ruby-version #{@options[:project_root]}`
21
+ `yes | cp -rf #{temporary_soar_sc_folder}/.gitignore #{@options[:project_root]}`
26
22
  }
27
23
  end
28
24
  end
@@ -1,15 +1,17 @@
1
+ require 'byebug'
2
+
1
3
  module Soaring
2
4
  class Packager
3
5
  def initialize(options)
4
6
  @options = options
5
7
  end
6
8
 
7
- def package(project_folder)
9
+ def package
8
10
  validate_project if not @options[:ignore_git_checks]
9
- build_output_location = generate_build_output_location(project_folder)
11
+ build_output_location = generate_build_output_location(@options[:project_root])
10
12
  update_project_commit_hash
11
- `mkdir -p #{project_folder}/build`
12
- `zip -r #{build_output_location} * .ebextensions --exclude=build/* --exclude=config/environment.yml`
13
+ `mkdir -p #{@options[:project_root]}/build`
14
+ `cd #{@options[:project_root]}; zip -r #{build_output_location} * .ebextensions --exclude=build/* --exclude=config/environment.yml`
13
15
  puts "Build packaged at #{build_output_location}"
14
16
  end
15
17
 
@@ -25,19 +27,31 @@ module Soaring
25
27
 
26
28
  def generate_build_output_location(project_folder)
27
29
  service_name = File.split(project_folder)[-1]
28
- revision_hash = `git rev-parse --short HEAD`.chomp
29
30
  timestamp = Time.now.strftime("%F-%H%M%S")
30
- "#{project_folder}/build/build_#{service_name}_#{revision_hash}_#{timestamp}.zip"
31
+ "#{project_folder}/build/build_#{service_name}_#{get_short_commit_hash}_#{timestamp}.zip"
31
32
  end
32
33
 
33
34
  def update_project_commit_hash
34
- `git rev-parse HEAD > commit-hash`
35
+ response, exit_status = Executor::execute("cd #{@options[:project_root]}; git rev-parse HEAD > commit-hash")
36
+ if not exit_status.success?
37
+ puts 'Failed to package, unable to get commit hash from local git repository'
38
+ exit 1
39
+ end
35
40
  end
36
41
 
37
42
  def is_git_repo_up_to_date?
38
- git_response = `git status --porcelain`.chomp
39
- return true if '' == git_response
43
+ response, exit_status = Executor::execute("cd #{@options[:project_root]}; git status --porcelain")
44
+ return true if ('' == response) and (exit_status.success?)
40
45
  false
41
46
  end
47
+
48
+ def get_short_commit_hash
49
+ response, exit_status = Executor::execute("cd #{@options[:project_root]}; git rev-parse --short HEAD")
50
+ if not exit_status.success?
51
+ puts 'Failed to package, unable to get short commit hash from local git repository'
52
+ exit 1
53
+ end
54
+ response.chomp
55
+ end
42
56
  end
43
57
  end
@@ -4,16 +4,11 @@ module Soaring
4
4
  @options = options
5
5
  end
6
6
 
7
- def run(project_folder)
8
- environment = 'development'
9
- environment = @options[:environment] if @options[:environment]
10
- port = 9393
11
- port = @options[:port] if @options[:port]
12
-
7
+ def run
13
8
  bind_address = '0.0.0.0'
14
- rackup_parameters = "-E #{environment} ./config.ru -p #{port} --host #{bind_address}"
9
+ rackup_parameters = "-E #{@options[:environment]} ./config.ru -p #{@options[:port]} --host #{bind_address}"
15
10
  puts "starting rackup with parameters #{rackup_parameters}" if @options[:verbose]
16
- `bundle exec rackup #{rackup_parameters}`
11
+ exec("bundle exec rackup #{rackup_parameters}")
17
12
  end
18
13
 
19
14
  end
@@ -0,0 +1,18 @@
1
+ require 'open3'
2
+
3
+ module Soaring
4
+ class Executor
5
+ def self.execute(command)
6
+ captured_stdout = ''
7
+ captured_stderr = ''
8
+ exit_status = Open3.popen3(ENV, command) {|stdin, stdout, stderr, wait_thr|
9
+ pid = wait_thr.pid # pid of the started process.
10
+ stdin.close
11
+ captured_stdout = stdout.read
12
+ captured_stderr = stderr.read
13
+ wait_thr.value # Process::Status object returned.
14
+ }
15
+ ["#{captured_stdout}#{captured_stderr}", exit_status]
16
+ end
17
+ end
18
+ end
@@ -1,3 +1,3 @@
1
1
  module Soaring
2
- VERSION = "0.1.10"
2
+ VERSION = "0.1.11"
3
3
  end
data/lib/soaring.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'soaring/version'
2
+ require 'soaring/tools'
2
3
  require 'soaring/initializer'
3
4
  require 'soaring/runner'
4
5
  require 'soaring/packager'
data/soaring.gemspec CHANGED
@@ -24,4 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
25
  spec.add_development_dependency "byebug", "~> 9"
26
26
 
27
+ spec.add_dependency "thor", "~> 0.19"
28
+
27
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: soaring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.10
4
+ version: 0.1.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Barney de Villiers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-14 00:00:00.000000000 Z
11
+ date: 2016-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: thor
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.19'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.19'
69
83
  description: A collection of command line tools that simplifies the creation, development
70
84
  and packaging of a soar project for deployment at Hetzner
71
85
  email:
@@ -77,6 +91,7 @@ extra_rdoc_files: []
77
91
  files:
78
92
  - ".gitignore"
79
93
  - ".rspec"
94
+ - Gemfile
80
95
  - LICENSE.txt
81
96
  - README.md
82
97
  - bin/soaring
@@ -85,6 +100,7 @@ files:
85
100
  - lib/soaring/initializer.rb
86
101
  - lib/soaring/packager.rb
87
102
  - lib/soaring/runner.rb
103
+ - lib/soaring/tools.rb
88
104
  - lib/soaring/version.rb
89
105
  - soaring.gemspec
90
106
  homepage: https://github.com/hetznerZA/soaring