soaring 0.1.10 → 0.1.11

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
  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