lbhrr 1.0.1 → 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 -106
- 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,25 +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
|
-
|
|
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"
|
|
82
119
|
}
|
|
83
120
|
|
|
84
121
|
YAML.dump(example_local_config)
|
|
85
122
|
end
|
|
86
123
|
|
|
87
124
|
def load_configuration
|
|
88
|
-
global_config_dir = File.expand_path(
|
|
89
|
-
global_config_path = File.join(global_config_dir,
|
|
90
|
-
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")
|
|
91
128
|
|
|
92
129
|
# Ensure global configuration exists
|
|
93
130
|
unless File.exist?(global_config_path)
|
|
@@ -98,7 +135,7 @@ class LbhrrCLI < Thor
|
|
|
98
135
|
# Ensure local configuration exists
|
|
99
136
|
unless File.exist?(local_config_path)
|
|
100
137
|
FileUtils.mkdir_p(File.dirname(local_config_path)) unless Dir.exist?(File.dirname(local_config_path))
|
|
101
|
-
File.write(local_config_path, create_example_local_config
|
|
138
|
+
File.write(local_config_path, create_example_local_config)
|
|
102
139
|
end
|
|
103
140
|
|
|
104
141
|
# Load and merge configurations
|
|
@@ -111,114 +148,134 @@ class LbhrrCLI < Thor
|
|
|
111
148
|
new_version = current_version + 1
|
|
112
149
|
|
|
113
150
|
manifest = YAML.load_file(manifest_path)
|
|
114
|
-
manifest[
|
|
115
|
-
File.
|
|
151
|
+
manifest["version"] = new_version
|
|
152
|
+
File.write(manifest_path, manifest.to_yaml)
|
|
116
153
|
puts "Version incremented to #{new_version}"
|
|
117
|
-
|
|
118
154
|
end
|
|
119
|
-
|
|
120
155
|
end
|
|
121
156
|
|
|
122
157
|
desc "init", "Initialize project with .gitignore"
|
|
123
158
|
def init
|
|
124
|
-
|
|
125
|
-
local_config_path = File.join(Dir.pwd, 'config', 'manifest.yml')
|
|
159
|
+
local_config_path = File.join(Dir.pwd, "config", "manifest.yml")
|
|
126
160
|
|
|
127
161
|
unless File.exist?(local_config_path)
|
|
128
162
|
FileUtils.mkdir_p(File.dirname(local_config_path)) unless Dir.exist?(File.dirname(local_config_path))
|
|
129
|
-
File.write(local_config_path, create_example_local_config
|
|
163
|
+
File.write(local_config_path, create_example_local_config)
|
|
130
164
|
end
|
|
131
165
|
# Load and merge configurations
|
|
132
166
|
local_config = YAML.load_file(local_config_path) || {}
|
|
133
167
|
create_gitignore
|
|
168
|
+
create_run_file
|
|
169
|
+
|
|
134
170
|
|
|
135
171
|
# Include other initialization tasks if necessary
|
|
136
172
|
end
|
|
137
173
|
|
|
138
|
-
desc "
|
|
139
|
-
def
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
version = config['version'].to_i
|
|
146
|
-
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
|
|
147
181
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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}'`
|
|
152
190
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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."
|
|
161
206
|
|
|
162
|
-
puts "Packaging completed successfully."
|
|
163
|
-
rescue => e
|
|
164
|
-
puts "Packaging error: #{e.message}"
|
|
165
207
|
end
|
|
208
|
+
|
|
209
|
+
puts "App #{container_name} has been successfully destroyed."
|
|
166
210
|
end
|
|
167
211
|
|
|
212
|
+
desc "raise", "Deploy an application using the configuration from config/manifest.yml to staging"
|
|
213
|
+
def raise
|
|
214
|
+
package
|
|
168
215
|
|
|
216
|
+
config = load_configuration
|
|
217
|
+
host = config["host"]
|
|
218
|
+
user = config["user"]
|
|
219
|
+
raise "Host configuration missing" unless host
|
|
169
220
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
begin
|
|
173
|
-
package
|
|
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)
|
|
174
223
|
|
|
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
|
-
git_tracked_files = `git ls-files`.split("\n")
|
|
202
|
-
Tempfile.create('git_files') do |tempfile|
|
|
203
|
-
git_tracked_files.each { |file| tempfile.puts(file) }
|
|
204
|
-
tempfile.close
|
|
205
|
-
|
|
206
|
-
# Rsync files to the new version directory and update the symlink
|
|
207
|
-
if system("rsync -avz --exclude=.git --files-from=#{tempfile.path} ./ #{user}@#{host}:#{destination_path}") &&
|
|
208
|
-
system("ssh #{user}@#{host} 'ln -sfn #{destination_path} #{current_path}'")
|
|
209
|
-
puts "Successfully deployed application version #{version} to #{host}"
|
|
210
|
-
increment_version(local_manifest_path, version)
|
|
211
|
-
deployed(version)
|
|
212
|
-
else
|
|
213
|
-
puts "Failed to deploy application version #{version} to #{host}"
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
rescue => e
|
|
217
|
-
puts "Deployment error: #{e.message}"
|
|
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}"
|
|
218
250
|
end
|
|
251
|
+
rescue => e
|
|
252
|
+
puts "Deployment error: #{e.message}"
|
|
219
253
|
end
|
|
220
|
-
# new method goes here
|
|
221
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}'"
|
|
262
|
+
end
|
|
263
|
+
|
|
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
|
|
222
279
|
end
|
|
223
280
|
|
|
224
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
|