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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9d366665ce2d3cf11822b1e3307de0d9da799428ad5ba420ac9a78aa526b3886
4
- data.tar.gz: 5fff131ca6d144186e5d3587c3b2cfbbe0cd35f5bbb70772f711bf50c0a6aabd
3
+ metadata.gz: '008a4e46f26124d5ddb1ff4a332779770038696ed6a2cfb2b1c8a6de7dddefdc'
4
+ data.tar.gz: 41a0c0acd33bd7a31c361fa6f626909011e69be41933c77e688544ecc5800991
5
5
  SHA512:
6
- metadata.gz: bf8db87c2979d12bcce92c3372c3e8202914a13e1d9f1a29c85d66ca593e650f222cb0df08a525eef5a1f07964049363b73d622eb2190d9d242b703e82868dde
7
- data.tar.gz: 9d21b6364f353fcaae039d1e5d7cbf7fdb87eaaca68b42d66478afd91218e985ad7cf4dcaafe4db613d358afe962160fee866c2e354797c6f3ecc0e50efbda28
6
+ metadata.gz: 807c2b1f37b43aad26e88c195250452635107b12e32e15dd5f48894ef50c37e10b36620ec84844f1734becc133a32e970e179f774b071718b79f278d68b689dd
7
+ data.tar.gz: a40ef0cbf0be98afff535f95b864988cf022a8ba35d8e5909715eeaab866791eed1bdf0290dc483d17e2a333b3fbb7fb4fcb44ce88fd9714d9a0be470a1a7ada
@@ -0,0 +1,5 @@
1
+ ---
2
+ name: lbhrr
3
+ version: '0'
4
+ port:
5
+ host: lbhrr.harbr.zero2one.ee
data/exe/lbhrr CHANGED
@@ -1,31 +1,53 @@
1
1
  #!/usr/bin/env ruby
2
- require 'thor'
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
- begin
12
- # Ensure we are in a git repository
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
- # Amend the last commit with the new message
16
- system("git commit --amend -m \"#{new_message}\"") or raise "Failed to amend the last commit"
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
- puts "Successfully amended the last commit."
19
- rescue => e
20
- puts "Error during commit amend: #{e.message}"
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, '.gitignore')
47
+ gitignore_path = File.join(Dir.pwd, ".gitignore")
26
48
  return if File.exist?(gitignore_path)
27
49
 
28
- gitignore_content = %q{
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
- 'user' => 'root',
73
- 'host' => 'harbr.zero2one.ee'
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
- 'version' => '0',
81
- 'host' => "#{File.basename(Dir.pwd)}.harbr.zero2one.ee'"
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('~/.config/harbr')
89
- global_config_path = File.join(global_config_dir, 'harbr.manifest.yml')
90
- local_config_path = File.join(Dir.pwd, 'config', 'manifest.yml')
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['version'] = new_version
115
- File.open(manifest_path, 'w') { |file| file.write(manifest.to_yaml) }
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 "package", "Prepare the application for deployment"
139
- def package
140
- begin
141
- # Load configuration
142
- config = load_configuration
143
- host = config['host']
144
- user = config['user']
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
- # Check for a git repository
149
- unless system("git rev-parse --is-inside-work-tree > /dev/null 2>&1")
150
- raise "No Git repository found in the current directory"
151
- end
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
- # Delete vendor directory if it exists
154
- vendor_path = File.join(Dir.pwd, 'vendor')
155
- FileUtils.rm_rf(vendor_path) if Dir.exist?(vendor_path)
156
- system("bundle install --path vendor/bundle") or raise "Bundle install failed"
157
- # Check if the repository is clean
158
- puts "Git repository is dirty, committing changes..."
159
- system("git add .") or raise "Failed to add changes to Git"
160
- system("git commit -m 'packaged #{version}'") or raise "Failed to commit changes to Git"
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
- desc "deploy", "Deploy an application using the configuration from config/manifest.yml"
171
- def deploy
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
- config = load_configuration
176
- host = config['host']
177
- user = config['user']
178
- raise "Host configuration missing" unless host
179
-
180
- local_manifest_path = File.join(Dir.pwd, 'config', 'manifest.yml')
181
- raise "Local manifest file not found at #{local_manifest_path}" unless File.exist?(local_manifest_path)
182
-
183
- local_config = YAML.load_file(local_manifest_path) || {}
184
- version = local_config['version'].to_i
185
- raise "Version not specified in manifest.yml" unless version
186
-
187
- basename = File.basename(Dir.pwd)
188
- base_directory = "/var/harbr/#{basename}"
189
- versions_directory = "#{base_directory}/versions"
190
- previous_version_path = "#{versions_directory}/#{version - 1}"
191
- destination_path = "#{versions_directory}/#{version}"
192
- current_path = "#{base_directory}/current"
193
-
194
- # Check and create the versions directory on the server
195
- system("ssh #{user}@#{host} 'mkdir -p #{versions_directory}'")
196
-
197
- # Copy the previous version to the new version directory if it exists
198
- system("ssh #{user}@#{host} '[ -d #{previous_version_path} ] && cp -R #{previous_version_path} #{destination_path} || mkdir -p #{destination_path}'")
199
-
200
- # Obtain the list of files tracked by Git and write to a temp file
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lbhrr
4
- VERSION = "1.0.1"
4
+ VERSION = "1.0.10"
5
5
  end
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.1
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-04 00:00:00.000000000 Z
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