dapp 0.22.1 → 0.22.2

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: c045374a9efddfa40e6eaf95436a0226f968a11d5c9d8dd4898de44114e1c097
4
- data.tar.gz: cd7951c2d9fa47ee3c0453bb27b7a21f1bec83e0aa3e9d8685c0435dacf3e72a
3
+ metadata.gz: 6772c46b21f3e433f04fb8c2c1d3ebc12cd48d41783c70751ba2eb90ae8dc0d5
4
+ data.tar.gz: f4a098cc19c7357ec473d3167b6b793d1e6197a6592e4abdca449a6d78674273
5
5
  SHA512:
6
- metadata.gz: 9eef997b64338768d8f7f37aa579a3e4c332335b4ade9538fec69e0db7330a6c2b86574ec5192eb510bbca058079601aecca977346cf45e85521a94ecfea9b1c
7
- data.tar.gz: 8a9ef60b34392efe292a5caa02834b0109eb5ef786fc07680ac640050fcc08256a525f194217d395917b3f628a568f31d7f11f1c5064738a52c4e2a02500f8f3
6
+ metadata.gz: 10534955c4393d6241001a96d90e20bc667f6ae09a5d4a1a2f4a15caced9b928646d53aa53598ac0c5132559305546a7f802548e30156a7ad5a24f967d70f111
7
+ data.tar.gz: 01cf0cbf46224eb0c5b95269e681fe5e73703a0a216f3f898faaa5d5471bc6c536fd396caa1fbee873d81f9e606679028849fc3b01e290dcb6ca9094e20ca219
data/lib/dapp.rb CHANGED
@@ -43,6 +43,7 @@ require 'dapp/exception/base'
43
43
  require 'dapp/cli'
44
44
  require 'dapp/cli/command/base'
45
45
  require 'dapp/cli/command/update'
46
+ require 'dapp/cli/command/slug'
46
47
  require 'dapp/cli/cli'
47
48
  require 'dapp/config/directive/base'
48
49
  require 'dapp/config/config'
@@ -54,6 +55,7 @@ require 'dapp/dapp/dappfile'
54
55
  require 'dapp/dapp/chef'
55
56
  require 'dapp/dapp/dapp_config'
56
57
  require 'dapp/dapp/option_tags'
58
+ require 'dapp/dapp/slug'
57
59
  require 'dapp/dapp/logging/base'
58
60
  require 'dapp/dapp/logging/process'
59
61
  require 'dapp/dapp/logging/paint'
@@ -64,6 +66,7 @@ require 'dapp/dapp/deps/gitartifact'
64
66
  require 'dapp/dapp/shellout/streaming'
65
67
  require 'dapp/dapp/shellout/base'
66
68
  require 'dapp/dapp/command/common'
69
+ require 'dapp/dapp/command/slug'
67
70
  require 'dapp/dapp'
68
71
  require 'dapp/deployment'
69
72
  require 'dapp/deployment/config/directive/mod/group'
data/lib/dapp/cli.rb CHANGED
@@ -5,7 +5,7 @@ module Dapp
5
5
  extend Helper::Cli
6
6
  include Helper::Trivia
7
7
 
8
- SUBCOMMANDS = ['dimg', 'deployment', 'kube', 'update'].freeze
8
+ SUBCOMMANDS = ['dimg', 'deployment', 'kube', 'update', 'slug'].freeze
9
9
 
10
10
  banner <<BANNER.freeze
11
11
  Usage: dapp subcommand [subcommand options]
@@ -16,6 +16,7 @@ Available subcommands: (for details, dapp SUB-COMMAND --help)
16
16
  dapp deployment
17
17
  dapp kube
18
18
  dapp update
19
+ dapp slug STRING
19
20
 
20
21
  Options:
21
22
  BANNER
@@ -7,9 +7,13 @@ module Dapp
7
7
  description: 'Change to directory',
8
8
  on: :head
9
9
 
10
- option :build_dir,
11
- long: '--build-dir PATH',
12
- description: 'Directory where build cache stored (DIR/.dapp_build by default)'
10
+ %w(run_dir build_dir deploy_dir).tap do |dirs|
11
+ dirs.each do |dir|
12
+ option dir.to_sym,
13
+ long: "--#{dir.gsub("_", "-")} PATH",
14
+ description: "Directory where reside: build cache, lock files for concurrent dapp operations (DIR/.dapp_build by default). Alias for #{(dirs - [dir]).map{|d| "--" + d.gsub("_", "-")}.join(", ")}."
15
+ end
16
+ end
13
17
 
14
18
  option :name,
15
19
  long: "--name NAME",
@@ -88,7 +92,12 @@ module Dapp
88
92
  end
89
93
 
90
94
  def cli_options(**kwargs)
91
- config.merge(**kwargs)
95
+ dirs = [config[:build_dir], config[:run_dir], config[:deploy_dir]]
96
+ if dirs.compact.size > 1
97
+ self.class.print_error_with_help_and_die! self, "cannot use alias options --run-dir, --build-dir, --deploy-dir at the same time"
98
+ end
99
+
100
+ config.merge(build_dir: dirs.compact.first, **kwargs)
92
101
  end
93
102
  end
94
103
  end
@@ -0,0 +1,22 @@
1
+ module Dapp
2
+ class CLI
3
+ module Command
4
+ class Slug < Base
5
+ banner <<BANNER.freeze
6
+ Usage:
7
+
8
+ dapp slug STRING
9
+
10
+ Options:
11
+ BANNER
12
+ def run(argv = ARGV)
13
+ self.class.parse_options(self, argv)
14
+ str = self.class.required_argument(self, 'string')
15
+ run_dapp_command(nil, options: cli_options, log_running_time: false) do |dapp|
16
+ dapp.slug([cli_arguments, str].flatten.join(' '))
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -2,7 +2,17 @@ module Dapp
2
2
  class CLI
3
3
  module Command
4
4
  class Update < ::Dapp::CLI
5
- def run(_argv)
5
+ banner <<BANNER.freeze
6
+ Usage:
7
+
8
+ dapp update
9
+
10
+ Options:
11
+ BANNER
12
+
13
+ def run(argv = ARGV)
14
+ self.class.parse_options(self, argv)
15
+
6
16
  spec = Gem::Specification.find do |s|
7
17
  File.fnmatch?(File.join(s.full_gem_path, '**', '*'), __FILE__, File::FNM_PATHNAME)
8
18
  end
data/lib/dapp/dapp.rb CHANGED
@@ -6,8 +6,10 @@ module Dapp
6
6
  include Chef
7
7
  include DappConfig
8
8
  include OptionTags
9
+ include Slug
9
10
 
10
11
  include Command::Common
12
+ include Command::Slug
11
13
 
12
14
  include Logging::Base
13
15
  include Logging::Process
@@ -41,17 +43,20 @@ module Dapp
41
43
 
42
44
  def name
43
45
  @name ||= begin
44
- if name = options[:name]
45
- name
46
- elsif git_url
47
- repo_name = git_url.split('/').last
48
- repo_name = repo_name[/.*(?=\.git)/] if repo_name.end_with? '.git'
49
- repo_name
50
- elsif git_path
51
- File.basename(File.dirname(git_path)).to_s
52
- else
53
- path.basename.to_s
46
+ n = begin
47
+ if (name = options[:name])
48
+ name
49
+ elsif git_url
50
+ repo_name = git_url.split('/').last
51
+ repo_name = repo_name[/.*(?=\.git)/] if repo_name.end_with? '.git'
52
+ repo_name
53
+ elsif git_path
54
+ File.basename(File.dirname(git_path)).to_s
55
+ else
56
+ path.basename.to_s
57
+ end
54
58
  end
59
+ consistent_uniq_slugify(n)
55
60
  end
56
61
  end
57
62
 
@@ -0,0 +1,11 @@
1
+ module Dapp
2
+ class Dapp
3
+ module Command
4
+ module Slug
5
+ def slug(str)
6
+ puts consistent_uniq_slugify(str)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -14,6 +14,9 @@ module Dapp
14
14
  [simple_tags, branch_tags, commit_tags, build_tags, ci_tags].reduce({}) do |some_tags_by_scheme, tags_by_scheme|
15
15
  tags_by_scheme.in_depth_merge(some_tags_by_scheme)
16
16
  end.tap do |tags_by_scheme|
17
+ [:git_branch, :git_tag].each do |scheme|
18
+ tags_by_scheme[scheme].map!(&method(:consistent_uniq_slugify)) unless tags_by_scheme[scheme].nil?
19
+ end
17
20
  tags_by_scheme[:custom] = [:latest] if tags_by_scheme.values.flatten.empty?
18
21
  end
19
22
  end
@@ -0,0 +1,25 @@
1
+ module Dapp
2
+ class Dapp
3
+ module Slug
4
+ def consistent_uniq_slugify(s)
5
+ if should_be_slugged?(s)
6
+ consistent_uniq_slug_reg =~ s.slugify.squeeze('--')
7
+ [].tap do |slug|
8
+ slug << Regexp.last_match(1) unless Regexp.last_match(1).nil?
9
+ slug << MurmurHash3::V32.str_hexdigest(s)
10
+ end.compact.join('-')
11
+ else
12
+ s
13
+ end
14
+ end
15
+
16
+ def should_be_slugged?(s)
17
+ !(/^#{consistent_uniq_slug_reg}$/ =~ s)
18
+ end
19
+
20
+ def consistent_uniq_slug_reg
21
+ /(?!-)((-?[a-z0-9]+)+)(?<!-)/
22
+ end
23
+ end # Slug
24
+ end # Dapp
25
+ end # Dapp
@@ -247,7 +247,7 @@ module Dapp
247
247
  end
248
248
 
249
249
  def image_should_be_prepared?
250
- (!image.built? && !should_be_not_present? || image_should_be_introspected?) && !dimg.dapp.dry_run?
250
+ (!image.built? && !should_be_not_present? || image_should_be_introspected? && image.tagged?) && !dimg.dapp.dry_run?
251
251
  end
252
252
 
253
253
  def should_be_renewed?
@@ -19,6 +19,10 @@ BANNER
19
19
  long: '--with-stages',
20
20
  boolean: true
21
21
 
22
+ option :without_kube,
23
+ long: '--without-kube',
24
+ boolean: true
25
+
22
26
  def run(argv = ARGV)
23
27
  self.class.parse_options(self, argv)
24
28
  repo = self.class.required_argument(self, 'repo')
@@ -42,8 +42,8 @@ module Dapp
42
42
  cleanup_repo_by_nonexistent_git_base(detailed_dimgs_images_by_scheme, scheme) do |detailed_dimg_image|
43
43
  delete_repo_image(registry, detailed_dimg_image) unless begin
44
44
  case scheme
45
- when 'git_tag' then git_local_repo.tags.include?(detailed_dimg_image[:tag])
46
- when 'git_branch' then git_local_repo.remote_branches.include?(detailed_dimg_image[:tag])
45
+ when 'git_tag' then consistent_git_tags.include?(detailed_dimg_image[:tag])
46
+ when 'git_branch' then consistent_git_remote_branches.include?(detailed_dimg_image[:tag])
47
47
  when 'git_commit' then git_local_repo.commit_exists?(detailed_dimg_image[:tag])
48
48
  else
49
49
  raise
@@ -53,6 +53,14 @@ module Dapp
53
53
  end
54
54
  end
55
55
 
56
+ def consistent_git_tags
57
+ git_tag_by_consistent_tag_name.keys
58
+ end
59
+
60
+ def consistent_git_remote_branches
61
+ @consistent_git_remote_branches ||= git_local_repo.remote_branches.map(&method(:consistent_uniq_slugify))
62
+ end
63
+
56
64
  def cleanup_repo_by_nonexistent_git_base(repo_dimgs_images_by_scheme, dapp_tag_scheme)
57
65
  return if repo_dimgs_images_by_scheme[dapp_tag_scheme].empty?
58
66
  log_step_with_indent(:"nonexistent #{dapp_tag_scheme.split('_').join(' ')}") do
@@ -98,6 +106,14 @@ module Dapp
98
106
  end
99
107
  end
100
108
 
109
+ def git_tag_by_consistent_git_tag(consistent_git_tag)
110
+ git_tag_by_consistent_tag_name[consistent_git_tag]
111
+ end
112
+
113
+ def git_tag_by_consistent_tag_name
114
+ @git_consistent_tags ||= git_local_repo.tags.map { |t| [consistent_uniq_slugify(t), t] }.to_h
115
+ end
116
+
101
117
  def repo_detailed_dimgs_images(registry)
102
118
  repo_dimgs_images(registry).each do |dimg|
103
119
  image_history = registry.image_history(dimg[:tag], dimg[:dimg])
@@ -107,6 +123,8 @@ module Dapp
107
123
  end
108
124
 
109
125
  def deployed_docker_images
126
+ return [] if without_kube?
127
+
110
128
  # open kube client, get all pods and select containers' images
111
129
  ::Dapp::Kube::Kubernetes::Client.tap do |kube|
112
130
  config_file = kube.kube_config_path
@@ -138,6 +156,10 @@ module Dapp
138
156
  image.start_with?(option_repo)
139
157
  end
140
158
  end
159
+
160
+ def without_kube?
161
+ !!options[:without_kube]
162
+ end
141
163
  end
142
164
  end
143
165
  end
@@ -110,7 +110,7 @@ module Dapp
110
110
  end
111
111
 
112
112
  def all_options
113
- service_options.merge(options)
113
+ service_options.in_depth_merge(options)
114
114
  end
115
115
 
116
116
  def all_bash_commands
@@ -118,7 +118,12 @@ module Dapp
118
118
  end
119
119
 
120
120
  def service_options
121
- { entrypoint: dapp.bash_bin, name: container_name, user: '0:0' }
121
+ {
122
+ entrypoint: dapp.bash_bin,
123
+ name: container_name,
124
+ user: '0:0',
125
+ :'volumes-from' => [dapp.base_container, dapp.toolchain_container]
126
+ }
122
127
  end
123
128
 
124
129
  def prepared_change
@@ -22,18 +22,12 @@ module Dapp
22
22
  end
23
23
 
24
24
  def build!
25
- add_build_service_volumes
26
25
  run!
27
26
  @built_id = commit!
28
27
  ensure
29
28
  dapp.shellout("#{dapp.host_docker} rm #{container_name}")
30
29
  end
31
30
 
32
- def add_build_service_volumes
33
- add_volumes_from dapp.toolchain_container
34
- add_volumes_from dapp.base_container
35
- end
36
-
37
31
  def built?
38
32
  !built_id.nil?
39
33
  end
@@ -10,22 +10,23 @@ module Dapp
10
10
  def cli_wrapper(cli)
11
11
  yield
12
12
  rescue OptionParser::MissingArgument, OptionParser::InvalidOption, OptionParser::InvalidArgument, OptionParser::AmbiguousOption => e
13
- STDERR.puts "Error: #{e.message}"
14
- puts
15
- puts cli.opt_parser
16
- exit 1
13
+ print_error_with_help_and_die!(cli, e.message)
17
14
  end
18
15
 
19
16
  def required_argument(cli, argument)
20
17
  unless (arg = cli.cli_arguments.pop)
21
- STDERR.puts "Error: required argument `#{argument.upcase}`"
22
- puts
23
- puts cli.opt_parser
24
- exit 1
18
+ print_error_with_help_and_die!(cli, "required argument `#{argument.upcase}`")
25
19
  end
26
20
  arg
27
21
  end
28
22
 
23
+ def print_error_with_help_and_die!(cli, error_message)
24
+ STDERR.puts "Error: #{error_message}"
25
+ puts
26
+ puts cli.opt_parser
27
+ exit 1
28
+ end
29
+
29
30
  def parse_subcommand(cli, args)
30
31
  argv = args
31
32
  divided_subcommand = []
@@ -3,6 +3,10 @@ module Dapp
3
3
  module Dapp
4
4
  module Command
5
5
  module Common
6
+ def lock_helm_release(&blk)
7
+ lock("helm_release.#{kube_release_name}", &blk)
8
+ end
9
+
6
10
  def helm_release
7
11
  kube_check_helm!
8
12
  kube_check_helm_template_plugin!
@@ -260,7 +264,7 @@ image: {{ tuple $name $context | include "_dimg2" }}
260
264
  end
261
265
 
262
266
  def kube_release_name
263
- "#{name}-#{kube_namespace}".slugify
267
+ consistent_uniq_slugify("#{name}-#{kube_namespace}")
264
268
  end
265
269
 
266
270
  { encode: :generate, decode: :extract }.each do |type, secret_method|
@@ -5,8 +5,16 @@ module Dapp
5
5
  module Deploy
6
6
  def kube_deploy
7
7
  helm_release do |release|
8
- kube_flush_hooks_jobs(release)
9
- kube_run_deploy(release)
8
+ do_deploy = proc do
9
+ kube_flush_hooks_jobs(release)
10
+ kube_run_deploy(release)
11
+ end
12
+
13
+ if dry_run?
14
+ do_deploy.call
15
+ else
16
+ lock_helm_release &do_deploy
17
+ end
10
18
  end
11
19
  end
12
20
 
@@ -4,11 +4,13 @@ module Dapp
4
4
  module Command
5
5
  module Dismiss
6
6
  def kube_dismiss
7
- kube_check_helm!
8
- kube_check_helm_release!
9
- log_process("Delete release #{kube_release_name}") do
10
- shellout! "helm delete #{kube_release_name} --purge"
11
- kubernetes.delete_namespace!(kube_namespace) if options[:with_namespace]
7
+ lock_helm_release do
8
+ kube_check_helm!
9
+ kube_check_helm_release!
10
+ log_process("Delete release #{kube_release_name}") do
11
+ shellout! "helm delete #{kube_release_name} --purge"
12
+ kubernetes.delete_namespace!(kube_namespace) if options[:with_namespace]
13
+ end
12
14
  end
13
15
  end
14
16
 
data/lib/dapp/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = '0.22.1'.freeze
2
+ VERSION = '0.22.2'.freeze
3
3
  BUILD_CACHE_VERSION = 25
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.1
4
+ version: 0.22.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Stolyarov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-07 00:00:00.000000000 Z
11
+ date: 2017-12-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -425,6 +425,7 @@ files:
425
425
  - lib/dapp/cli.rb
426
426
  - lib/dapp/cli/cli.rb
427
427
  - lib/dapp/cli/command/base.rb
428
+ - lib/dapp/cli/command/slug.rb
428
429
  - lib/dapp/cli/command/update.rb
429
430
  - lib/dapp/config/config.rb
430
431
  - lib/dapp/config/directive/base.rb
@@ -434,6 +435,7 @@ files:
434
435
  - lib/dapp/dapp.rb
435
436
  - lib/dapp/dapp/chef.rb
436
437
  - lib/dapp/dapp/command/common.rb
438
+ - lib/dapp/dapp/command/slug.rb
437
439
  - lib/dapp/dapp/dapp_config.rb
438
440
  - lib/dapp/dapp/dappfile.rb
439
441
  - lib/dapp/dapp/deps/base.rb
@@ -448,6 +450,7 @@ files:
448
450
  - lib/dapp/dapp/option_tags.rb
449
451
  - lib/dapp/dapp/shellout/base.rb
450
452
  - lib/dapp/dapp/shellout/streaming.rb
453
+ - lib/dapp/dapp/slug.rb
451
454
  - lib/dapp/dapp/ssh_agent.rb
452
455
  - lib/dapp/deployment.rb
453
456
  - lib/dapp/deployment/app.rb