harbr 0.0.75 → 0.0.76
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 +4 -4
- data/exe/harbr +4 -12
- data/lib/harbr/container.rb +1 -0
- data/lib/harbr/job.rb +169 -82
- data/lib/harbr/next/job.rb +203 -117
- data/lib/harbr/version.rb +1 -1
- data/lib/harbr.rb +83 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b82b02c1688ef82d892d9119fc16de0ee53ecc9932ac5fce1044f411ac93eaf5
|
4
|
+
data.tar.gz: e37d42b6bf195d0e9369773270b449235b5430df9670b0406d2fa99dab11b41d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 910a38e79037bced8a8e7e38cbe774f2255cc30077b83c89360207caf6067767ff5456c8e73613f71372a5d627c6f773d6498de5fbd2a5cc07f00e7a0cbd4bb1
|
7
|
+
data.tar.gz: 4d71192400148675c41d89c4ec6d3d97556822e114eca6384a4ab2b0f111fc857ba6717d92b3be3429e64a7857e10e8036bdee5ac982dd908708d5db176b666e
|
data/exe/harbr
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
require_relative "../lib/harbr"
|
3
3
|
|
4
4
|
class HarbrCLI < Thor
|
5
|
-
|
6
5
|
no_commands do
|
7
|
-
|
8
6
|
def display_containers_table(containers)
|
9
7
|
return puts "No containers available." if containers.empty?
|
10
8
|
|
@@ -78,12 +76,11 @@ class HarbrCLI < Thor
|
|
78
76
|
else
|
79
77
|
Harbr::Next::Job.perform_async(container, version)
|
80
78
|
puts "deploy next version #{version} of #{container}"
|
81
|
-
|
79
|
+
|
82
80
|
end
|
83
81
|
end
|
84
82
|
|
85
83
|
def create_traefik_config(containers)
|
86
|
-
|
87
84
|
`rm -rf "/etc/traefik/harbr.toml"`
|
88
85
|
|
89
86
|
config = {
|
@@ -115,13 +112,11 @@ class HarbrCLI < Thor
|
|
115
112
|
File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
|
116
113
|
puts "Traefik configuration written to /etc/traefik/harbr.toml"
|
117
114
|
end
|
118
|
-
|
119
115
|
end
|
120
116
|
|
121
117
|
desc "destroy", "Destroy a container and remove all traces"
|
122
118
|
def destroy(container_name)
|
123
|
-
|
124
|
-
puts "Destroying container: #{container_name}"
|
119
|
+
puts "Destroying container: #{container_name}"
|
125
120
|
puts `sv stop #{container_name}`
|
126
121
|
|
127
122
|
container_repo = Harbr::Container::Repository.new
|
@@ -129,7 +124,6 @@ class HarbrCLI < Thor
|
|
129
124
|
if container
|
130
125
|
puts `port release #{container.port}`
|
131
126
|
create_traefik_config(container_repo.all)
|
132
|
-
|
133
127
|
|
134
128
|
`rm -rf /var/harbr/#{container_name}`
|
135
129
|
`rm -rf /etc/service/#{container_name}`
|
@@ -137,23 +131,21 @@ class HarbrCLI < Thor
|
|
137
131
|
`rm -rf /var/log/harbr/#{container_name}`
|
138
132
|
|
139
133
|
`lsof -i :#{container.port} | awk 'NR!=1 {print $2}' | xargs kill`
|
140
|
-
container_repo.delete(container)
|
134
|
+
container_repo.delete(container)
|
141
135
|
|
142
136
|
puts "Container #{container_name} destroyed successfully."
|
143
137
|
|
144
138
|
else
|
145
139
|
puts "Container #{container_name} not found."
|
146
140
|
end
|
147
|
-
|
148
141
|
end
|
149
142
|
|
150
143
|
desc "logs CONTAINER", "Show logs for a given container"
|
151
144
|
def logs(container)
|
152
|
-
|
153
145
|
container_repo = Harbr::Container::Repository.new
|
154
146
|
container = container_repo.find_by_name(container)
|
155
147
|
if container
|
156
|
-
exec "tail -f /var/log/harbr/#{container.name}/current"
|
148
|
+
exec "tail -f /var/log/harbr/#{container.name}/current"
|
157
149
|
else
|
158
150
|
puts "Container not recognized"
|
159
151
|
end
|
data/lib/harbr/container.rb
CHANGED
data/lib/harbr/job.rb
CHANGED
@@ -1,14 +1,32 @@
|
|
1
|
+
require 'harbr'
|
1
2
|
module Harbr
|
2
3
|
class Job
|
3
4
|
include SuckerPunch::Job
|
4
5
|
|
5
|
-
def
|
6
|
-
|
7
|
-
|
8
|
-
manifest_data = YAML.load_file(manifest_path)
|
9
|
-
OpenStruct.new(manifest_data)
|
6
|
+
def highest_numbered_directory(path)
|
7
|
+
directories = Dir.glob("#{path}/*").select { |entry| File.directory?(entry) }
|
8
|
+
directories.max_by { |entry| entry[/\d+/].to_i }
|
10
9
|
end
|
11
|
-
|
10
|
+
|
11
|
+
def get_container_name(path)
|
12
|
+
File.basename(path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def check_container_version(name, version)
|
16
|
+
file_path = '/var/harbr/.data/processed_next.txt' # replace with your file path
|
17
|
+
`touch #{file_path}`
|
18
|
+
container_version = "#{name},#{version}"
|
19
|
+
|
20
|
+
File.open(file_path, 'r') do |file|
|
21
|
+
if file.any? { |line| line.chomp == container_version }
|
22
|
+
puts 'containerised'
|
23
|
+
else
|
24
|
+
result = yield name, version
|
25
|
+
File.write(file_path, "#{container_version}\n", mode: 'a') unless result == false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
12
30
|
def create_traefik_config(containers)
|
13
31
|
config = {
|
14
32
|
"http" => {
|
@@ -21,102 +39,171 @@ module Harbr
|
|
21
39
|
"services" => {}
|
22
40
|
}
|
23
41
|
}
|
24
|
-
|
42
|
+
|
25
43
|
containers.each do |container|
|
26
44
|
container.ip = "127.0.0.1"
|
27
|
-
|
28
|
-
|
45
|
+
name = container.name.gsub(".","-")
|
46
|
+
|
47
|
+
config["http"]["routers"]["#{name}-router"] = {
|
29
48
|
"rule" => "Host(`#{container.host_header}`)",
|
30
|
-
"service" => "#{
|
49
|
+
"service" => "#{name}-service"
|
31
50
|
}
|
32
|
-
config["http"]["services"]["#{
|
51
|
+
config["http"]["services"]["#{name}-service"] = {
|
33
52
|
"loadBalancer" => {
|
34
53
|
"servers" => [{"url" => "http://#{container.ip}:#{container.port}"}]
|
35
54
|
}
|
36
55
|
}
|
37
56
|
end
|
38
|
-
|
57
|
+
|
39
58
|
File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
|
40
59
|
puts "Traefik configuration written to /etc/traefik/harbr.toml"
|
41
60
|
end
|
42
|
-
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
exec 2>&1
|
49
|
-
cd /var/harbr/#{container_name}/current
|
50
|
-
exec ./exe/run #{port}
|
51
|
-
SCRIPT
|
52
|
-
|
53
|
-
service_dir = "/etc/sv/harbr/#{container_name}"
|
54
|
-
FileUtils.mkdir_p(service_dir)
|
55
|
-
|
56
|
-
File.write("#{service_dir}/run", script_template)
|
57
|
-
FileUtils.chmod("+x", "#{service_dir}/run")
|
58
|
-
puts "Run script created and made executable for container: #{container_name}"
|
59
|
-
end
|
60
|
-
|
61
|
-
def create_log_script(container_name)
|
62
|
-
log_dir = "/var/log/harbr/#{container_name}"
|
63
|
-
|
64
|
-
FileUtils.mkdir_p(log_dir)
|
65
|
-
|
66
|
-
script_template = <<~SCRIPT
|
67
|
-
#!/bin/sh
|
68
|
-
exec svlogd -tt #{log_dir}/
|
69
|
-
SCRIPT
|
70
|
-
|
71
|
-
dir_path = "/etc/sv/harbr/#{container_name}/log"
|
72
|
-
FileUtils.mkdir_p(dir_path)
|
73
|
-
|
74
|
-
File.write("#{dir_path}/run", script_template)
|
75
|
-
FileUtils.chmod("+x", "#{dir_path}/run")
|
76
|
-
puts "Log script created and made executable for container: #{container_name}"
|
77
|
-
end
|
78
|
-
|
79
|
-
def create_a_service(container_name, port)
|
80
|
-
create_run_script(container_name, port)
|
81
|
-
create_log_script(container_name)
|
82
|
-
system("ln -s /etc/sv/harbr/#{container_name} /etc/service/#{container_name}") unless File.exist?("/etc/service/#{container_name}")
|
83
|
-
end
|
84
|
-
|
85
|
-
def run_container(manifest)
|
86
|
-
puts "Starting container: #{manifest.name}"
|
87
|
-
port = `port assign #{manifest.port}`.strip
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
create_a_service(manifest.name, port)
|
92
|
-
|
93
|
-
containers = Container::Repository.new
|
94
|
-
container = containers.find_by_header(manifest.host)
|
95
|
-
|
61
|
+
|
62
|
+
def collate_containers(name,host,port)
|
63
|
+
|
64
|
+
containers = Harbr::Container::Repository.new
|
65
|
+
container = containers.find_by_header(host)
|
66
|
+
|
96
67
|
if container.nil?
|
97
|
-
container = Container.new
|
98
|
-
container.name =
|
99
|
-
container.host_header =
|
68
|
+
container = Harbr::Container.new
|
69
|
+
container.name = name
|
70
|
+
container.host_header =host
|
100
71
|
container.ip = "127.0.0.1"
|
101
72
|
container.port = port
|
102
73
|
containers.create(container)
|
103
74
|
else
|
104
|
-
container.port = port
|
105
|
-
containers.update(container)
|
75
|
+
container.port = port
|
76
|
+
containers.update(container)
|
106
77
|
end
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
78
|
+
containers.all
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
module Runit
|
83
|
+
|
84
|
+
class Run
|
85
|
+
def initialize(container, port)
|
86
|
+
@container_name = container
|
87
|
+
@port = port
|
88
|
+
end
|
89
|
+
|
90
|
+
def to_s
|
91
|
+
script_template = <<~SCRIPT
|
92
|
+
#!/bin/sh
|
93
|
+
exec 2>&1
|
94
|
+
cd /var/harbr/#{@container_name}/current
|
95
|
+
exec ./exe/run #{@port}
|
96
|
+
SCRIPT
|
97
|
+
end
|
98
|
+
|
99
|
+
def link
|
100
|
+
"ln -s /etc/sv/harbr/#{@container_name} /etc/service/#{@container_name}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
class Finish
|
106
|
+
def initialize(port)
|
107
|
+
@port = port
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_s
|
111
|
+
script_template = <<~SCRIPT
|
112
|
+
#!/bin/sh
|
113
|
+
sleep 3
|
114
|
+
`lsof -i :#{@port} | awk 'NR!=1 {print $2}' | xargs kill`
|
115
|
+
SCRIPT
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class Log
|
120
|
+
def initialize(container, port)
|
121
|
+
@container_name = container
|
122
|
+
end
|
123
|
+
|
124
|
+
def to_s
|
125
|
+
script_template = <<~SCRIPT
|
126
|
+
#!/bin/sh
|
127
|
+
exec svlogd -tt /var/log/harbr/#{@container_name}/next/
|
128
|
+
SCRIPT
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
module Next
|
134
|
+
|
135
|
+
class Run
|
136
|
+
def initialize(container, port)
|
137
|
+
@container_name = container
|
138
|
+
@port = port
|
139
|
+
end
|
140
|
+
|
141
|
+
def to_s
|
142
|
+
script_template = <<~SCRIPT
|
143
|
+
#!/bin/sh
|
144
|
+
exec 2>&1
|
145
|
+
cd /var/harbr/containers/#{@container_name}/next
|
146
|
+
exec ./exe/run #{@port}
|
147
|
+
SCRIPT
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
class Log
|
152
|
+
def initialize(container)
|
153
|
+
@container_name = container
|
154
|
+
end
|
155
|
+
|
156
|
+
def to_s
|
157
|
+
script_template = <<~SCRIPT
|
158
|
+
#!/bin/sh
|
159
|
+
exec svlogd -tt /var/log/harbr/#{@container_name}/next/
|
160
|
+
SCRIPT
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def write_to_file(path, contents)
|
168
|
+
File.open(path, 'w') do |file|
|
169
|
+
file.write(contents)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def load_manifest(container, version)
|
174
|
+
manifest_path = "/var/harbr/containers/#{container}/versions/#{version}/config/manifest.yml"
|
175
|
+
raise "Manifest not found at #{manifest_path}" unless File.exist?(manifest_path)
|
176
|
+
manifest_data = YAML.load_file(manifest_path)
|
177
|
+
OpenStruct.new(manifest_data)
|
113
178
|
end
|
114
179
|
|
115
|
-
def perform(
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
180
|
+
def perform(name,version)
|
181
|
+
Dir.chdir "/var/harbr/containers/#{name}/versions/#{version}" do
|
182
|
+
`bundle config set --local path 'vendor/bundle'`
|
183
|
+
manifest = load_manifest(name, version)
|
184
|
+
port = `port assign next.#{manifest.port}`.strip
|
185
|
+
system "sv stop #{name}"
|
186
|
+
system 'bundle install'
|
187
|
+
`mkdir -p /etc/sv/harbr/#{name}`
|
188
|
+
`mkdir -p /etc/sv/harbr/#{name}/log`
|
189
|
+
|
190
|
+
write_to_file "/etc/sv/harbr/#{name}/run", Runit::Next::Run.new(name, port).to_s
|
191
|
+
write_to_file "/etc/sv/harbr/#{name}/finish", Runit::Finish.new(port).to_s
|
192
|
+
write_to_file "/etc/sv/harbr/#{name}/log/run", Runit::Next::Log.new(name).to_s
|
193
|
+
|
194
|
+
`chmod +x /etc/sv/harbr/#{name}/run`
|
195
|
+
`chmod +x /etc/sv/harbr/#{name}/log/run`
|
196
|
+
`chmod +x /etc/sv/harbr/#{name}/finish`
|
197
|
+
|
198
|
+
system "ln -s /var/harbr/containers/#{name}/versions/#{version} /var/harbr/containers/#{name}/current"
|
199
|
+
system "ln -s /etc/sv/harbr/#{name}/next /etc/service/#{name}"
|
200
|
+
|
201
|
+
containers = collate_containers(name, manifest.host, port)
|
202
|
+
create_traefik_config(containers)
|
203
|
+
puts "process #{version} of #{name}"
|
204
|
+
end
|
120
205
|
end
|
206
|
+
|
121
207
|
end
|
208
|
+
|
122
209
|
end
|
data/lib/harbr/next/job.rb
CHANGED
@@ -1,122 +1,78 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'ostruct'
|
3
|
+
require 'sucker_punch'
|
4
|
+
|
5
|
+
require 'harbr'
|
1
6
|
module Harbr
|
2
7
|
module Next
|
3
8
|
class Job
|
4
9
|
include SuckerPunch::Job
|
5
10
|
|
6
|
-
def
|
7
|
-
|
8
|
-
|
9
|
-
manifest_data = YAML.load_file(manifest_path)
|
10
|
-
OpenStruct.new(manifest_data)
|
11
|
+
def highest_numbered_directory(path)
|
12
|
+
directories = Dir.glob("#{path}/*").select { |entry| File.directory?(entry) }
|
13
|
+
directories.max_by { |entry| entry[/\d+/].to_i }
|
11
14
|
end
|
12
|
-
|
13
15
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
def get_container_name(path)
|
17
|
+
File.basename(path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def check_container_version(name, version)
|
21
|
+
file_path = '/var/harbr/.data/processed_next.txt' # replace with your file path
|
22
|
+
`touch #{file_path}`
|
23
|
+
container_version = "#{name},#{version}"
|
24
|
+
|
25
|
+
File.open(file_path, 'r') do |file|
|
26
|
+
if file.any? { |line| line.chomp == container_version }
|
27
|
+
puts 'containerised'
|
28
|
+
else
|
29
|
+
result = yield name, version
|
30
|
+
File.write(file_path, "#{container_version}\n", mode: 'a') unless result == false
|
31
|
+
end
|
21
32
|
end
|
22
|
-
|
23
|
-
write_config_to_file(config)
|
24
33
|
end
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
'rule' => 'Host(`traefik.harbr.zero2one.ee`)',
|
34
|
-
'service' => 'api@internal'
|
34
|
+
|
35
|
+
def create_traefik_config(containers)
|
36
|
+
config = {
|
37
|
+
"http" => {
|
38
|
+
"routers" => {
|
39
|
+
"traefik-dashboard" => {
|
40
|
+
"rule" => "Host(`traefik.harbr.zero2one.ee`)",
|
41
|
+
"service" => "api@internal"
|
35
42
|
}
|
36
43
|
},
|
37
|
-
|
44
|
+
"services" => {}
|
38
45
|
}
|
39
46
|
}
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
def add_service_to_config(config, container)
|
50
|
-
config['http']['services']["#{container.name}-service"] = {
|
51
|
-
'loadBalancer' => {
|
52
|
-
'servers' => [{'url' => "http://#{container.ip}:#{container.port}"}]
|
47
|
+
|
48
|
+
containers.each do |container|
|
49
|
+
container.ip = "127.0.0.1"
|
50
|
+
name = container.name.gsub(".","-")
|
51
|
+
|
52
|
+
config["http"]["routers"]["#{name}-router"] = {
|
53
|
+
"rule" => "Host(`#{container.host_header}`)",
|
54
|
+
"service" => "#{name}-service"
|
53
55
|
}
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
end
|
56
|
+
config["http"]["services"]["#{name}-service"] = {
|
57
|
+
"loadBalancer" => {
|
58
|
+
"servers" => [{"url" => "http://#{container.ip}:#{container.port}"}]
|
59
|
+
}
|
60
|
+
}
|
61
|
+
end
|
61
62
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
script_template = <<~SCRIPT
|
66
|
-
#!/bin/sh
|
67
|
-
exec 2>&1
|
68
|
-
cd /var/harbr/#{container_name}/next
|
69
|
-
exec ./exe/run #{port}
|
70
|
-
SCRIPT
|
71
|
-
|
72
|
-
service_dir = "/etc/sv/harbr/#{container_name}/next"
|
73
|
-
FileUtils.mkdir_p(service_dir)
|
74
|
-
|
75
|
-
File.write("#{service_dir}/run", script_template)
|
76
|
-
FileUtils.chmod("+x", "#{service_dir}/run")
|
77
|
-
puts "Run script created and made executable for container: next.#{container_name}"
|
78
|
-
end
|
79
|
-
|
80
|
-
def create_log_script(container_name)
|
81
|
-
log_dir = "/var/log/harbr/#{container_name}/next"
|
82
|
-
|
83
|
-
FileUtils.mkdir_p(log_dir)
|
84
|
-
|
85
|
-
script_template = <<~SCRIPT
|
86
|
-
#!/bin/sh
|
87
|
-
exec svlogd -tt #{log_dir}/
|
88
|
-
SCRIPT
|
89
|
-
|
90
|
-
dir_path = "/etc/sv/harbr/#{container_name}/next/log"
|
91
|
-
FileUtils.mkdir_p(dir_path)
|
92
|
-
|
93
|
-
File.write("#{dir_path}/run", script_template)
|
94
|
-
FileUtils.chmod("+x", "#{dir_path}/run")
|
95
|
-
puts "Log script created and made executable for container: next.#{container_name}"
|
96
|
-
end
|
97
|
-
def create_a_service(container_name, port)
|
98
|
-
create_run_script(container_name, port)
|
99
|
-
create_log_script(container_name)
|
100
|
-
|
101
|
-
system("ln -s /etc/sv/harbr/#{container_name}/next /etc/service/next.#{container_name}") unless File.exist?("/etc/service/next.#{container_name}")
|
63
|
+
File.write("/etc/traefik/harbr.toml", TomlRB.dump(config))
|
64
|
+
puts "Traefik configuration written to /etc/traefik/harbr.toml"
|
102
65
|
end
|
103
|
-
|
104
|
-
def
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
`rm -rf /etc/sv/harbr/#{manifest.name}/next`
|
110
|
-
|
111
|
-
create_a_service(manifest.name, port)
|
112
|
-
|
113
|
-
containers = Container::Repository.new
|
114
|
-
container = containers.find_by_header("next.#{manifest.host}")
|
115
|
-
|
66
|
+
|
67
|
+
def collate_containers(name,host,port)
|
68
|
+
|
69
|
+
containers = Harbr::Container::Repository.new
|
70
|
+
container = containers.find_by_header(host)
|
71
|
+
|
116
72
|
if container.nil?
|
117
|
-
container = Container.new
|
118
|
-
container.name =
|
119
|
-
container.host_header =
|
73
|
+
container = Harbr::Container.new
|
74
|
+
container.name = name
|
75
|
+
container.host_header =host
|
120
76
|
container.ip = "127.0.0.1"
|
121
77
|
container.port = port
|
122
78
|
containers.create(container)
|
@@ -124,27 +80,157 @@ module Harbr
|
|
124
80
|
container.port = port
|
125
81
|
containers.update(container)
|
126
82
|
end
|
83
|
+
containers.all
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
module Runit
|
88
|
+
|
89
|
+
class Run
|
90
|
+
def initialize(container, port)
|
91
|
+
@container_name = container
|
92
|
+
@port = port
|
93
|
+
end
|
94
|
+
|
95
|
+
def to_s
|
96
|
+
script_template = <<~SCRIPT
|
97
|
+
#!/bin/sh
|
98
|
+
exec 2>&1
|
99
|
+
cd /var/harbr/#{@container_name}/current
|
100
|
+
exec ./exe/run #{@port}
|
101
|
+
SCRIPT
|
102
|
+
end
|
103
|
+
|
104
|
+
def link
|
105
|
+
"ln -s /etc/sv/harbr/#{@container_name} /etc/service/#{@container_name}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
class Finish
|
111
|
+
def initialize(port)
|
112
|
+
@port = port
|
113
|
+
end
|
114
|
+
|
115
|
+
def to_s
|
116
|
+
script_template = <<~SCRIPT
|
117
|
+
#!/bin/sh
|
118
|
+
sleep 3
|
119
|
+
`lsof -i :#{@port} | awk 'NR!=1 {print $2}' | xargs kill`
|
120
|
+
SCRIPT
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
class Log
|
125
|
+
def initialize(container, port)
|
126
|
+
@container_name = container
|
127
|
+
end
|
128
|
+
|
129
|
+
def to_s
|
130
|
+
script_template = <<~SCRIPT
|
131
|
+
#!/bin/sh
|
132
|
+
exec svlogd -tt /var/log/harbr/#{@container_name}/next/
|
133
|
+
SCRIPT
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
module Next
|
139
|
+
|
140
|
+
class Run
|
141
|
+
def initialize(container, port)
|
142
|
+
@container_name = container
|
143
|
+
@port = port
|
144
|
+
end
|
145
|
+
|
146
|
+
def to_s
|
147
|
+
script_template = <<~SCRIPT
|
148
|
+
#!/bin/sh
|
149
|
+
exec 2>&1
|
150
|
+
cd /var/harbr/containers/#{@container_name}/next
|
151
|
+
exec ./exe/run #{@port}
|
152
|
+
SCRIPT
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class Log
|
157
|
+
def initialize(container)
|
158
|
+
@container_name = container
|
159
|
+
end
|
160
|
+
|
161
|
+
def to_s
|
162
|
+
script_template = <<~SCRIPT
|
163
|
+
#!/bin/sh
|
164
|
+
exec svlogd -tt /var/log/harbr/#{@container_name}/next/
|
165
|
+
SCRIPT
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def write_to_file(path, contents)
|
173
|
+
File.open(path, 'w') do |file|
|
174
|
+
file.write(contents)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def load_manifest(container, version)
|
179
|
+
manifest_path = "/var/harbr/containers/#{container}/versions/#{version}/config/manifest.yml"
|
180
|
+
raise "Manifest not found at #{manifest_path}" unless File.exist?(manifest_path)
|
181
|
+
manifest_data = YAML.load_file(manifest_path)
|
182
|
+
OpenStruct.new(manifest_data)
|
183
|
+
end
|
127
184
|
|
185
|
+
def perform
|
186
|
+
`bundle config set --local path 'vendor/bundle'`
|
187
|
+
`rm /var/harbr/.data/processed_next.txt`
|
128
188
|
|
189
|
+
Dir.glob('/var/harbr/containers/*').select { |f| File.directory? f }.each do |container_path|
|
190
|
+
latest_version = highest_numbered_directory("#{container_path}/versions")
|
191
|
+
|
192
|
+
version = get_container_name(latest_version)
|
193
|
+
name = get_container_name(container_path)
|
194
|
+
manifest = load_manifest(name,version)
|
129
195
|
|
130
|
-
|
131
|
-
system("sv restart next.#{manifest.name}")
|
132
|
-
puts "Started container: next.#{manifest.name}"
|
133
|
-
|
134
|
-
system("ln -s /var/harbr/#{manifest.name}/versions/#{manifest.version}/ /etc/sv/harbr/#{manifest.name}/next")
|
135
|
-
puts "Linked to: /etc/sv/harbr/#{manifest.name}/next"
|
136
|
-
|
137
|
-
|
196
|
+
check_container_version(name, version) do
|
138
197
|
|
139
|
-
|
140
|
-
|
198
|
+
current_path = "/var/harbr/containers/#{name}/versions/#{version}"
|
199
|
+
|
200
|
+
port = `port assign next.#{manifest.port}`.strip
|
201
|
+
|
202
|
+
Dir.chdir current_path do
|
203
|
+
|
204
|
+
system "sv stop #{name}"
|
205
|
+
system "bundle install"
|
206
|
+
|
207
|
+
`mkdir -p /etc/sv/harbr/#{name}/next`
|
208
|
+
`mkdir -p /etc/sv/harbr/#{name}/next/log`
|
209
|
+
`mkdir -p /var/log/harbr/#{name}/next/log`
|
210
|
+
|
211
|
+
write_to_file "/etc/sv/harbr/#{name}/next/run", Runit::Next::Run.new(name,port).to_s
|
212
|
+
write_to_file "/etc/sv/harbr/#{name}/next/finish", Runit::Finish.new(port).to_s
|
213
|
+
write_to_file "/etc/sv/harbr/#{name}/next/log/run", Runit::Next::Log.new(name).to_s
|
214
|
+
|
215
|
+
`chmod +x /etc/sv/harbr/#{name}/next/run`
|
216
|
+
`chmod +x /etc/sv/harbr/#{name}/next/log/run`
|
217
|
+
`chmod +x /etc/sv/harbr/#{name}/next/finish`
|
218
|
+
|
219
|
+
|
220
|
+
system "ln -s /var/harbr/containers/#{name}/versions/#{version} /var/harbr/containers/#{name}/next"
|
221
|
+
system "ln -s /etc/sv/harbr/#{name}/next /etc/service/next.#{name}"
|
222
|
+
|
223
|
+
containers = collate_containers("next.#{name}","next.#{manifest.host}",port)
|
224
|
+
create_traefik_config(containers)
|
225
|
+
end
|
226
|
+
|
227
|
+
puts "process #{version} of #{name}"
|
228
|
+
end
|
229
|
+
end
|
141
230
|
|
142
|
-
def perform(container, version)
|
143
|
-
puts "Running tasks for container: 'next.#{container}', Version: '#{version}'"
|
144
|
-
manifest = load_manifest(container, version)
|
145
|
-
puts "Manifest: #{manifest}"
|
146
|
-
run_container(manifest)
|
147
231
|
end
|
232
|
+
|
148
233
|
end
|
234
|
+
|
149
235
|
end
|
150
236
|
end
|
data/lib/harbr/version.rb
CHANGED
data/lib/harbr.rb
CHANGED
@@ -12,12 +12,94 @@ require_relative "harbr/container"
|
|
12
12
|
require_relative "harbr/job"
|
13
13
|
require_relative "harbr/next/job"
|
14
14
|
|
15
|
-
|
16
15
|
# Harbr module for managing containers, jobs, ports, and 2s
|
17
16
|
module Harbr
|
18
17
|
DEFAULT_DIRECTORY = "/var/harbr"
|
19
18
|
DEFAULT_DIRECTORY_DATA_DIR = "#{DEFAULT_DIRECTORY}/.data"
|
20
19
|
class Error < StandardError; end
|
20
|
+
|
21
|
+
def self.highest_numbered_directory(path)
|
22
|
+
directories = Dir.glob("#{path}/*").select { |entry| File.directory?(entry) }
|
23
|
+
directories.max_by { |entry| entry[/\d+/].to_i }
|
24
|
+
end
|
25
|
+
|
26
|
+
module Runit
|
27
|
+
class Run
|
28
|
+
def initialize(container, port)
|
29
|
+
@container_name = container
|
30
|
+
@port = port
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
<<~SCRIPT
|
35
|
+
#!/bin/sh
|
36
|
+
exec 2>&1
|
37
|
+
cd /var/harbr/#{@container_name}/current
|
38
|
+
exec ./exe/run #{@port}
|
39
|
+
SCRIPT
|
40
|
+
end
|
41
|
+
|
42
|
+
def link
|
43
|
+
"ln -s /etc/sv/harbr/#{@container_name} /etc/service/#{@container_name}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class Log
|
48
|
+
def initialize(container, port)
|
49
|
+
@container_name = container
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_s
|
53
|
+
<<~SCRIPT
|
54
|
+
#!/bin/sh
|
55
|
+
exec svlogd -tt /var/log/harbr/#{@container_name}/next/
|
56
|
+
SCRIPT
|
57
|
+
end
|
58
|
+
|
59
|
+
def link
|
60
|
+
"ln -s /etc/sv/harbr/#{@container_name}/log /etc/service/#{@container_name}/log"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
module Next
|
65
|
+
class Run
|
66
|
+
def initialize(container, port)
|
67
|
+
@container_name = container
|
68
|
+
@port = port
|
69
|
+
end
|
70
|
+
|
71
|
+
def to_s
|
72
|
+
<<~SCRIPT
|
73
|
+
#!/bin/sh
|
74
|
+
exec 2>&1
|
75
|
+
cd /var/harbr/#{@container_name}/next
|
76
|
+
exec ./exe/run #{@port}
|
77
|
+
SCRIPT
|
78
|
+
end
|
79
|
+
|
80
|
+
def link
|
81
|
+
"ln -s /etc/sv/harbr/#{@container_name}/next /etc/service/next.#{@container_name}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class Log
|
86
|
+
def initialize(container, port)
|
87
|
+
@container_name = container
|
88
|
+
end
|
89
|
+
|
90
|
+
def to_s
|
91
|
+
<<~SCRIPT
|
92
|
+
#!/bin/sh
|
93
|
+
exec svlogd -tt /var/log/harbr/#{@container_name}/next/
|
94
|
+
SCRIPT
|
95
|
+
end
|
96
|
+
|
97
|
+
def link
|
98
|
+
"ln -s /etc/sv/harbr/#{container_name}/next/log/ /etc/service/next.#{container_name}/log"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
21
103
|
end
|
22
104
|
|
23
105
|
Dddr.configure do |config|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: harbr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.76
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delaney Kuldvee Burke
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-12-
|
11
|
+
date: 2023-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: listen
|