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.
Files changed (299) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dapp +5 -5
  3. data/config/en/common.yml +6 -4
  4. data/config/en/net_status.yml +8 -7
  5. data/lib/dapp.rb +157 -139
  6. data/lib/dapp/cli.rb +6 -16
  7. data/lib/dapp/cli/base.rb +3 -5
  8. data/lib/dapp/config/base.rb +19 -7
  9. data/lib/dapp/config/directive/base.rb +0 -1
  10. data/lib/dapp/config/error/config.rb +7 -0
  11. data/lib/dapp/core_ext/hash.rb +0 -2
  12. data/lib/dapp/core_ext/pathname.rb +1 -3
  13. data/lib/dapp/{project.rb → dapp.rb} +2 -21
  14. data/lib/dapp/{project → dapp}/chef.rb +2 -4
  15. data/lib/dapp/{project → dapp}/dappfile.rb +5 -7
  16. data/lib/dapp/{project → dapp}/deps/base.rb +3 -6
  17. data/lib/dapp/{project → dapp}/deps/gitartifact.rb +2 -5
  18. data/lib/dapp/{project → dapp}/git_artifact.rb +2 -4
  19. data/lib/dapp/{project → dapp}/lock.rb +3 -5
  20. data/lib/dapp/{project → dapp}/logging/base.rb +2 -5
  21. data/lib/dapp/{project → dapp}/logging/i18n.rb +2 -3
  22. data/lib/dapp/{project → dapp}/logging/paint.rb +2 -4
  23. data/lib/dapp/{project → dapp}/logging/process.rb +2 -5
  24. data/lib/dapp/{project → dapp}/shellout/base.rb +2 -4
  25. data/lib/dapp/{project → dapp}/shellout/streaming.rb +3 -8
  26. data/lib/dapp/{project → dapp}/ssh_agent.rb +6 -9
  27. data/lib/dapp/dimg.rb +1 -192
  28. data/lib/dapp/dimg/artifact.rb +24 -0
  29. data/lib/dapp/dimg/build/stage/after_install_artifact.rb +14 -0
  30. data/lib/dapp/dimg/build/stage/after_setup_artifact.rb +18 -0
  31. data/lib/dapp/dimg/build/stage/artifact_base.rb +80 -0
  32. data/lib/dapp/dimg/build/stage/artifact_default.rb +63 -0
  33. data/lib/dapp/dimg/build/stage/base.rb +210 -0
  34. data/lib/dapp/dimg/build/stage/before_install.rb +33 -0
  35. data/lib/dapp/dimg/build/stage/before_install_artifact.rb +14 -0
  36. data/lib/dapp/dimg/build/stage/before_setup.rb +31 -0
  37. data/lib/dapp/dimg/build/stage/before_setup_artifact.rb +14 -0
  38. data/lib/dapp/dimg/build/stage/build_artifact.rb +31 -0
  39. data/lib/dapp/dimg/build/stage/docker_instructions.rb +25 -0
  40. data/lib/dapp/dimg/build/stage/from.rb +50 -0
  41. data/lib/dapp/dimg/build/stage/ga_archive.rb +28 -0
  42. data/lib/dapp/dimg/build/stage/ga_archive_dependencies.rb +27 -0
  43. data/lib/dapp/dimg/build/stage/ga_artifact_patch.rb +22 -0
  44. data/lib/dapp/dimg/build/stage/ga_base.rb +80 -0
  45. data/lib/dapp/dimg/build/stage/ga_dependencies_base.rb +20 -0
  46. data/lib/dapp/dimg/build/stage/ga_latest_patch.rb +54 -0
  47. data/lib/dapp/dimg/build/stage/import_artifact.rb +64 -0
  48. data/lib/dapp/dimg/build/stage/install/ga_post_install_patch.rb +22 -0
  49. data/lib/dapp/dimg/build/stage/install/ga_post_install_patch_dependencies.rb +22 -0
  50. data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch.rb +22 -0
  51. data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch_dependencies.rb +22 -0
  52. data/lib/dapp/dimg/build/stage/install/install.rb +35 -0
  53. data/lib/dapp/dimg/build/stage/mod/group.rb +42 -0
  54. data/lib/dapp/dimg/build/stage/mod/logging.rb +101 -0
  55. data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch.rb +22 -0
  56. data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch_dependencies.rb +32 -0
  57. data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch.rb +22 -0
  58. data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch_dependencies.rb +22 -0
  59. data/lib/dapp/dimg/build/stage/setup/setup.rb +35 -0
  60. data/lib/dapp/dimg/builder.rb +6 -0
  61. data/lib/dapp/{builder → dimg/builder}/base.rb +4 -5
  62. data/lib/dapp/{builder → dimg/builder}/chef.rb +41 -33
  63. data/lib/dapp/dimg/builder/chef/berksfile.rb +121 -0
  64. data/lib/dapp/dimg/builder/chef/cookbook.rb +285 -0
  65. data/lib/dapp/dimg/builder/chef/cookbook_metadata.rb +106 -0
  66. data/lib/dapp/{builder → dimg/builder}/none.rb +4 -5
  67. data/lib/dapp/{builder → dimg/builder}/shell.rb +5 -6
  68. data/lib/dapp/dimg/cli/base.rb +16 -0
  69. data/lib/dapp/dimg/cli/bp.rb +37 -0
  70. data/lib/dapp/dimg/cli/build.rb +64 -0
  71. data/lib/dapp/dimg/cli/build_context.rb +18 -0
  72. data/lib/dapp/dimg/cli/build_context/export.rb +26 -0
  73. data/lib/dapp/dimg/cli/build_context/import.rb +17 -0
  74. data/lib/dapp/dimg/cli/cleanup.rb +22 -0
  75. data/lib/dapp/dimg/cli/cli.rb +1 -0
  76. data/lib/dapp/dimg/cli/dimg.rb +30 -0
  77. data/lib/dapp/dimg/cli/list.rb +17 -0
  78. data/lib/dapp/dimg/cli/mrproper.rb +26 -0
  79. data/lib/dapp/dimg/cli/push.rb +61 -0
  80. data/lib/dapp/dimg/cli/run.rb +59 -0
  81. data/lib/dapp/{cli → dimg/cli}/spush.rb +7 -7
  82. data/lib/dapp/dimg/cli/stage_image.rb +24 -0
  83. data/lib/dapp/dimg/cli/stages.rb +22 -0
  84. data/lib/dapp/dimg/cli/stages/cleanup_local.rb +44 -0
  85. data/lib/dapp/dimg/cli/stages/cleanup_repo.rb +26 -0
  86. data/lib/dapp/dimg/cli/stages/flush_local.rb +23 -0
  87. data/lib/dapp/dimg/cli/stages/flush_repo.rb +24 -0
  88. data/lib/dapp/dimg/cli/stages/pull.rb +28 -0
  89. data/lib/dapp/dimg/cli/stages/push.rb +24 -0
  90. data/lib/dapp/dimg/cli/tag.rb +24 -0
  91. data/lib/dapp/dimg/config/artifact_dimg.rb +17 -0
  92. data/lib/dapp/dimg/config/artifact_group.rb +47 -0
  93. data/lib/dapp/dimg/config/base.rb +7 -0
  94. data/lib/dapp/dimg/config/dimg.rb +24 -0
  95. data/lib/dapp/dimg/config/dimg/instance_methods.rb +177 -0
  96. data/lib/dapp/dimg/config/dimg/validation.rb +126 -0
  97. data/lib/dapp/dimg/config/dimg_group.rb +61 -0
  98. data/lib/dapp/dimg/config/dimg_group_base.rb +54 -0
  99. data/lib/dapp/dimg/config/dimg_group_main.rb +22 -0
  100. data/lib/dapp/dimg/config/directive/artifact.rb +70 -0
  101. data/lib/dapp/dimg/config/directive/artifact_base.rb +97 -0
  102. data/lib/dapp/dimg/config/directive/base.rb +9 -0
  103. data/lib/dapp/dimg/config/directive/chef.rb +68 -0
  104. data/lib/dapp/dimg/config/directive/docker/artifact.rb +15 -0
  105. data/lib/dapp/dimg/config/directive/docker/base.rb +22 -0
  106. data/lib/dapp/dimg/config/directive/docker/dimg.rb +82 -0
  107. data/lib/dapp/dimg/config/directive/git_artifact_local.rb +47 -0
  108. data/lib/dapp/dimg/config/directive/git_artifact_remote.rb +58 -0
  109. data/lib/dapp/dimg/config/directive/mount.rb +27 -0
  110. data/lib/dapp/dimg/config/directive/shell/artifact.rb +18 -0
  111. data/lib/dapp/dimg/config/directive/shell/dimg.rb +65 -0
  112. data/lib/dapp/dimg/dapp/command.rb +21 -0
  113. data/lib/dapp/dimg/dapp/command/bp.rb +20 -0
  114. data/lib/dapp/dimg/dapp/command/build.rb +22 -0
  115. data/lib/dapp/dimg/dapp/command/build_context/common.rb +27 -0
  116. data/lib/dapp/dimg/dapp/command/build_context/export.rb +55 -0
  117. data/lib/dapp/dimg/dapp/command/build_context/import.rb +71 -0
  118. data/lib/dapp/dimg/dapp/command/cleanup.rb +23 -0
  119. data/lib/dapp/dimg/dapp/command/common.rb +96 -0
  120. data/lib/dapp/dimg/dapp/command/list.rb +19 -0
  121. data/lib/dapp/dimg/dapp/command/mrproper.rb +75 -0
  122. data/lib/dapp/dimg/dapp/command/push.rb +27 -0
  123. data/lib/dapp/dimg/dapp/command/run.rb +15 -0
  124. data/lib/dapp/dimg/dapp/command/spush.rb +17 -0
  125. data/lib/dapp/dimg/dapp/command/stage_image.rb +14 -0
  126. data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +137 -0
  127. data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +124 -0
  128. data/lib/dapp/dimg/dapp/command/stages/common.rb +85 -0
  129. data/lib/dapp/dimg/dapp/command/stages/flush_local.rb +21 -0
  130. data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +21 -0
  131. data/lib/dapp/dimg/dapp/command/stages/pull.rb +26 -0
  132. data/lib/dapp/dimg/dapp/command/stages/push.rb +22 -0
  133. data/lib/dapp/dimg/dapp/command/tag.rb +17 -0
  134. data/lib/dapp/dimg/dimg.rb +192 -0
  135. data/lib/dapp/dimg/dimg/git_artifact.rb +26 -0
  136. data/lib/dapp/dimg/dimg/path.rb +37 -0
  137. data/lib/dapp/dimg/dimg/stages.rb +60 -0
  138. data/lib/dapp/dimg/dimg/tags.rb +65 -0
  139. data/lib/dapp/dimg/docker_registry.rb +37 -0
  140. data/lib/dapp/dimg/docker_registry/base.rb +109 -0
  141. data/lib/dapp/dimg/docker_registry/base/authorization.rb +63 -0
  142. data/lib/dapp/dimg/docker_registry/base/request.rb +34 -0
  143. data/lib/dapp/dimg/docker_registry/default.rb +18 -0
  144. data/lib/dapp/dimg/error/base.rb +7 -0
  145. data/lib/dapp/dimg/error/build.rb +7 -0
  146. data/lib/dapp/dimg/error/chef.rb +11 -0
  147. data/lib/dapp/dimg/error/command.rb +7 -0
  148. data/lib/dapp/dimg/error/config.rb +7 -0
  149. data/lib/dapp/dimg/error/dimg.rb +7 -0
  150. data/lib/dapp/dimg/error/lock.rb +7 -0
  151. data/lib/dapp/dimg/error/registry.rb +7 -0
  152. data/lib/dapp/dimg/error/rugged.rb +7 -0
  153. data/lib/dapp/dimg/error/shellout.rb +7 -0
  154. data/lib/dapp/dimg/error/tar_writer.rb +7 -0
  155. data/lib/dapp/dimg/exception/base.rb +7 -0
  156. data/lib/dapp/dimg/exception/introspect_image.rb +7 -0
  157. data/lib/dapp/dimg/exception/registry.rb +7 -0
  158. data/lib/dapp/dimg/filelock.rb +43 -0
  159. data/lib/dapp/dimg/git_artifact.rb +241 -18
  160. data/lib/dapp/dimg/git_repo/base.rb +90 -0
  161. data/lib/dapp/dimg/git_repo/own.rb +39 -0
  162. data/lib/dapp/dimg/git_repo/remote.rb +50 -0
  163. data/lib/dapp/dimg/image/argument.rb +143 -0
  164. data/lib/dapp/dimg/image/docker.rb +127 -0
  165. data/lib/dapp/dimg/image/scratch.rb +32 -0
  166. data/lib/dapp/dimg/image/stage.rb +95 -0
  167. data/lib/dapp/dimg/lock/base.rb +51 -0
  168. data/lib/dapp/dimg/lock/file.rb +48 -0
  169. data/lib/dapp/error/base.rb +0 -1
  170. data/lib/dapp/error/dapp.rb +5 -0
  171. data/lib/dapp/error/dappfile.rb +0 -1
  172. data/lib/dapp/error/shellout.rb +0 -1
  173. data/lib/dapp/exception/base.rb +0 -1
  174. data/lib/dapp/helper/cli.rb +5 -6
  175. data/lib/dapp/helper/net_status.rb +0 -1
  176. data/lib/dapp/helper/sha256.rb +0 -1
  177. data/lib/dapp/helper/trivia.rb +0 -1
  178. data/lib/dapp/prctl.rb +0 -1
  179. data/lib/dapp/version.rb +1 -2
  180. metadata +172 -140
  181. data/lib/dapp/artifact.rb +0 -23
  182. data/lib/dapp/build/stage/after_install_artifact.rb +0 -13
  183. data/lib/dapp/build/stage/after_setup_artifact.rb +0 -17
  184. data/lib/dapp/build/stage/artifact_base.rb +0 -80
  185. data/lib/dapp/build/stage/artifact_default.rb +0 -63
  186. data/lib/dapp/build/stage/base.rb +0 -203
  187. data/lib/dapp/build/stage/before_install.rb +0 -32
  188. data/lib/dapp/build/stage/before_install_artifact.rb +0 -13
  189. data/lib/dapp/build/stage/before_setup.rb +0 -30
  190. data/lib/dapp/build/stage/before_setup_artifact.rb +0 -13
  191. data/lib/dapp/build/stage/build_artifact.rb +0 -36
  192. data/lib/dapp/build/stage/docker_instructions.rb +0 -24
  193. data/lib/dapp/build/stage/from.rb +0 -34
  194. data/lib/dapp/build/stage/ga_archive.rb +0 -27
  195. data/lib/dapp/build/stage/ga_archive_dependencies.rb +0 -26
  196. data/lib/dapp/build/stage/ga_artifact_patch.rb +0 -21
  197. data/lib/dapp/build/stage/ga_base.rb +0 -79
  198. data/lib/dapp/build/stage/ga_dependencies_base.rb +0 -19
  199. data/lib/dapp/build/stage/ga_latest_patch.rb +0 -53
  200. data/lib/dapp/build/stage/import_artifact.rb +0 -65
  201. data/lib/dapp/build/stage/install/ga_post_install_patch.rb +0 -21
  202. data/lib/dapp/build/stage/install/ga_post_install_patch_dependencies.rb +0 -21
  203. data/lib/dapp/build/stage/install/ga_pre_install_patch.rb +0 -21
  204. data/lib/dapp/build/stage/install/ga_pre_install_patch_dependencies.rb +0 -21
  205. data/lib/dapp/build/stage/install/install.rb +0 -40
  206. data/lib/dapp/build/stage/mod/group.rb +0 -42
  207. data/lib/dapp/build/stage/mod/logging.rb +0 -104
  208. data/lib/dapp/build/stage/setup/ga_post_setup_patch.rb +0 -21
  209. data/lib/dapp/build/stage/setup/ga_post_setup_patch_dependencies.rb +0 -31
  210. data/lib/dapp/build/stage/setup/ga_pre_setup_patch.rb +0 -21
  211. data/lib/dapp/build/stage/setup/ga_pre_setup_patch_dependencies.rb +0 -21
  212. data/lib/dapp/build/stage/setup/setup.rb +0 -40
  213. data/lib/dapp/builder/chef/berksfile.rb +0 -78
  214. data/lib/dapp/builder/chef/cookbook.rb +0 -257
  215. data/lib/dapp/builder/chef/cookbook_metadata.rb +0 -54
  216. data/lib/dapp/builder/chef/error.rb +0 -12
  217. data/lib/dapp/cli/bp.rb +0 -37
  218. data/lib/dapp/cli/build.rb +0 -60
  219. data/lib/dapp/cli/cleanup.rb +0 -22
  220. data/lib/dapp/cli/list.rb +0 -17
  221. data/lib/dapp/cli/mrproper.rb +0 -26
  222. data/lib/dapp/cli/push.rb +0 -61
  223. data/lib/dapp/cli/run.rb +0 -53
  224. data/lib/dapp/cli/stage_image.rb +0 -24
  225. data/lib/dapp/cli/stages.rb +0 -23
  226. data/lib/dapp/cli/stages/cleanup_local.rb +0 -44
  227. data/lib/dapp/cli/stages/cleanup_repo.rb +0 -26
  228. data/lib/dapp/cli/stages/flush_local.rb +0 -23
  229. data/lib/dapp/cli/stages/flush_repo.rb +0 -24
  230. data/lib/dapp/cli/stages/pull.rb +0 -28
  231. data/lib/dapp/cli/stages/push.rb +0 -24
  232. data/lib/dapp/cli/tag.rb +0 -24
  233. data/lib/dapp/config/artifact_dimg.rb +0 -20
  234. data/lib/dapp/config/artifact_group.rb +0 -56
  235. data/lib/dapp/config/dimg.rb +0 -23
  236. data/lib/dapp/config/dimg/instance_methods.rb +0 -194
  237. data/lib/dapp/config/dimg/validation.rb +0 -125
  238. data/lib/dapp/config/dimg_group.rb +0 -60
  239. data/lib/dapp/config/dimg_group_base.rb +0 -53
  240. data/lib/dapp/config/dimg_group_main.rb +0 -21
  241. data/lib/dapp/config/directive/artifact.rb +0 -69
  242. data/lib/dapp/config/directive/artifact_base.rb +0 -93
  243. data/lib/dapp/config/directive/chef.rb +0 -57
  244. data/lib/dapp/config/directive/docker/artifact.rb +0 -15
  245. data/lib/dapp/config/directive/docker/base.rb +0 -20
  246. data/lib/dapp/config/directive/docker/dimg.rb +0 -81
  247. data/lib/dapp/config/directive/git_artifact_local.rb +0 -13
  248. data/lib/dapp/config/directive/git_artifact_remote.rb +0 -57
  249. data/lib/dapp/config/directive/mount.rb +0 -26
  250. data/lib/dapp/config/directive/shell/artifact.rb +0 -17
  251. data/lib/dapp/config/directive/shell/dimg.rb +0 -65
  252. data/lib/dapp/dimg/path.rb +0 -37
  253. data/lib/dapp/dimg/stages.rb +0 -59
  254. data/lib/dapp/dimg/tags.rb +0 -65
  255. data/lib/dapp/docker_registry.rb +0 -36
  256. data/lib/dapp/docker_registry/base.rb +0 -109
  257. data/lib/dapp/docker_registry/default.rb +0 -18
  258. data/lib/dapp/docker_registry/mod/authorization.rb +0 -63
  259. data/lib/dapp/docker_registry/mod/request.rb +0 -32
  260. data/lib/dapp/error/build.rb +0 -6
  261. data/lib/dapp/error/config.rb +0 -6
  262. data/lib/dapp/error/dimg.rb +0 -6
  263. data/lib/dapp/error/image.rb +0 -6
  264. data/lib/dapp/error/project.rb +0 -6
  265. data/lib/dapp/error/registry.rb +0 -6
  266. data/lib/dapp/error/rugged.rb +0 -6
  267. data/lib/dapp/error/tar_writer.rb +0 -6
  268. data/lib/dapp/exception/introspect_image.rb +0 -6
  269. data/lib/dapp/exception/registry.rb +0 -6
  270. data/lib/dapp/filelock.rb +0 -43
  271. data/lib/dapp/git_artifact.rb +0 -241
  272. data/lib/dapp/git_repo/base.rb +0 -88
  273. data/lib/dapp/git_repo/own.rb +0 -38
  274. data/lib/dapp/git_repo/remote.rb +0 -49
  275. data/lib/dapp/image/argument.rb +0 -134
  276. data/lib/dapp/image/docker.rb +0 -115
  277. data/lib/dapp/image/scratch.rb +0 -32
  278. data/lib/dapp/image/stage.rb +0 -94
  279. data/lib/dapp/lock/base.rb +0 -51
  280. data/lib/dapp/lock/error.rb +0 -14
  281. data/lib/dapp/lock/file.rb +0 -45
  282. data/lib/dapp/project/command/bp.rb +0 -21
  283. data/lib/dapp/project/command/build.rb +0 -20
  284. data/lib/dapp/project/command/cleanup.rb +0 -24
  285. data/lib/dapp/project/command/common.rb +0 -96
  286. data/lib/dapp/project/command/list.rb +0 -20
  287. data/lib/dapp/project/command/mrproper.rb +0 -69
  288. data/lib/dapp/project/command/push.rb +0 -28
  289. data/lib/dapp/project/command/run.rb +0 -15
  290. data/lib/dapp/project/command/spush.rb +0 -18
  291. data/lib/dapp/project/command/stage_image.rb +0 -15
  292. data/lib/dapp/project/command/stages/cleanup_local.rb +0 -138
  293. data/lib/dapp/project/command/stages/cleanup_repo.rb +0 -125
  294. data/lib/dapp/project/command/stages/common.rb +0 -86
  295. data/lib/dapp/project/command/stages/flush_local.rb +0 -22
  296. data/lib/dapp/project/command/stages/flush_repo.rb +0 -22
  297. data/lib/dapp/project/command/stages/pull.rb +0 -27
  298. data/lib/dapp/project/command/stages/push.rb +0 -23
  299. 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