lbhrr 1.0.6 → 1.0.10
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/config/manifest.yml +5 -0
- data/exe/lbhrr +163 -101
- data/lbhrr.gemspec +1 -1
- data/lib/lbhrr/version.rb +1 -1
- data/lib/lbhrr.rb +11 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '008a4e46f26124d5ddb1ff4a332779770038696ed6a2cfb2b1c8a6de7dddefdc'
|
4
|
+
data.tar.gz: 41a0c0acd33bd7a31c361fa6f626909011e69be41933c77e688544ecc5800991
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 807c2b1f37b43aad26e88c195250452635107b12e32e15dd5f48894ef50c37e10b36620ec84844f1734becc133a32e970e179f774b071718b79f278d68b689dd
|
7
|
+
data.tar.gz: a40ef0cbf0be98afff535f95b864988cf022a8ba35d8e5909715eeaab866791eed1bdf0290dc483d17e2a333b3fbb7fb4fcb44ce88fd9714d9a0be470a1a7ada
|
data/config/manifest.yml
ADDED
data/exe/lbhrr
CHANGED
@@ -1,31 +1,53 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'yaml'
|
4
|
-
require 'tempfile'
|
5
|
-
require 'fileutils'
|
2
|
+
require_relative "../lib/lbhrr"
|
6
3
|
|
7
4
|
class LbhrrCLI < Thor
|
8
5
|
no_commands do
|
6
|
+
def package
|
7
|
+
# Load configuration
|
8
|
+
config = load_configuration
|
9
|
+
host = config["host"]
|
10
|
+
user = config["user"]
|
11
|
+
port = config["port"]
|
12
|
+
version = config["version"].to_i
|
13
|
+
raise "Configuration error: Host, User, or Version missing" unless host && port && user && version > 0
|
14
|
+
|
15
|
+
# Check for a git repository
|
16
|
+
unless `git rev-parse --is-inside-work-tree > /dev/null 2>&1`
|
17
|
+
raise "No Git repository found in the current directory"
|
18
|
+
end
|
19
|
+
|
20
|
+
# Delete vendor directory if it exists
|
21
|
+
vendor_path = File.join(Dir.pwd, "vendor")
|
22
|
+
FileUtils.rm_rf(vendor_path) if Dir.exist?(vendor_path)
|
23
|
+
`bundle config set --local path 'vendor/bundle'`
|
24
|
+
`bundle install` or raise "Bundle install failed"
|
25
|
+
# Check if the repository is clean
|
26
|
+
puts "Git repository is dirty, committing changes..."
|
27
|
+
`git add .` or raise "Failed to add changes to Git"
|
28
|
+
`git commit -m 'packaged #{version}'` or raise "Failed to commit changes to Git"
|
29
|
+
puts "Packaging completed successfully."
|
30
|
+
rescue => e
|
31
|
+
puts "Packaging error: #{e.message}"
|
32
|
+
end
|
9
33
|
|
10
34
|
def amend_last_commit(new_message)
|
11
|
-
|
12
|
-
|
13
|
-
system("git rev-parse --git-dir > /dev/null 2>&1") or raise "Not a git repository"
|
35
|
+
# Ensure we are in a git repository
|
36
|
+
system("git rev-parse --git-dir > /dev/null 2>&1") or raise "Not a git repository"
|
14
37
|
|
15
|
-
|
16
|
-
|
38
|
+
# Amend the last commit with the new message
|
39
|
+
system("git commit --amend -m \"#{new_message}\"") or raise "Failed to amend the last commit"
|
17
40
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
41
|
+
puts "Successfully amended the last commit."
|
42
|
+
rescue => e
|
43
|
+
puts "Error during commit amend: #{e.message}"
|
22
44
|
end
|
23
45
|
|
24
46
|
def create_gitignore
|
25
|
-
gitignore_path = File.join(Dir.pwd,
|
47
|
+
gitignore_path = File.join(Dir.pwd, ".gitignore")
|
26
48
|
return if File.exist?(gitignore_path)
|
27
49
|
|
28
|
-
gitignore_content =
|
50
|
+
gitignore_content = '
|
29
51
|
# Ignore bundler config and installed gems.
|
30
52
|
/.bundle
|
31
53
|
# Ignore all logfiles and tempfiles.
|
@@ -42,7 +64,7 @@ class LbhrrCLI < Thor
|
|
42
64
|
.DS_Store
|
43
65
|
.idea
|
44
66
|
.byebug_history
|
45
|
-
|
67
|
+
'
|
46
68
|
|
47
69
|
File.write(gitignore_path, gitignore_content.strip)
|
48
70
|
puts ".gitignore created for Rack project."
|
@@ -50,11 +72,10 @@ class LbhrrCLI < Thor
|
|
50
72
|
puts "Error creating .gitignore: #{e.message}"
|
51
73
|
end
|
52
74
|
|
53
|
-
def deployed(version)
|
75
|
+
def deployed(local_manifest_path, version)
|
54
76
|
# Git add all changes
|
77
|
+
increment_version(local_manifest_path, version)
|
55
78
|
system("git add .") or raise "Failed to add changes to Git"
|
56
|
-
|
57
|
-
|
58
79
|
# Commit changes with a message
|
59
80
|
commit_message = "Deployed version #{version}"
|
60
81
|
amend_last_commit commit_message
|
@@ -69,26 +90,41 @@ class LbhrrCLI < Thor
|
|
69
90
|
|
70
91
|
def create_example_global_config
|
71
92
|
example_global_config = {
|
72
|
-
|
73
|
-
|
93
|
+
"user" => "root",
|
94
|
+
"host" => "harbr.zero2one.ee"
|
74
95
|
}
|
75
96
|
YAML.dump(example_global_config)
|
76
97
|
end
|
77
98
|
|
99
|
+
def create_run_file
|
100
|
+
run_file_path = File.join(Dir.pwd, "exe", "run")
|
101
|
+
run_file_content = "#!/bin/sh\nbundle exec puma -p $1"
|
102
|
+
exe_directory = File.join(Dir.pwd, "exe")
|
103
|
+
|
104
|
+
Dir.mkdir(exe_directory) unless Dir.exist?(exe_directory)
|
105
|
+
File.write(run_file_path, run_file_content)
|
106
|
+
File.chmod(0o755, run_file_path) # Set executable permission
|
107
|
+
|
108
|
+
puts "Created ./exe/run file."
|
109
|
+
rescue => e
|
110
|
+
puts "Error creating ./exe/run file: #{e.message}"
|
111
|
+
end
|
112
|
+
|
78
113
|
def create_example_local_config
|
79
114
|
example_local_config = {
|
80
|
-
|
81
|
-
|
82
|
-
|
115
|
+
"name" => File.basename(Dir.pwd),
|
116
|
+
"version" => "0",
|
117
|
+
"port" => "#{File.basename(Dir.pwd)}.app",
|
118
|
+
"host" => "#{File.basename(Dir.pwd)}.harbr.zero2one.ee"
|
83
119
|
}
|
84
120
|
|
85
121
|
YAML.dump(example_local_config)
|
86
122
|
end
|
87
123
|
|
88
124
|
def load_configuration
|
89
|
-
global_config_dir = File.expand_path(
|
90
|
-
global_config_path = File.join(global_config_dir,
|
91
|
-
local_config_path = File.join(Dir.pwd,
|
125
|
+
global_config_dir = File.expand_path("~/.config/harbr")
|
126
|
+
global_config_path = File.join(global_config_dir, "harbr.manifest.yml")
|
127
|
+
local_config_path = File.join(Dir.pwd, "config", "manifest.yml")
|
92
128
|
|
93
129
|
# Ensure global configuration exists
|
94
130
|
unless File.exist?(global_config_path)
|
@@ -99,7 +135,7 @@ class LbhrrCLI < Thor
|
|
99
135
|
# Ensure local configuration exists
|
100
136
|
unless File.exist?(local_config_path)
|
101
137
|
FileUtils.mkdir_p(File.dirname(local_config_path)) unless Dir.exist?(File.dirname(local_config_path))
|
102
|
-
File.write(local_config_path, create_example_local_config
|
138
|
+
File.write(local_config_path, create_example_local_config)
|
103
139
|
end
|
104
140
|
|
105
141
|
# Load and merge configurations
|
@@ -112,108 +148,134 @@ class LbhrrCLI < Thor
|
|
112
148
|
new_version = current_version + 1
|
113
149
|
|
114
150
|
manifest = YAML.load_file(manifest_path)
|
115
|
-
manifest[
|
116
|
-
File.
|
151
|
+
manifest["version"] = new_version
|
152
|
+
File.write(manifest_path, manifest.to_yaml)
|
117
153
|
puts "Version incremented to #{new_version}"
|
118
|
-
|
119
154
|
end
|
120
|
-
|
121
155
|
end
|
122
156
|
|
123
157
|
desc "init", "Initialize project with .gitignore"
|
124
158
|
def init
|
125
|
-
|
126
|
-
local_config_path = File.join(Dir.pwd, 'config', 'manifest.yml')
|
159
|
+
local_config_path = File.join(Dir.pwd, "config", "manifest.yml")
|
127
160
|
|
128
161
|
unless File.exist?(local_config_path)
|
129
162
|
FileUtils.mkdir_p(File.dirname(local_config_path)) unless Dir.exist?(File.dirname(local_config_path))
|
130
|
-
File.write(local_config_path, create_example_local_config
|
163
|
+
File.write(local_config_path, create_example_local_config)
|
131
164
|
end
|
132
165
|
# Load and merge configurations
|
133
166
|
local_config = YAML.load_file(local_config_path) || {}
|
134
167
|
create_gitignore
|
168
|
+
create_run_file
|
169
|
+
|
135
170
|
|
136
171
|
# Include other initialization tasks if necessary
|
137
172
|
end
|
138
173
|
|
139
|
-
desc "
|
140
|
-
def
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
version = config['version'].to_i
|
147
|
-
raise "Configuration error: Host, User, or Version missing" unless host && user && version > 0
|
174
|
+
desc "containers", "list all containers"
|
175
|
+
def containers
|
176
|
+
config = load_configuration
|
177
|
+
host = config["host"]
|
178
|
+
user = config["user"]
|
179
|
+
puts `ssh #{user}@#{host} 'harbr containers'`
|
180
|
+
end
|
148
181
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
182
|
+
desc "drop", "Destroy an app and remove all traces"
|
183
|
+
def drop
|
184
|
+
container_name = File.basename(Dir.pwd)
|
185
|
+
config = load_configuration
|
186
|
+
host = config["host"]
|
187
|
+
user = config["user"]
|
188
|
+
puts "Destroying app: #{container_name}"
|
189
|
+
`ssh #{user}@#{host} 'harbr destroy #{container_name}'`
|
153
190
|
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
191
|
+
current_dir = Dir.pwd
|
192
|
+
parent_dir = File.dirname(current_dir)
|
193
|
+
|
194
|
+
# Requesting confirmation
|
195
|
+
if yes? "Are you sure you want to delete the directory: #{current_dir}? [y/N]"
|
196
|
+
# Proceeding with deletion
|
197
|
+
puts "Changing directory to the parent directory..."
|
198
|
+
Dir.chdir(parent_dir)
|
199
|
+
|
200
|
+
puts "Deleting the directory: #{current_dir}"
|
201
|
+
FileUtils.rm_rf(current_dir)
|
202
|
+
|
203
|
+
Dir.chdir(parent_dir)
|
204
|
+
|
205
|
+
puts "#{current_dir} has been deleted."
|
162
206
|
|
163
|
-
puts "Packaging completed successfully."
|
164
|
-
rescue => e
|
165
|
-
puts "Packaging error: #{e.message}"
|
166
207
|
end
|
208
|
+
|
209
|
+
puts "App #{container_name} has been successfully destroyed."
|
167
210
|
end
|
168
211
|
|
212
|
+
desc "raise", "Deploy an application using the configuration from config/manifest.yml to staging"
|
213
|
+
def raise
|
214
|
+
package
|
169
215
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
216
|
+
config = load_configuration
|
217
|
+
host = config["host"]
|
218
|
+
user = config["user"]
|
219
|
+
raise "Host configuration missing" unless host
|
174
220
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
system("ssh #{user}@#{host} 'ln -sfn #{destination_path} #{current_path}'")
|
205
|
-
puts "Successfully deployed application version #{version} to #{host}"
|
206
|
-
increment_version(local_manifest_path, version)
|
207
|
-
deployed(version)
|
208
|
-
else
|
209
|
-
puts "Failed to deploy application version #{version} to #{host}"
|
210
|
-
end
|
211
|
-
rescue => e
|
212
|
-
puts "Deployment error: #{e.message}"
|
221
|
+
local_manifest_path = File.join(Dir.pwd, "config", "manifest.yml")
|
222
|
+
raise "Local manifest file not found at #{local_manifest_path}" unless File.exist?(local_manifest_path)
|
223
|
+
|
224
|
+
local_config = YAML.load_file(local_manifest_path) || {}
|
225
|
+
version = local_config["version"].to_i
|
226
|
+
raise "Version not specified in manifest.yml" unless version
|
227
|
+
|
228
|
+
basename = File.basename(Dir.pwd)
|
229
|
+
base_directory = "/var/harbr/containers/#{basename}"
|
230
|
+
versions_directory = "#{base_directory}/versions"
|
231
|
+
destination_path = "#{versions_directory}/#{version}"
|
232
|
+
current_path = "#{base_directory}/current"
|
233
|
+
|
234
|
+
# Check and create the versions directory on the server
|
235
|
+
`ssh #{user}@#{host} 'mkdir -p #{versions_directory}'`
|
236
|
+
|
237
|
+
# Prepare the rsync exclude option using .gitignore
|
238
|
+
gitignore_path = File.join(Dir.pwd, ".gitignore")
|
239
|
+
exclude_option = File.exist?(gitignore_path) ? "--exclude='.git' --exclude-from='#{gitignore_path}'" : ""
|
240
|
+
|
241
|
+
# Rsync files to the new version directory, excluding files as per .gitignore
|
242
|
+
rsync_command = "rsync -avz #{exclude_option} ./ #{user}@#{host}:#{destination_path}"
|
243
|
+
|
244
|
+
if `#{rsync_command}` &&
|
245
|
+
`ssh #{user}@#{host} 'ln -sfn #{destination_path} #{current_path}'`
|
246
|
+
puts "Successfully deployed application version #{version} to #{host}"
|
247
|
+
deployed(local_manifest_path, version)
|
248
|
+
else
|
249
|
+
puts "Failed to deploy application version #{version} to #{host}"
|
213
250
|
end
|
251
|
+
rescue => e
|
252
|
+
puts "Deployment error: #{e.message}"
|
253
|
+
end
|
254
|
+
|
255
|
+
desc "logs", "Show logs for a container"
|
256
|
+
def logs
|
257
|
+
container_name = File.basename(Dir.pwd)
|
258
|
+
config = load_configuration
|
259
|
+
host = config["host"]
|
260
|
+
user = config["user"]
|
261
|
+
exec "ssh #{user}@#{host} 'harbr logs #{container_name}'"
|
214
262
|
end
|
215
263
|
|
216
264
|
|
265
|
+
|
266
|
+
desc "hoist", "Deploy an application using the configuration from config/manifest.yml to production"
|
267
|
+
def hoist
|
268
|
+
config = load_configuration
|
269
|
+
host = config["host"]
|
270
|
+
user = config["user"]
|
271
|
+
name = config["name"]
|
272
|
+
|
273
|
+
puts `ssh #{user}@#{host} 'harbr deploy #{name}'`
|
274
|
+
end
|
275
|
+
|
276
|
+
def self.exit_on_failure?
|
277
|
+
true
|
278
|
+
end
|
217
279
|
end
|
218
280
|
|
219
281
|
LbhrrCLI.start(ARGV)
|
data/lbhrr.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.homepage = "https://github.com/dekubu/lbhrr"
|
14
14
|
spec.license = "MIT"
|
15
15
|
spec.required_ruby_version = ">= 2.6.0"
|
16
|
-
|
16
|
+
|
17
17
|
spec.metadata["homepage_uri"] = spec.homepage
|
18
18
|
spec.metadata["source_code_uri"] = "https://github.com/dekubu/lbhrr"
|
19
19
|
spec.metadata["changelog_uri"] = "https://github.com/dekubu/lbhrr/CHANGELOG.md"
|
data/lib/lbhrr/version.rb
CHANGED
data/lib/lbhrr.rb
CHANGED
@@ -1,9 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require "yaml"
|
3
2
|
|
3
|
+
require "yaml"
|
4
|
+
require "thor"
|
5
|
+
require "yaml"
|
6
|
+
require "tempfile"
|
7
|
+
require "fileutils"
|
4
8
|
require_relative "lbhrr/version"
|
5
9
|
|
6
10
|
module Lbhrr
|
7
11
|
class Error < StandardError; end
|
12
|
+
|
13
|
+
class SelfDelete
|
14
|
+
def delete_current_directory
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
8
18
|
# Your code goes here...
|
9
19
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lbhrr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.10
|
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-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- Rakefile
|
48
48
|
- bin/console
|
49
49
|
- bin/setup
|
50
|
+
- config/manifest.yml
|
50
51
|
- exe/lbhrr
|
51
52
|
- hero.png
|
52
53
|
- lbhrr.gemspec
|