dapp 0.20.0 → 0.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/config/en/net_status.yml +4 -2
  3. data/lib/dapp.rb +2 -1
  4. data/lib/dapp/dapp.rb +1 -0
  5. data/lib/dapp/dapp/git_artifact.rb +4 -0
  6. data/lib/dapp/dapp/option_tags.rb +63 -0
  7. data/lib/dapp/dimg/build/stage/base.rb +1 -1
  8. data/lib/dapp/dimg/build/stage/ga_base.rb +1 -1
  9. data/lib/dapp/dimg/cli/command/dimg/stages.rb +4 -4
  10. data/lib/dapp/dimg/cli/command/dimg/stages/cleanup_local.rb +2 -4
  11. data/lib/dapp/dimg/cli/command/dimg/stages/cleanup_repo.rb +1 -3
  12. data/lib/dapp/dimg/cli/command/dimg/stages/flush_local.rb +2 -4
  13. data/lib/dapp/dimg/cli/command/dimg/stages/flush_repo.rb +2 -4
  14. data/lib/dapp/dimg/dapp/command/common.rb +1 -1
  15. data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +9 -9
  16. data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +42 -51
  17. data/lib/dapp/dimg/dapp/command/stages/common.rb +33 -25
  18. data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +2 -2
  19. data/lib/dapp/dimg/dapp/dappfile.rb +8 -0
  20. data/lib/dapp/dimg/dimg.rb +1 -2
  21. data/lib/dapp/dimg/docker_registry.rb +1 -1
  22. data/lib/dapp/dimg/docker_registry/base.rb +3 -5
  23. data/lib/dapp/dimg/docker_registry/default.rb +1 -1
  24. data/lib/dapp/dimg/docker_registry/dimg.rb +58 -0
  25. data/lib/dapp/dimg/git_artifact.rb +21 -21
  26. data/lib/dapp/dimg/git_repo/base.rb +24 -3
  27. data/lib/dapp/dimg/git_repo/own.rb +4 -4
  28. data/lib/dapp/dimg/git_repo/remote.rb +3 -3
  29. data/lib/dapp/kube/cli/command/kube/deploy.rb +25 -3
  30. data/lib/dapp/kube/cli/command/kube/lint.rb +36 -14
  31. data/lib/dapp/kube/cli/command/kube/render.rb +25 -3
  32. data/lib/dapp/kube/dapp/command/common.rb +9 -5
  33. data/lib/dapp/kube/dapp/command/lint.rb +3 -3
  34. data/lib/dapp/kube/helm/release.rb +4 -4
  35. data/lib/dapp/version.rb +1 -1
  36. metadata +4 -3
  37. data/lib/dapp/dimg/dimg/tags.rb +0 -65
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 25371f86eea9f7d1896fc258be654241cf1021c05bfdc472da2cd676e2bdda56
4
- data.tar.gz: d2c8a9e2f4e116ab34ae80c8dae3cca09d31715cc0d80da2c71d06c323f04818
3
+ metadata.gz: 03083f145a1b261c09f5ac85cb210498603ae8255b9d1caf8f4a20f1c44781a5
4
+ data.tar.gz: 042aaa870856b1141411106909baa1d6e7e880ca43d9b87b037c09f5dc37f4ac
5
5
  SHA512:
6
- metadata.gz: f89fc98080749f41fdf250897010079dd0aaa38c8ffabd1dbfc1874d5c30a40ff303521b2af0c3bc61781cafd93e97acf28562a0bd0cbccdd6c14da4a085d34e
7
- data.tar.gz: e8c81970d2f75f1339aab19900874725f3147be4d82ad6febbaafa2863414065d64d65bdc79839bb62005e422d3f1d1b84ae4325d9f2aa3208e4975a74c83a25
6
+ metadata.gz: a337d11f46ccda094b8295a245e1416a1e0027fe23b1738181c77d1619eb79172c81d7c1a1040050d52c93227b9f6d4f9d70d866589b0edc5fc02c9edd1ed359
7
+ data.tar.gz: 59f31c8087e4c50b22e8135bbe943887322bd4ab021f51029d008d30a236e8ecbffa896c451c94c6989276599201e063e67c6c583860d760b5291a36749a4f8e
@@ -6,8 +6,6 @@ en:
6
6
  dimg:
7
7
  dimg_not_built: "Dimg hasn't been built yet!"
8
8
  dimg_not_run: "Dimg run failed!"
9
- git_branch_without_name: "Dimg has specific revision that isn't associated with a branch name!"
10
- ci_environment_required: 'CI environment required (Travis or GitLab CI)!'
11
9
  kube:
12
10
  deploy_timeout: "Deploy timeout!"
13
11
  dappfile:
@@ -44,6 +42,7 @@ en:
44
42
  user_containers_detected: "User containers are using these images:\n%{ids}"
45
43
  incorrect_yaml_structure: "Incorrect YAML structure in `%{path}`!"
46
44
  editor_not_found: "Editor not found!"
45
+ expected_only_one_tag: 'Expected only one tag (`%{tags}`)!'
47
46
  dapp:
48
47
  no_such_dimg: "No such dimg: `%{dimgs_patterns}`!"
49
48
  no_such_app: "No such app: `%{apps_patterns}`!"
@@ -57,6 +56,8 @@ en:
57
56
  yaml_incorrect: "`%{message}`"
58
57
  incorrect_dapp_config_option: ".dapp_config includes option `%{option}` with incorrect value `%{value}`: expected one of the following types [%{expected}]"
59
58
  incorrect_dapp_config_option_color: ".dapp_config includes option `color` with incorrect value `%{value}`: expected one of the following values [%{expected}]"
59
+ ci_environment_required: 'CI environment required (Travis or GitLab CI)!'
60
+ git_branch_without_name: "Dimg has specific revision that isn't associated with a branch name!"
60
61
  config:
61
62
  dimg_name_required: 'Dimg name required!'
62
63
  dimg_name_incorrect: "Dimg has incorrect name `%{value}`: doesn't match regex `%{pattern}`!"
@@ -108,6 +109,7 @@ en:
108
109
  no_such_dimg: 'Registry `%{registry}`: no such dimg in registry!'
109
110
  authenticate_type_not_supported: 'Registry `%{registry}`: authenticate type is not supported!'
110
111
  page_not_found: "Registry `%{registry}`: page `%{url}` not found!"
112
+ method_not_allowed: "Registry `%{registry}`: method `%{method}` not allowed (`%{url}`)!"
111
113
  user_not_authorized: 'Registry `%{registry}`: user not authorized!'
112
114
  rugged:
113
115
  git_repository_reference_error: "Git repo `%{name}`: %{message}!"
@@ -53,6 +53,7 @@ require 'dapp/dapp/git_artifact'
53
53
  require 'dapp/dapp/dappfile'
54
54
  require 'dapp/dapp/chef'
55
55
  require 'dapp/dapp/dapp_config'
56
+ require 'dapp/dapp/option_tags'
56
57
  require 'dapp/dapp/logging/base'
57
58
  require 'dapp/dapp/logging/process'
58
59
  require 'dapp/dapp/logging/paint'
@@ -258,6 +259,7 @@ require 'dapp/dimg/docker_registry'
258
259
  require 'dapp/dimg/docker_registry/base/request'
259
260
  require 'dapp/dimg/docker_registry/base/authorization'
260
261
  require 'dapp/dimg/docker_registry/base'
262
+ require 'dapp/dimg/docker_registry/dimg'
261
263
  require 'dapp/dimg/docker_registry/default'
262
264
  require 'dapp/dimg/error/base'
263
265
  require 'dapp/dimg/error/dimg'
@@ -285,7 +287,6 @@ require 'dapp/dimg/image/stage'
285
287
  require 'dapp/dimg/image/scratch'
286
288
  require 'dapp/dimg/dimg/git_artifact'
287
289
  require 'dapp/dimg/dimg/path'
288
- require 'dapp/dimg/dimg/tags'
289
290
  require 'dapp/dimg/dimg/stages'
290
291
  require 'dapp/dimg/dimg'
291
292
  require 'dapp/dimg/artifact'
@@ -5,6 +5,7 @@ module Dapp
5
5
  include Dappfile
6
6
  include Chef
7
7
  include DappConfig
8
+ include OptionTags
8
9
 
9
10
  include Logging::Base
10
11
  include Logging::Process
@@ -6,6 +6,10 @@ module Dapp
6
6
  yield exclude_paths if block_given?
7
7
  end
8
8
  end
9
+
10
+ def dimgstage_ga_label(paramshash)
11
+ "dapp-git-#{paramshash}-commit"
12
+ end
9
13
  end # GitArtifact
10
14
  end # Dapp
11
15
  end # Dapp
@@ -0,0 +1,63 @@
1
+ module Dapp
2
+ class Dapp
3
+ module OptionTags
4
+ def git_local_repo
5
+ @git_repo ||= ::Dapp::Dimg::GitRepo::Own.new(self)
6
+ end
7
+
8
+ def option_tags
9
+ @tags ||= begin
10
+ tags = simple_tags + branch_tags + commit_tags + build_tags + ci_tags
11
+ tags << :latest if tags.empty?
12
+ tags
13
+ end
14
+ end
15
+
16
+ def simple_tags
17
+ options[:tag]
18
+ end
19
+
20
+ def branch_tags
21
+ return [] unless options[:tag_branch]
22
+ raise Error::Dapp, code: :git_branch_without_name if (branch = git_local_repo.branch) == 'HEAD'
23
+ [branch]
24
+ end
25
+
26
+ def commit_tags
27
+ return [] unless options[:tag_commit]
28
+ commit = git_local_repo.latest_commit
29
+ [commit]
30
+ end
31
+
32
+ def build_tags
33
+ return [] unless options[:tag_build_id]
34
+
35
+ if ENV['GITLAB_CI']
36
+ build_id = ENV['CI_BUILD_ID']
37
+ elsif ENV['TRAVIS']
38
+ build_id = ENV['TRAVIS_BUILD_NUMBER']
39
+ else
40
+ raise Error::Dapp, code: :ci_environment_required
41
+ end
42
+
43
+ [build_id]
44
+ end
45
+
46
+ def ci_tags
47
+ return [] unless options[:tag_ci]
48
+
49
+ if ENV['GITLAB_CI']
50
+ branch = ENV['CI_BUILD_REF_NAME']
51
+ tag = ENV['CI_BUILD_TAG']
52
+ elsif ENV['TRAVIS']
53
+ branch = ENV['TRAVIS_BRANCH']
54
+ tag = ENV['TRAVIS_TAG']
55
+ else
56
+ raise Error::Dapp, code: :ci_environment_required
57
+ end
58
+
59
+ [branch, tag].compact
60
+ end
61
+ end # Tags
62
+ end # Dapp
63
+ end # Dapp
@@ -191,7 +191,7 @@ module Dapp
191
191
  def layer_commit(git_artifact)
192
192
  commits[git_artifact] ||= begin
193
193
  if image.tagged?
194
- image.labels["dapp-git-#{git_artifact.paramshash}-commit"]
194
+ image.labels[dimg.dapp.dimgstage_ga_label(git_artifact.paramshash)]
195
195
  else
196
196
  git_artifact.latest_commit
197
197
  end
@@ -10,7 +10,7 @@ module Dapp
10
10
  image.add_volume "#{dimg.tmp_path('patches')}:#{dimg.container_tmp_path('patches')}:ro"
11
11
 
12
12
  dimg.git_artifacts.each do |git_artifact|
13
- image.add_service_change_label("dapp-git-#{git_artifact.paramshash}-commit".to_sym => git_artifact.latest_commit)
13
+ image.add_service_change_label(dimg.dapp.dimgstage_ga_label(git_artifact.paramshash).to_sym => git_artifact.latest_commit)
14
14
  image.add_command git_artifact.send(apply_command_method, self)
15
15
  end
16
16
  end
@@ -7,10 +7,10 @@ module Dapp::Dimg::CLI
7
7
  banner <<BANNER.freeze
8
8
  Available subcommands: (for details, dapp dimg stages SUB-COMMAND --help)
9
9
 
10
- dapp dimg stages cleanup local [options] [DIMG ...] [REPO]
11
- dapp dimg stages cleanup repo [options] [DIMG ...] REPO
12
- dapp dimg stages flush local [options] [DIMG ...]
13
- dapp dimg stages flush repo [options] [DIMG ...] REPO
10
+ dapp dimg stages cleanup local [options] [REPO]
11
+ dapp dimg stages cleanup repo [options] REPO
12
+ dapp dimg stages flush local [options]
13
+ dapp dimg stages flush repo [options] REPO
14
14
  dapp dimg stages push [options] [DIMG ...] REPO
15
15
  dapp dimg stages pull [options] [DIMG ...] REPO
16
16
 
@@ -6,9 +6,7 @@ module Dapp::Dimg::CLI
6
6
  banner <<BANNER.freeze
7
7
  Usage:
8
8
 
9
- dapp dimg stages cleanup local [options] [DIMG ...] [REPO]
10
-
11
- DIMG Dapp image to process [default: *].
9
+ dapp dimg stages cleanup local [options] [REPO]
12
10
 
13
11
  Options:
14
12
  BANNER
@@ -33,7 +31,7 @@ BANNER
33
31
  def run(argv = ARGV)
34
32
  self.class.parse_options(self, argv)
35
33
  repository = repo
36
- run_dapp_command(run_method, options: cli_options(dimgs_patterns: cli_arguments, repo: repository))
34
+ run_dapp_command(run_method, options: cli_options(repo: repository))
37
35
  end
38
36
 
39
37
  def repo
@@ -6,9 +6,7 @@ module Dapp::Dimg::CLI
6
6
  banner <<BANNER.freeze
7
7
  Usage:
8
8
 
9
- dapp dimg stages cleanup repo [options] [DIMG ...] REPO
10
-
11
- DIMG Dapp image to process [default: *].
9
+ dapp dimg stages cleanup repo [options] REPO
12
10
 
13
11
  Options:
14
12
  BANNER
@@ -6,15 +6,13 @@ module Dapp::Dimg::CLI
6
6
  banner <<BANNER.freeze
7
7
  Usage:
8
8
 
9
- dapp dimg stages flush local [options] [DIMG ...]
10
-
11
- DIMG Dapp image to process [default: *].
9
+ dapp dimg stages flush local [options]
12
10
 
13
11
  Options:
14
12
  BANNER
15
13
  def run(argv = ARGV)
16
14
  self.class.parse_options(self, argv)
17
- run_dapp_command(:stages_flush_local, options: cli_options(dimgs_patterns: cli_arguments))
15
+ run_dapp_command(:stages_flush_local, options: cli_options)
18
16
  end
19
17
  end
20
18
  end
@@ -6,9 +6,7 @@ module Dapp::Dimg::CLI
6
6
  banner <<BANNER.freeze
7
7
  Usage:
8
8
 
9
- dapp dimg stages flush repo [options] [DIMG ...] REPO
10
-
11
- DIMG Dapp image to process [default: *].
9
+ dapp dimg stages flush repo [options] REPO
12
10
 
13
11
  Options:
14
12
  BANNER
@@ -21,7 +19,7 @@ BANNER
21
19
  def run(argv = ARGV)
22
20
  self.class.parse_options(self, argv)
23
21
  repo = self.class.required_argument(self, 'repo')
24
- run_dapp_command(:stages_flush_repo, options: cli_options(dimgs_patterns: cli_arguments, repo: repo))
22
+ run_dapp_command(:stages_flush_repo, options: cli_options(repo: repo))
25
23
  end
26
24
  end
27
25
  end
@@ -159,7 +159,7 @@ module Dapp
159
159
  if dimg_name.nil?
160
160
  spush_format
161
161
  else
162
- '%{repo}:%{dimg_name}-%{tag}'
162
+ '%{repo}/%{dimg_name}:%{tag}'
163
163
  end
164
164
  end
165
165
 
@@ -45,29 +45,29 @@ module Dapp
45
45
  log_step_with_indent(name) do
46
46
  dapp_project_dangling_images_flush
47
47
 
48
- dimgs, stages = dapp_project_images.partition { |image| repo_dimgs.values.include?(image[:id]) }
49
- dimgs.each { |dimg_image| except_dapp_project_image_with_parents(dimg_image[:id], stages) }
48
+ dimgs, dimgstages = dapp_project_images.partition { |image| repo_dimgs.any? { |dimg| dimg[:id] == image[:id] } }
49
+ dimgs.each { |dimg_image| except_dapp_project_image_with_parents(dimg_image[:id], dimgstages) }
50
50
 
51
51
  # Удаление только образов старше 2ч
52
- stages.delete_if do |stage_image|
53
- Time.now - stage_image[:created_at] < 2*60*60
52
+ dimgstages.delete_if do |dimgstage|
53
+ Time.now - dimgstage[:created_at] < 2*60*60
54
54
  end
55
55
 
56
- remove_project_images(stages.map { |image| image[:id]} )
56
+ remove_project_images(dimgstages.map { |dimgstage| dimgstage[:id]} )
57
57
  end
58
58
  end
59
59
  end
60
60
 
61
- def except_dapp_project_image_with_parents(image_id, stages)
61
+ def except_dapp_project_image_with_parents(image_id, dimgstages)
62
62
  if dapp_project_image_exist?(image_id)
63
- dapp_project_image_artifacts_ids_in_labels(image_id).each { |aiid| except_dapp_project_image_with_parents(aiid, stages) }
63
+ dapp_project_image_artifacts_ids_in_labels(image_id).each { |aiid| except_dapp_project_image_with_parents(aiid, dimgstages) }
64
64
  iid = image_id
65
65
  loop do
66
- stages.delete_if { |stage_image| stage_image[:id] == iid }
66
+ dimgstages.delete_if { |dimgstage| dimgstage[:id] == iid }
67
67
  break if (iid = dapp_project_image_parent_id(iid)).nil?
68
68
  end
69
69
  else
70
- stages.delete_if { |stage_image| stage_image[:id] == image_id }
70
+ dimgstages.delete_if { |dimgstage| dimgstage[:id] == dimgstage }
71
71
  end
72
72
  end
73
73
 
@@ -10,89 +10,80 @@ module Dapp
10
10
 
11
11
  registry = registry(repo)
12
12
  repo_dimgs = repo_dimgs_images(registry)
13
- repo_stages = repo_stages_images(registry)
13
+ repo_dimgstages = repo_dimgstages_images(registry)
14
14
 
15
- repo_stages.delete_if { |_, siid| repo_dimgs.values.include?(siid) } # ignoring stages with dimgs ids (v2)
15
+ repo_dimgstages.delete_if { |dimgstage| repo_dimgs.any? { |dimg| dimgstage[:id] == dimg[:id] } } # ignoring stages with dimgs ids (v2)
16
16
 
17
- proper_repo_cache(registry, repo_stages) if proper_cache_version?
18
- repo_stages_cleanup(registry, repo_dimgs, repo_stages) if proper_repo_cache?
19
- proper_repo_git_commit(registry) if proper_git_commit?
17
+ proper_repo_cache(registry, repo_dimgstages) if proper_cache_version?
18
+ repo_dimgstages_cleanup(registry, repo_dimgs, repo_dimgstages) if proper_repo_cache?
19
+ proper_repo_git_commit(registry) if proper_git_commit?
20
20
  end
21
21
  end
22
22
 
23
23
  protected
24
24
 
25
- def proper_repo_cache(registry, repo_stages)
25
+ def proper_repo_cache(registry, repo_dimgstages)
26
26
  log_proper_cache do
27
- wrong_cache_images = repo_stages.select do |image_tag, _|
28
- repo_image_dapp_cache_version_label(registry, image_tag) != ::Dapp::BUILD_CACHE_VERSION.to_s
29
- end
30
- wrong_cache_images.each { |image_tag, _| delete_repo_image(registry, image_tag) }
31
- repo_stages.delete_if { |image_tag, _| wrong_cache_images.keys.include?(image_tag) }
27
+ repo_dimgstages
28
+ .select { |dimgstage| repo_image_dapp_cache_version_label(registry, dimgstage) != ::Dapp::BUILD_CACHE_VERSION.to_s }
29
+ .each { |dimgstage| delete_repo_image(registry, dimgstage); repo_dimgstages.delete_at(repo_dimgstages.index(dimgstage)) }
32
30
  end
33
31
  end
34
32
 
35
- def repo_stages_cleanup(registry, repo_dimgs, repo_stages)
33
+ def repo_dimgstages_cleanup(registry, repo_dimgs, repo_dimgstages)
36
34
  log_step_with_indent(option_repo) do
37
- repo_dimgs.each { |image_tag, image_id| clear_repo_stages(registry, repo_stages, image_tag, image_id) }
38
- repo_stages.keys.each { |image_tag| delete_repo_image(registry, image_tag) }
35
+ repo_dimgs.each { |dimg| except_repo_image_with_parents(registry, repo_dimgstages, dimg) }
36
+ repo_dimgstages.each { |dimgstage| delete_repo_image(registry, dimgstage) }
39
37
  end
40
38
  end
41
39
 
42
- def clear_repo_stages(registry, repo_stages, image_tag, image_id)
43
- repo_image_dapp_artifacts_labels(registry, image_tag).each do |iid|
44
- itag = find_image_tag_by_id(repo_stages, iid)
45
- clear_repo_stages(registry, repo_stages, itag, iid) unless itag.nil?
40
+ def except_repo_image_with_parents(registry, repo_dimgstages, repo_image)
41
+ repo_image_dapp_artifacts_labels(registry, repo_image).each do |aid|
42
+ repo_image = find_repo_image_by_id(repo_dimgstages, aid)
43
+ except_repo_image_with_parents(registry, repo_dimgstages, repo_image) unless repo_image.nil?
46
44
  end
47
45
 
48
- itag = image_tag
49
- iid = image_id
50
46
  loop do
51
- repo_stages.delete_if { |_, siid| siid == iid }
52
- break if itag.nil? || (iid = registry.image_parent_id(itag)).empty?
53
- itag = find_image_tag_by_id(repo_stages, iid)
47
+ repo_dimgstages.delete_if { |dimgstage| dimgstage[:id] == repo_image[:id] }
48
+ break if begin
49
+ (iid = registry.image_parent_id(repo_image[:tag], repo_image[:dimg])).empty? ||
50
+ (repo_image = find_repo_image_by_id(repo_dimgstages, iid)).nil?
51
+ end
54
52
  end
55
53
  end
56
54
 
57
- def repo_image_dapp_artifacts_labels(registry, image_tag)
58
- select_dapp_artifacts_ids(registry.image_labels(image_tag))
55
+ def repo_image_dapp_artifacts_labels(registry, repo_image)
56
+ select_dapp_artifacts_ids(registry.image_labels(repo_image[:tag], repo_image[:dimg]))
59
57
  end
60
58
 
61
- def repo_image_dapp_cache_version_label(registry, image_tag)
62
- registry.image_labels(image_tag)['dapp-cache-version']
59
+ def repo_image_dapp_cache_version_label(registry, repo_image)
60
+ registry.image_labels(repo_image[:tag], repo_image[:dimg])['dapp-cache-version']
63
61
  end
64
62
 
65
- def find_image_tag_by_id(images, image_id)
66
- images.each { |tag, id| return tag if id == image_id }
67
- nil
63
+ def find_repo_image_by_id(repo_images, repo_image_id)
64
+ repo_images.find { |repo_image| repo_image[:id] == repo_image_id }
68
65
  end
69
66
 
70
67
  def proper_repo_git_commit(registry)
71
68
  log_proper_git_commit do
72
69
  unproper_images = []
73
- repo_dapp_dappstage_images_detailed(registry).each do |_, attrs|
74
- attrs[:labels].each do |repo_name, commit|
70
+ repo_detailed_dimgstage_images(registry).each do |dimgstage|
71
+ dimgstage[:labels].each do |repo_name, commit|
75
72
  next if (repo = dapp_git_repositories[repo_name]).nil?
76
- unproper_images.concat(repo_image_tags_hierarchy(registry, attrs[:id])) unless repo.commit_exists?(commit)
73
+ unproper_images.concat(repo_image_tags_hierarchy(registry, dimgstage[:id])) unless repo.commit_exists?(commit)
77
74
  end
78
75
  end
79
- remove_repo_images(registry, unproper_images.uniq)
76
+ remove_repo_dapp_dimgstage_images(registry, unproper_images.uniq)
80
77
  end
81
78
  end
82
79
 
83
- def repo_dapp_dappstage_images_detailed(registry)
84
- @repo_dapp_dappstage_images_detailed ||= begin
85
- registry.tags.map do |tag|
86
- next unless tag.start_with?('dimgstage')
87
-
88
- image_history = registry.image_history(tag)
89
- attrs = {
90
- id: registry.image_id(tag),
91
- parent: image_history['container_config']['Image'],
92
- labels: image_history['config']['Labels']
93
- }
94
- [tag, attrs]
95
- end.compact
80
+ def repo_detailed_dimgstage_images(registry)
81
+ @repo_dapp_dimgstage_images_detailed ||= begin
82
+ repo_dimgstages_images(registry).each do |dimgstage|
83
+ image_history = registry.image_history(dimgstage[:tag], nil)
84
+ dimgstage[:parent] = image_history['container_config']['Image']
85
+ dimgstage[:labels] = image_history['config']['Labels']
86
+ end
96
87
  end
97
88
  end
98
89
 
@@ -104,18 +95,18 @@ module Dapp
104
95
  hierarchy.concat(iids)
105
96
  break if begin
106
97
  iids.map! do |iid|
107
- repo_dapp_dappstage_images_detailed(registry).map { |_, attrs| attrs[:id] if attrs[:parent] == iid }.compact
98
+ repo_detailed_dimgstage_images(registry).map { |dimgstage| dimgstage[:id] if dimgstage[:parent] == iid }.compact
108
99
  end.flatten!.empty?
109
100
  end
110
101
  end
111
102
 
112
- repo_dapp_dappstage_images_detailed(registry).map { |tag, attrs| tag if hierarchy.include? attrs[:id] }.compact
103
+ repo_detailed_dimgstage_images(registry).map { |dimgstage| dimgstage[:tag] if hierarchy.include? dimgstage[:id] }.compact
113
104
  end
114
105
 
115
- def remove_repo_images(registry, tags)
106
+ def remove_repo_dapp_dimgstage_images(registry, tags)
116
107
  tags.each do |tag|
117
108
  log(tag) if log_verbose? || dry_run?
118
- registry.image_delete(tag) unless dry_run?
109
+ registry.image_delete(tag, nil) unless dry_run?
119
110
  end
120
111
  end
121
112
  end
@@ -12,44 +12,52 @@ module Dapp
12
12
  end
13
13
 
14
14
  def repo_dimgs_images(registry)
15
- repo_dimgs_and_stages_images(registry)[:dimgs]
15
+ @repo_dimgs_images ||= [].tap do |dimgs_images|
16
+ with_registry_wrapper do
17
+ {}.tap do |dimgs_tags|
18
+ dimgs_tags[nil] = registry.nameless_dimg_tags
19
+ dimgs_names.each do |dimg_name|
20
+ dimgs_tags[dimg_name] = registry.dimg_tags(dimg_name)
21
+ end unless nameless_dimg?
22
+ end.each do |dimg_name, tags|
23
+ dimgs_images.concat(tags_to_repo_images(registry, tags, dimg_name))
24
+ end
25
+ end
26
+ end
16
27
  end
17
28
 
18
- def repo_stages_images(registry)
19
- repo_dimgs_and_stages_images(registry)[:stages]
29
+ def repo_dimgstages_images(registry)
30
+ with_registry_wrapper do
31
+ tags_to_repo_images(registry, registry.dimgstages_tags)
32
+ end
20
33
  end
21
34
 
22
- def repo_dimgs_and_stages_images(registry)
23
- @repo_dimgs_and_cache_names ||= {}.tap do |images|
24
- format = proc do |arr|
25
- arr.map do |tag|
26
- if (id = registry.image_id(tag)).nil?
27
- log_warning(desc: { code: 'tag_ignored', data: { tag: tag } })
28
- else
29
- [tag, id]
30
- end
31
- end.compact.to_h
32
- end
33
- dimgs, stages = registry_tags(registry).partition { |tag| !tag.start_with?('dimgstage') }
34
-
35
- images[:dimgs] = format.call(dimgs)
36
- images[:stages] = format.call(stages)
37
- end
35
+ def tags_to_repo_images(registry, tags, dimg_name = nil)
36
+ tags.map { |tag| repo_image_format(registry, tag, dimg_name) }.compact
38
37
  end
39
38
 
40
- def registry_tags(registry)
41
- registry.tags
39
+ def with_registry_wrapper
40
+ yield
42
41
  rescue Exception::Registry => e
43
42
  raise unless e.net_status[:code] == :no_such_dimg
44
43
  log_warning(desc: { code: :dimg_not_found_in_registry })
45
44
  []
46
45
  end
47
46
 
48
- def delete_repo_image(registry, image_tag)
47
+ def repo_image_format(registry, tag, dimg_name = nil)
48
+ if (id = registry.image_id(tag, dimg_name)).nil?
49
+ log_warning(desc: { code: 'tag_ignored', data: { tag: tag } })
50
+ nil
51
+ else
52
+ { dimg: dimg_name, tag: tag, id: id }
53
+ end
54
+ end
55
+
56
+ def delete_repo_image(registry, repo_image)
49
57
  if dry_run?
50
- log(image_tag)
58
+ log(repo_image[:tag])
51
59
  else
52
- registry.image_delete(image_tag)
60
+ registry.image_delete(repo_image[:tag], repo_image[:dimg])
53
61
  end
54
62
  end
55
63
 
@@ -64,7 +72,7 @@ module Dapp
64
72
  dimgs.each do |dimg|
65
73
  [dimg, dimg.artifacts].flatten
66
74
  .map(&:git_artifacts).flatten
67
- .map { |ga_artifact| repositories[ga_artifact.full_name] = ga_artifact.repo }
75
+ .map { |ga_artifact| repositories[dimgstage_ga_label(ga_artifact.paramshash)] = ga_artifact.repo }
68
76
  end
69
77
  end
70
78
  end
@@ -9,9 +9,9 @@ module Dapp
9
9
  log_step_with_indent(option_repo) do
10
10
  registry = registry(option_repo)
11
11
  repo_dimgs = repo_dimgs_images(registry)
12
- repo_stages = repo_stages_images(registry)
12
+ repo_dimgstages = repo_dimgstages_images(registry)
13
13
 
14
- repo_dimgs.merge(repo_stages).keys.each { |image_tag| delete_repo_image(registry, image_tag) }
14
+ repo_dimgs.concat(repo_dimgstages).each { |repo_image| delete_repo_image(registry, repo_image) }
15
15
  end
16
16
  end
17
17
  end
@@ -2,6 +2,14 @@ module Dapp
2
2
  module Dimg
3
3
  module Dapp
4
4
  module Dappfile
5
+ def nameless_dimg?
6
+ dimgs_names.first.nil?
7
+ end
8
+
9
+ def dimgs_names
10
+ build_configs.map(&:_name)
11
+ end
12
+
5
13
  def build_configs
6
14
  @build_configs ||= begin
7
15
  config._dimg.select do |dimg|
@@ -3,7 +3,6 @@ module Dapp
3
3
  class Dimg
4
4
  include GitArtifact
5
5
  include Path
6
- include Tags
7
6
  include Stages
8
7
 
9
8
  include Helper::Sha256
@@ -62,7 +61,7 @@ module Dapp
62
61
 
63
62
  def export!(repo, format:)
64
63
  dapp.lock("#{dapp.name}.images", readonly: true) do
65
- tags.each do |tag|
64
+ dapp.option_tags.each do |tag|
66
65
  image_name = format(format, repo: repo, dimg_name: config._name, tag: tag)
67
66
  export_base!(last_stage.image, image_name)
68
67
  end
@@ -9,7 +9,7 @@ module Dapp
9
9
  if expected_hostname
10
10
  %w(https http).each do |protocol|
11
11
  expected_hostname_url = [protocol, expected_hostname].join('://')
12
- return Base.new(repo, expected_hostname_url, expected_repo_suffix) if hostname_exist?(expected_hostname_url)
12
+ return Dimg.new(repo, expected_hostname_url, expected_repo_suffix) if hostname_exist?(expected_hostname_url)
13
13
  end
14
14
  end
15
15
  Default.new(repo, File.join(*[expected_hostname, expected_repo_suffix].compact))
@@ -17,12 +17,8 @@ module Dapp
17
17
  self.repo_suffix = repo_suffix
18
18
  end
19
19
 
20
- def repo_exist?
21
- tags.any?
22
- end
23
-
24
20
  def tags
25
- @tags ||= api_request(repo_suffix, 'tags/list')['tags'] || []
21
+ api_request(repo_suffix, 'tags/list')['tags'] || []
26
22
  rescue Error::Registry => e
27
23
  raise Exception::Registry, code: :no_such_dimg, data: { registry: api_url } if e.net_status[:code] == :page_not_found
28
24
  raise
@@ -86,6 +82,8 @@ module Dapp
86
82
  def raw_api_request(*uri, **options)
87
83
  url = api_url(*uri)
88
84
  request(url, **default_api_options.merge(options))
85
+ rescue Excon::Error::MethodNotAllowed
86
+ raise Error::Registry, code: :method_not_allowed, data: { url: url, registry: api_url, method: options[:method] }
89
87
  rescue Excon::Error::NotFound
90
88
  raise Error::Registry, code: :page_not_found, data: { url: url, registry: api_url }
91
89
  rescue Excon::Error::Unauthorized
@@ -1,7 +1,7 @@
1
1
  module Dapp
2
2
  module Dimg
3
3
  module DockerRegistry
4
- class Default < Base
4
+ class Default < Dimg
5
5
  DEFAULT_HOSTNAME_URL = 'https://registry.hub.docker.com'.freeze
6
6
 
7
7
  def initialize(repo, repo_suffix)
@@ -0,0 +1,58 @@
1
+ module Dapp
2
+ module Dimg
3
+ module DockerRegistry
4
+ class Dimg < Base
5
+ def dimgstages_tags
6
+ tags.select { |tag| tag.start_with?('dimgstage') }
7
+ end
8
+
9
+ def dimg_tags(dimg_name)
10
+ with_repo_suffix(dimg_name.to_s) { tags }
11
+ rescue Exception::Registry => e
12
+ raise unless e.net_status[:code] == :no_such_dimg
13
+ []
14
+ end
15
+
16
+ def nameless_dimg_tags
17
+ tags.select { |tag| !tag.start_with?('dimgstage') }
18
+ end
19
+
20
+ def tags
21
+ (@tags ||= {})[repo_suffix] ||= super
22
+ end
23
+
24
+ def image_id(tag, extra_repo_suffix = nil)
25
+ with_repo_suffix(extra_repo_suffix.to_s) { super(tag) }
26
+ end
27
+
28
+ def image_parent_id(tag, extra_repo_suffix = nil)
29
+ with_repo_suffix(extra_repo_suffix.to_s) { super(tag) }
30
+ end
31
+
32
+ def image_labels(tag, extra_repo_suffix = nil)
33
+ with_repo_suffix(extra_repo_suffix.to_s) { super(tag) }
34
+ end
35
+
36
+ def image_delete(tag, extra_repo_suffix = nil)
37
+ with_repo_suffix(extra_repo_suffix.to_s) { super(tag) }
38
+ end
39
+
40
+ def image_history(tag, extra_repo_suffix = nil)
41
+ with_repo_suffix(extra_repo_suffix.to_s) do
42
+ (@image_history ||= {})[[repo_suffix, tag]] ||= super(tag)
43
+ end
44
+ end
45
+
46
+ protected
47
+
48
+ def with_repo_suffix(extra_repo_suffix)
49
+ old_repo_suffix = repo_suffix
50
+ @repo_suffix = File.join(repo_suffix, extra_repo_suffix)
51
+ yield
52
+ ensure
53
+ @repo_suffix = old_repo_suffix
54
+ end
55
+ end
56
+ end # DockerRegistry
57
+ end # Dimg
58
+ end # Dapp
@@ -16,7 +16,7 @@ module Dapp
16
16
  @repo = repo
17
17
  @name = name
18
18
 
19
- @branch = branch || repo.dimg.dapp.options[:git_artifact_branch] || repo.branch
19
+ @branch = branch || repo.dapp.options[:git_artifact_branch] || repo.branch
20
20
  @commit = commit
21
21
 
22
22
  @to = to
@@ -67,13 +67,13 @@ module Dapp
67
67
  when :directory
68
68
  stage.image.add_service_change_label :"dapp-git-#{paramshash}-type" => 'directory'
69
69
 
70
- commands << "#{repo.dimg.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
71
- commands << "#{sudo}#{repo.dimg.dapp.tar_bin} -xf #{archive_file(stage, *archive_stage_commit(stage))} -C \"#{to}\""
70
+ commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
71
+ commands << "#{sudo}#{repo.dapp.tar_bin} -xf #{archive_file(stage, *archive_stage_commit(stage))} -C \"#{to}\""
72
72
  when :file
73
73
  stage.image.add_service_change_label :"dapp-git-#{paramshash}-type" => 'file'
74
74
 
75
- commands << "#{repo.dimg.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
76
- commands << "#{sudo}#{repo.dimg.dapp.tar_bin} -xf #{archive_file(stage, *archive_stage_commit(stage))} -C \"#{File.dirname(to)}\""
75
+ commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
76
+ commands << "#{sudo}#{repo.dapp.tar_bin} -xf #{archive_file(stage, *archive_stage_commit(stage))} -C \"#{File.dirname(to)}\""
77
77
  end
78
78
  end
79
79
  end
@@ -90,13 +90,13 @@ module Dapp
90
90
  case archive_type
91
91
  when :directory
92
92
  changed_files = diff_patches(*dev_patch_stage_commits(stage)).map {|p| "\"#{File.join(to, cwd, p.delta.new_file[:path])}\""}
93
- commands << "#{repo.dimg.dapp.rm_bin} -rf #{changed_files.join(' ')}"
94
- commands << "#{repo.dimg.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
95
- commands << "#{sudo}#{repo.dimg.dapp.tar_bin} -xf #{archive_file(stage, *dev_patch_stage_commits(stage))} -C \"#{to}\""
93
+ commands << "#{repo.dapp.rm_bin} -rf #{changed_files.join(' ')}"
94
+ commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
95
+ commands << "#{sudo}#{repo.dapp.tar_bin} -xf #{archive_file(stage, *dev_patch_stage_commits(stage))} -C \"#{to}\""
96
96
  when :file
97
- commands << "#{repo.dimg.dapp.rm_bin} -rf \"#{to}\""
98
- commands << "#{repo.dimg.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
99
- commands << "#{sudo}#{repo.dimg.dapp.tar_bin} -xf #{archive_file(stage, *dev_patch_stage_commits(stage))} -C \"#{File.dirname(to)}\""
97
+ commands << "#{repo.dapp.rm_bin} -rf \"#{to}\""
98
+ commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
99
+ commands << "#{sudo}#{repo.dapp.tar_bin} -xf #{archive_file(stage, *dev_patch_stage_commits(stage))} -C \"#{File.dirname(to)}\""
100
100
  else
101
101
  raise
102
102
  end
@@ -105,11 +105,11 @@ module Dapp
105
105
  if patch_any_changes?(stage)
106
106
  case archive_type
107
107
  when :directory
108
- commands << "#{repo.dimg.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
109
- commands << "#{sudo}#{repo.dimg.dapp.git_bin} apply --whitespace=nowarn --directory=\"#{to}\" --unsafe-paths #{patch_file(stage, *patch_stage_commits(stage))}"
108
+ commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{to}\""
109
+ commands << "#{sudo}#{repo.dapp.git_bin} apply --whitespace=nowarn --directory=\"#{to}\" --unsafe-paths #{patch_file(stage, *patch_stage_commits(stage))}"
110
110
  when :file
111
- commands << "#{repo.dimg.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
112
- commands << "#{sudo}#{repo.dimg.dapp.git_bin} apply --whitespace=nowarn --directory=\"#{File.dirname(to)}\" --unsafe-paths #{patch_file(stage, *patch_stage_commits(stage))}"
111
+ commands << "#{repo.dapp.install_bin} #{credentials.join(' ')} -d \"#{File.dirname(to)}\""
112
+ commands << "#{sudo}#{repo.dapp.git_bin} apply --whitespace=nowarn --directory=\"#{File.dirname(to)}\" --unsafe-paths #{patch_file(stage, *patch_stage_commits(stage))}"
113
113
  else
114
114
  raise
115
115
  end
@@ -129,9 +129,9 @@ module Dapp
129
129
  @stage_dependencies_checksums ||= {}
130
130
  @stage_dependencies_checksums[stage_dependencies_key] ||= begin
131
131
  if (entries = repo_entries(commit, paths: paths)).empty?
132
- repo.dimg.dapp.log_warning(desc: { code: :stage_dependencies_not_found,
133
- data: { repo: repo.respond_to?(:url) ? repo.url : 'local',
134
- dependencies: stage_dependencies.join(', ') } })
132
+ repo.dapp.log_warning(desc: { code: :stage_dependencies_not_found,
133
+ data: { repo: repo.respond_to?(:url) ? repo.url : 'local',
134
+ dependencies: stage_dependencies.join(', ') } })
135
135
  end
136
136
 
137
137
  entries
@@ -203,7 +203,7 @@ module Dapp
203
203
  attr_reader :stages_dependencies
204
204
 
205
205
  def sudo
206
- repo.dimg.dapp.sudo_command(owner: owner, group: group)
206
+ repo.dapp.sudo_command(owner: owner, group: group)
207
207
  end
208
208
 
209
209
  def credentials
@@ -211,7 +211,7 @@ module Dapp
211
211
  end
212
212
 
213
213
  def archive_file(stage, commit)
214
- if repo.dimg.dapp.options[:use_system_tar]
214
+ if repo.dapp.options[:use_system_tar]
215
215
  archive_file_with_system_tar(stage, commit)
216
216
  else
217
217
  archive_file_with_tar_writer(stage, commit)
@@ -249,7 +249,7 @@ module Dapp
249
249
  end
250
250
  end
251
251
 
252
- repo.dimg.dapp.shellout!("tar -C #{repo.dimg.tmp_path(relative_archive_file_path)} -cf #{archive_path} .")
252
+ repo.dapp.shellout!("tar -C #{repo.dimg.tmp_path(relative_archive_file_path)} -cf #{archive_path} .")
253
253
  end
254
254
  end
255
255
 
@@ -3,14 +3,33 @@ module Dapp
3
3
  module GitRepo
4
4
  # Base class for any Git repo (remote, gitkeeper, etc)
5
5
  class Base
6
- attr_reader :dimg
7
6
  attr_reader :name
8
7
 
9
- def initialize(dimg, name)
10
- @dimg = dimg
8
+ def initialize(manager, name)
9
+ @manager = manager
11
10
  @name = name
12
11
  end
13
12
 
13
+ def dapp
14
+ @dapp ||= begin
15
+ if manager.is_a? ::Dapp::Dapp
16
+ manager
17
+ else
18
+ dimg.dapp
19
+ end
20
+ end
21
+ end
22
+
23
+ def dimg
24
+ @dimg ||= begin
25
+ if manager.is_a? ::Dapp::Dimg::Dimg
26
+ manager
27
+ else
28
+ raise
29
+ end
30
+ end
31
+ end
32
+
14
33
  def exclude_paths
15
34
  []
16
35
  end
@@ -92,6 +111,8 @@ module Dapp
92
111
 
93
112
  protected
94
113
 
114
+ attr_reader :manager
115
+
95
116
  def git(**kwargs)
96
117
  @git ||= Rugged::Repository.new(path.to_s, **kwargs)
97
118
  end
@@ -2,12 +2,12 @@ module Dapp
2
2
  module Dimg
3
3
  module GitRepo
4
4
  class Own < Base
5
- def initialize(dimg)
6
- super(dimg, 'own')
5
+ def initialize(manager)
6
+ super(manager, 'own')
7
7
  end
8
8
 
9
9
  def exclude_paths
10
- dimg.dapp.local_git_artifact_exclude_paths
10
+ dapp.local_git_artifact_exclude_paths
11
11
  end
12
12
 
13
13
  def workdir_path
@@ -15,7 +15,7 @@ module Dapp
15
15
  end
16
16
 
17
17
  def path
18
- @path ||= Pathname(Rugged::Repository.discover(dimg.home_path.to_s).path)
18
+ @path ||= Pathname(Rugged::Repository.discover(dapp.path.to_s).path)
19
19
  rescue Rugged::RepositoryError => _e
20
20
  raise Error::Rugged, code: :local_git_repository_does_not_exist
21
21
  end
@@ -9,7 +9,7 @@ module Dapp
9
9
 
10
10
  @url = url
11
11
 
12
- dimg.dapp.log_secondary_process(dimg.dapp.t(code: 'process.git_artifact_clone', data: { url: url }), short: true) do
12
+ dapp.log_secondary_process(dapp.t(code: 'process.git_artifact_clone', data: { url: url }), short: true) do
13
13
  begin
14
14
  if [:https, :ssh].include?(protocol) && !Rugged.features.include?(protocol)
15
15
  raise Error::Rugged, code: :rugged_protocol_not_supported, data: { url: url, protocol: protocol }
@@ -38,10 +38,10 @@ module Dapp
38
38
 
39
39
  def fetch!(branch = nil)
40
40
  branch ||= self.branch
41
- dimg.dapp.log_secondary_process(dimg.dapp.t(code: 'process.git_artifact_fetch', data: { url: url }), short: true) do
41
+ dapp.log_secondary_process(dapp.t(code: 'process.git_artifact_fetch', data: { url: url }), short: true) do
42
42
  git.fetch('origin', [branch], credentials: _rugged_credentials)
43
43
  raise Error::Rugged, code: :branch_not_exist_in_remote_git_repository, data: { branch: branch, url: url } unless branch_exist?(branch)
44
- end unless dimg.ignore_git_fetch || dimg.dapp.dry_run?
44
+ end unless dimg.ignore_git_fetch || dapp.dry_run?
45
45
  end
46
46
 
47
47
  def branch_exist?(name)
@@ -12,9 +12,31 @@ BANNER
12
12
  long: '--namespace NAME',
13
13
  default: nil
14
14
 
15
- option :image_version,
16
- long: '--image-version IMAGE_VERSION',
17
- default: 'latest'
15
+ option :tag,
16
+ long: '--tag TAG',
17
+ description: 'Custom tag',
18
+ default: [],
19
+ proc: proc { |v| composite_options(:tags) << v }
20
+
21
+ option :tag_branch,
22
+ long: '--tag-branch',
23
+ description: 'Tag by git branch',
24
+ boolean: true
25
+
26
+ option :tag_build_id,
27
+ long: '--tag-build-id',
28
+ description: 'Tag by CI build id',
29
+ boolean: true
30
+
31
+ option :tag_ci,
32
+ long: '--tag-ci',
33
+ description: 'Tag by CI branch and tag',
34
+ boolean: true
35
+
36
+ option :tag_commit,
37
+ long: '--tag-commit',
38
+ description: 'Tag by git commit',
39
+ boolean: true
18
40
 
19
41
  option :tmp_dir_prefix,
20
42
  long: '--tmp-dir-prefix PREFIX',
@@ -10,27 +10,49 @@ Options:
10
10
  BANNER
11
11
 
12
12
  option :namespace,
13
- long: '--namespace NAME',
14
- default: nil
13
+ long: '--namespace NAME',
14
+ default: nil
15
15
 
16
- option :image_version,
17
- long: '--image-version IMAGE_VERSION',
18
- default: 'latest'
16
+ option :tag,
17
+ long: '--tag TAG',
18
+ description: 'Custom tag',
19
+ default: [],
20
+ proc: proc { |v| composite_options(:tags) << v }
21
+
22
+ option :tag_branch,
23
+ long: '--tag-branch',
24
+ description: 'Tag by git branch',
25
+ boolean: true
26
+
27
+ option :tag_build_id,
28
+ long: '--tag-build-id',
29
+ description: 'Tag by CI build id',
30
+ boolean: true
31
+
32
+ option :tag_ci,
33
+ long: '--tag-ci',
34
+ description: 'Tag by CI branch and tag',
35
+ boolean: true
36
+
37
+ option :tag_commit,
38
+ long: '--tag-commit',
39
+ description: 'Tag by git commit',
40
+ boolean: true
19
41
 
20
42
  option :helm_set_options,
21
- long: '--set STRING_ARRAY',
22
- default: [],
23
- proc: proc { |v| composite_options(:helm_set) << v }
43
+ long: '--set STRING_ARRAY',
44
+ default: [],
45
+ proc: proc { |v| composite_options(:helm_set) << v }
24
46
 
25
47
  option :helm_values_options,
26
- long: '--values FILE_PATH',
27
- default: [],
28
- proc: proc { |v| composite_options(:helm_values) << v }
48
+ long: '--values FILE_PATH',
49
+ default: [],
50
+ proc: proc { |v| composite_options(:helm_values) << v }
29
51
 
30
52
  option :helm_secret_values_options,
31
- long: '--secret-values FILE_PATH',
32
- default: [],
33
- proc: proc { |v| composite_options(:helm_secret_values) << v }
53
+ long: '--secret-values FILE_PATH',
54
+ default: [],
55
+ proc: proc { |v| composite_options(:helm_secret_values) << v }
34
56
 
35
57
  def run(argv = ARGV)
36
58
  self.class.parse_options(self, argv)
@@ -12,9 +12,31 @@ BANNER
12
12
  long: '--namespace NAME',
13
13
  default: nil
14
14
 
15
- option :image_version,
16
- long: '--image-version IMAGE_VERSION',
17
- default: 'latest'
15
+ option :tag,
16
+ long: '--tag TAG',
17
+ description: 'Custom tag',
18
+ default: [],
19
+ proc: proc { |v| composite_options(:tags) << v }
20
+
21
+ option :tag_branch,
22
+ long: '--tag-branch',
23
+ description: 'Tag by git branch',
24
+ boolean: true
25
+
26
+ option :tag_build_id,
27
+ long: '--tag-build-id',
28
+ description: 'Tag by CI build id',
29
+ boolean: true
30
+
31
+ option :tag_ci,
32
+ long: '--tag-ci',
33
+ description: 'Tag by CI branch and tag',
34
+ boolean: true
35
+
36
+ option :tag_commit,
37
+ long: '--tag-commit',
38
+ description: 'Tag by git commit',
39
+ boolean: true
18
40
 
19
41
  option :tmp_dir_prefix,
20
42
  long: '--tmp-dir-prefix PREFIX',
@@ -9,9 +9,13 @@ module Dapp
9
9
  kube_check_helm_chart!
10
10
 
11
11
  repo = option_repo
12
- image_version = options[:image_version]
12
+ tag = begin
13
+ raise Error::Command, code: :expected_only_one_tag,
14
+ data: { tags: option_tags.join(', ') } if option_tags.count > 1
15
+ option_tags.first
16
+ end
13
17
  validate_repo_name!(repo)
14
- validate_tag_name!(image_version)
18
+ validate_tag_name!(tag)
15
19
 
16
20
  with_kube_tmp_chart_dir do
17
21
  kube_copy_chart
@@ -22,7 +26,7 @@ module Dapp
22
26
  self,
23
27
  name: kube_release_name,
24
28
  repo: repo,
25
- image_version: image_version,
29
+ docker_tag: tag,
26
30
  namespace: kube_namespace,
27
31
  chart_path: kube_chart_path_for_helm,
28
32
  set: self.options[:helm_set_options],
@@ -92,10 +96,10 @@ module Dapp
92
96
  {{- if (ge (len (index .)) 2) -}}
93
97
  {{- $name := index . 0 -}}
94
98
  {{- $context := index . 1 -}}
95
- {{- printf "%v:%v-%v" $context.Values.global.dapp.repo $name $context.Values.global.dapp.image_version -}}
99
+ {{- printf "%v/%v:%v" $context.Values.global.dapp.repo $name $context.Values.global.dapp.docker_tag -}}
96
100
  {{- else -}}
97
101
  {{- $context := index . 0 -}}
98
- {{- printf "%v:%v" $context.Values.global.dapp.repo $context.Values.global.dapp.image_version -}}
102
+ {{- printf "%v:%v" $context.Values.global.dapp.repo $context.Values.global.dapp.docker_tag -}}
99
103
  {{- end -}}
100
104
  {{- end -}}
101
105
 
@@ -31,7 +31,7 @@ module Dapp
31
31
  kube_check_helm_chart!
32
32
 
33
33
  repo = option_repo
34
- image_version = options[:image_version]
34
+ docker_tag = options[:docker_tag]
35
35
 
36
36
  with_kube_tmp_lint_chart_dir do
37
37
  kube_copy_chart
@@ -61,8 +61,8 @@ module Dapp
61
61
  all_values['global'] = {
62
62
  'namespace' => kube_namespace,
63
63
  'dapp' => {
64
- 'repo' => option_repo,
65
- 'image_version' => options[:image_version]
64
+ 'repo' => repo,
65
+ 'docker_tag' => docker_tag
66
66
  }
67
67
  }
68
68
 
@@ -7,7 +7,7 @@ module Dapp
7
7
 
8
8
  attr_reader :name
9
9
  attr_reader :repo
10
- attr_reader :image_version
10
+ attr_reader :docker_tag
11
11
  attr_reader :namespace
12
12
  attr_reader :chart_path
13
13
  attr_reader :set
@@ -15,13 +15,13 @@ module Dapp
15
15
  attr_reader :deploy_timeout
16
16
 
17
17
  def initialize(dapp,
18
- name:, repo:, image_version:, namespace:, chart_path:,
18
+ name:, repo:, docker_tag:, namespace:, chart_path:,
19
19
  set: [], values: [], deploy_timeout: nil)
20
20
  @dapp = dapp
21
21
 
22
22
  @name = name
23
23
  @repo = repo
24
- @image_version = image_version
24
+ @docker_tag = docker_tag
25
25
  @namespace = namespace
26
26
  @chart_path = chart_path
27
27
  @set = set
@@ -119,7 +119,7 @@ module Dapp
119
119
  [].tap do |options|
120
120
  options.concat(set.map { |opt| "--set #{opt}" })
121
121
  options << "--set global.dapp.repo=#{repo}"
122
- options << "--set global.dapp.image_version=#{image_version}"
122
+ options << "--set global.dapp.docker_tag=#{docker_tag}"
123
123
  options << "--set global.namespace=#{namespace}"
124
124
  end
125
125
  end
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = '0.20.0'.freeze
2
+ VERSION = '0.21.0'.freeze
3
3
  BUILD_CACHE_VERSION = 23
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.20.0
4
+ version: 0.21.0
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-11-24 00:00:00.000000000 Z
11
+ date: 2017-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -444,6 +444,7 @@ files:
444
444
  - lib/dapp/dapp/logging/i18n.rb
445
445
  - lib/dapp/dapp/logging/paint.rb
446
446
  - lib/dapp/dapp/logging/process.rb
447
+ - lib/dapp/dapp/option_tags.rb
447
448
  - lib/dapp/dapp/shellout/base.rb
448
449
  - lib/dapp/dapp/shellout/streaming.rb
449
450
  - lib/dapp/dapp/ssh_agent.rb
@@ -595,12 +596,12 @@ files:
595
596
  - lib/dapp/dimg/dimg/git_artifact.rb
596
597
  - lib/dapp/dimg/dimg/path.rb
597
598
  - lib/dapp/dimg/dimg/stages.rb
598
- - lib/dapp/dimg/dimg/tags.rb
599
599
  - lib/dapp/dimg/docker_registry.rb
600
600
  - lib/dapp/dimg/docker_registry/base.rb
601
601
  - lib/dapp/dimg/docker_registry/base/authorization.rb
602
602
  - lib/dapp/dimg/docker_registry/base/request.rb
603
603
  - lib/dapp/dimg/docker_registry/default.rb
604
+ - lib/dapp/dimg/docker_registry/dimg.rb
604
605
  - lib/dapp/dimg/error/base.rb
605
606
  - lib/dapp/dimg/error/build.rb
606
607
  - lib/dapp/dimg/error/chef.rb
@@ -1,65 +0,0 @@
1
- module Dapp
2
- module Dimg
3
- class Dimg
4
- module Tags
5
- protected
6
-
7
- def git_repo
8
- @git_repo ||= GitRepo::Own.new(self)
9
- end
10
-
11
- def tags
12
- tags = simple_tags + branch_tags + commit_tags + build_tags + ci_tags
13
- tags << :latest if tags.empty?
14
- tags
15
- end
16
-
17
- def simple_tags
18
- dapp.options[:tag]
19
- end
20
-
21
- def branch_tags
22
- return [] unless dapp.options[:tag_branch]
23
- raise Error::Dimg, code: :git_branch_without_name if (branch = git_repo.branch) == 'HEAD'
24
- [branch]
25
- end
26
-
27
- def commit_tags
28
- return [] unless dapp.options[:tag_commit]
29
- commit = git_repo.latest_commit
30
- [commit]
31
- end
32
-
33
- def build_tags
34
- return [] unless dapp.options[:tag_build_id]
35
-
36
- if ENV['GITLAB_CI']
37
- build_id = ENV['CI_BUILD_ID']
38
- elsif ENV['TRAVIS']
39
- build_id = ENV['TRAVIS_BUILD_NUMBER']
40
- else
41
- raise Error::Dimg, code: :ci_environment_required
42
- end
43
-
44
- [build_id]
45
- end
46
-
47
- def ci_tags
48
- return [] unless dapp.options[:tag_ci]
49
-
50
- if ENV['GITLAB_CI']
51
- branch = ENV['CI_BUILD_REF_NAME']
52
- tag = ENV['CI_BUILD_TAG']
53
- elsif ENV['TRAVIS']
54
- branch = ENV['TRAVIS_BRANCH']
55
- tag = ENV['TRAVIS_TAG']
56
- else
57
- raise Error::Dimg, code: :ci_environment_required
58
- end
59
-
60
- [branch, tag].compact
61
- end
62
- end # Tags
63
- end # Mod
64
- end # Dimg
65
- end # Dapp