indocker 0.3.9 → 0.4.0

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: 2e66344870970bb12d0f6811219da96fe68d4549416280ac39cf3bd07960ff96
4
+ data.tar.gz: ff05089cd25b1aea14d84a052febae5436b002cedbb03d7490cc2659815a6846
5
5
  SHA512:
6
- metadata.gz: ea87d5271a5bce0ff19bb28145ac31e6ab681278e008e43ebbba057fd8325bd358f02b83b46b1ba762653cbb6ed1b6565ce4e7ef72961149270fea3073e5d960
7
- data.tar.gz: 2a18463fbb82df02122ec3b842f3a186dd08d50a946b5f999850c7f677ee305292a09cd9e95f54d1ca51ccaed21ac69edd25f56c3b5dde9f9de2a10d599b5319
6
+ metadata.gz: 44a2d51ed48f473d5b5f65f81d681d188be17830487b1ff98ac63b252f99f5ca33686f262c41fc763f3f70e9244b31a1469615fae6b47f6f16b91b3632129eb3
7
+ data.tar.gz: d196b2da95b698b3b897c54a408526229978f69e29f9c6d297c4bda8234662ea633f6e493b7612cd218132b4aa96bdc97bcb4c057a591e270e4d35b1714f48d4
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.0)
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
@@ -1,3 +1,3 @@
1
1
  module Indocker
2
- VERSION = "0.3.9"
2
+ VERSION = "0.4.0"
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.0
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