dapp 0.0.24 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +13 -5
  2. data/bin/dapp +17 -1
  3. data/config/en/common.yml +23 -0
  4. data/config/en/net_status.yml +24 -0
  5. data/lib/dapp.rb +68 -12
  6. data/lib/dapp/application.rb +57 -0
  7. data/lib/dapp/application/git_artifact.rb +26 -0
  8. data/lib/dapp/application/logging.rb +120 -0
  9. data/lib/dapp/application/path.rb +31 -0
  10. data/lib/dapp/application/tags.rb +65 -0
  11. data/lib/dapp/build/stage/app_install.rb +19 -0
  12. data/lib/dapp/build/stage/app_setup.rb +19 -0
  13. data/lib/dapp/build/stage/base.rb +106 -0
  14. data/lib/dapp/build/stage/from.rb +40 -0
  15. data/lib/dapp/build/stage/infra_install.rb +23 -0
  16. data/lib/dapp/build/stage/infra_setup.rb +19 -0
  17. data/lib/dapp/build/stage/source_1.rb +31 -0
  18. data/lib/dapp/build/stage/source_1_archive.rb +31 -0
  19. data/lib/dapp/build/stage/source_2.rb +20 -0
  20. data/lib/dapp/build/stage/source_3.rb +27 -0
  21. data/lib/dapp/build/stage/source_4.rb +31 -0
  22. data/lib/dapp/build/stage/source_5.rb +51 -0
  23. data/lib/dapp/build/stage/source_base.rb +109 -0
  24. data/lib/dapp/builder/base.rb +44 -0
  25. data/lib/dapp/builder/chef.rb +242 -0
  26. data/lib/dapp/builder/chef/berksfile.rb +54 -0
  27. data/lib/dapp/builder/shell.rb +16 -0
  28. data/lib/dapp/cli.rb +10 -44
  29. data/lib/dapp/cli/base.rb +55 -0
  30. data/lib/dapp/cli/build.rb +6 -140
  31. data/lib/dapp/cli/flush.rb +19 -0
  32. data/lib/dapp/cli/flush/build_cache.rb +26 -0
  33. data/lib/dapp/cli/flush/stage_cache.rb +23 -0
  34. data/lib/dapp/cli/list.rb +19 -0
  35. data/lib/dapp/cli/push.rb +59 -0
  36. data/lib/dapp/cli/smartpush.rb +19 -0
  37. data/lib/dapp/config/application.rb +98 -0
  38. data/lib/dapp/config/chef.rb +20 -0
  39. data/lib/dapp/config/docker.rb +39 -0
  40. data/lib/dapp/config/git_artifact.rb +78 -0
  41. data/lib/dapp/config/main.rb +23 -0
  42. data/lib/dapp/config/shell.rb +40 -0
  43. data/lib/dapp/controller.rb +103 -0
  44. data/lib/dapp/docker_image.rb +51 -0
  45. data/lib/dapp/error/application.rb +6 -0
  46. data/lib/dapp/error/base.rb +10 -0
  47. data/lib/dapp/error/build.rb +6 -0
  48. data/lib/dapp/error/config.rb +6 -0
  49. data/lib/dapp/error/controller.rb +6 -0
  50. data/lib/dapp/error/shellout.rb +6 -0
  51. data/lib/dapp/filelock.rb +1 -1
  52. data/lib/dapp/git_artifact.rb +43 -272
  53. data/lib/dapp/git_repo/base.rb +10 -12
  54. data/lib/dapp/git_repo/own.rb +7 -3
  55. data/lib/dapp/git_repo/remote.rb +14 -20
  56. data/lib/dapp/helper/cli.rb +66 -0
  57. data/lib/dapp/helper/i18n.rb +20 -0
  58. data/lib/dapp/helper/log.rb +72 -0
  59. data/lib/dapp/helper/paint.rb +27 -0
  60. data/lib/dapp/helper/sha256.rb +14 -0
  61. data/lib/dapp/helper/shellout.rb +41 -0
  62. data/lib/dapp/helper/streaming.rb +49 -0
  63. data/lib/dapp/helper/trivia.rb +27 -0
  64. data/lib/dapp/stage_image.rb +98 -0
  65. data/lib/dapp/version.rb +3 -1
  66. metadata +207 -51
  67. data/lib/dapp/atomizer.rb +0 -56
  68. data/lib/dapp/builder.rb +0 -230
  69. data/lib/dapp/builder/cascade_tagging.rb +0 -48
  70. data/lib/dapp/builder/centos7.rb +0 -47
  71. data/lib/dapp/builder/chefify.rb +0 -107
  72. data/lib/dapp/builder/ci_tagging.rb +0 -53
  73. data/lib/dapp/builder/git_tagging.rb +0 -21
  74. data/lib/dapp/builder/manual_tagging.rb +0 -22
  75. data/lib/dapp/builder/ubuntu1404.rb +0 -20
  76. data/lib/dapp/builder/ubuntu1604.rb +0 -20
  77. data/lib/dapp/docker.rb +0 -207
  78. data/lib/dapp/git_repo/chronicler.rb +0 -44
@@ -2,22 +2,20 @@ module Dapp
2
2
  module GitRepo
3
3
  # Base class for any Git repo (remote, gitkeeper, etc)
4
4
  class Base
5
- attr_reader :builder
5
+ attr_reader :application
6
6
  attr_reader :name
7
- attr_reader :su
8
7
 
9
- def initialize(builder, name, build_path: nil)
10
- @builder = builder
8
+ def initialize(application, name)
9
+ @application = application
11
10
  @name = name
12
- @build_path = build_path || []
13
11
  end
14
12
 
15
- def build_path(*paths)
16
- builder.build_path(*@build_path, *paths)
13
+ def container_build_dir_path
14
+ application.container_build_path "#{name}.git"
17
15
  end
18
16
 
19
17
  def dir_path
20
- build_path "#{name}.git"
18
+ application.build_path "#{name}.git"
21
19
  end
22
20
 
23
21
  def git_bare(command, **kwargs)
@@ -28,7 +26,7 @@ module Dapp
28
26
  Time.at Integer git_bare("show -s --format=%ct #{commit}").stdout.strip
29
27
  end
30
28
 
31
- def latest_commit(branch = 'master')
29
+ def latest_commit(branch)
32
30
  git_bare("rev-parse #{branch}").stdout.strip
33
31
  end
34
32
 
@@ -39,14 +37,14 @@ module Dapp
39
37
  def cleanup!
40
38
  end
41
39
 
42
- def lock(**kwargs, &block)
43
- builder.filelock(build_path("#{name}.lock"), error_message: "Repository #{name} in use! Try again later.", **kwargs, &block)
40
+ def branch
41
+ git_bare('rev-parse --abbrev-ref HEAD').stdout.strip
44
42
  end
45
43
 
46
44
  protected
47
45
 
48
46
  def git(command, **kwargs)
49
- builder.shellout "git #{command}", **kwargs
47
+ application.shellout!("git #{command}", **kwargs)
50
48
  end
51
49
  end
52
50
  end
@@ -2,12 +2,16 @@ module Dapp
2
2
  module GitRepo
3
3
  # Own Git repo
4
4
  class Own < Base
5
- def initialize(builder, **kwargs)
6
- super(builder, 'own', **kwargs)
5
+ def initialize(application)
6
+ super(application, 'own')
7
7
  end
8
8
 
9
9
  def dir_path
10
- @dir_path ||= git("-C #{builder.home_path} rev-parse --git-dir").stdout.strip
10
+ @dir_path ||= Pathname(git("-C #{application.home_path} rev-parse --git-dir").stdout.strip).expand_path
11
+ end
12
+
13
+ def latest_commit(branch = nil)
14
+ super(branch || 'HEAD')
11
15
  end
12
16
  end
13
17
  end
@@ -2,37 +2,31 @@ module Dapp
2
2
  module GitRepo
3
3
  # Normal Git repo
4
4
  class Remote < Base
5
- def initialize(builder, name, url:, ssh_key_path: nil, **kwargs)
6
- super(builder, name, **kwargs)
5
+ def initialize(application, name, url:, ssh_key_path: nil)
6
+ super(application, name)
7
7
 
8
8
  @url = url
9
- @ssh_key_path = File.expand_path(ssh_key_path, builder.home_path) if ssh_key_path
9
+ @ssh_key_path = File.expand_path(ssh_key_path, application.home_path) if ssh_key_path
10
10
 
11
11
  @use_ssh_key = false
12
- File.chmod(0600, @ssh_key_path) if @ssh_key_path
12
+ File.chmod(0o600, @ssh_key_path) if @ssh_key_path
13
13
 
14
- lock do
15
- unless File.directory? dir_path
16
- with_ssh_key do
17
- git "clone --bare --depth 1 #{url} #{dir_path}", log_verbose: true
18
- end
19
- end
20
- end
14
+ with_ssh_key do
15
+ git "clone --bare --depth 1 #{url} #{dir_path}"
16
+ end unless File.directory? dir_path
21
17
  end
22
18
 
23
19
  def fetch!(branch = 'master')
24
- lock do
25
- with_ssh_key do
26
- git_bare "fetch origin #{branch}:#{branch}", log_verbose: true
20
+ with_ssh_key do
21
+ application.log_secondary_process(application.t(code: 'process.git_artifact_fetch', data: { name: name }), short: true) do
22
+ git_bare "fetch origin #{branch}:#{branch}"
27
23
  end
28
- end
24
+ end unless application.ignore_git_fetch || application.dry_run?
29
25
  end
30
26
 
31
27
  def cleanup!
32
- lock do
33
- super
34
- FileUtils.rm_rf dir_path
35
- end
28
+ super
29
+ FileUtils.rm_rf dir_path
36
30
  end
37
31
 
38
32
  protected
@@ -56,7 +50,7 @@ module Dapp
56
50
 
57
51
  def git(command, **kwargs)
58
52
  if use_ssh_key && ssh_key_path
59
- builder.shellout "ssh-agent bash -ec 'ssh-add #{ssh_key_path}; git #{command}'", **kwargs
53
+ application.shellout!("ssh-agent bash -ec 'ssh-add #{ssh_key_path}; git #{command}'", **kwargs)
60
54
  else
61
55
  super
62
56
  end
@@ -0,0 +1,66 @@
1
+ module Dapp
2
+ module Helper
3
+ # Cli
4
+ module Cli
5
+ def parse_options(cli, argv)
6
+ cli.parse_options(argv)
7
+ rescue OptionParser::MissingArgument, OptionParser::InvalidOption, OptionParser::InvalidArgument => e
8
+ STDERR.puts "Error: #{e.message}"
9
+ puts cli.opt_parser
10
+ exit 1
11
+ end
12
+
13
+ def required_argument(cli)
14
+ unless (arg = cli.cli_arguments.pop)
15
+ puts cli.opt_parser
16
+ exit 1
17
+ end
18
+ arg
19
+ end
20
+
21
+ # rubocop:disable Metrics/MethodLength
22
+ def parse_subcommand(cli, args)
23
+ argv = args
24
+ divided_subcommand = []
25
+ subcommand_argv = []
26
+
27
+ cmd_arr = args.dup
28
+ loop do
29
+ if cli.class::SUBCOMMANDS.include? cmd_arr.join(' ')
30
+ argv = args[0...args.index(cmd_arr.first)]
31
+ divided_subcommand = cmd_arr
32
+ index = cmd_arr.one? ? args.index(cmd_arr.first).next : args.index(cmd_arr.last).next
33
+ subcommand_argv = args[index..-1]
34
+ elsif !cmd_arr.empty?
35
+ cmd_arr.pop
36
+ next
37
+ end
38
+ break
39
+ end
40
+
41
+ [argv, divided_subcommand, subcommand_argv]
42
+ end
43
+ # rubocop:enable Metrics/MethodLength
44
+
45
+ def run_subcommand(cli, divided_subcommand, subcommand_argv)
46
+ if !divided_subcommand.empty?
47
+ cli.class.const_get(prepare_subcommand(divided_subcommand)).new.run(subcommand_argv)
48
+ else
49
+ STDERR.puts 'Error: subcommand not passed'
50
+ puts
51
+ puts cli.opt_parser
52
+ exit 1
53
+ end
54
+ end
55
+
56
+ def prepare_subcommand(divided_subcommand)
57
+ Array(divided_subcommand).map(&:capitalize).join
58
+ end
59
+
60
+ def composite_options(opt)
61
+ @composite_options ||= {}
62
+ @composite_options[opt] ||= []
63
+ end
64
+ end
65
+ end # Helper
66
+ end # Dapp
@@ -0,0 +1,20 @@
1
+ module Dapp
2
+ module Helper
3
+ # I18n
4
+ module I18n
5
+ def self.initialize
6
+ ::I18n.load_path << Dir[File.join(Dapp.root, 'config', '**', '*')].select { |path| File.file?(path) }
7
+ ::I18n.reload!
8
+ ::I18n.locale = :en
9
+ end
10
+
11
+ def t(context: nil, **desc)
12
+ code = desc[:code]
13
+ data = desc[:data] || {}
14
+ ::I18n.t [:common, context, code].join('.'), [:common, code].join('.'), **data, raise: true
15
+ rescue ::I18n::MissingTranslationData => _e
16
+ raise NetStatus::Exception, code: :missing_translation, data: { code: code }
17
+ end
18
+ end
19
+ end # Helper
20
+ end # Dapp
@@ -0,0 +1,72 @@
1
+ module Dapp
2
+ module Helper
3
+ # Log
4
+ module Log
5
+ def log_info(message, *args)
6
+ log(message, *args, style: :info)
7
+ end
8
+
9
+ def log_step(message, *args)
10
+ log(message, *args, style: :step)
11
+ end
12
+
13
+ def log_secondary(message, *args)
14
+ log(message, *args, style: :secondary)
15
+ end
16
+
17
+ def log(message = '', desc: nil, inline: false, **kwargs)
18
+ return unless defined?(cli_options) && !cli_options[:log_quiet]
19
+ unless desc.nil?
20
+ (desc[:data] ||= {})[:msg] = message
21
+ message = t(desc: desc)
22
+ end
23
+ print "#{log_format_string(message, **kwargs)}#{"\n" unless inline}"
24
+ end
25
+
26
+ def log_time
27
+ "#{DateTime.now.strftime('%Y-%m-%dT%T%z')} "
28
+ end
29
+
30
+ def log_format_string(str, time: true, indent: true, style: nil)
31
+ str.to_s.lines.map do |line|
32
+ line = paint_string(line, style) if style
33
+ "#{log_time if time && cli_options[:log_time]}#{indent ? (log_indent + line) : line}"
34
+ end.join
35
+ end
36
+
37
+ def log_with_indent(message = '', **kvargs)
38
+ with_log_indent do
39
+ log(message, **kvargs)
40
+ end
41
+ end
42
+
43
+ def with_log_indent(with = true)
44
+ log_indent_next if with
45
+ yield
46
+ log_indent_prev if with
47
+ end
48
+
49
+ def log_indent
50
+ ' ' * 2 * cli_options[:log_indent].to_i
51
+ end
52
+
53
+ def log_indent_next
54
+ return unless defined? cli_options
55
+ cli_options[:log_indent] += 1
56
+ end
57
+
58
+ def log_indent_prev
59
+ return unless defined? cli_options
60
+ if cli_options[:log_indent] <= 0
61
+ cli_options[:log_indent] = 0
62
+ else
63
+ cli_options[:log_indent] -= 1
64
+ end
65
+ end
66
+
67
+ def self.included(base)
68
+ base.include(Paint)
69
+ end
70
+ end # Log
71
+ end # Helper
72
+ end # Dapp
@@ -0,0 +1,27 @@
1
+ module Dapp
2
+ module Helper
3
+ # Paint
4
+ module Paint
5
+ FORMAT = {
6
+ step: [:yellow, :bold],
7
+ info: [:blue],
8
+ success: [:green, :bold],
9
+ warning: [:red, :bold],
10
+ secondary: [:white, :bold],
11
+ default: [:white]
12
+ }.freeze
13
+
14
+ def paint_style(name)
15
+ FORMAT[name].tap do |format|
16
+ fail if format.nil?
17
+ end
18
+ end
19
+
20
+ def paint_string(object, style_name)
21
+ ::Paint[::Paint.unpaint(object.to_s), *paint_style(style_name)]
22
+ end
23
+ end # Paint
24
+ end # Helper
25
+ end # Dapp
26
+
27
+ Dapp::Helper::Paint.extend Dapp::Helper::Paint
@@ -0,0 +1,14 @@
1
+ module Dapp
2
+ module Helper
3
+ # Sha256
4
+ module Sha256
5
+ def hashsum(arg)
6
+ sha256(arg)
7
+ end
8
+
9
+ def sha256(arg)
10
+ Digest::SHA256.hexdigest Array(arg).compact.map(&:to_s).join(':::')
11
+ end
12
+ end
13
+ end # Helper
14
+ end # Dapp
@@ -0,0 +1,41 @@
1
+ module Dapp
2
+ module Helper
3
+ # Shellout
4
+ module Shellout
5
+ include Streaming
6
+
7
+ def shellout(*args, log_verbose: false, **kwargs)
8
+ do_shellout = proc do
9
+ log_verbose = (log_verbose && cli_options[:log_verbose]) if defined? cli_options
10
+ kwargs[:live_stream] ||= STDOUT if log_verbose
11
+ ::Mixlib::ShellOut.new(*args, timeout: 3600, **kwargs).run_command
12
+ end
13
+
14
+ if defined? ::Bundler
15
+ ::Bundler.with_clean_env { do_shellout.call }
16
+ else
17
+ do_shellout.call
18
+ end
19
+ end
20
+
21
+ def shellout!(*args, log_verbose: false, log_time: false, **kwargs)
22
+ stream = Stream.new
23
+ log_time = defined?(cli_options) ? cli_options[:log_time] : log_time
24
+ if log_verbose
25
+ kwargs[:live_stream] = Proxy::Base.new(stream, STDOUT, with_time: log_time)
26
+ else
27
+ kwargs[:live_stdout] = Proxy::Base.new(stream, with_time: log_time)
28
+ end
29
+ kwargs[:live_stderr] = Proxy::Error.new(stream, with_time: log_time)
30
+ shellout(*args, **kwargs).tap(&:error!)
31
+ rescue ::Mixlib::ShellOut::ShellCommandFailed => e
32
+ raise Error::Shellout, code: Trivia.class_to_lowercase(e.class),
33
+ data: { stream: stream.inspect }
34
+ end
35
+
36
+ def self.included(base)
37
+ base.extend(self)
38
+ end
39
+ end
40
+ end # Helper
41
+ end # Dapp
@@ -0,0 +1,49 @@
1
+ module Dapp
2
+ module Helper
3
+ # Streaming
4
+ module Streaming
5
+ # Stream
6
+ class Stream
7
+ def buffer
8
+ @buffer ||= []
9
+ end
10
+
11
+ def <<(string)
12
+ buffer << string
13
+ end
14
+
15
+ def inspect
16
+ buffer.join
17
+ end
18
+ end
19
+
20
+ # Proxy
21
+ module Proxy
22
+ # Base
23
+ class Base
24
+ include Helper::Log
25
+
26
+ def initialize(*streams, with_time: false)
27
+ @streams = streams
28
+ @with_time = with_time
29
+ end
30
+
31
+ def <<(str)
32
+ @streams.each { |s| s << format_string(str) }
33
+ end
34
+
35
+ def format_string(str)
36
+ str.lines.map { |l| "#{log_time if @with_time}#{l.strip}\n" }.join
37
+ end
38
+ end
39
+
40
+ # Error
41
+ class Error < Base
42
+ def format_string(str)
43
+ Paint.paint_string(super, :warning)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end # Helper
49
+ end # Dapp
@@ -0,0 +1,27 @@
1
+ module Dapp
2
+ module Helper
3
+ # Trivia
4
+ module Trivia
5
+ def kwargs(args)
6
+ args.last.is_a?(Hash) ? args.pop : {}
7
+ end
8
+
9
+ def class_to_lowercase(class_name = self.class)
10
+ Trivia.class_to_lowercase(class_name)
11
+ end
12
+
13
+ def delete_file(path)
14
+ path = Pathname(path)
15
+ path.delete if path.exist?
16
+ end
17
+
18
+ def to_mb(bytes)
19
+ (bytes / 1024.0 / 1024.0).round(2)
20
+ end
21
+
22
+ def self.class_to_lowercase(class_name = self.class)
23
+ class_name.to_s.split('::').last.split(/(?=[[:upper:]]|[0-9])/).join('_').downcase.to_s
24
+ end
25
+ end # Trivia
26
+ end # Helper
27
+ end # Dapp