mr-shipper 0.0.3 → 0.0.8

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
  SHA256:
3
- metadata.gz: 62a89124cd13c7f9c9bb8172289206e0a07a415c049798327e1499cec74616c6
4
- data.tar.gz: 96d6c8002ec688c7354722281d79073393429af6ca762566e7a5ccd4a94d24a5
3
+ metadata.gz: f2369a23d83d7ce62517f9218f552ee2f1eb486d577c5ae3d7789478c050bdd6
4
+ data.tar.gz: f955464874823fdaeae8b7bc91775edfab1652d62941dbe14e5c6adcca46d5bd
5
5
  SHA512:
6
- metadata.gz: a921c5767e5a4c01d935db8d1a609894672f7b6afae51891a5eee5cda6144302ce868ca5fbc691e6ff716736d5b1daa9dc78cf0b4cc9d64543714ef24e22eafb
7
- data.tar.gz: c6fbf4fad5b3cb7335e330d170f396c24c673cc5dc623c68e89f15a1d296fd35420db09d31eb05a5f4674e4167f56bab5421acc01cca5170e4af3f2cbb646825
6
+ metadata.gz: b359768c2a119a000ecff0b37328eb697fbcb35a84b8af93c840209cda61c94b397fc7108de9ec8a4e5d5fbae070dc895e223af76f603880db5f19b6975323d3
7
+ data.tar.gz: 3f26fd58671009f78249d3b16a6b3a5c7307b4f6f69259384da434c52f6f05ec83e1280122fda24a8a8bea966f85a97e5d840283f9727dffef6f841a8560682f
data/bin/ship CHANGED
@@ -3,5 +3,4 @@
3
3
 
4
4
  require 'shipper'
5
5
 
6
- specified_services = ARGV.empty? ? nil : ARGV
7
- Shipper::Deploy.new(specified_services).perform
6
+ Shipper::Run.new(ARGV).perform
@@ -7,4 +7,5 @@ require 'shipper/executor'
7
7
  require 'shipper/host'
8
8
  require 'shipper/service'
9
9
  require 'shipper/logger'
10
+ require 'shipper/run'
10
11
  require 'shipper/deploy'
@@ -6,11 +6,35 @@ require 'yaml'
6
6
 
7
7
  module Shipper
8
8
  class Config < ::OpenStruct
9
- include Singleton
9
+ def initialize(config_path: nil, env: nil)
10
+ config_path ||= "#{Dir.pwd}/shipper.yml"
11
+ env ||= 'production'
10
12
 
11
- def initialize
12
- config = ::YAML::load_file("#{Dir.pwd}/shipper.yml")
13
+ config = load_env_config(config_path, env)
13
14
  super(config)
14
15
  end
16
+
17
+ private
18
+
19
+ def load_env_config(config_path, env)
20
+ full_config = ::YAML.load_file(config_path)
21
+ check_env_available!(full_config, env)
22
+
23
+ hosts = full_config.delete('hosts')
24
+ services = full_config.delete('services')
25
+
26
+ full_config['host'] = hosts[env]
27
+ full_config['services'] = services[env]
28
+ full_config
29
+ end
30
+
31
+ def check_env_available!(config, env)
32
+ services = !config.dig('services', env).nil?
33
+ hosts = !config.dig('hosts', env).nil?
34
+
35
+ puts "Error: No host available for env '#{env}'" unless hosts
36
+ puts "Error: No services available for env '#{env}'" unless services
37
+ exit(0) if !hosts || !services
38
+ end
15
39
  end
16
40
  end
@@ -4,9 +4,9 @@ module Shipper
4
4
  class Deploy
5
5
  attr_reader :config, :specified_services
6
6
 
7
- def initialize(specified_services = nil)
7
+ def initialize(config, specified_services = nil)
8
+ @config = config
8
9
  @specified_services = specified_services
9
- @config = Shipper::Config.instance
10
10
  end
11
11
 
12
12
  def perform
@@ -32,7 +32,7 @@ module Shipper
32
32
 
33
33
  def load_services
34
34
  config.services
35
- .select { |name, _| !service_ignored?(name) }
35
+ .reject { |name, _| service_ignored?(name) }
36
36
  .map { |name, config| ::Shipper::Service.new(name, config) }
37
37
  end
38
38
 
@@ -25,7 +25,7 @@ module Shipper
25
25
  def exec_host(cmd)
26
26
  logger.bold("Exec host '#{cmd}'")
27
27
 
28
- host_bash.exec!("cd #{path}; #{cmd}") do |channel, stream, data|
28
+ host_bash.exec!("cd #{path}; #{cmd}") do |_channel, _stream, data|
29
29
  logger.puts(data)
30
30
  end
31
31
  end
@@ -34,17 +34,24 @@ module Shipper
34
34
  logger.bold("Exec local '#{cmd}'")
35
35
 
36
36
  Dir.chdir(path) do
37
- Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
38
- logger.puts(stdout.gets)
39
- logger.puts(stderr.gets)
37
+ status = Open3.popen2e(cmd) do |_stdin, stdout, wait_thread|
38
+ stdout.each_line { |line| logger.puts(line) }
40
39
 
41
- wait_thr.value
40
+ wait_thread.value
42
41
  end
42
+ fall_down!(cmd) unless status.exitstatus.zero?
43
43
  end
44
44
  end
45
45
 
46
46
  def logger
47
47
  ::Shipper::Logger.instance
48
48
  end
49
+
50
+ def fall_down!(failed_cmd)
51
+ logger.error 'Command finished with non-zero code:'
52
+ logger.puts "'#{failed_cmd}'"
53
+ logger.puts 'halt.'
54
+ exit
55
+ end
49
56
  end
50
57
  end
@@ -2,22 +2,26 @@
2
2
 
3
3
  module Shipper
4
4
  class Host
5
- attr_accessor :ssh_entry, :location, :executor
5
+ attr_accessor :user, :host, :port, :location, :executor
6
6
 
7
7
  def initialize(options)
8
- @ssh_entry = options['ssh_entry']
8
+ @user, full_host = options['ssh_entry'].split('@')
9
+ @host, @port = full_host.split(':')
10
+ @post ||= 22
11
+
9
12
  @location = options['location']
10
13
  @executor = nil
11
14
  end
12
15
 
13
16
  def update!
14
- user, host = ssh_entry.split('@')
17
+ restart!(pull_changes: true)
18
+ end
15
19
 
16
- ::Net::SSH.start(host, user) do |ssh|
20
+ def restart!(pull_changes: false)
21
+ ::Net::SSH.start(host, user, port: port) do |ssh|
17
22
  load_executor(ssh)
18
-
19
23
  executor.cd location
20
- exec 'docker-compose pull'
24
+ exec 'docker-compose pull' if pull_changes
21
25
  exec 'docker-compose down'
22
26
  exec 'docker-compose up -d'
23
27
  end
@@ -20,6 +20,10 @@ module Shipper
20
20
  puts "# #{phrase}".bold.yellow
21
21
  end
22
22
 
23
+ def error(phrase)
24
+ puts "# #{phrase}".bold.red
25
+ end
26
+
23
27
  def puts(phrase)
24
28
  super(phrase)
25
29
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shipper
4
+ class Run
5
+ attr_reader :config, :options, :env
6
+
7
+ COMMANDS = %w[restart].freeze
8
+
9
+ def initialize(options)
10
+ pop_env!(options)
11
+ @config = ::Shipper::Config.new(env: env)
12
+ @options = options.empty? ? nil : options
13
+ end
14
+
15
+ def perform
16
+ if restart?
17
+ ::Shipper::Host.new(config.host).restart!
18
+ else
19
+ ::Shipper::Deploy.new(config, options).perform
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def restart?
26
+ options&.size == 1 && options[0] == 'restart'
27
+ end
28
+
29
+ def pop_env!(options)
30
+ if options.empty? || COMMANDS.include?(options[0])
31
+ @env = 'production'
32
+ else
33
+ @env = options.delete_at(0)
34
+ end
35
+ end
36
+ end
37
+ end
@@ -13,7 +13,7 @@ module Shipper
13
13
 
14
14
  def ship!
15
15
  executor.cd(path)
16
- before_build.each { |cmd| exec(cmd) } if before_build
16
+ before_build&.each { |cmd| exec(cmd) }
17
17
  exec "docker build . -t #{repo}"
18
18
  exec "docker push #{repo}"
19
19
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mr-shipper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rostyslav Safonov
@@ -11,33 +11,33 @@ cert_chain: []
11
11
  date: 2019-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: net-ssh
14
+ name: colorize
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: '5.1'
19
+ version: 0.8.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: '5.1'
26
+ version: 0.8.1
27
27
  - !ruby/object:Gem::Dependency
28
- name: colorize
28
+ name: net-ssh
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.8.1
33
+ version: '5.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.8.1
40
+ version: '5.1'
41
41
  description: The simple way to deploy docker-compose based apps
42
42
  email: elhowm@gmail.com
43
43
  executables:
@@ -52,13 +52,14 @@ files:
52
52
  - lib/shipper/executor.rb
53
53
  - lib/shipper/host.rb
54
54
  - lib/shipper/logger.rb
55
+ - lib/shipper/run.rb
55
56
  - lib/shipper/service.rb
56
57
  homepage: https://rubygemspecs.org/gems/mr-shipper
57
58
  licenses:
58
59
  - MIT
59
60
  metadata:
60
- source_code_uri: https://github.com/elhowm/shipper
61
- documentation_uri: https://github.com/elhowm/shipper
61
+ source_code_uri: https://github.com/elhowm/mr-shipper
62
+ documentation_uri: https://github.com/elhowm/mr-shipper
62
63
  post_install_message:
63
64
  rdoc_options: []
64
65
  require_paths:
@@ -74,8 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
75
  - !ruby/object:Gem::Version
75
76
  version: '0'
76
77
  requirements: []
77
- rubyforge_project:
78
- rubygems_version: 2.7.9
78
+ rubygems_version: 3.1.2
79
79
  signing_key:
80
80
  specification_version: 4
81
81
  summary: Docker shipping