indocker 0.3.9 → 0.4.1

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: 94c3e1673cb76f0e0684e0d88286d7e9797e0d5095cc8d1da23c43c729c80df4
4
- data.tar.gz: c2ee0ea5f6e461fb3efeeeb5b3f9415e701c7bffcadc754fae8356a88dcdd7ac
3
+ metadata.gz: 90d16fd262c9576fcdd7e9f442bd6706533b37c195a8c95f991dd6ac4d7daf0a
4
+ data.tar.gz: 9a4d6fb758745112611f62879a6c8409bc8f2f3bfc9355b83b8022e3951ec111
5
5
  SHA512:
6
- metadata.gz: ea87d5271a5bce0ff19bb28145ac31e6ab681278e008e43ebbba057fd8325bd358f02b83b46b1ba762653cbb6ed1b6565ce4e7ef72961149270fea3073e5d960
7
- data.tar.gz: 2a18463fbb82df02122ec3b842f3a186dd08d50a946b5f999850c7f677ee305292a09cd9e95f54d1ca51ccaed21ac69edd25f56c3b5dde9f9de2a10d599b5319
6
+ metadata.gz: 12faa98ac4b95b8f9d7dbfad174a8fc797082c320eeff858bedfad1f136fd60024f9800915fb9e725c55717565833f6c36b83666ccace129a83ef1fb9e631791
7
+ data.tar.gz: ae35e8ca9212ebb76c63dd43348aa1fe20cbd462809e54660c20f693a0bcb4201d01b57bf68941c597c396ad68a2532e5fe0a2ac3077bd3d5578e9db1798a6e0
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- indocker (0.3.9)
4
+ indocker (0.4.1)
5
5
  net-ssh
6
6
 
7
7
  GEM
@@ -17,39 +17,25 @@ class Indocker::ContainerDeployer
17
17
  def deploy(container, force_restart, skip_force_restart, progress)
18
18
  return if @deployed_containers[container]
19
19
 
20
- container.servers.each do |server|
20
+ # Deploy the same container to all of its servers in parallel.
21
+ #
22
+ # Each thread opens its OWN ssh connection (create_connection!), so no
23
+ # net-ssh session is shared between threads. We join all threads before
24
+ # returning, so container dependency ordering (depends_on) is preserved:
25
+ # a dependent container never starts deploying until every server of its
26
+ # dependency has finished.
27
+ threads = container.servers.map do |server|
21
28
  progress.start_deploying_container(container, server)
22
29
 
23
- exec_proc = if !container.is_daemonized?
24
- Proc.new do |&block|
25
- block.call
26
- end
27
- else
28
- Proc.new do |&block|
29
- block.call
30
- end
30
+ Thread.new do
31
+ deploy_to_server(container, server, force_restart, skip_force_restart, progress)
31
32
  end
33
+ end
32
34
 
33
- exec_proc.call do
34
- deploy_server = @server_pool.create_connection!(server)
35
- @logger.info("Deploying container: #{container.name.to_s.green} to #{server.user}@#{server.host}")
36
-
37
- result = deploy_server
38
- .run_container_remotely(
39
- configuration_name: Indocker.configuration_name,
40
- container_name: container.name,
41
- force_restart: force_restart && !skip_force_restart.include?(container.name)
42
- )
43
-
44
- if result.exit_code != 0
45
- exit 1
46
- end
47
-
48
- @logger.info("Container deployment to #{server.user}@#{server.host} finished: #{container.name.to_s.green}")
35
+ results = threads.map(&:value)
49
36
 
50
- deploy_server.close_session
51
- progress.finish_deploying_container(container, server)
52
- end
37
+ if results.any? { |exit_code| exit_code != 0 }
38
+ exit 1
53
39
  end
54
40
 
55
41
  @deployed_containers[container] = true
@@ -60,4 +46,31 @@ class Indocker::ContainerDeployer
60
46
  rescue => e
61
47
  @logger.error("error during closing sessions #{e.inspect}")
62
48
  end
49
+
50
+ private
51
+
52
+ # Runs a single container deployment on a single server. Returns the remote
53
+ # exit code (0 on success). Runs inside its own thread with a dedicated ssh
54
+ # connection, so it must not touch shared mutable state except the
55
+ # thread-safe `progress`.
56
+ def deploy_to_server(container, server, force_restart, skip_force_restart, progress)
57
+ deploy_server = @server_pool.create_connection!(server)
58
+ @logger.info("Deploying container: #{container.name.to_s.green} to #{server.user}@#{server.host}")
59
+
60
+ result = deploy_server
61
+ .run_container_remotely(
62
+ configuration_name: Indocker.configuration_name,
63
+ container_name: container.name,
64
+ force_restart: force_restart && !skip_force_restart.include?(container.name)
65
+ )
66
+
67
+ if result.exit_code == 0
68
+ @logger.info("Container deployment to #{server.user}@#{server.host} finished: #{container.name.to_s.green}")
69
+ progress.finish_deploying_container(container, server)
70
+ end
71
+
72
+ deploy_server.close_session
73
+
74
+ result.exit_code
75
+ end
63
76
  end
@@ -20,7 +20,7 @@ class Indocker::Docker
20
20
 
21
21
  def stop(container_name, time: nil, skip_errors: false)
22
22
  time ||= 10 # default timeout for Linux
23
- Indocker::Shell.command("docker stop --time=#{time} #{container_name}", Indocker.logger, skip_errors: skip_errors)
23
+ Indocker::Shell.command("docker stop -t #{time} #{container_name}", Indocker.logger, skip_errors: skip_errors)
24
24
  rm(container_name, skip_errors: skip_errors)
25
25
  end
26
26
 
@@ -1,3 +1,3 @@
1
1
  module Indocker
2
- VERSION = "0.3.9"
2
+ VERSION = "0.4.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: indocker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2024-12-04 00:00:00.000000000 Z
12
+ date: 2026-07-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: net-ssh