dapp 0.10.2 → 0.36.24

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 (287) hide show
  1. checksums.yaml +5 -5
  2. data/bin/dapp +77 -15
  3. data/config/en/common.yml +20 -11
  4. data/config/en/net_status.yml +108 -27
  5. data/lib/dapp/cli/cli.rb +1 -0
  6. data/lib/dapp/cli/command/base.rb +111 -0
  7. data/lib/dapp/cli/command/sample/base.rb +28 -0
  8. data/lib/dapp/cli/command/sample/create.rb +24 -0
  9. data/lib/dapp/cli/command/sample/list.rb +25 -0
  10. data/lib/dapp/cli/command/sample.rb +20 -0
  11. data/lib/dapp/cli/command/slug.rb +26 -0
  12. data/lib/dapp/cli/command/update.rb +65 -0
  13. data/lib/dapp/cli/options/ssh.rb +18 -0
  14. data/lib/dapp/cli/options/tag.rb +51 -0
  15. data/lib/dapp/cli.rb +11 -3
  16. data/lib/dapp/config/config.rb +21 -0
  17. data/lib/dapp/config/directive/base.rb +100 -3
  18. data/lib/dapp/core_ext/hash.rb +14 -0
  19. data/lib/dapp/core_ext/pathname.rb +6 -4
  20. data/lib/dapp/dapp/chef.rb +1 -9
  21. data/lib/dapp/dapp/command/common.rb +24 -0
  22. data/lib/dapp/dapp/command/sample/common.rb +54 -0
  23. data/lib/dapp/dapp/command/sample/create.rb +57 -0
  24. data/lib/dapp/dapp/command/sample/list.rb +13 -0
  25. data/lib/dapp/dapp/command/slug.rb +11 -0
  26. data/lib/dapp/dapp/dapp_config.rb +85 -0
  27. data/lib/dapp/dapp/dappfile.rb +108 -27
  28. data/lib/dapp/dapp/deps/base.rb +9 -32
  29. data/lib/dapp/dapp/deps/common.rb +26 -0
  30. data/lib/dapp/dapp/deps/gitartifact.rb +2 -20
  31. data/lib/dapp/dapp/deps/toolchain.rb +11 -0
  32. data/lib/dapp/dapp/git_artifact.rb +6 -4
  33. data/lib/dapp/dapp/lock.rb +6 -5
  34. data/lib/dapp/dapp/logging/base.rb +32 -20
  35. data/lib/dapp/dapp/logging/i18n.rb +5 -1
  36. data/lib/dapp/dapp/logging/process.rb +6 -6
  37. data/lib/dapp/dapp/option_tags.rb +98 -0
  38. data/lib/dapp/dapp/ruby2go.rb +130 -0
  39. data/lib/dapp/dapp/sentry.rb +97 -0
  40. data/lib/dapp/dapp/shellout/base.rb +26 -18
  41. data/lib/dapp/dapp/shellout/streaming.rb +2 -2
  42. data/lib/dapp/dapp/slug.rb +12 -0
  43. data/lib/dapp/dapp/ssh_agent.rb +25 -7
  44. data/lib/dapp/dapp.rb +192 -41
  45. data/lib/dapp/deployment.rb +1 -0
  46. data/lib/dapp/dimg/artifact.rb +12 -4
  47. data/lib/dapp/dimg/build/stage/artifact_base.rb +26 -30
  48. data/lib/dapp/dimg/build/stage/artifact_default.rb +50 -28
  49. data/lib/dapp/dimg/build/stage/base.rb +187 -52
  50. data/lib/dapp/dimg/build/stage/before_install.rb +4 -15
  51. data/lib/dapp/dimg/build/stage/before_install_artifact.rb +4 -0
  52. data/lib/dapp/dimg/build/stage/before_setup.rb +1 -20
  53. data/lib/dapp/dimg/build/stage/build_artifact.rb +1 -20
  54. data/lib/dapp/dimg/build/stage/docker_instructions.rb +5 -4
  55. data/lib/dapp/dimg/build/stage/from.rb +62 -9
  56. data/lib/dapp/dimg/build/stage/ga_archive.rb +14 -1
  57. data/lib/dapp/dimg/build/stage/ga_artifact_patch.rb +1 -5
  58. data/lib/dapp/dimg/build/stage/ga_base.rb +5 -35
  59. data/lib/dapp/dimg/build/stage/ga_latest_patch.rb +15 -34
  60. data/lib/dapp/dimg/build/stage/ga_related_base.rb +21 -0
  61. data/lib/dapp/dimg/build/stage/import_artifact.rb +22 -11
  62. data/lib/dapp/dimg/build/stage/install/ga_post_install_patch.rb +6 -2
  63. data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch.rb +6 -2
  64. data/lib/dapp/dimg/build/stage/install/install.rb +1 -19
  65. data/lib/dapp/dimg/build/stage/instructions.rb +27 -0
  66. data/lib/dapp/dimg/build/stage/mod/group.rb +19 -7
  67. data/lib/dapp/dimg/build/stage/mod/logging.rb +15 -19
  68. data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch.rb +24 -1
  69. data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch.rb +6 -2
  70. data/lib/dapp/dimg/build/stage/setup/setup.rb +1 -19
  71. data/lib/dapp/dimg/builder/ansible.rb +5 -0
  72. data/lib/dapp/dimg/builder/chef/cookbook.rb +8 -8
  73. data/lib/dapp/dimg/builder/chef.rb +29 -16
  74. data/lib/dapp/dimg/builder/none.rb +1 -34
  75. data/lib/dapp/dimg/builder/ruby2go.rb +57 -0
  76. data/lib/dapp/dimg/builder/shell.rb +1 -20
  77. data/lib/dapp/dimg/cli/cli.rb +2 -1
  78. data/lib/dapp/dimg/cli/command/base.rb +24 -0
  79. data/lib/dapp/dimg/cli/command/dimg/bp.rb +60 -0
  80. data/lib/dapp/dimg/cli/command/dimg/build.rb +43 -0
  81. data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/export.rb +9 -4
  82. data/lib/dapp/dimg/cli/{build_context → command/dimg/build_context}/import.rb +4 -4
  83. data/lib/dapp/dimg/cli/{build_context.rb → command/dimg/build_context.rb} +5 -5
  84. data/lib/dapp/dimg/cli/{cleanup.rb → command/dimg/cleanup.rb} +4 -6
  85. data/lib/dapp/dimg/cli/command/dimg/cleanup_repo.rb +47 -0
  86. data/lib/dapp/dimg/cli/command/dimg/flush_local.rb +24 -0
  87. data/lib/dapp/dimg/cli/command/dimg/flush_repo.rb +36 -0
  88. data/lib/dapp/dimg/cli/{list.rb → command/dimg/list.rb} +6 -3
  89. data/lib/dapp/dimg/cli/{mrproper.rb → command/dimg/mrproper.rb} +4 -4
  90. data/lib/dapp/dimg/cli/command/dimg/push.rb +39 -0
  91. data/lib/dapp/dimg/cli/{run.rb → command/dimg/run.rb} +30 -15
  92. data/lib/dapp/dimg/cli/{spush.rb → command/dimg/spush.rb} +4 -4
  93. data/lib/dapp/dimg/cli/{stage_image.rb → command/dimg/stage_image.rb} +12 -3
  94. data/lib/dapp/dimg/cli/command/dimg/stages/base.rb +13 -0
  95. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_local.rb +13 -9
  96. data/lib/dapp/dimg/cli/{stages → command/dimg/stages}/cleanup_repo.rb +6 -8
  97. data/lib/dapp/dimg/cli/command/dimg/stages/flush_local.rb +21 -0
  98. data/lib/dapp/dimg/cli/command/dimg/stages/flush_repo.rb +28 -0
  99. data/lib/dapp/dimg/cli/command/dimg/stages/pull.rb +34 -0
  100. data/lib/dapp/dimg/cli/command/dimg/stages/push.rb +30 -0
  101. data/lib/dapp/dimg/cli/command/dimg/stages.rb +22 -0
  102. data/lib/dapp/dimg/cli/command/dimg/tag.rb +24 -0
  103. data/lib/dapp/dimg/cli/command/dimg.rb +31 -0
  104. data/lib/dapp/dimg/cli/options/introspection.rb +45 -0
  105. data/lib/dapp/dimg/config/config.rb +24 -0
  106. data/lib/dapp/dimg/config/directive/artifact.rb +13 -15
  107. data/lib/dapp/dimg/config/directive/artifact_base.rb +13 -8
  108. data/lib/dapp/dimg/config/directive/artifact_dimg.rb +12 -0
  109. data/lib/dapp/dimg/config/directive/artifact_group.rb +60 -0
  110. data/lib/dapp/dimg/config/directive/dimg/instance_methods.rb +203 -0
  111. data/lib/dapp/dimg/config/directive/dimg/validation.rb +217 -0
  112. data/lib/dapp/dimg/config/directive/dimg.rb +36 -0
  113. data/lib/dapp/dimg/config/directive/dimg_group.rb +73 -0
  114. data/lib/dapp/dimg/config/directive/dimg_group_base.rb +46 -0
  115. data/lib/dapp/dimg/config/directive/docker/artifact.rb +5 -0
  116. data/lib/dapp/dimg/config/directive/docker/base.rb +2 -3
  117. data/lib/dapp/dimg/config/directive/docker/dimg.rb +4 -4
  118. data/lib/dapp/dimg/config/directive/git_artifact_local.rb +24 -5
  119. data/lib/dapp/dimg/config/directive/git_artifact_remote.rb +23 -12
  120. data/lib/dapp/dimg/config/directive/mount.rb +11 -3
  121. data/lib/dapp/dimg/config/directive/shell/dimg.rb +2 -2
  122. data/lib/dapp/dimg/dapp/command/bp.rb +3 -5
  123. data/lib/dapp/dimg/dapp/command/build.rb +4 -6
  124. data/lib/dapp/dimg/dapp/command/build_context/common.rb +2 -2
  125. data/lib/dapp/dimg/dapp/command/build_context/export.rb +14 -14
  126. data/lib/dapp/dimg/dapp/command/build_context/import.rb +28 -23
  127. data/lib/dapp/dimg/dapp/command/cleanup.rb +4 -11
  128. data/lib/dapp/dimg/dapp/command/cleanup_repo.rb +143 -0
  129. data/lib/dapp/dimg/dapp/command/common.rb +148 -38
  130. data/lib/dapp/dimg/dapp/command/flush_local.rb +25 -0
  131. data/lib/dapp/dimg/dapp/command/flush_repo.rb +25 -0
  132. data/lib/dapp/dimg/dapp/command/list.rb +1 -1
  133. data/lib/dapp/dimg/dapp/command/mrproper.rb +16 -63
  134. data/lib/dapp/dimg/dapp/command/push.rb +11 -16
  135. data/lib/dapp/dimg/dapp/command/ruby2go_cleanup.rb +48 -0
  136. data/lib/dapp/dimg/dapp/command/run.rb +4 -4
  137. data/lib/dapp/dimg/dapp/command/spush.rb +4 -5
  138. data/lib/dapp/dimg/dapp/command/stage_image.rb +2 -2
  139. data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +13 -115
  140. data/lib/dapp/dimg/dapp/command/stages/cleanup_repo.rb +23 -102
  141. data/lib/dapp/dimg/dapp/command/stages/common.rb +57 -39
  142. data/lib/dapp/dimg/dapp/command/stages/flush_local.rb +13 -7
  143. data/lib/dapp/dimg/dapp/command/stages/flush_repo.rb +14 -8
  144. data/lib/dapp/dimg/dapp/command/stages/pull.rb +4 -13
  145. data/lib/dapp/dimg/dapp/command/stages/push.rb +4 -9
  146. data/lib/dapp/dimg/dapp/command/tag.rb +4 -6
  147. data/lib/dapp/dimg/dapp/config_artifact_group.rb +20 -0
  148. data/lib/dapp/dimg/dapp/dapp.rb +40 -0
  149. data/lib/dapp/dimg/dapp/dappfile.rb +43 -0
  150. data/lib/dapp/dimg/dapp/dimg.rb +41 -0
  151. data/lib/dapp/dimg/dimg/git_artifact.rb +25 -11
  152. data/lib/dapp/dimg/dimg/path.rb +7 -9
  153. data/lib/dapp/dimg/dimg/stages.rb +27 -15
  154. data/lib/dapp/dimg/dimg.rb +172 -69
  155. data/lib/dapp/dimg/docker_registry/base.rb +31 -74
  156. data/lib/dapp/dimg/docker_registry/dimg.rb +55 -0
  157. data/lib/dapp/dimg/docker_registry.rb +5 -23
  158. data/lib/dapp/dimg/error/build.rb +1 -1
  159. data/lib/dapp/dimg/error/chef.rb +1 -5
  160. data/lib/dapp/dimg/error/{command.rb → default.rb} +1 -1
  161. data/lib/dapp/dimg/error/dimg.rb +1 -1
  162. data/lib/dapp/dimg/error/lock.rb +1 -1
  163. data/lib/dapp/dimg/error/registry.rb +1 -1
  164. data/lib/dapp/dimg/error/rugged.rb +1 -1
  165. data/lib/dapp/dimg/error/tar_writer.rb +1 -1
  166. data/lib/dapp/dimg/git_artifact.rb +195 -179
  167. data/lib/dapp/dimg/git_repo/base.rb +49 -45
  168. data/lib/dapp/dimg/git_repo/local.rb +45 -0
  169. data/lib/dapp/dimg/git_repo/own.rb +3 -31
  170. data/lib/dapp/dimg/git_repo/remote.rb +65 -26
  171. data/lib/dapp/dimg/image/argument.rb +15 -50
  172. data/lib/dapp/dimg/image/dimg.rb +15 -0
  173. data/lib/dapp/dimg/image/scratch.rb +35 -9
  174. data/lib/dapp/dimg/image/stage.rb +223 -44
  175. data/lib/dapp/dimg/lock/file.rb +4 -4
  176. data/lib/dapp/downloader.rb +117 -0
  177. data/lib/dapp/error/base.rb +1 -5
  178. data/lib/dapp/error/command.rb +5 -0
  179. data/lib/dapp/error/config.rb +5 -0
  180. data/lib/dapp/error/dapp.rb +1 -1
  181. data/lib/dapp/error/dappfile.rb +1 -1
  182. data/lib/dapp/error/default.rb +11 -0
  183. data/lib/dapp/error/mod/user.rb +11 -0
  184. data/lib/dapp/error/shellout.rb +1 -1
  185. data/lib/dapp/exception/base.rb +1 -1
  186. data/lib/dapp/helper/case_conversion.rb +17 -0
  187. data/lib/dapp/helper/cli.rb +18 -7
  188. data/lib/dapp/helper/net_status.rb +5 -1
  189. data/lib/dapp/helper/sha256.rb +1 -1
  190. data/lib/dapp/helper/tar.rb +31 -0
  191. data/lib/dapp/helper/trivia.rb +40 -1
  192. data/lib/dapp/helper/url.rb +23 -0
  193. data/lib/dapp/helper/yaml.rb +24 -0
  194. data/lib/dapp/kube/cli/cli.rb +1 -0
  195. data/lib/dapp/kube/cli/command/base.rb +14 -0
  196. data/lib/dapp/kube/cli/command/kube/chart_create.rb +19 -0
  197. data/lib/dapp/kube/cli/command/kube/deploy.rb +80 -0
  198. data/lib/dapp/kube/cli/command/kube/dismiss.rb +31 -0
  199. data/lib/dapp/kube/cli/command/kube/lint.rb +53 -0
  200. data/lib/dapp/kube/cli/command/kube/minikube_setup.rb +19 -0
  201. data/lib/dapp/kube/cli/command/kube/render.rb +63 -0
  202. data/lib/dapp/kube/cli/command/kube/secret_edit.rb +30 -0
  203. data/lib/dapp/kube/cli/command/kube/secret_extract.rb +39 -0
  204. data/lib/dapp/kube/cli/command/kube/secret_generate.rb +34 -0
  205. data/lib/dapp/kube/cli/command/kube/secret_key_generate.rb +16 -0
  206. data/lib/dapp/kube/cli/command/kube/secret_regenerate.rb +29 -0
  207. data/lib/dapp/kube/cli/command/kube/value_get.rb +47 -0
  208. data/lib/dapp/kube/cli/command/kube.rb +28 -0
  209. data/lib/dapp/kube/dapp/command/chart_create.rb +103 -0
  210. data/lib/dapp/kube/dapp/command/common.rb +379 -0
  211. data/lib/dapp/kube/dapp/command/deploy.rb +351 -0
  212. data/lib/dapp/kube/dapp/command/dismiss.rb +50 -0
  213. data/lib/dapp/kube/dapp/command/lint.rb +69 -0
  214. data/lib/dapp/kube/dapp/command/minikube_setup.rb +402 -0
  215. data/lib/dapp/kube/dapp/command/render.rb +54 -0
  216. data/lib/dapp/kube/dapp/command/ruby2go.rb +17 -0
  217. data/lib/dapp/kube/dapp/command/secret_edit.rb +21 -0
  218. data/lib/dapp/kube/dapp/command/secret_extract.rb +17 -0
  219. data/lib/dapp/kube/dapp/command/secret_generate.rb +21 -0
  220. data/lib/dapp/kube/dapp/command/secret_key_generate.rb +13 -0
  221. data/lib/dapp/kube/dapp/command/secret_regenerate.rb +13 -0
  222. data/lib/dapp/kube/dapp/command/value_get.rb +32 -0
  223. data/lib/dapp/kube/dapp/dapp.rb +26 -0
  224. data/lib/dapp/kube/error/default.rb +7 -0
  225. data/lib/dapp/kube/helm/release.rb +189 -0
  226. data/lib/dapp/kube/helm/values.rb +148 -0
  227. data/lib/dapp/kube/helm.rb +5 -0
  228. data/lib/dapp/kube/kubernetes/client/error.rb +43 -0
  229. data/lib/dapp/kube/kubernetes/client/resource/base.rb +33 -0
  230. data/lib/dapp/kube/kubernetes/client/resource/deployment.rb +11 -0
  231. data/lib/dapp/kube/kubernetes/client/resource/event.rb +8 -0
  232. data/lib/dapp/kube/kubernetes/client/resource/job.rb +27 -0
  233. data/lib/dapp/kube/kubernetes/client/resource/pod.rb +62 -0
  234. data/lib/dapp/kube/kubernetes/client/resource/replicaset.rb +8 -0
  235. data/lib/dapp/kube/kubernetes/client.rb +314 -0
  236. data/lib/dapp/kube/kubernetes/config.rb +132 -0
  237. data/lib/dapp/kube/kubernetes/error.rb +15 -0
  238. data/lib/dapp/kube/kubernetes/manager/base.rb +15 -0
  239. data/lib/dapp/kube/kubernetes/manager/container.rb +103 -0
  240. data/lib/dapp/kube/kubernetes/manager/deployment.rb +212 -0
  241. data/lib/dapp/kube/kubernetes/manager/job.rb +65 -0
  242. data/lib/dapp/kube/kubernetes/manager/pod.rb +69 -0
  243. data/lib/dapp/kube/kubernetes.rb +6 -0
  244. data/lib/dapp/kube/secret.rb +93 -0
  245. data/lib/dapp/kube.rb +1 -0
  246. data/lib/dapp/version.rb +2 -2
  247. data/lib/dapp.rb +155 -61
  248. metadata +208 -61
  249. data/lib/dapp/cli/base.rb +0 -63
  250. data/lib/dapp/config/base.rb +0 -54
  251. data/lib/dapp/config/error/config.rb +0 -7
  252. data/lib/dapp/dimg/build/stage/ga_archive_dependencies.rb +0 -27
  253. data/lib/dapp/dimg/build/stage/ga_dependencies_base.rb +0 -20
  254. data/lib/dapp/dimg/build/stage/install/ga_post_install_patch_dependencies.rb +0 -22
  255. data/lib/dapp/dimg/build/stage/install/ga_pre_install_patch_dependencies.rb +0 -22
  256. data/lib/dapp/dimg/build/stage/mod/git_artifact_dependencies.rb +0 -23
  257. data/lib/dapp/dimg/build/stage/setup/ga_post_setup_patch_dependencies.rb +0 -32
  258. data/lib/dapp/dimg/build/stage/setup/ga_pre_setup_patch_dependencies.rb +0 -22
  259. data/lib/dapp/dimg/cli/base.rb +0 -16
  260. data/lib/dapp/dimg/cli/bp.rb +0 -37
  261. data/lib/dapp/dimg/cli/build.rb +0 -64
  262. data/lib/dapp/dimg/cli/dimg.rb +0 -30
  263. data/lib/dapp/dimg/cli/push.rb +0 -61
  264. data/lib/dapp/dimg/cli/stages/flush_local.rb +0 -23
  265. data/lib/dapp/dimg/cli/stages/flush_repo.rb +0 -24
  266. data/lib/dapp/dimg/cli/stages/pull.rb +0 -28
  267. data/lib/dapp/dimg/cli/stages/push.rb +0 -24
  268. data/lib/dapp/dimg/cli/stages.rb +0 -22
  269. data/lib/dapp/dimg/cli/tag.rb +0 -24
  270. data/lib/dapp/dimg/config/artifact_dimg.rb +0 -17
  271. data/lib/dapp/dimg/config/artifact_group.rb +0 -43
  272. data/lib/dapp/dimg/config/base.rb +0 -7
  273. data/lib/dapp/dimg/config/dimg/instance_methods.rb +0 -179
  274. data/lib/dapp/dimg/config/dimg/validation.rb +0 -126
  275. data/lib/dapp/dimg/config/dimg.rb +0 -24
  276. data/lib/dapp/dimg/config/dimg_group.rb +0 -61
  277. data/lib/dapp/dimg/config/dimg_group_base.rb +0 -54
  278. data/lib/dapp/dimg/config/dimg_group_main.rb +0 -22
  279. data/lib/dapp/dimg/dapp/command.rb +0 -21
  280. data/lib/dapp/dimg/dimg/tags.rb +0 -65
  281. data/lib/dapp/dimg/docker_registry/base/authorization.rb +0 -63
  282. data/lib/dapp/dimg/docker_registry/base/request.rb +0 -34
  283. data/lib/dapp/dimg/docker_registry/default.rb +0 -18
  284. data/lib/dapp/dimg/error/base.rb +0 -7
  285. data/lib/dapp/dimg/error/config.rb +0 -7
  286. data/lib/dapp/dimg/exception/introspect_image.rb +0 -7
  287. data/lib/dapp/dimg/image/docker.rb +0 -134
@@ -0,0 +1,130 @@
1
+ module Dapp
2
+ class Dapp
3
+ module Ruby2Go
4
+ class Error < ::Dapp::Error::Base
5
+ end
6
+
7
+ def ruby2go_image(args_hash)
8
+ _ruby2go("image", args_hash)
9
+ end
10
+
11
+ def ruby2go_docker_registry(args_hash)
12
+ _ruby2go("docker_registry", args_hash)
13
+ end
14
+
15
+ def ruby2go_builder(args_hash)
16
+ _ruby2go("builder", args_hash)
17
+ end
18
+
19
+ def ruby2go_git_artifact(args_hash)
20
+ _ruby2go("git-artifact", args_hash)
21
+ end
22
+
23
+ def ruby2go_dappdeps(args_hash)
24
+ _ruby2go("dappdeps", args_hash)
25
+ end
26
+
27
+ def ruby2go_git_repo(args_hash)
28
+ _ruby2go("git-repo", args_hash)
29
+ end
30
+
31
+ def ruby2go_cleanup(args_hash)
32
+ _ruby2go("cleanup", args_hash)
33
+ end
34
+
35
+ def ruby2go_slug(args_hash)
36
+ _ruby2go("slug", args_hash)
37
+ end
38
+
39
+ def ruby2go_deploy_watcher(args_hash, **kwargs)
40
+ _ruby2go("deploy-watcher", args_hash, **kwargs)
41
+ end
42
+
43
+ def ruby2go_deploy(args_hash)
44
+ _ruby2go("deploy", args_hash)
45
+ end
46
+
47
+ def ruby2go_init
48
+ @_call_after_before_terminate << proc {
49
+ FileUtils.rmtree(@_ruby2go_tmp_dir) if @_ruby2go_tmp_dir
50
+ }
51
+ end
52
+
53
+ def _ruby2go_bin_path_env_var_name(progname)
54
+ "DAPP_BIN_#{progname.gsub("-", "_").upcase}"
55
+ end
56
+
57
+ def _ruby2go(progname, args_hash, tmp_dir: nil)
58
+ tmp_dir = _ruby2go_tmp_dir if tmp_dir.nil?
59
+
60
+ call_id = SecureRandom.uuid
61
+
62
+ args_file = File.join(tmp_dir, "args.#{call_id}.json")
63
+ File.open(args_file, "w") {|f| f.write JSON.dump(args_hash)}
64
+
65
+ res_file = File.join(tmp_dir, "res.#{call_id}.json")
66
+
67
+ if bin_path = ENV[_ruby2go_bin_path_env_var_name(progname)]
68
+ unless File.exists? bin_path
69
+ raise ::Dapp::Error::Dapp,
70
+ code: :ruby2go_bin_path_not_found,
71
+ data: {env_var_name: _ruby2go_bin_path_env_var_name(progname), path: bin_path}
72
+ end
73
+ else
74
+ bin_path = File.join(::Dapp::Dapp.home_dir, "bin", progname, ::Dapp::VERSION, progname)
75
+ unless File.exists? bin_path
76
+ _download_ruby2go_bin(progname, bin_path)
77
+ end
78
+ end
79
+
80
+ env_hash = ENV.map {|k, v| [k, v]}.to_h
81
+
82
+ begin
83
+ exec(env_hash, "#{bin_path} -args-from-file #{args_file} -result-to-file #{res_file}") unless (pid = fork)
84
+ pid, status = Process.waitpid2(pid)
85
+ rescue Interrupt => _e
86
+ Process.kill('INT', pid)
87
+ raise
88
+ end
89
+
90
+ status_code = status.exitstatus
91
+ if [0, 16].include?(status_code)
92
+ res = nil
93
+ File.open(res_file, "r") {|f| res = JSON.load(f.read)}
94
+ res
95
+ else
96
+ raise ::Dapp::Dapp::Ruby2Go::Error, code: :ruby2go_command_unexpected_exitstatus, data: { progname: progname, status_code: status_code }
97
+ end
98
+ end
99
+
100
+ def _ruby2go_tmp_dir
101
+ @_ruby2go_tmp_dir ||= Dir.mktmpdir('dapp-ruby2go-', tmp_base_dir)
102
+ end
103
+
104
+ def _download_ruby2go_bin(progname, bin_path)
105
+ lock("downloader.bin.#{progname}", default_timeout: 1800) do
106
+ return if File.exists? bin_path
107
+
108
+ log_process("Downloading #{progname} dapp dependency") do
109
+ location = URI("https://dl.bintray.com/dapp/ruby2go/#{::Dapp::VERSION}/#{progname}")
110
+
111
+ tmp_bin_path = File.join(self.class.tmp_base_dir, "#{progname}-#{SecureRandom.uuid}")
112
+ ::Dapp::Downloader.download(location, tmp_bin_path, show_progress: true, progress_titile: bin_path)
113
+
114
+ checksum_location = URI("https://dl.bintray.com/dapp/ruby2go/#{::Dapp::VERSION}/#{progname}.sha")
115
+ tmp_bin_checksum_path = tmp_bin_path + ".checksum"
116
+ ::Dapp::Downloader.download(checksum_location, tmp_bin_checksum_path)
117
+
118
+ if Digest::SHA256.hexdigest(File.read(tmp_bin_path)) != File.read(tmp_bin_checksum_path).strip
119
+ raise ::Dapp::Error::Dapp, code: :ruby2go_download_failed_bad_checksum, data: {url: location.to_s, checksum_url: checksum_location.to_s, progname: progname}
120
+ end
121
+
122
+ File.chmod(0755, tmp_bin_path)
123
+ FileUtils.mkdir_p File.dirname(bin_path)
124
+ FileUtils.mv tmp_bin_path, bin_path
125
+ end # log_process
126
+ end # lock
127
+ end
128
+ end # Ruby2Go
129
+ end # Dapp
130
+ end # Dapp
@@ -0,0 +1,97 @@
1
+ module Dapp
2
+ class Dapp
3
+ module Sentry
4
+ def sentry_message(msg, **kwargs)
5
+ return if not ensure_sentry_configured
6
+ kwargs[:level] ||= "info"
7
+ Raven.capture_message(msg, _make_sentry_params(**kwargs))
8
+ end
9
+
10
+ def sentry_exception(exception, **kwargs)
11
+ return if not ensure_sentry_configured
12
+ (kwargs[:tags] ||= {})['error-code'] = begin
13
+ net_status = exception.net_status
14
+ [net_status[:context], net_status[:code]].compact.join('_')
15
+ end
16
+ Raven.capture_exception(exception, _make_sentry_params(**kwargs))
17
+ end
18
+
19
+ def ensure_sentry_configured
20
+ return false unless sentry_settings = settings["sentry"]
21
+
22
+ unless @sentry_settings_configured
23
+ Raven.configure do |config|
24
+ logger = ::Logger.new(STDOUT)
25
+ logger.level = ::Logger::WARN
26
+
27
+ config.logger = logger
28
+ config.dsn = sentry_settings["dsn"]
29
+ end
30
+
31
+ @sentry_settings_configured = true
32
+ end
33
+
34
+ return true
35
+ end
36
+
37
+ def _make_sentry_params(level: nil, tags: {}, extra: {}, user: {})
38
+ Marshal.load(Marshal.dump({
39
+ level: level,
40
+ tags: _sentry_tags_context.merge(tags),
41
+ extra: _sentry_extra_context.merge(extra),
42
+ user: _sentry_user_context.merge(user),
43
+ }))
44
+ end
45
+
46
+ def _sentry_extra_context
47
+ @_sentry_extra_context ||= {
48
+ "pwd" => Dir.pwd,
49
+ "dapp-dir" => self.work_dir,
50
+ "build-dir" => self.build_dir,
51
+ "options" => self.options,
52
+ "env-options" => {
53
+ "DAPP_FORCE_SAVE_CACHE" => ENV["DAPP_FORCE_SAVE_CACHE"],
54
+ "DAPP_BIN_DAPPFILE_YML" => ENV["DAPP_BIN_DAPPFILE_YML"],
55
+ "ANSIBLE_ARGS" => ENV["ANSIBLE_ARGS"],
56
+ "DAPP_CHEF_DEBUG" => ENV["DAPP_CHEF_DEBUG"],
57
+ },
58
+ }.tap {|extra|
59
+ extra["ci-env"] = {"CI" => ENV["CI"]}
60
+ ENV.select {|k, v| k.start_with?("CI_")}.each do |k, v|
61
+ extra["ci-env"][k] = v
62
+ end
63
+ }
64
+ end
65
+
66
+ def _sentry_tags_context
67
+ @_sentry_tags_context ||= {
68
+ "dapp-name" => self.name,
69
+ "dapp-short-version" => ::Dapp::VERSION.split(".")[0..1].join("."),
70
+ "dapp-version" => ::Dapp::VERSION,
71
+ "dapp-build-cache-version" => ::Dapp::BUILD_CACHE_VERSION,
72
+ "dapp-command" => self.options[:dapp_command],
73
+ }.tap {|tags|
74
+ # FIXME: precache this info after Dapp object initialization
75
+ #if git_own_repo_exist? && git_own_repo.remote_origin_url
76
+ #tags["git-host"] = self.get_host_from_git_url(git_own_repo.remote_origin_url)
77
+
78
+ #git_name = self.git_url_to_name(git_own_repo.remote_origin_url)
79
+
80
+ #tags["git-group"] = git_name.partition("/")[0]
81
+ #tags["git-name"] = git_name
82
+ #end
83
+
84
+ begin
85
+ ver = self.class.host_docker_minor_version
86
+ tags["docker-minor-version"] = ver.to_s
87
+ rescue ::Exception
88
+ end
89
+ }
90
+ end
91
+
92
+ def _sentry_user_context
93
+ @__sentry_user_context ||= {}
94
+ end
95
+ end # Sentry
96
+ end # Dapp
97
+ end # Dapp
@@ -19,7 +19,7 @@ module Dapp
19
19
  env = (env || {}).merge(param_env) if param_env
20
20
  kwargs[:env] = env if env
21
21
 
22
- do_shellout = -> { ::Mixlib::ShellOut.new(*args, timeout: 3600, **kwargs).run_command }
22
+ do_shellout = -> { ::Mixlib::ShellOut.new(*args, timeout: 86400, **kwargs).run_command }
23
23
  if defined? ::Bundler
24
24
  ::Bundler.with_clean_env { do_shellout.call }
25
25
  else
@@ -28,13 +28,16 @@ module Dapp
28
28
  end
29
29
 
30
30
  def shellout!(*args, **kwargs)
31
- shellout_with_logging(**kwargs) do |options|
32
- shellout(*args, **options).tap(&:error!)
31
+ if instance_of? Dapp
32
+ default_kwarg = proc { |key, value| kwargs[key] = value unless kwargs.key?(key) }
33
+ default_kwarg.call(:quiet, log_quiet?)
34
+ default_kwarg.call(:time, log_time?)
33
35
  end
36
+ _shellout_with_logging!(*args, **kwargs)
34
37
  end
35
38
 
36
39
  def shellout_pack(command)
37
- "eval $(echo #{Base64.strict_encode64(command)} | base64 --decode)"
40
+ "eval $(echo #{Base64.strict_encode64(command)} | #{base64_bin} --decode)"
38
41
  end
39
42
 
40
43
  class << self
@@ -47,24 +50,29 @@ module Dapp
47
50
  end
48
51
  end # << self
49
52
 
50
- protected
53
+ def shellout_cmd_should_succeed!(cmd)
54
+ return cmd.tap(&:error!)
55
+ rescue ::Mixlib::ShellOut::ShellCommandFailed => e
56
+ raise Error::Shellout, code: Helper::Trivia.class_to_lowercase(e.class), data: { stream: e.message }
57
+ end
51
58
 
52
- def shellout_with_logging(log_verbose: false, **kwargs)
53
- return yield(**kwargs) unless instance_of? Dapp
59
+ protected
54
60
 
55
- begin
56
- stream = Stream.new
57
- if log_verbose && log_verbose?
58
- kwargs[:live_stream] = Proxy::Base.new(stream, STDOUT, with_time: log_time?)
59
- else
60
- kwargs[:live_stdout] = Proxy::Base.new(stream, with_time: log_time?)
61
- end
62
- kwargs[:live_stderr] = Proxy::Error.new(stream, with_time: log_time?)
61
+ def _shellout_with_logging!(*args, verbose: false, quiet: true, time: false, raise_on_error: true, **kwargs)
62
+ stream = Stream.new
63
+ if verbose && !quiet
64
+ kwargs[:live_stream] = Proxy::Base.new(stream, STDOUT, with_time: time)
65
+ kwargs[:live_stderr] = Proxy::Error.new(stream, STDERR, with_time: time)
66
+ else
67
+ kwargs[:live_stdout] = Proxy::Base.new(stream, with_time: time)
68
+ kwargs[:live_stderr] = Proxy::Error.new(stream, with_time: time)
69
+ end
63
70
 
64
- yield(**kwargs)
65
- rescue ::Mixlib::ShellOut::ShellCommandFailed => e
66
- raise Error::Shellout, code: class_to_lowercase(e.class), data: { stream: stream.show }
71
+ shellout(*args, **kwargs).tap do |res|
72
+ res.error! if raise_on_error
67
73
  end
74
+ rescue ::Mixlib::ShellOut::ShellCommandFailed => e
75
+ raise Error::Shellout, code: Helper::Trivia.class_to_lowercase(e.class), data: { stream: stream.show }
68
76
  end
69
77
  end
70
78
  end
@@ -28,13 +28,13 @@ module Dapp
28
28
  end
29
29
 
30
30
  def format_string(str)
31
- str.lines.map { |l| "#{Dapp.log_time if @with_time}#{l.strip}\n" }.join
31
+ str.lines.map { |l| "#{Dapp.log_time if @with_time}#{l.chomp}\n" }.join
32
32
  end
33
33
  end
34
34
 
35
35
  class Error < Base
36
36
  def format_string(str)
37
- "#{Dapp.paint_string(super.strip, :warning)}\n"
37
+ "#{Dapp.paint_string(super.chomp, :warning)}\n"
38
38
  end
39
39
  end
40
40
  end
@@ -0,0 +1,12 @@
1
+ module Dapp
2
+ class Dapp
3
+ module Slug
4
+ def consistent_uniq_slugify(s)
5
+ ruby2go_slug({ options: { data: s } }).tap do |res|
6
+ raise Error::Build, code: :ruby2go_slug_failed_unexpected_error, data: { message: res["error"] } unless res["error"].nil?
7
+ break res['data']
8
+ end
9
+ end
10
+ end # Slug
11
+ end # Dapp
12
+ end # Dapp
@@ -46,10 +46,24 @@ module Dapp
46
46
  shellout! "ssh-add #{ssh_key_path}", env: { SSH_AUTH_SOCK: ssh_auth_sock(force_run_agent: true) }
47
47
  end
48
48
 
49
+ def ssh_agent_exist?
50
+ ENV['SSH_AUTH_SOCK'] && File.exist?(ENV['SSH_AUTH_SOCK'])
51
+ end
52
+
53
+ def default_ssh_keys
54
+ @default_ssh_keys ||= begin
55
+ %w(id_rsa id_dsa).map do |path|
56
+ File.join(ENV["HOME"], ".ssh", path)
57
+ end.select do |path|
58
+ File.exist? path
59
+ end
60
+ end
61
+ end
62
+
49
63
  def ssh_auth_sock(force_run_agent: false)
50
64
  @ssh_auth_sock ||= begin
51
65
  system_ssh_auth_sock = nil
52
- system_ssh_auth_sock = File.expand_path(ENV['SSH_AUTH_SOCK']) if ENV['SSH_AUTH_SOCK'] && File.exist?(ENV['SSH_AUTH_SOCK'])
66
+ system_ssh_auth_sock = File.expand_path(ENV['SSH_AUTH_SOCK']) if ssh_agent_exist?
53
67
 
54
68
  if force_run_agent
55
69
  run_ssh_agent.tap { |ssh_auth_sock| ENV['SSH_AUTH_SOCK'] = ssh_auth_sock }
@@ -60,13 +74,17 @@ module Dapp
60
74
  end
61
75
 
62
76
  def setup_ssh_agent
63
- return unless cli_options[:ssh_key]
64
-
65
- cli_options[:ssh_key].each do |ssh_key|
66
- raise Error::Dapp, code: :ssh_key_not_found, data: { path: ssh_key } unless File.exist? ssh_key
77
+ if options[:ssh_key]
78
+ options[:ssh_key].each do |ssh_key|
79
+ raise Error::Dapp, code: :ssh_key_not_found, data: { path: ssh_key } unless File.exist? ssh_key
67
80
 
68
- File.chmod 0o600, ssh_key
69
- add_ssh_key ssh_key
81
+ File.chmod 0o600, ssh_key
82
+ add_ssh_key ssh_key
83
+ end
84
+ elsif (not ssh_agent_exist?) and default_ssh_keys.any?
85
+ default_ssh_keys.each do |ssh_key|
86
+ add_ssh_key ssh_key
87
+ end
70
88
  end
71
89
  end
72
90
  end # SshAgent
data/lib/dapp/dapp.rb CHANGED
@@ -4,6 +4,15 @@ module Dapp
4
4
  include GitArtifact
5
5
  include Dappfile
6
6
  include Chef
7
+ include DappConfig
8
+ include OptionTags
9
+ include Slug
10
+
11
+ include Command::Common
12
+ include Command::Slug
13
+ include Command::Sample::Common
14
+ include Command::Sample::List
15
+ include Command::Sample::Create
7
16
 
8
17
  include Logging::Base
9
18
  include Logging::Process
@@ -11,78 +20,127 @@ module Dapp
11
20
  include Logging::Paint
12
21
 
13
22
  include SshAgent
23
+ include Sentry
24
+ include Ruby2Go
25
+
14
26
  include Helper::Sha256
27
+ extend Helper::Trivia
15
28
  include Helper::Trivia
29
+ include Helper::Tar
30
+ include Helper::Url
16
31
 
32
+ include Deps::Common
33
+ include Deps::Toolchain
17
34
  include Deps::Gitartifact
18
35
  include Deps::Base
19
36
 
20
37
  include Shellout::Base
21
38
 
22
- attr_reader :cli_options
23
- attr_reader :dimgs_patterns
39
+ GCR_REGISTRIES = %w(asia.gcr.io eu.gcr.io gcr.io marketplace.gcr.io staging-k8s.gcr.io us.gcr.io)
24
40
 
25
- def initialize(cli_options: {}, dimgs_patterns: nil)
26
- @cli_options = cli_options
27
- @dimgs_patterns = dimgs_patterns || []
28
- @dimgs_patterns << '*' unless @dimgs_patterns.any?
41
+ attr_reader :options
42
+
43
+ def get_ruby2go_state_hash
44
+ {
45
+ "Name" => name.to_s,
46
+ "WorkDir" => work_dir.to_s,
47
+ }
48
+ end
29
49
 
30
- Logging::Paint.initialize(cli_options[:log_color])
50
+ def initialize(options: {})
51
+ self.class.options.merge!(options)
31
52
  Logging::I18n.initialize
53
+ validate_config_options!
54
+ Logging::Paint.initialize(option_color)
55
+
56
+ @_call_before_terminate = []
57
+ @_call_after_before_terminate = []
58
+
59
+ ruby2go_init
60
+
61
+ setup_ssh_agent
62
+ try_host_docker_login unless !!options[:ignore_try_host_docker_login]
63
+ end
64
+
65
+ def options
66
+ self.class.options
67
+ end
68
+
69
+ def settings
70
+ @settings ||= begin
71
+ settings_path = File.join(self.class.home_dir, "settings.toml")
72
+
73
+ if File.exists? settings_path
74
+ TomlRB.load_file(settings_path)
75
+ else
76
+ {}
77
+ end
78
+ end
32
79
  end
33
80
 
34
81
  def name
35
82
  @name ||= begin
36
- if git_url
37
- repo_name = git_url.split('/').last
38
- repo_name = repo_name[/.*(?=\.git)/] if repo_name.end_with? '.git'
39
- repo_name
40
- elsif git_path
41
- File.basename(File.dirname(git_path))
42
- else
43
- File.basename(path)
83
+ n = begin
84
+ if (name = options[:name])
85
+ name
86
+ elsif git_own_repo_exist?
87
+ if git_url
88
+ repo_name = git_url.split('/').last
89
+ repo_name = repo_name[/.*(?=\.git)/] if repo_name.end_with? '.git'
90
+ repo_name
91
+ else
92
+ File.basename(File.dirname(git_own_repo.path)).to_s
93
+ end
94
+ else
95
+ path.basename.to_s
96
+ end
44
97
  end
98
+ consistent_uniq_slugify(n)
45
99
  end
46
100
  end
47
101
 
48
102
  def git_url
49
- return unless git_config
50
- (git_config['remote "origin"'] || {})['url']
103
+ return unless git_own_repo_exist?
104
+ git_own_repo.remote_origin_url
51
105
  end
52
106
 
53
- def git_config
54
- @git_config ||= begin
55
- IniFile.load(File.join(git_path, 'config')) if git_path
56
- end
107
+ def git_own_repo_exist?
108
+ !git_own_repo.nil?
57
109
  end
58
110
 
59
- def git_path
60
- defined?(@git_path) ? @git_path : begin
61
- @git_path = search_file_upward('.git')
62
- end
111
+ def git_own_repo
112
+ @git_own_repo ||= Dimg::GitRepo::Own.new(self)
113
+ rescue Dimg::Error::Rugged => e
114
+ raise unless e.net_status[:code] == :local_git_repository_does_not_exist
115
+ nil
116
+ end
117
+
118
+ def work_dir
119
+ File.expand_path(options[:dir] || Dir.pwd)
120
+ end
121
+
122
+ def path(*path)
123
+ @path ||= make_path(work_dir)
124
+ make_path(@path, *path)
63
125
  end
64
126
 
65
- def path
66
- @path ||= expand_path(dappfile_path)
127
+ def tmp_base_dir
128
+ self.class.tmp_base_dir
67
129
  end
68
130
 
69
- def build_path
70
- @build_path ||= begin
71
- if cli_options[:build_dir]
72
- Pathname.new(cli_options[:build_dir])
131
+ def build_dir
132
+ @build_dir ||= begin
133
+ if option_build_dir
134
+ Pathname.new(option_build_dir)
73
135
  else
74
- Pathname.new(path).join('.dapp_build')
136
+ dir = File.join(self.class.home_dir, "builds", self.name)
137
+ Pathname.new(dir)
75
138
  end.expand_path.tap(&:mkpath)
76
139
  end
77
140
  end
78
141
 
79
- def local_git_artifact_exclude_paths(&blk)
80
- super do |exclude_paths|
81
- build_path_relpath = Pathname.new(build_path).subpath_of(File.dirname(git_path))
82
- exclude_paths << build_path_relpath.to_s if build_path_relpath
83
-
84
- yield exclude_paths if block_given?
85
- end
142
+ def build_path(*path)
143
+ make_path(build_dir, *path)
86
144
  end
87
145
 
88
146
  def stage_cache
@@ -93,8 +151,101 @@ module Dapp
93
151
  name
94
152
  end
95
153
 
96
- def dev_mode?
97
- !!cli_options[:dev]
154
+ def terminate
155
+ @_call_before_terminate.each {|on_terminate| on_terminate.call(self)}
156
+ @_call_after_before_terminate.each {|on_terminate| on_terminate.call(self)}
157
+ FileUtils.rmtree(host_docker_tmp_config_dir)
158
+ end
159
+
160
+ def host_docker
161
+ self.class.host_docker
162
+ end
163
+
164
+ def host_docker_tmp_config_dir
165
+ self.class.host_docker_tmp_config_dir
166
+ end
167
+
168
+ def try_host_docker_login
169
+ return unless option_repo
170
+ validate_repo_name!(option_repo)
171
+ host_docker_login(option_repo)
172
+ end
173
+
174
+ def host_docker_login(repo)
175
+ return unless self.class.options_with_docker_credentials?
176
+
177
+ username, password = self.class.docker_credentials
178
+ ::Dapp::Dimg::Image::Stage.ruby2go_command(self, command: :login, options: { username: username, password: password, repository: repo })
179
+ end
180
+
181
+ class << self
182
+ def home_dir
183
+ ENV["DAPP_HOME"] || File.join(Dir.home, ".dapp")
184
+ end
185
+
186
+ def options
187
+ @options ||= {}
188
+ end
189
+
190
+ def host_docker
191
+ @host_docker ||= begin
192
+ min_docker_minor_version = Gem::Version.new('1.10')
193
+ unless host_docker_minor_version > min_docker_minor_version
194
+ raise Error::Dapp, code: :docker_version, data: { min_version: min_docker_minor_version.to_s,
195
+ version: host_docker_minor_version.to_s }
196
+ end
197
+
198
+ [].tap do |cmd|
199
+ cmd << host_docker_bin
200
+ cmd << "--config #{host_docker_config_dir}"
201
+ end.join(' ')
202
+ end
203
+ end
204
+
205
+ def host_docker_bin
206
+ raise Error::Dapp, code: :docker_not_found if (res = shellout('which docker')).exitstatus.nonzero?
207
+ res.stdout.strip
208
+ end
209
+
210
+ def host_docker_minor_version
211
+ Gem::Version.new(shellout!("#{host_docker_bin} --version").stdout.strip[/\d+\.\d+/])
212
+ end
213
+
214
+ def host_docker_config_dir
215
+ if options_with_docker_credentials? && !options[:repo].nil?
216
+ host_docker_tmp_config_dir
217
+ elsif ENV.key?('DAPP_DOCKER_CONFIG')
218
+ ENV['DAPP_DOCKER_CONFIG']
219
+ else
220
+ File.join(Dir.home, '.docker')
221
+ end
222
+ end
223
+
224
+ def options_with_docker_credentials?
225
+ !docker_credentials.nil?
226
+ end
227
+
228
+ def docker_credentials
229
+ if options[:registry_username] && options[:registry_password]
230
+ [options[:registry_username], options[:registry_password]]
231
+ elsif ENV.key?('DAPP_DOCKER_CONFIG')
232
+ elsif !gcr_registry? && !ENV.key?('DAPP_IGNORE_CI_DOCKER_AUTOLOGIN') && ENV.key?('CI_REGISTRY') && ENV.key?('CI_JOB_TOKEN')
233
+ ['gitlab-ci-token', ENV['CI_JOB_TOKEN']]
234
+ end
235
+ end
236
+
237
+ def gcr_registry?
238
+ return false if options[:repo].nil?
239
+ GCR_REGISTRIES.any? { |registry| options[:repo].to_s.start_with?(registry) }
240
+ end
241
+
242
+ def host_docker_tmp_config_dir
243
+ @host_docker_tmp_config_dir ||= Dir.mktmpdir('dapp-', tmp_base_dir)
244
+ end
245
+
246
+ def tmp_base_dir
247
+ File.expand_path(options[:tmp_dir_prefix] || '/tmp')
248
+ end
98
249
  end
99
250
  end # Dapp
100
251
  end # Dapp
@@ -0,0 +1 @@
1
+ module Dapp::Deployment; end