dry-stack 0.0.67 → 0.0.68

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
  SHA256:
3
- metadata.gz: 2b25f53e89f787deef0a2dbb32f120cc18a66cc085fb33dabe4f95ef21a02cf1
4
- data.tar.gz: 39d17808bc44fb83bc6c14c44391b5257de6b0cc961ba76da041964b4b0c31ef
3
+ metadata.gz: 146c4a166dd6b6136a2b3f9c4068bcdf01fa38f64665148523bb7e4192d91cc7
4
+ data.tar.gz: 27e180472c79e5b351d51086c5595b8d5326d67bf18b0b1661d849ab9315be0e
5
5
  SHA512:
6
- metadata.gz: cb7bbe27f18757b7e57185ecdfd5eb23cc49810923fd702f1e277cbf383933df87ace982480687938db5934efcc3082e35b97e3c621f09fa42cd36c5532dd440
7
- data.tar.gz: af89e3f72df4bd5ebc54f4ed54328298699a2dc86096f3a0ec1ae86e593a11ec822b452348a3d9115845db2cba9e2d2b0ac7a8f10f1ac57f3ca1aa64e112f263
6
+ metadata.gz: 74afa47a72fe82c508baedd4feaf3e8280f6890c540161f1fc87a3a2787d0330f6d3d05e8bc37ad5152a16243d485d477488969c37119b140cdfa6bb3a9c98a5
7
+ data.tar.gz: cb99fb3f874fbd03c04b9c8cef3a28ca660f60c65304e0c2977485a85f6af140a700a12d7430de0f10400aaa54dbbade3c1fa0dbd6460976328f56bf5c034da7
data/bin/stack.drs CHANGED
@@ -2,6 +2,13 @@ Description <<~DSC
2
2
 
3
3
  DSC
4
4
 
5
+ Options name: 'stack_name'
6
+ SwarmDeploy :sky_gates do
7
+ context_host 'ssh://root@10.0.0.1'
8
+ stack_name 'remote_stack'
9
+ env REGISTRY_HOST: '10.100.0.2:5000'
10
+ end
11
+
5
12
  PublishPorts admin: 4000, operator: 4001, navigator: 4002, reports: 7000 # mode: ingress, protocol: tcp
6
13
 
7
14
  Service :admin, image: 'frontend', env: {APP: 'admin'}, ports: 5000
@@ -1,7 +1,8 @@
1
1
  require_relative 'command_line'
2
2
 
3
3
  Dry::CommandLine::COMMANDS[:to_compose] = Class.new do
4
- def run(stack, params)
4
+ def run(stack, params, args)
5
+ raise "unsupported args: #{args}" unless args.empty?
5
6
  _params = stack.options.merge params
6
7
  stack.name = _params[:name] if _params[:name]
7
8
  yaml = stack.to_compose(_params).lines[1..].join
@@ -14,6 +14,14 @@ def exec_i(cmd, input_string = nil)
14
14
  end
15
15
  end
16
16
 
17
+ def exec_o_lines(cmd,&)
18
+ IO.popen(cmd, 'r') do |f|
19
+ f.each_line do |line|
20
+ yield line
21
+ end
22
+ end
23
+ end
24
+
17
25
  module Dry
18
26
  module CommandLine
19
27
  COMMANDS = {}
@@ -74,7 +82,7 @@ module Dry
74
82
  safe_eval stack_text # isolate context
75
83
 
76
84
  Stack.last_stack.name = params[:name] if params[:name]
77
- COMMANDS[command.to_sym].run Stack.last_stack, params
85
+ COMMANDS[command.to_sym].run Stack.last_stack, params, args
78
86
  rescue => e
79
87
  puts e.message
80
88
  ENV['DEBUG'] ? raise : exit(1)
@@ -1,12 +1,38 @@
1
1
  require_relative 'command_line'
2
2
 
3
3
  Dry::CommandLine::COMMANDS[:swarm_deploy] = Class.new do
4
- def run(stack, params)
4
+ def run(stack, params, args)
5
+ unless args.empty?
6
+ raise "deploy config not found: #{args[0]}" unless stack.swarm_deploy.key? args[0].to_sym
7
+ context = stack.swarm_deploy[args[0].to_sym]
8
+ end
5
9
  _params = stack.options.merge params
6
10
  stack.name = _params[:name] if _params[:name]
7
- yaml = stack.to_compose(_params).lines[1..].join
11
+
12
+ if context
13
+ name = context[:context_name]&.to_sym || args[0].to_sym
14
+ host = context[:context_host]
15
+ contexts = {}
16
+ exec_o_lines "docker context ls --format json" do |line|
17
+ ctx = JSON.parse line, symbolize_names: true
18
+ contexts[ctx[:Name].to_sym] = ctx # {"Current":false,"Description":"","DockerEndpoint":"ssh://root@x.x.x.x","Error":"","Name":"prod-swarm"}
19
+ end
20
+
21
+ if contexts[name] && contexts[name][:DockerEndpoint] != host
22
+ raise "context '#{name}' has different host value: #{contexts[name][:DockerEndpoint]} != #{host}"
23
+ end
24
+
25
+ exec_i "docker context create #{name} --docker host=#{host}" unless contexts[name]
26
+
27
+ ENV['DOCKER_CONTEXT'] = name.to_s
28
+ stack.name = context[:stack_name] || stack.name
29
+ context[:stack_name][:environment].each do |k,v|
30
+ ENV[k.to_s] = v.to_s
31
+ end
32
+ end
8
33
 
9
34
  # substitute ENV variables
35
+ yaml = stack.to_compose(_params).lines[1..].join
10
36
  yaml = _params[:'no-env'] ? yaml : `echo \"#{yaml.gsub("`", '\\\`')}\"`
11
37
  system " echo \"#{yaml.gsub("`", '\\\`')}\"" if _params[:v]
12
38
  # system " echo \"#{yaml.gsub("`", '\\\`')}\" | docker stack deploy -c - #{stack.name} --prune --resolve-image changed"
@@ -14,7 +40,7 @@ Dry::CommandLine::COMMANDS[:swarm_deploy] = Class.new do
14
40
  exec_i "docker stack deploy -c - #{stack.name} --prune --resolve-image changed", yaml
15
41
  system "docker config rm $(docker config ls --filter label=com.docker.stack.namespace=#{stack.name} --format \"{{.ID}}\")"
16
42
 
17
- exec_i "docker config rm #{stack.name}_readme || echo 'failed to remove config#{stack.name}_readme'"
43
+ exec_i "docker config rm #{stack.name}_readme || echo 'failed to remove config #{stack.name}_readme'"
18
44
  puts "stack description: #{stack.description}"
19
45
  exec_i "docker config create #{stack.name}_readme -", stack.description
20
46
  end
@@ -42,12 +42,20 @@ module Dry
42
42
  def network(names) = (@service[:networks] ||= []) << names
43
43
  end
44
44
 
45
+ class SwarmFunction
46
+ def initialize(swarm, &); @swarm = swarm; instance_exec(&) end
47
+ def env(variables)= @swarm[:environment].merge! variables
48
+ def context_host(host)= @swarm[:context_host] = host
49
+ def context_name(name)= @swarm[:context_name] = name
50
+ def stack_name(name)= @swarm[:stack_name] = name
51
+ end
52
+
45
53
  class Stack
46
54
  COMPOSE_VERSION = '3.8'
47
55
  class << self
48
56
  attr_accessor :last_stack
49
57
  end
50
- attr_accessor :name, :options, :description
58
+ attr_accessor :name, :options, :description, :swarm_deploy
51
59
 
52
60
  def Stack(name = nil, &)
53
61
  Stack.last_stack = Stack.new name
@@ -69,6 +77,7 @@ module Dry
69
77
  @labels = {}
70
78
  @configs = {}
71
79
  @logging = {}
80
+ @swarm_deploy = {}
72
81
  end
73
82
 
74
83
  def expand_hash(hash)
@@ -235,9 +244,9 @@ module Dry
235
244
  opts[:ports] = [opts[:ports]].flatten if opts.key? :ports
236
245
  opts[:environment] = opts.delete(:env) if opts.key? :env
237
246
 
238
- @services[name] ||= {environment: {}, deploy: {labels: []}}
239
- @services[name].merge! opts
240
- ServiceFunction.new(@services[name], &) if block_given?
247
+ service = @services[name.to_sym] ||= {environment: {}, deploy: {labels: []}}
248
+ service.merge! opts
249
+ ServiceFunction.new(service, &) if block_given?
241
250
  end
242
251
 
243
252
  def Description(string)
@@ -299,6 +308,15 @@ module Dry
299
308
  @volumes[name].merge! opts
300
309
  yield if block_given?
301
310
  end
311
+
312
+ def SwarmDeploy(name, opts = {}, &)
313
+ opts[:environment] = opts.delete(:env) if opts.key? :env
314
+
315
+ swarm = @swarm_deploy[name.to_sym] ||= { environment: {} }
316
+ swarm.merge! opts
317
+ SwarmFunction.new(swarm, &) if block_given?
318
+ end
319
+
302
320
  end
303
321
  end
304
322
 
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  class Stack
3
- VERSION = '0.0.67'
3
+ VERSION = '0.0.68'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-stack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.67
4
+ version: 0.0.68
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artyom B
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-02 00:00:00.000000000 Z
11
+ date: 2024-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake