first_deployment 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 16e0d68fcda7561f7c0c74549c5b584397dd13f550928f176c086c1ae7ec34cc
4
+ data.tar.gz: dcb5882749187fcff08f294c87b72b3183b2bd8de4fe52465b355be5ae0ae755
5
+ SHA512:
6
+ metadata.gz: b4fe13967b4ccc3af7e5085e04b9eed62cc2f6fe54c4e3e5854e07411a7bae614b7a11f7ee7ba303b967799f9c6557015c9e878c811bc55577f89251933c1be4
7
+ data.tar.gz: 5e11dc7435547435ecb2402fbbfa78196281516218bab72f816ffb79ca7c2dce6586cb329b317562c81ab71ee03b6df651d58079cc4a96d4ff02840d53f85ef7
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ lib = File.expand_path("../lib", __dir__)
5
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
+
7
+ require("byebug") if ENV["DEBUG"] && !Gem::Specification.find_all_by_name("byebug").empty?
8
+ require "first_deployment"
9
+ require "optionparser"
10
+
11
+ OptionParser.new do |opts|
12
+ opts.banner = "Usage: first_deployment"
13
+
14
+ opts.on("-h", "--help", "Prints this help") do
15
+ puts opts
16
+ exit 0
17
+ end
18
+ end.parse!
19
+
20
+ begin
21
+ # TODO
22
+ rescue StandardError => e
23
+ FirstDeployment::LOG.error(e.message)
24
+ FirstDeployment::LOG.error(e.backtrace.join("\n")) if ENV["DEBUG"]
25
+ exit 1
26
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "first_deployment/version"
4
+ require "first_deployment/errors"
5
+ require "first_deployment/logger"
6
+ require "first_deployment/command_result"
7
+ require "first_deployment/shell_helper"
8
+ require "first_deployment/results_helper"
9
+
10
+ module FirstDeployment
11
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FirstDeployment
4
+ class CommandResult < String
5
+ attr_accessor :success
6
+
7
+ def success?
8
+ @success
9
+ end
10
+
11
+ def failure?
12
+ !@success
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FirstDeployment
4
+ Error = Class.new(StandardError)
5
+ CommandFailureError = Class.new(Error)
6
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "logger"
4
+ require "time"
5
+ require "colorize"
6
+
7
+ module FirstDeployment
8
+ LOG = Logger.new(STDOUT)
9
+ LOG.level = Logger::INFO
10
+ LOG.formatter = proc do |severity, datetime, _progname, message|
11
+ line = "[#{datetime.strftime('%Y-%m-%d %H:%M:%S')}] #{severity} -- #{message}\n"
12
+
13
+ case severity
14
+ when "ERROR"
15
+ line.colorize(:red)
16
+ else
17
+ line
18
+ end
19
+ end
20
+
21
+ class << LOG
22
+ def info_success(message)
23
+ LOG.info(message.colorize(:green))
24
+ end
25
+
26
+ def info_error(message)
27
+ LOG.info(message.colorize(:red))
28
+ end
29
+
30
+ def info_warning(message)
31
+ LOG.info(message.colorize(:yellow))
32
+ end
33
+
34
+ def info_notice(message)
35
+ LOG.info(message.colorize(:light_blue))
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "colorize"
5
+
6
+ module FirstDeployment
7
+ module ResultsHelper
8
+ module_function
9
+
10
+ def process(results, config:)
11
+ if config["output"].nil? || config["output"] == "STDOUT"
12
+ output_to_stdout(results)
13
+ else
14
+ output_to_directory(results, directory: config["output"])
15
+ end
16
+ end
17
+
18
+ def output_to_stdout(results)
19
+ results.each_pair do |env_name, result|
20
+ puts
21
+ puts "== Output for #{env_name}".colorize(:green)
22
+ puts
23
+ puts result
24
+ end
25
+ puts
26
+ end
27
+
28
+ def output_to_directory(results, directory:)
29
+ FileUtils.mkdir_p(directory)
30
+ filenames = []
31
+ results.each_pair do |env_name, result|
32
+ filename = File.join(directory, env_name + ".txt")
33
+ filenames << filename
34
+
35
+ File.open(filename, "w+") do |file|
36
+ file.write(result)
37
+ end
38
+ end
39
+
40
+ message = +"Command outputs are now present in the following files:\n"
41
+ message << filenames.join("\n")
42
+
43
+ puts
44
+ puts message.colorize(:green)
45
+ puts
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "English"
4
+ require "open3"
5
+ require "shellwords"
6
+
7
+ module FirstDeployment
8
+ module ShellHelper
9
+ def run_command(command, success_only: true, no_capture: false)
10
+ LOG.info("Running `#{command.colorize(:light_yellow)}` ...")
11
+
12
+ exit_status, result_str = no_capture ? run_no_capture_command(command) : run_capture_command(command)
13
+ raise "(non-zero exit code: #{exit_status.exitstatus})" if success_only && !exit_status.success?
14
+
15
+ CommandResult.new(result_str).tap do |result|
16
+ result.success = exit_status.success?
17
+ end
18
+ rescue StandardError => e
19
+ raise Error, <<~MSG
20
+ Error running the command `#{command}`:
21
+ => error: #{e.message}
22
+ => command output: #{result_str}
23
+ MSG
24
+ end
25
+
26
+ def run_no_capture_command(command)
27
+ system(command)
28
+ [$CHILD_STATUS, ""]
29
+ end
30
+
31
+ def run_capture_command(command)
32
+ exit_status = nil
33
+ result_str = +""
34
+
35
+ Open3.popen2e(command) do |_stdin, stdout_and_stderr, wait_thr|
36
+ stdout_and_stderr.each do |line|
37
+ result_str << line
38
+ end
39
+ exit_status = wait_thr.value
40
+ end
41
+ exit_status.success? ? LOG.info_success(result_str) : LOG.info_error(result_str)
42
+
43
+ [exit_status, result_str]
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FirstDeployment
4
+ VERSION = "0.1.0"
5
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: first_deployment
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Christophe Maximin
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-01-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.8'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.8'
27
+ description: FirstDeployment is a zero-conf tool which will deploy your Rails app
28
+ to a web server
29
+ email:
30
+ - christophe.maximin@gmail.com
31
+ executables:
32
+ - first_deployment
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - exe/first_deployment
37
+ - lib/first_deployment.rb
38
+ - lib/first_deployment/command_result.rb
39
+ - lib/first_deployment/errors.rb
40
+ - lib/first_deployment/logger.rb
41
+ - lib/first_deployment/results_helper.rb
42
+ - lib/first_deployment/shell_helper.rb
43
+ - lib/first_deployment/version.rb
44
+ homepage: https://github.com/christophemaximin/first_deployment
45
+ licenses:
46
+ - MIT
47
+ metadata:
48
+ homepage_uri: https://github.com/christophemaximin/first_deployment
49
+ source_code_uri: https://github.com/christophemaximin/first_deployment
50
+ changelog_uri: https://github.com/christophemaximin/first_deployment/blob/master/CHANGELOG.md
51
+ post_install_message:
52
+ rdoc_options: []
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubygems_version: 3.0.1
67
+ signing_key:
68
+ specification_version: 4
69
+ summary: FirstDeployment is a zero-conf tool which will deploy your Rails app to a
70
+ web server
71
+ test_files: []