dapp 0.8.0 → 0.9.0
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 +4 -4
- data/bin/dapp +5 -5
- data/config/en/common.yml +6 -4
- data/config/en/net_status.yml +8 -7
- data/lib/dapp.rb +157 -139
- data/lib/dapp/cli.rb +6 -16
- data/lib/dapp/cli/base.rb +3 -5
- data/lib/dapp/config/base.rb +19 -7
- data/lib/dapp/config/directive/base.rb +0 -1
- data/lib/dapp/config/error/config.rb +7 -0
- data/lib/dapp/core_ext/hash.rb +0 -2
- data/lib/dapp/core_ext/pathname.rb +1 -3
- data/lib/dapp/{project.rb → dapp.rb} +2 -21
- data/lib/dapp/{project → dapp}/chef.rb +2 -4
- data/lib/dapp/{project → dapp}/dappfile.rb +5 -7
- data/lib/dapp/{project → dapp}/deps/base.rb +3 -6
- data/lib/dapp/{project → dapp}/deps/gitartifact.rb +2 -5
- data/lib/dapp/{project → dapp}/git_artifact.rb +2 -4
- data/lib/dapp/{project → dapp}/lock.rb +3 -5
- data/lib/dapp/{project → dapp}/logging/base.rb +2 -5
- data/lib/dapp/{project → dapp}/logging/i18n.rb +2 -3
- data/lib/dapp/{project → dapp}/logging/paint.rb +2 -4
- data/lib/dapp/{project → dapp}/logging/process.rb +2 -5
- data/lib/dapp/{project → dapp}/shellout/base.rb +2 -4
- data/lib/dapp/{project → dapp}/shellout/streaming.rb +3 -8
- data/lib/dapp/{project → dapp}/ssh_agent.rb +6 -9
- data/lib/dapp/dimg.rb +1 -192
- data/lib/dapp/dimg/artifact.rb +24 -0
- data/lib/dapp/dimg/build/stage/after_install_artifact.rb +14 -0
- data/lib/dapp/dimg/build/stage/after_setup_artifact.rb +18 -0
- data/lib/dapp/dimg/build/stage/artifact_base.rb +80 -0
- data/lib/dapp/dimg/build/stage/artifact_default.rb +63 -0
- data/lib/dapp/dimg/build/stage/base.rb +210 -0
- data/lib/dapp/dimg/build/stage/before_install.rb +33 -0
- data/lib/dapp/dimg/build/stage/before_install_artifact.rb +14 -0
- data/lib/dapp/dimg/build/stage/before_setup.rb +31 -0
- data/lib/dapp/dimg/build/stage/before_setup_artifact.rb +14 -0
- data/lib/dapp/dimg/build/stage/build_artifact.rb +31 -0
- data/lib/dapp/dimg/build/stage/docker_instructions.rb +25 -0
- data/lib/dapp/dimg/build/stage/from.rb +50 -0
- data/lib/dapp/dimg/build/stage/ga_archive.rb +28 -0
- data/lib/dapp/dimg/build/stage/ga_archive_dependencies.rb +27 -0
- data/lib/dapp/dimg/build/stage/ga_artifact_patch.rb +22 -0
- data/lib/dapp/dimg/build/stage/ga_base.rb +80 -0
- data/lib/dapp/dimg/build/stage/ga_dependencies_base.rb +20 -0
- data/lib/dapp/dimg/build/stage/ga_latest_patch.rb +54 -0
- data/lib/dapp/dimg/build/stage/import_artifact.rb +64 -0
- data/lib/dapp/dimg/build/stage/install/ga_post_install_patch.rb +22 -0
- data/lib/dapp/dimg/build/stage/install/ga_post_install_patch_dependencies.rb +22 -0
- data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch.rb +22 -0
- data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch_dependencies.rb +22 -0
- data/lib/dapp/dimg/build/stage/install/install.rb +35 -0
- data/lib/dapp/dimg/build/stage/mod/group.rb +42 -0
- data/lib/dapp/dimg/build/stage/mod/logging.rb +101 -0
- data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch.rb +22 -0
- data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch_dependencies.rb +32 -0
- data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch.rb +22 -0
- data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch_dependencies.rb +22 -0
- data/lib/dapp/dimg/build/stage/setup/setup.rb +35 -0
- data/lib/dapp/dimg/builder.rb +6 -0
- data/lib/dapp/{builder → dimg/builder}/base.rb +4 -5
- data/lib/dapp/{builder → dimg/builder}/chef.rb +41 -33
- data/lib/dapp/dimg/builder/chef/berksfile.rb +121 -0
- data/lib/dapp/dimg/builder/chef/cookbook.rb +285 -0
- data/lib/dapp/dimg/builder/chef/cookbook_metadata.rb +106 -0
- data/lib/dapp/{builder → dimg/builder}/none.rb +4 -5
- data/lib/dapp/{builder → dimg/builder}/shell.rb +5 -6
- data/lib/dapp/dimg/cli/base.rb +16 -0
- data/lib/dapp/dimg/cli/bp.rb +37 -0
- data/lib/dapp/dimg/cli/build.rb +64 -0
- data/lib/dapp/dimg/cli/build_context.rb +18 -0
- data/lib/dapp/dimg/cli/build_context/export.rb +26 -0
- data/lib/dapp/dimg/cli/build_context/import.rb +17 -0
- data/lib/dapp/dimg/cli/cleanup.rb +22 -0
- data/lib/dapp/dimg/cli/cli.rb +1 -0
- data/lib/dapp/dimg/cli/dimg.rb +30 -0
- data/lib/dapp/dimg/cli/list.rb +17 -0
- data/lib/dapp/dimg/cli/mrproper.rb +26 -0
- data/lib/dapp/dimg/cli/push.rb +61 -0
- data/lib/dapp/dimg/cli/run.rb +59 -0
- data/lib/dapp/{cli → dimg/cli}/spush.rb +7 -7
- data/lib/dapp/dimg/cli/stage_image.rb +24 -0
- data/lib/dapp/dimg/cli/stages.rb +22 -0
- data/lib/dapp/dimg/cli/stages/cleanup_local.rb +44 -0
- data/lib/dapp/dimg/cli/stages/cleanup_repo.rb +26 -0
- data/lib/dapp/dimg/cli/stages/flush_local.rb +23 -0
- data/lib/dapp/dimg/cli/stages/flush_repo.rb +24 -0
- data/lib/dapp/dimg/cli/stages/pull.rb +28 -0
- data/lib/dapp/dimg/cli/stages/push.rb +24 -0
- data/lib/dapp/dimg/cli/tag.rb +24 -0
- data/lib/dapp/dimg/config/artifact_dimg.rb +17 -0
- data/lib/dapp/dimg/config/artifact_group.rb +47 -0
- data/lib/dapp/dimg/config/base.rb +7 -0
- data/lib/dapp/dimg/config/dimg.rb +24 -0
- data/lib/dapp/dimg/config/dimg/instance_methods.rb +177 -0
- data/lib/dapp/dimg/config/dimg/validation.rb +126 -0
- data/lib/dapp/dimg/config/dimg_group.rb +61 -0
- data/lib/dapp/dimg/config/dimg_group_base.rb +54 -0
- data/lib/dapp/dimg/config/dimg_group_main.rb +22 -0
- data/lib/dapp/dimg/config/directive/artifact.rb +70 -0
- data/lib/dapp/dimg/config/directive/artifact_base.rb +97 -0
- data/lib/dapp/dimg/config/directive/base.rb +9 -0
- data/lib/dapp/dimg/config/directive/chef.rb +68 -0
- data/lib/dapp/dimg/config/directive/docker/artifact.rb +15 -0
- data/lib/dapp/dimg/config/directive/docker/base.rb +22 -0
- data/lib/dapp/dimg/config/directive/docker/dimg.rb +82 -0
- data/lib/dapp/dimg/config/directive/git_artifact_local.rb +47 -0
- data/lib/dapp/dimg/config/directive/git_artifact_remote.rb +58 -0
- data/lib/dapp/dimg/config/directive/mount.rb +27 -0
- data/lib/dapp/dimg/config/directive/shell/artifact.rb +18 -0
- data/lib/dapp/dimg/config/directive/shell/dimg.rb +65 -0
- data/lib/dapp/dimg/dapp/command.rb +21 -0
- data/lib/dapp/dimg/dapp/command/bp.rb +20 -0
- data/lib/dapp/dimg/dapp/command/build.rb +22 -0
- data/lib/dapp/dimg/dapp/command/build_context/common.rb +27 -0
- data/lib/dapp/dimg/dapp/command/build_context/export.rb +55 -0
- data/lib/dapp/dimg/dapp/command/build_context/import.rb +71 -0
- data/lib/dapp/dimg/dapp/command/cleanup.rb +23 -0
- data/lib/dapp/dimg/dapp/command/common.rb +96 -0
- data/lib/dapp/dimg/dapp/command/list.rb +19 -0
- data/lib/dapp/dimg/dapp/command/mrproper.rb +75 -0
- data/lib/dapp/dimg/dapp/command/push.rb +27 -0
- data/lib/dapp/dimg/dapp/command/run.rb +15 -0
- data/lib/dapp/dimg/dapp/command/spush.rb +17 -0
- data/lib/dapp/dimg/dapp/command/stage_image.rb +14 -0
- data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +137 -0
- data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +124 -0
- data/lib/dapp/dimg/dapp/command/stages/common.rb +85 -0
- data/lib/dapp/dimg/dapp/command/stages/flush_local.rb +21 -0
- data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +21 -0
- data/lib/dapp/dimg/dapp/command/stages/pull.rb +26 -0
- data/lib/dapp/dimg/dapp/command/stages/push.rb +22 -0
- data/lib/dapp/dimg/dapp/command/tag.rb +17 -0
- data/lib/dapp/dimg/dimg.rb +192 -0
- data/lib/dapp/dimg/dimg/git_artifact.rb +26 -0
- data/lib/dapp/dimg/dimg/path.rb +37 -0
- data/lib/dapp/dimg/dimg/stages.rb +60 -0
- data/lib/dapp/dimg/dimg/tags.rb +65 -0
- data/lib/dapp/dimg/docker_registry.rb +37 -0
- data/lib/dapp/dimg/docker_registry/base.rb +109 -0
- data/lib/dapp/dimg/docker_registry/base/authorization.rb +63 -0
- data/lib/dapp/dimg/docker_registry/base/request.rb +34 -0
- data/lib/dapp/dimg/docker_registry/default.rb +18 -0
- data/lib/dapp/dimg/error/base.rb +7 -0
- data/lib/dapp/dimg/error/build.rb +7 -0
- data/lib/dapp/dimg/error/chef.rb +11 -0
- data/lib/dapp/dimg/error/command.rb +7 -0
- data/lib/dapp/dimg/error/config.rb +7 -0
- data/lib/dapp/dimg/error/dimg.rb +7 -0
- data/lib/dapp/dimg/error/lock.rb +7 -0
- data/lib/dapp/dimg/error/registry.rb +7 -0
- data/lib/dapp/dimg/error/rugged.rb +7 -0
- data/lib/dapp/dimg/error/shellout.rb +7 -0
- data/lib/dapp/dimg/error/tar_writer.rb +7 -0
- data/lib/dapp/dimg/exception/base.rb +7 -0
- data/lib/dapp/dimg/exception/introspect_image.rb +7 -0
- data/lib/dapp/dimg/exception/registry.rb +7 -0
- data/lib/dapp/dimg/filelock.rb +43 -0
- data/lib/dapp/dimg/git_artifact.rb +241 -18
- data/lib/dapp/dimg/git_repo/base.rb +90 -0
- data/lib/dapp/dimg/git_repo/own.rb +39 -0
- data/lib/dapp/dimg/git_repo/remote.rb +50 -0
- data/lib/dapp/dimg/image/argument.rb +143 -0
- data/lib/dapp/dimg/image/docker.rb +127 -0
- data/lib/dapp/dimg/image/scratch.rb +32 -0
- data/lib/dapp/dimg/image/stage.rb +95 -0
- data/lib/dapp/dimg/lock/base.rb +51 -0
- data/lib/dapp/dimg/lock/file.rb +48 -0
- data/lib/dapp/error/base.rb +0 -1
- data/lib/dapp/error/dapp.rb +5 -0
- data/lib/dapp/error/dappfile.rb +0 -1
- data/lib/dapp/error/shellout.rb +0 -1
- data/lib/dapp/exception/base.rb +0 -1
- data/lib/dapp/helper/cli.rb +5 -6
- data/lib/dapp/helper/net_status.rb +0 -1
- data/lib/dapp/helper/sha256.rb +0 -1
- data/lib/dapp/helper/trivia.rb +0 -1
- data/lib/dapp/prctl.rb +0 -1
- data/lib/dapp/version.rb +1 -2
- metadata +172 -140
- data/lib/dapp/artifact.rb +0 -23
- data/lib/dapp/build/stage/after_install_artifact.rb +0 -13
- data/lib/dapp/build/stage/after_setup_artifact.rb +0 -17
- data/lib/dapp/build/stage/artifact_base.rb +0 -80
- data/lib/dapp/build/stage/artifact_default.rb +0 -63
- data/lib/dapp/build/stage/base.rb +0 -203
- data/lib/dapp/build/stage/before_install.rb +0 -32
- data/lib/dapp/build/stage/before_install_artifact.rb +0 -13
- data/lib/dapp/build/stage/before_setup.rb +0 -30
- data/lib/dapp/build/stage/before_setup_artifact.rb +0 -13
- data/lib/dapp/build/stage/build_artifact.rb +0 -36
- data/lib/dapp/build/stage/docker_instructions.rb +0 -24
- data/lib/dapp/build/stage/from.rb +0 -34
- data/lib/dapp/build/stage/ga_archive.rb +0 -27
- data/lib/dapp/build/stage/ga_archive_dependencies.rb +0 -26
- data/lib/dapp/build/stage/ga_artifact_patch.rb +0 -21
- data/lib/dapp/build/stage/ga_base.rb +0 -79
- data/lib/dapp/build/stage/ga_dependencies_base.rb +0 -19
- data/lib/dapp/build/stage/ga_latest_patch.rb +0 -53
- data/lib/dapp/build/stage/import_artifact.rb +0 -65
- data/lib/dapp/build/stage/install/ga_post_install_patch.rb +0 -21
- data/lib/dapp/build/stage/install/ga_post_install_patch_dependencies.rb +0 -21
- data/lib/dapp/build/stage/install/ga_pre_install_patch.rb +0 -21
- data/lib/dapp/build/stage/install/ga_pre_install_patch_dependencies.rb +0 -21
- data/lib/dapp/build/stage/install/install.rb +0 -40
- data/lib/dapp/build/stage/mod/group.rb +0 -42
- data/lib/dapp/build/stage/mod/logging.rb +0 -104
- data/lib/dapp/build/stage/setup/ga_post_setup_patch.rb +0 -21
- data/lib/dapp/build/stage/setup/ga_post_setup_patch_dependencies.rb +0 -31
- data/lib/dapp/build/stage/setup/ga_pre_setup_patch.rb +0 -21
- data/lib/dapp/build/stage/setup/ga_pre_setup_patch_dependencies.rb +0 -21
- data/lib/dapp/build/stage/setup/setup.rb +0 -40
- data/lib/dapp/builder/chef/berksfile.rb +0 -78
- data/lib/dapp/builder/chef/cookbook.rb +0 -257
- data/lib/dapp/builder/chef/cookbook_metadata.rb +0 -54
- data/lib/dapp/builder/chef/error.rb +0 -12
- data/lib/dapp/cli/bp.rb +0 -37
- data/lib/dapp/cli/build.rb +0 -60
- data/lib/dapp/cli/cleanup.rb +0 -22
- data/lib/dapp/cli/list.rb +0 -17
- data/lib/dapp/cli/mrproper.rb +0 -26
- data/lib/dapp/cli/push.rb +0 -61
- data/lib/dapp/cli/run.rb +0 -53
- data/lib/dapp/cli/stage_image.rb +0 -24
- data/lib/dapp/cli/stages.rb +0 -23
- data/lib/dapp/cli/stages/cleanup_local.rb +0 -44
- data/lib/dapp/cli/stages/cleanup_repo.rb +0 -26
- data/lib/dapp/cli/stages/flush_local.rb +0 -23
- data/lib/dapp/cli/stages/flush_repo.rb +0 -24
- data/lib/dapp/cli/stages/pull.rb +0 -28
- data/lib/dapp/cli/stages/push.rb +0 -24
- data/lib/dapp/cli/tag.rb +0 -24
- data/lib/dapp/config/artifact_dimg.rb +0 -20
- data/lib/dapp/config/artifact_group.rb +0 -56
- data/lib/dapp/config/dimg.rb +0 -23
- data/lib/dapp/config/dimg/instance_methods.rb +0 -194
- data/lib/dapp/config/dimg/validation.rb +0 -125
- data/lib/dapp/config/dimg_group.rb +0 -60
- data/lib/dapp/config/dimg_group_base.rb +0 -53
- data/lib/dapp/config/dimg_group_main.rb +0 -21
- data/lib/dapp/config/directive/artifact.rb +0 -69
- data/lib/dapp/config/directive/artifact_base.rb +0 -93
- data/lib/dapp/config/directive/chef.rb +0 -57
- data/lib/dapp/config/directive/docker/artifact.rb +0 -15
- data/lib/dapp/config/directive/docker/base.rb +0 -20
- data/lib/dapp/config/directive/docker/dimg.rb +0 -81
- data/lib/dapp/config/directive/git_artifact_local.rb +0 -13
- data/lib/dapp/config/directive/git_artifact_remote.rb +0 -57
- data/lib/dapp/config/directive/mount.rb +0 -26
- data/lib/dapp/config/directive/shell/artifact.rb +0 -17
- data/lib/dapp/config/directive/shell/dimg.rb +0 -65
- data/lib/dapp/dimg/path.rb +0 -37
- data/lib/dapp/dimg/stages.rb +0 -59
- data/lib/dapp/dimg/tags.rb +0 -65
- data/lib/dapp/docker_registry.rb +0 -36
- data/lib/dapp/docker_registry/base.rb +0 -109
- data/lib/dapp/docker_registry/default.rb +0 -18
- data/lib/dapp/docker_registry/mod/authorization.rb +0 -63
- data/lib/dapp/docker_registry/mod/request.rb +0 -32
- data/lib/dapp/error/build.rb +0 -6
- data/lib/dapp/error/config.rb +0 -6
- data/lib/dapp/error/dimg.rb +0 -6
- data/lib/dapp/error/image.rb +0 -6
- data/lib/dapp/error/project.rb +0 -6
- data/lib/dapp/error/registry.rb +0 -6
- data/lib/dapp/error/rugged.rb +0 -6
- data/lib/dapp/error/tar_writer.rb +0 -6
- data/lib/dapp/exception/introspect_image.rb +0 -6
- data/lib/dapp/exception/registry.rb +0 -6
- data/lib/dapp/filelock.rb +0 -43
- data/lib/dapp/git_artifact.rb +0 -241
- data/lib/dapp/git_repo/base.rb +0 -88
- data/lib/dapp/git_repo/own.rb +0 -38
- data/lib/dapp/git_repo/remote.rb +0 -49
- data/lib/dapp/image/argument.rb +0 -134
- data/lib/dapp/image/docker.rb +0 -115
- data/lib/dapp/image/scratch.rb +0 -32
- data/lib/dapp/image/stage.rb +0 -94
- data/lib/dapp/lock/base.rb +0 -51
- data/lib/dapp/lock/error.rb +0 -14
- data/lib/dapp/lock/file.rb +0 -45
- data/lib/dapp/project/command/bp.rb +0 -21
- data/lib/dapp/project/command/build.rb +0 -20
- data/lib/dapp/project/command/cleanup.rb +0 -24
- data/lib/dapp/project/command/common.rb +0 -96
- data/lib/dapp/project/command/list.rb +0 -20
- data/lib/dapp/project/command/mrproper.rb +0 -69
- data/lib/dapp/project/command/push.rb +0 -28
- data/lib/dapp/project/command/run.rb +0 -15
- data/lib/dapp/project/command/spush.rb +0 -18
- data/lib/dapp/project/command/stage_image.rb +0 -15
- data/lib/dapp/project/command/stages/cleanup_local.rb +0 -138
- data/lib/dapp/project/command/stages/cleanup_repo.rb +0 -125
- data/lib/dapp/project/command/stages/common.rb +0 -86
- data/lib/dapp/project/command/stages/flush_local.rb +0 -22
- data/lib/dapp/project/command/stages/flush_repo.rb +0 -22
- data/lib/dapp/project/command/stages/pull.rb +0 -27
- data/lib/dapp/project/command/stages/push.rb +0 -23
- data/lib/dapp/project/command/tag.rb +0 -18
@@ -0,0 +1,26 @@
|
|
1
|
+
module Dapp
|
2
|
+
module Dimg
|
3
|
+
class Dimg
|
4
|
+
module GitArtifact
|
5
|
+
def git_artifacts
|
6
|
+
[*local_git_artifacts, *remote_git_artifacts].compact
|
7
|
+
end
|
8
|
+
|
9
|
+
def local_git_artifacts
|
10
|
+
@local_git_artifact_list ||= Array(config._git_artifact._local).map do |ga_config|
|
11
|
+
repo = GitRepo::Own.new(self)
|
12
|
+
::Dapp::Dimg::GitArtifact.new(repo, **ga_config._artifact_options)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def remote_git_artifacts
|
17
|
+
@remote_git_artifact_list ||= Array(config._git_artifact._remote).map do |ga_config|
|
18
|
+
repo = GitRepo::Remote.new(self, ga_config._name, url: ga_config._url)
|
19
|
+
repo.fetch!(ga_config._branch)
|
20
|
+
::Dapp::Dimg::GitArtifact.new(repo, **ga_config._artifact_options)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end # GitArtifact
|
24
|
+
end # Mod
|
25
|
+
end # Dimg
|
26
|
+
end # Dapp
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Dapp
|
2
|
+
module Dimg
|
3
|
+
class Dimg
|
4
|
+
module Path
|
5
|
+
def home_path(*path)
|
6
|
+
make_path(dapp.path, *path).expand_path
|
7
|
+
end
|
8
|
+
|
9
|
+
def tmp_path(*path)
|
10
|
+
@tmp_path ||= Dir.mktmpdir('dapp-', dapp.cli_options[:tmp_dir_prefix] || '/tmp')
|
11
|
+
make_path(@tmp_path, *path).expand_path.tap { |p| p.parent.mkpath }
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_path(*path)
|
15
|
+
make_path(dapp.build_path, *path).expand_path.tap { |p| p.parent.mkpath }
|
16
|
+
end
|
17
|
+
|
18
|
+
def container_dapp_path(*path)
|
19
|
+
make_path('/.dapp', *path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def container_tmp_path(*path)
|
23
|
+
container_dapp_path('tmp', *path)
|
24
|
+
end
|
25
|
+
|
26
|
+
alias build_dir build_path
|
27
|
+
alias tmp_dir tmp_path
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def make_path(base, *path)
|
32
|
+
path.compact.map(&:to_s).inject(Pathname.new(base), &:+)
|
33
|
+
end
|
34
|
+
end # Path
|
35
|
+
end
|
36
|
+
end # Dimg
|
37
|
+
end # Dapp
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Dapp
|
2
|
+
module Dimg
|
3
|
+
class Dimg
|
4
|
+
module Stages
|
5
|
+
def signature
|
6
|
+
last_stage.send(:signature)
|
7
|
+
end
|
8
|
+
|
9
|
+
def stage_cache_format
|
10
|
+
"#{dapp.stage_cache}:%{signature}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def stage_dapp_label
|
14
|
+
dapp.stage_dapp_label
|
15
|
+
end
|
16
|
+
|
17
|
+
def tagged_images
|
18
|
+
all_images.select(&:tagged?)
|
19
|
+
end
|
20
|
+
alias export_images tagged_images
|
21
|
+
|
22
|
+
def all_images
|
23
|
+
@all_images ||= all_stages.map(&:image).uniq!(&:name)
|
24
|
+
end
|
25
|
+
|
26
|
+
def all_stages
|
27
|
+
stages + artifacts.map(&:all_stages).flatten
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def last_stage
|
33
|
+
@last_stage ||= if scratch?
|
34
|
+
Build::Stage::ImportArtifact.new(self)
|
35
|
+
else
|
36
|
+
Build::Stage::DockerInstructions.new(self)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def import_images
|
41
|
+
all_images.select { |image| !image.tagged? }
|
42
|
+
end
|
43
|
+
|
44
|
+
def artifacts_stages
|
45
|
+
@artifacts_stages ||= stages.select(&:artifact?)
|
46
|
+
end
|
47
|
+
|
48
|
+
def stages
|
49
|
+
(@stages ||= []).tap do |stages|
|
50
|
+
stage = last_stage
|
51
|
+
loop do
|
52
|
+
stages << stage
|
53
|
+
break if (stage = stage.prev_stage).nil?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end # Stages
|
58
|
+
end # Mod
|
59
|
+
end # Dimg
|
60
|
+
end # Dapp
|
@@ -0,0 +1,65 @@
|
|
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.cli_options[:tag]
|
19
|
+
end
|
20
|
+
|
21
|
+
def branch_tags
|
22
|
+
return [] unless dapp.cli_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.cli_options[:tag_commit]
|
29
|
+
commit = git_repo.latest_commit
|
30
|
+
[commit]
|
31
|
+
end
|
32
|
+
|
33
|
+
def build_tags
|
34
|
+
return [] unless dapp.cli_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.cli_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
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Dapp
|
2
|
+
module Dimg
|
3
|
+
module DockerRegistry
|
4
|
+
def self.new(repo)
|
5
|
+
/^#{repo_name_format}$/ =~ repo
|
6
|
+
expected_hostname = Regexp.last_match(:hostname)
|
7
|
+
expected_repo_suffix = Regexp.last_match(:repo_suffix)
|
8
|
+
expected_hostname_url = expected_hostname ? "http://#{expected_hostname}" : nil
|
9
|
+
|
10
|
+
if hostname_exist?(expected_hostname_url)
|
11
|
+
Base.new(repo, expected_hostname_url, expected_repo_suffix)
|
12
|
+
else
|
13
|
+
Default.new(repo, File.join(*[expected_hostname, expected_repo_suffix].compact))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.repo_name_format
|
18
|
+
separator = '[_.]|__|[-]*'
|
19
|
+
alpha_numeric = '[[:alnum:]]*'
|
20
|
+
component = "#{alpha_numeric}[#{separator}#{alpha_numeric}]*"
|
21
|
+
port_number = '[[:digit:]]+'
|
22
|
+
hostcomponent = '[[:alnum:]_-]*[[:alnum:]]'
|
23
|
+
hostname = "#{hostcomponent}[\\.#{hostcomponent}]*(?<port>:#{port_number})?"
|
24
|
+
"(?<hostname>#{hostname}/)?(?<repo_suffix>#{component}[/#{component}]*)"
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.repo_name?(name)
|
28
|
+
!(/^#{repo_name_format}$/ =~ name).nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.hostname_exist?(url)
|
32
|
+
return false unless url
|
33
|
+
Base.url_available?(url)
|
34
|
+
end
|
35
|
+
end # DockerRegistry
|
36
|
+
end # Dimg
|
37
|
+
end # Dapp
|
@@ -0,0 +1,109 @@
|
|
1
|
+
module Dapp
|
2
|
+
module Dimg
|
3
|
+
module DockerRegistry
|
4
|
+
class Base
|
5
|
+
include Request
|
6
|
+
include Authorization
|
7
|
+
|
8
|
+
API_VERSION = 'v2'.freeze
|
9
|
+
|
10
|
+
attr_accessor :repo
|
11
|
+
attr_accessor :hostname_url
|
12
|
+
attr_accessor :repo_suffix
|
13
|
+
|
14
|
+
def initialize(repo, hostname_url, repo_suffix)
|
15
|
+
self.repo = repo
|
16
|
+
self.hostname_url = hostname_url
|
17
|
+
self.repo_suffix = repo_suffix
|
18
|
+
end
|
19
|
+
|
20
|
+
def repo_exist?
|
21
|
+
tags.any?
|
22
|
+
end
|
23
|
+
|
24
|
+
def tags
|
25
|
+
@tags ||= api_request(repo_suffix, 'tags/list')['tags'] || []
|
26
|
+
rescue Error::Registry => e
|
27
|
+
raise Exception::Registry, code: :no_such_dimg, data: { registry: api_url } if e.net_status[:code] == :page_not_found
|
28
|
+
raise
|
29
|
+
end
|
30
|
+
|
31
|
+
def image_id(tag)
|
32
|
+
response = manifest_v2(tag)
|
33
|
+
response['config']['digest'] if response['schemaVersion'] == 2
|
34
|
+
end
|
35
|
+
|
36
|
+
def image_parent_id(tag)
|
37
|
+
image_history(tag)['container_config']['Image']
|
38
|
+
end
|
39
|
+
|
40
|
+
def image_labels(tag)
|
41
|
+
image_history(tag)['config']['Labels']
|
42
|
+
end
|
43
|
+
|
44
|
+
def image_delete(tag)
|
45
|
+
image_blobs(tag).each { |hash| blob_delete(hash.values.first) }
|
46
|
+
api_request(repo_suffix, "/manifests/#{image_digest(tag)}",
|
47
|
+
method: :delete,
|
48
|
+
expects: [202, 404],
|
49
|
+
headers: { Accept: 'Accept: application/vnd.docker.distribution.manifest.v2+json' })
|
50
|
+
end
|
51
|
+
|
52
|
+
def image_history(tag)
|
53
|
+
response = manifest_v1(tag)
|
54
|
+
JSON.load(response['history'].first['v1Compatibility'])
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
|
59
|
+
def image_digest(tag)
|
60
|
+
raw_api_request(repo_suffix, "/manifests/#{tag}",
|
61
|
+
headers: { Accept: 'application/vnd.docker.distribution.manifest.v2+json' }).headers['Docker-Content-Digest']
|
62
|
+
end
|
63
|
+
|
64
|
+
def image_blobs(tag)
|
65
|
+
manifest_v1(tag)['fsLayers']
|
66
|
+
end
|
67
|
+
|
68
|
+
def manifest_v1(tag)
|
69
|
+
api_request(repo_suffix, "/manifests/#{tag}")
|
70
|
+
end
|
71
|
+
|
72
|
+
def manifest_v2(tag)
|
73
|
+
api_request(repo_suffix, "/manifests/#{tag}",
|
74
|
+
headers: { Accept: 'application/vnd.docker.distribution.manifest.v2+json' })
|
75
|
+
end
|
76
|
+
|
77
|
+
def blob_delete(id)
|
78
|
+
api_request(repo_suffix, "/blobs/#{id}",
|
79
|
+
method: :delete, expects: [202, 404])
|
80
|
+
end
|
81
|
+
|
82
|
+
def api_request(*uri, **options)
|
83
|
+
JSON.load(raw_api_request(*uri, **options).body)
|
84
|
+
end
|
85
|
+
|
86
|
+
def raw_api_request(*uri, **options)
|
87
|
+
url = api_url(*uri)
|
88
|
+
request(url, **default_api_options.merge(options))
|
89
|
+
rescue Excon::Error::NotFound
|
90
|
+
raise Error::Registry, code: :page_not_found, data: { url: url, registry: api_url }
|
91
|
+
rescue Excon::Error::Unauthorized
|
92
|
+
user_not_authorized!
|
93
|
+
end
|
94
|
+
|
95
|
+
def api_url(*uri)
|
96
|
+
File.join(hostname_url, API_VERSION, '/', *uri)
|
97
|
+
end
|
98
|
+
|
99
|
+
def default_api_options
|
100
|
+
{ expects: [200] }
|
101
|
+
end
|
102
|
+
|
103
|
+
def user_not_authorized!
|
104
|
+
raise Error::Registry, code: :user_not_authorized, data: { registry: api_url }
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end # DockerRegistry
|
108
|
+
end # Dimg
|
109
|
+
end # Dapp
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Dapp
|
2
|
+
module Dimg
|
3
|
+
module DockerRegistry
|
4
|
+
class Base
|
5
|
+
module Authorization
|
6
|
+
def authorization_options(url)
|
7
|
+
@authorization_options ||= begin
|
8
|
+
case authenticate_header = raw_request(url).headers['Www-Authenticate']
|
9
|
+
when /Bearer/ then { headers: { Authorization: "Bearer #{authorization_token(authenticate_header)}" } }
|
10
|
+
when /Basic/ then { headers: { Authorization: "Basic #{authorization_auth}" } }
|
11
|
+
when nil then {}
|
12
|
+
else raise Error::Registry, code: :authenticate_type_not_supported, data: { registry: api_url }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def authorization_token(authenticate_header)
|
18
|
+
options = parse_authenticate_header(authenticate_header)
|
19
|
+
realm = options.delete(:realm)
|
20
|
+
begin
|
21
|
+
response = raw_request(realm, headers: { Authorization: "Basic #{authorization_auth}" }, query: options, expects: [200])
|
22
|
+
rescue Error::Registry
|
23
|
+
raise unless (response = raw_request(realm, query: options)).status == 200
|
24
|
+
end
|
25
|
+
JSON.load(response.body)['token']
|
26
|
+
end
|
27
|
+
|
28
|
+
def parse_authenticate_header(header)
|
29
|
+
[:realm, :service, :scope].map do |option|
|
30
|
+
/#{option}="([[^"].]*)/ =~ header
|
31
|
+
next unless Regexp.last_match(1)
|
32
|
+
[option, Regexp.last_match(1)]
|
33
|
+
end.compact.to_h
|
34
|
+
end
|
35
|
+
|
36
|
+
def authorization_auth
|
37
|
+
auths = auths_section_from_docker_config
|
38
|
+
r = repo
|
39
|
+
loop do
|
40
|
+
break unless r.include?('/') && !auths.keys.any? { |auth| auth.start_with?(r) }
|
41
|
+
r = chomp_name(r)
|
42
|
+
end
|
43
|
+
credential = (auths[r] || auths.find { |repo, _| repo == r })
|
44
|
+
user_not_authorized! if credential.nil?
|
45
|
+
credential['auth']
|
46
|
+
end
|
47
|
+
|
48
|
+
def auths_section_from_docker_config
|
49
|
+
file = Pathname(File.join(Dir.home, '.docker', 'config.json'))
|
50
|
+
user_not_authorized! unless file.exist?
|
51
|
+
JSON.load(file.read)['auths'].tap { |auths| user_not_authorized! if auths.nil? }
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def chomp_name(r)
|
57
|
+
r.split('/')[0..-2].join('/')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end # Base
|
61
|
+
end # DockerRegistry
|
62
|
+
end # Dimg
|
63
|
+
end # Dapp
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Dapp
|
2
|
+
module Dimg
|
3
|
+
module DockerRegistry
|
4
|
+
class Base
|
5
|
+
module Request
|
6
|
+
def self.included(base)
|
7
|
+
base.extend(self)
|
8
|
+
end
|
9
|
+
|
10
|
+
def request(url, **options)
|
11
|
+
raw_request(url, options.in_depth_merge(authorization_options(url)))
|
12
|
+
end
|
13
|
+
|
14
|
+
def raw_request(url, **options)
|
15
|
+
Excon.new(url).request(default_request_options.in_depth_merge(options))
|
16
|
+
end
|
17
|
+
|
18
|
+
def url_available?(url)
|
19
|
+
raw_request(url, expects: [200])
|
20
|
+
true
|
21
|
+
rescue Excon::Error
|
22
|
+
false
|
23
|
+
end
|
24
|
+
|
25
|
+
protected
|
26
|
+
|
27
|
+
def default_request_options
|
28
|
+
{ method: :get, omit_default_port: true }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end # Base
|
32
|
+
end # DockerRegistry
|
33
|
+
end # Dimg
|
34
|
+
end # Dapp
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Dapp
|
2
|
+
module Dimg
|
3
|
+
module DockerRegistry
|
4
|
+
class Default < Base
|
5
|
+
DEFAULT_HOSTNAME_URL = 'https://registry.hub.docker.com'.freeze
|
6
|
+
|
7
|
+
def initialize(repo, repo_suffix)
|
8
|
+
super(repo, DEFAULT_HOSTNAME_URL, repo_suffix)
|
9
|
+
end
|
10
|
+
|
11
|
+
def repo_suffix=(val)
|
12
|
+
val = "library/#{val}" if val.split('/').one?
|
13
|
+
super(val)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end # Dimg
|
18
|
+
end # Dapp
|