harbr 0.1.41 → 0.1.42

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: 961d2fcd8bbf17593359f10c94fedb0dea4ee66ddd63847e5aa4b22d26b7e2ba
4
- data.tar.gz: 8bd0be2d101562f224e8101556514eea70fc9cf31b74b6bd838df08a79059736
3
+ metadata.gz: b4a81834b6e281138d670063f16e6ce3aef3ba2a4c611126c5769f7a800c6a43
4
+ data.tar.gz: '09c9cb7ba2a44b1d61282c05c63d5cf6a9ea96711d063805268b15fbee0b4569'
5
5
  SHA512:
6
- metadata.gz: 714bd9940f1cfdacfa242567adbe006470c919c50c31669f03f32c60a28a9ef0b45bfdb8834605ddfcea6157716ba0486f5686183584f098788a8bafe2602db6
7
- data.tar.gz: 7e800f4514d06701ced3a12a359458201be7ad2b5c51c2cf5603e9a34a6eef1ec18f34e5b616bd14cddaaca0c5f672df3150739da120b2c82ed1fc3641822cd2
6
+ metadata.gz: 11e9eb1bc37ab2095afcac4509521c414d38c7b40fbe0215d9e035d0bfda830999b9c210576cf8dea4903ad35e13bb8062eeb6c5eb2cdeb4f9a7b4fa6e4008c9
7
+ data.tar.gz: 1ecaed7982e06159ef3a16956754fc8d5c677c4ffa40548852a5685a36ab68971d22f317455fa27d01794118d14be762e6ea8caf832dbc73160e86f3ff81ca17
data/exe/harbr CHANGED
@@ -92,10 +92,10 @@ class HarbrCLI < Thor
92
92
  Dir.exist?("/var/harbr/containers/#{container}/versions/#{version}/config/manifest.yml")
93
93
  end
94
94
 
95
- Harbr::Job.perform_async(container, version)
95
+ Harbr::Job.perform_async(container, versio,"live")
96
96
  else
97
97
  sleep 3
98
- Harbr::Next::Job.perform_async(container, version)
98
+ Harbr::Job.perform_async(container, version,"next")
99
99
  puts "deploy next version #{version} of #{container}"
100
100
  end
101
101
 
data/lib/harbr/job.rb CHANGED
@@ -1,4 +1,9 @@
1
+ require "yaml"
2
+ require "ostruct"
3
+ require "sucker_punch"
1
4
  require "harbr"
5
+ require "tomlrb"
6
+
2
7
  module Harbr
3
8
  class Job
4
9
  include SuckerPunch::Job
@@ -10,13 +15,7 @@ module Harbr
10
15
  def create_traefik_config(containers)
11
16
  config = {
12
17
  "http" => {
13
- "routers" => {
14
- "traefik-dashboard" => {
15
- "rule" => "Host(`traefik.harbr.zero2one.ee`)",
16
- "service" => "api@internal",
17
- "tls" => {} # Enable TLS for the dashboard
18
- }
19
- },
18
+ "routers" => {},
20
19
  "services" => {}
21
20
  }
22
21
  }
@@ -25,18 +24,16 @@ module Harbr
25
24
  container.ip = "127.0.0.1"
26
25
  name = container.name.tr(".", "-")
27
26
 
28
- # Create the router with TLS enabled and specific format
29
27
  router_key = "#{name}-router-secure"
30
28
  config["http"]["routers"][router_key] = {
31
29
  "rule" => "Host(`#{container.host_header}`)",
32
30
  "service" => "#{name}-service",
33
31
  "entryPoints" => ["https"],
34
32
  "tls" => {
35
- "certResolver" => "myresolver" # Use a custom certificate resolver
33
+ "certResolver" => "myresolver"
36
34
  }
37
35
  }
38
36
 
39
- # Create the service
40
37
  config["http"]["services"]["#{name}-service"] = {
41
38
  "loadBalancer" => {
42
39
  "servers" => [{"url" => "http://#{container.ip}:#{container.port}"}]
@@ -44,7 +41,6 @@ module Harbr
44
41
  }
45
42
  end
46
43
 
47
- # Write the configuration to a TOML file
48
44
  File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
49
45
  puts "Traefik configuration written to /etc/traefik/harbr.toml"
50
46
  end
@@ -64,99 +60,130 @@ module Harbr
64
60
  container.port = port
65
61
  containers.update(container)
66
62
  end
63
+
67
64
  containers.all
68
65
  end
69
66
 
70
- module Runit
71
- class Run
72
- def initialize(container, port)
73
- @container_name = container
74
- @port = port
75
- end
67
+ def write_to_file(path, contents)
68
+ File.write(path, contents)
69
+ end
76
70
 
77
- def to_s
78
- <<~SCRIPT
79
- #!/bin/sh
80
- exec 2>&1
81
- cd /var/harbr/containers/#{@container_name}/current
82
- exec ./exe/run #{@port} live
83
- SCRIPT
84
- end
71
+ def load_manifest(container, version)
72
+ manifest_path = "/var/harbr/containers/#{container}/versions/#{version}/config/manifest.yml"
73
+ raise "Manifest not found at #{manifest_path}" unless File.exist?(manifest_path)
85
74
 
86
- def link
87
- "ln -s /etc/sv/harbr/#{@container_name} /etc/service/#{@container_name}"
88
- end
75
+ manifest_data = YAML.load_file(manifest_path)
76
+ OpenStruct.new(manifest_data)
77
+ end
78
+
79
+ def perform(name, version, env)
80
+ Harbr.notifiable(name, version) do
81
+ manifest = load_manifest(name, version)
82
+ port = `port assign #{env}.#{manifest.port}`.strip
83
+
84
+ current_path = "/var/harbr/containers/#{name}/versions/#{version}"
85
+ check_dir_exists(current_path)
86
+
87
+ process_container(name, version, port, env, manifest)
89
88
  end
89
+ end
90
90
 
91
- class Finish
92
- def initialize(port)
93
- @port = port
94
- end
91
+ private
95
92
 
96
- def to_s
97
- <<~SCRIPT
98
- #!/bin/sh
99
- sleep 3
100
- `lsof -i :#{@port} | awk 'NR!=1 {print $2}' | xargs kill`
101
- SCRIPT
93
+ def check_dir_exists(path)
94
+ sleep_times = [1, 3, 5, 8, 23]
95
+ begin
96
+ sleep_times.each do |time|
97
+ return if Dir.exist?(path)
98
+ sleep(time)
102
99
  end
100
+ raise "Directory not found: #{path}"
101
+ rescue => e
102
+ puts "Error: #{e.message}"
103
103
  end
104
+ end
104
105
 
105
- class Log
106
- def initialize(container)
107
- @container_name = container
108
- end
106
+ def process_container(name, version, port, env, manifest)
107
+ env_path = "/var/harbr/containers/#{name}/#{env}"
108
+ system "sv stop #{env}.#{name}" if env == 'next'
109
+
110
+ bundle_install_if_needed(env_path)
111
+ create_runit_scripts(name, port, env)
112
+ link_directories(name, version, env)
113
+ sync_live_data_if_next(name) if env == 'next'
109
114
 
110
- def to_s
111
- <<~SCRIPT
112
- #!/bin/sh
113
- exec svlogd -tt /var/log/harbr/#{@container_name}
114
- SCRIPT
115
+ containers = collate_containers("#{env}.#{name}", "#{env}.#{manifest.host}", port)
116
+ create_traefik_config(containers)
117
+ puts "harbr: #{version} of #{name} in #{env} environment"
118
+ end
119
+
120
+ def bundle_install_if_needed(path)
121
+ Dir.chdir(path) do
122
+ if File.exist?("Gemfile")
123
+ `bundle config set --local path 'vendor/bundle'`
124
+ system "bundle install"
115
125
  end
116
126
  end
117
127
  end
118
128
 
119
- def write_to_file(path, contents)
120
- File.write(path, contents)
129
+ def create_runit_scripts(name, port, env)
130
+ run_script = Runit::Script.new(name, port, env).run_script
131
+ finish_script = Runit::Script.new(name, port, env).finish_script
132
+ log_script = Runit::Script.new(name, port, env).log_script
133
+
134
+ write_to_file "/etc/sv/harbr/#{name}/#{env}/run", run_script
135
+ write_to_file "/etc/sv/harbr/#{name}/#{env}/finish", finish_script
136
+ write_to_file "/etc/sv/harbr/#{name}/#{env}/log/run", log_script
137
+
138
+ `chmod +x /etc/sv/harbr/#{name}/#{env}/run`
139
+ `chmod +x /etc/sv/harbr/#{name}/#{env}/log/run`
140
+ `chmod +x /etc/sv/harbr/#{name}/#{env}/finish`
121
141
  end
122
142
 
123
- def load_manifest(container, version)
124
- manifest_path = "/var/harbr/containers/#{container}/versions/#{version}/config/manifest.yml"
125
- raise "Manifest not found at #{manifest_path}" unless File.exist?(manifest_path)
126
- manifest_data = YAML.load_file(manifest_path)
127
- OpenStruct.new(manifest_data)
143
+ def link_directories(name, version, env)
144
+ `rm -f /etc/service/#{env}.#{name}`
145
+ `rm -f /var/harbr/containers/#{name}/#{env}`
146
+
147
+ `ln -sf /var/harbr/containers/#{name}/versions/#{version} /var/harbr/containers/#{name}/#{env}`
148
+ `ln -sf /etc/sv/harbr/#{name}/#{env} /etc/service/#{env}.#{name}`
128
149
  end
129
150
 
130
- def perform(name, version)
131
- Harbr.notifiable(name, version) do
132
- Dir.chdir "/var/harbr/containers/#{name}/versions/#{version}" do
133
- manifest = load_manifest(name, version)
134
- port = `port assign #{manifest.port}`.strip
135
- system "sv stop #{name}" if File.exist?("/etc/service/#{name}")
136
- if File.exist?("Gemfile")
137
- `bundle config set --local path 'vendor/bundle'`
138
- system "bundle install"
139
- end
140
-
141
- `mkdir -p /etc/sv/harbr/#{name}`
142
- `mkdir -p /etc/sv/harbr/#{name}/log`
143
- `mkdir -p /var/log/harbr/#{name}`
144
-
145
- write_to_file "/etc/sv/harbr/#{name}/run", Runit::Run.new(name, port).to_s
146
- write_to_file "/etc/sv/harbr/#{name}/finish", Runit::Finish.new(port).to_s
147
- write_to_file "/etc/sv/harbr/#{name}/log/run", Runit::Log.new(name).to_s
148
-
149
- `chmod +x /etc/sv/harbr/#{name}/run`
150
- `chmod +x /etc/sv/harbr/#{name}/log/run`
151
- `chmod +x /etc/sv/harbr/#{name}/finish`
152
-
153
- system "ln -sf /var/harbr/containers/#{name}/versions/#{version} /var/harbr/containers/#{name}/current"
154
- system "ln -sf /etc/sv/harbr/#{name} /etc/service/#{name}"
155
-
156
- containers = collate_containers(name, manifest.host, port)
157
- create_traefik_config(containers)
158
- puts "process #{version} of #{name}"
159
- end
151
+ def sync_live_data_if_next(name)
152
+ `rsync -av /var/dddr/#{name}/live /var/dddr/#{name}/next`
153
+ puts "sync live data to next"
154
+ end
155
+ end
156
+
157
+ module Runit
158
+ class Script
159
+ def initialize(container, port, env)
160
+ @container_name = container
161
+ @port = port
162
+ @env = env
163
+ end
164
+
165
+ def run_script
166
+ <<~SCRIPT
167
+ #!/bin/sh
168
+ exec 2>&1
169
+ cd /var/harbr/containers/#{@container_name}/#{@env}
170
+ exec ./exe/run #{@port} #{@env}
171
+ SCRIPT
172
+ end
173
+
174
+ def finish_script
175
+ <<~SCRIPT
176
+ #!/bin/sh
177
+ sleep 3
178
+ `lsof -i :#{@port} | awk 'NR!=1 {print $2}' | xargs kill`
179
+ SCRIPT
180
+ end
181
+
182
+ def log_script
183
+ <<~SCRIPT
184
+ #!/bin/sh
185
+ exec svlogd -tt /var/log/harbr/#{@container_name}/#{@env}/
186
+ SCRIPT
160
187
  end
161
188
  end
162
189
  end
data/lib/harbr/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Harbr
4
- VERSION = "0.1.41"
4
+ VERSION = "0.1.42"
5
5
  end
data/lib/harbr.rb CHANGED
@@ -11,7 +11,6 @@ require "resend"
11
11
  require_relative "harbr/version"
12
12
  require_relative "harbr/container"
13
13
  require_relative "harbr/job"
14
- require_relative "harbr/next/job"
15
14
 
16
15
  # Harbr module for managing containers, jobs, ports, and 2s
17
16
  module Harbr
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: harbr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.41
4
+ version: 0.1.42
5
5
  platform: ruby
6
6
  authors:
7
7
  - Delaney Kuldvee Burke
@@ -149,7 +149,6 @@ files:
149
149
  - lib/harbr.rb
150
150
  - lib/harbr/container.rb
151
151
  - lib/harbr/job.rb
152
- - lib/harbr/next/job.rb
153
152
  - lib/harbr/version.rb
154
153
  - sig/harbr.rbs
155
154
  - vendor/bundle/ruby/3.2.0/bin/bundle
@@ -1,249 +0,0 @@
1
- require "yaml"
2
- require "ostruct"
3
- require "sucker_punch"
4
-
5
- require "harbr"
6
- module Harbr
7
- module Next
8
- class Job
9
- include SuckerPunch::Job
10
-
11
-
12
- def check
13
- sleep_times = [1, 3, 5, 8, 23]
14
- begin
15
- result = yield if block_given?
16
- unless result
17
- sleep_times.each do |time|
18
- result = yield if block_given?
19
- break if result
20
- sleep(time)
21
- end
22
- end
23
- rescue => e
24
- puts "Error: #{e.message}"
25
- end
26
- end
27
-
28
- def get_container_name(path)
29
- File.basename(path)
30
- end
31
-
32
- def create_traefik_config(containers)
33
- config = {
34
- "http" => {
35
- "routers" => {
36
- "traefik-dashboard" => {
37
- "rule" => "Host(`traefik.harbr.zero2one.ee`)",
38
- "service" => "api@internal",
39
- "tls" => {} # Enable TLS for the dashboard
40
- }
41
- },
42
- "services" => {}
43
- }
44
- }
45
-
46
- containers.each do |container|
47
- container.ip = "127.0.0.1"
48
- name = container.name.tr(".", "-")
49
-
50
- # Create the router with TLS enabled and specific format
51
- router_key = "#{name}-router-secure"
52
- config["http"]["routers"][router_key] = {
53
- "rule" => "Host(`#{container.host_header}`)",
54
- "service" => "#{name}-service",
55
- "entryPoints" => ["https"],
56
- "tls" => {
57
- "certResolver" => "myresolver" # Use a custom certificate resolver
58
- }
59
- }
60
-
61
- # Create the service
62
- config["http"]["services"]["#{name}-service"] = {
63
- "loadBalancer" => {
64
- "servers" => [{"url" => "http://#{container.ip}:#{container.port}"}]
65
- }
66
- }
67
- end
68
-
69
- # Write the configuration to a TOML file
70
- File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
71
- puts "Traefik configuration written to /etc/traefik/harbr.toml"
72
- end
73
-
74
- def collate_containers(name, host, port)
75
- containers = Harbr::Container::Repository.new
76
- container = containers.find_by_header(host)
77
-
78
- if container.nil?
79
- container = Harbr::Container.new
80
- container.name = name
81
- container.host_header = host
82
- container.ip = "127.0.0.1"
83
- container.port = port
84
- containers.create(container)
85
- else
86
- container.port = port
87
- containers.update(container)
88
- end
89
- containers.all
90
- end
91
-
92
- module Runit
93
- class Run
94
- def initialize(container, port)
95
- @container_name = container
96
- @port = port
97
- end
98
-
99
- def to_s
100
- <<~SCRIPT
101
- #!/bin/sh
102
- exec 2>&1
103
- cd /var/harbr/#{@container_name}/current
104
- exec ./exe/run #{@port} live
105
- SCRIPT
106
- end
107
-
108
- def link
109
- "ln -s /etc/sv/harbr/#{@container_name} /etc/service/#{@container_name}"
110
- end
111
- end
112
-
113
- class Finish
114
- def initialize(port)
115
- @port = port
116
- end
117
-
118
- def to_s
119
- <<~SCRIPT
120
- #!/bin/sh
121
- sleep 3
122
- `lsof -i :#{@port} | awk 'NR!=1 {print $2}' | xargs kill`
123
- SCRIPT
124
- end
125
- end
126
-
127
- class Log
128
- def initialize(container, port)
129
- @container_name = container
130
- end
131
-
132
- def to_s
133
- <<~SCRIPT
134
- #!/bin/sh
135
- exec svlogd -tt /var/log/harbr/#{@container_name}/next/
136
- SCRIPT
137
- end
138
- end
139
-
140
- module Next
141
- class Run
142
- def initialize(container, port)
143
- @container_name = container
144
- @port = port
145
- end
146
-
147
- def to_s
148
- <<~SCRIPT
149
- #!/bin/sh
150
- exec 2>&1
151
- cd /var/harbr/containers/#{@container_name}/next
152
- exec ./exe/run #{@port} next
153
- SCRIPT
154
- end
155
- end
156
-
157
- class Log
158
- def initialize(container)
159
- @container_name = container
160
- end
161
-
162
- def to_s
163
- <<~SCRIPT
164
- #!/bin/sh
165
- exec svlogd -tt /var/log/harbr/#{@container_name}/next/
166
- SCRIPT
167
- end
168
- end
169
- end
170
- end
171
-
172
- def write_to_file(path, contents)
173
- File.write(path, contents)
174
- end
175
-
176
- def load_manifest(container, version)
177
- manifest_path = "/var/harbr/containers/#{container}/versions/#{version}/config/manifest.yml"
178
- raise "Manifest not found at #{manifest_path}" unless File.exist?(manifest_path)
179
- manifest_data = YAML.load_file(manifest_path)
180
- OpenStruct.new(manifest_data)
181
- end
182
-
183
- def check
184
- sleep_times = [1, 3, 5, 8, 23]
185
- begin
186
- result = yield if block_given?
187
- unless result
188
- sleep_times.each do |time|
189
- result = yield if block_given?
190
- break if result
191
- sleep(time)
192
- end
193
- end
194
- rescue => e
195
- puts "Error: #{e.message}"
196
- end
197
- end
198
-
199
- def perform(name, version)
200
- Harbr.notifiable(name, version) do
201
- manifest = load_manifest(name, version)
202
- current_path = "/var/harbr/containers/#{name}/versions/#{version}"
203
-
204
- port = `port assign next.#{manifest.port}`.strip
205
-
206
- check do
207
- puts "Waiting for container #{current_path} 5to be available..."
208
- Dir.exist?(current_path)
209
- end
210
-
211
- Dir.chdir current_path do
212
- system "sv stop next.#{name}"
213
- if File.exist?("Gemfile")
214
- `bundle config set --local path 'vendor/bundle'`
215
- system "bundle install"
216
- end
217
-
218
- `mkdir -p /etc/sv/harbr/#{name}/next`
219
- `mkdir -p /etc/sv/harbr/#{name}/next/log`
220
- `mkdir -p /var/log/harbr/#{name}/next/log`
221
-
222
- write_to_file "/etc/sv/harbr/#{name}/next/run", Runit::Next::Run.new(name, port).to_s
223
- write_to_file "/etc/sv/harbr/#{name}/next/finish", Runit::Finish.new(port).to_s
224
- write_to_file "/etc/sv/harbr/#{name}/next/log/run", Runit::Next::Log.new(name).to_s
225
-
226
- `chmod +x /etc/sv/harbr/#{name}/next/run`
227
- `chmod +x /etc/sv/harbr/#{name}/next/log/run`
228
- `chmod +x /etc/sv/harbr/#{name}/next/finish`
229
-
230
- system "rm /etc/service/next.#{name}"
231
- system "rm /var/harbr/containers/#{name}/next"
232
-
233
- system "ln -sf /var/harbr/containers/#{name}/versions/#{version} /var/harbr/containers/#{name}/next"
234
- system "ln -sf /etc/sv/harbr/#{name}/next /etc/service/next.#{name}"
235
-
236
- `rsync -av /var/dddr/#{name}/live /var/dddr/#{name}/next`
237
- puts "sync live data to next"
238
-
239
- system "sv restart next.#{name}"
240
- end
241
-
242
- containers = collate_containers("next.#{name}", "next.#{manifest.host}", port)
243
- create_traefik_config(containers)
244
- puts "harbr: #{version} of #{name} into next environment"
245
- end
246
- end
247
- end
248
- end
249
- end