ufo 5.0.7 → 6.0.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 (457) hide show
  1. checksums.yaml +4 -4
  2. data/.cody/README.md +19 -0
  3. data/.cody/acceptance/bin/build.sh +90 -0
  4. data/.cody/acceptance/buildspec.yml +10 -0
  5. data/.cody/acceptance/project.rb +11 -0
  6. data/.cody/acceptance/role.rb +28 -0
  7. data/.cody/shared/script/install/ufo.sh +40 -0
  8. data/.cody/shared/script/install.sh +5 -0
  9. data/.github/workflows/main.yml +28 -0
  10. data/CHANGELOG.md +4 -1
  11. data/Gemfile +0 -2
  12. data/README.md +1 -32
  13. data/lib/templates/docker/Dockerfile +4 -0
  14. data/lib/templates/helper/%underscore_name%_helper.rb.tt +6 -0
  15. data/lib/templates/init/.ufo/config/web/base.rb +6 -0
  16. data/lib/templates/init/.ufo/config/web/dev.rb +6 -0
  17. data/lib/templates/init/.ufo/config/web/prod.rb +6 -0
  18. data/lib/templates/init/.ufo/config.rb.tt +39 -0
  19. data/lib/templates/init/.ufo/resources/iam_roles/execution_role.rb +23 -0
  20. data/lib/templates/init/.ufo/resources/iam_roles/task_role.rb +20 -0
  21. data/lib/templates/init/.ufo/resources/task_definitions/web.yml +29 -0
  22. data/lib/templates/init/.ufo/vars/base.rb +20 -0
  23. data/lib/templates/init/.ufo/vars/dev.rb +4 -0
  24. data/lib/templates/init/.ufo/vars/prod.rb +4 -0
  25. data/lib/ufo/aws_services.rb +118 -0
  26. data/lib/ufo/booter.rb +27 -0
  27. data/lib/ufo/cfn/base.rb +7 -0
  28. data/lib/ufo/cfn/deploy.rb +54 -0
  29. data/lib/ufo/{stack → cfn/stack}/builder/base.rb +12 -23
  30. data/lib/ufo/cfn/stack/builder/conditions.rb +25 -0
  31. data/lib/ufo/{stack → cfn/stack}/builder/outputs.rb +2 -2
  32. data/lib/ufo/cfn/stack/builder/parameters.rb +34 -0
  33. data/lib/ufo/cfn/stack/builder/resources/base.rb +4 -0
  34. data/lib/ufo/cfn/stack/builder/resources/dns.rb +47 -0
  35. data/lib/ufo/{stack/builder/resources/ecs.rb → cfn/stack/builder/resources/ecs_service.rb} +11 -10
  36. data/lib/ufo/cfn/stack/builder/resources/elb.rb +35 -0
  37. data/lib/ufo/cfn/stack/builder/resources/iam_roles/base.rb +32 -0
  38. data/lib/ufo/cfn/stack/builder/resources/iam_roles/execution_role.rb +4 -0
  39. data/lib/ufo/cfn/stack/builder/resources/iam_roles/task_role.rb +4 -0
  40. data/lib/ufo/cfn/stack/builder/resources/listener.rb +65 -0
  41. data/lib/ufo/cfn/stack/builder/resources/listener_ssl.rb +44 -0
  42. data/lib/ufo/cfn/stack/builder/resources/scaling/base.rb +5 -0
  43. data/lib/ufo/cfn/stack/builder/resources/scaling/policy.rb +27 -0
  44. data/lib/ufo/cfn/stack/builder/resources/scaling/role.rb +33 -0
  45. data/lib/ufo/cfn/stack/builder/resources/scaling/target.rb +22 -0
  46. data/lib/ufo/cfn/stack/builder/resources/security_group/base.rb +4 -0
  47. data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/ecs.rb +4 -4
  48. data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/ecs_rule.rb +2 -2
  49. data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/elb.rb +5 -6
  50. data/lib/ufo/{stack → cfn/stack}/builder/resources/target_group.rb +4 -4
  51. data/lib/ufo/{stack → cfn/stack}/builder/resources/task_definition/reconstructor.rb +4 -4
  52. data/lib/ufo/{stack → cfn/stack}/builder/resources/task_definition.rb +4 -4
  53. data/lib/ufo/cfn/stack/builder/resources.rb +24 -0
  54. data/lib/ufo/cfn/stack/builder.rb +30 -0
  55. data/lib/ufo/{stack → cfn/stack}/custom_properties.rb +21 -5
  56. data/lib/ufo/cfn/stack/params.rb +51 -0
  57. data/lib/ufo/{stack → cfn/stack}/status.rb +2 -2
  58. data/lib/ufo/cfn/stack/template.rb +8 -0
  59. data/lib/ufo/cfn/stack/vars.rb +110 -0
  60. data/lib/ufo/cfn/stack/vpc.rb +31 -0
  61. data/lib/ufo/cfn/stack.rb +175 -0
  62. data/lib/ufo/cli/base.rb +18 -0
  63. data/lib/ufo/cli/build.rb +30 -0
  64. data/lib/ufo/cli/cancel.rb +18 -0
  65. data/lib/ufo/cli/central/update.rb +80 -0
  66. data/lib/ufo/cli/central.rb +12 -0
  67. data/lib/ufo/cli/clean.rb +17 -0
  68. data/lib/ufo/cli/destroy.rb +31 -0
  69. data/lib/ufo/{docker.rb → cli/docker.rb} +18 -18
  70. data/lib/ufo/cli/exec.rb +82 -0
  71. data/lib/ufo/cli/help/central/update.md +20 -0
  72. data/lib/ufo/{help → cli/help}/completion.md +0 -0
  73. data/lib/ufo/{help → cli/help}/completion_script.md +0 -0
  74. data/lib/ufo/cli/help/destroy.md +9 -0
  75. data/lib/ufo/cli/help/docker/base.md +39 -0
  76. data/lib/ufo/{help → cli/help}/docker/build.md +9 -9
  77. data/lib/ufo/{help → cli/help}/docker/clean.md +8 -8
  78. data/lib/ufo/{help → cli/help}/docker/compile.md +0 -0
  79. data/lib/ufo/cli/help/docker/name.md +16 -0
  80. data/lib/ufo/{help → cli/help}/docker/push.md +0 -0
  81. data/lib/ufo/cli/help/docker.md +6 -0
  82. data/lib/ufo/{help → cli/help}/help.md +1 -1
  83. data/lib/ufo/cli/help/init.md +27 -0
  84. data/lib/ufo/{help → cli/help}/logs.md +5 -4
  85. data/lib/ufo/cli/help/ps.md +12 -0
  86. data/lib/ufo/cli/help/releases.md +15 -0
  87. data/lib/ufo/cli/help/rollback.md +40 -0
  88. data/lib/ufo/cli/help/scale.md +7 -0
  89. data/lib/ufo/cli/help/ship.md +41 -0
  90. data/lib/ufo/cli/help/stop.md +3 -0
  91. data/lib/ufo/cli/help.rb +62 -0
  92. data/lib/ufo/{logs.rb → cli/logs.rb} +13 -6
  93. data/lib/ufo/cli/new/concerns.rb +16 -0
  94. data/lib/ufo/cli/new/helper.rb +24 -0
  95. data/lib/ufo/cli/new/init.rb +68 -0
  96. data/lib/ufo/{sequence.rb → cli/new/sequence.rb} +26 -4
  97. data/lib/ufo/cli/new.rb +10 -0
  98. data/lib/ufo/cli/opts.rb +35 -0
  99. data/lib/ufo/{ps → cli/ps}/task.rb +22 -29
  100. data/lib/ufo/cli/ps.rb +190 -0
  101. data/lib/ufo/{releases.rb → cli/releases.rb} +4 -4
  102. data/lib/ufo/{rollback.rb → cli/rollback.rb} +24 -12
  103. data/lib/ufo/cli/scale.rb +76 -0
  104. data/lib/ufo/cli/ship.rb +28 -0
  105. data/lib/ufo/cli/status.rb +8 -0
  106. data/lib/ufo/cli/stop.rb +49 -0
  107. data/lib/ufo/{tasks.rb → cli/tasks.rb} +2 -2
  108. data/lib/ufo/{upgrade.rb → cli/upgrade.rb} +2 -2
  109. data/lib/ufo/cli.rb +82 -172
  110. data/lib/ufo/command.rb +56 -1
  111. data/lib/ufo/concerns/autoscaling.rb +11 -0
  112. data/lib/ufo/concerns/names.rb +9 -0
  113. data/lib/ufo/concerns.rb +26 -0
  114. data/lib/ufo/config/inits.rb +13 -0
  115. data/lib/ufo/config.rb +187 -0
  116. data/lib/ufo/core.rb +32 -44
  117. data/lib/ufo/docker/builder.rb +44 -40
  118. data/lib/ufo/docker/cleaner.rb +9 -12
  119. data/lib/ufo/docker/compiler.rb +10 -4
  120. data/lib/ufo/docker/concerns.rb +7 -0
  121. data/lib/ufo/docker/dockerfile.rb +13 -9
  122. data/lib/ufo/docker/pusher.rb +13 -25
  123. data/lib/ufo/docker/state.rb +63 -0
  124. data/lib/ufo/ecr/auth.rb +8 -7
  125. data/lib/ufo/ecr/cleaner.rb +10 -14
  126. data/lib/ufo/ext/core/module.rb +31 -0
  127. data/lib/ufo/ext/core/nil_class.rb +11 -0
  128. data/lib/ufo/ext.rb +2 -0
  129. data/lib/ufo/{role → iam_role}/builder.rb +1 -1
  130. data/lib/ufo/{role → iam_role}/dsl.rb +8 -2
  131. data/lib/ufo/{role → iam_role}/registry.rb +1 -1
  132. data/lib/ufo/info.rb +22 -4
  133. data/lib/ufo/layering/layer.rb +95 -0
  134. data/lib/ufo/layering.rb +23 -0
  135. data/lib/ufo/log_group.rb +18 -10
  136. data/lib/ufo/logger/formatter.rb +13 -0
  137. data/lib/ufo/logger.rb +32 -0
  138. data/lib/ufo/names.rb +69 -0
  139. data/lib/ufo/param.rb +2 -1
  140. data/lib/ufo/task_definition/builder.rb +7 -0
  141. data/lib/ufo/task_definition/context.rb +45 -0
  142. data/lib/ufo/task_definition/erb/base.rb +18 -0
  143. data/lib/ufo/task_definition/erb/json.rb +28 -0
  144. data/lib/ufo/task_definition/erb/yaml.rb +18 -0
  145. data/lib/ufo/task_definition/erb.rb +78 -0
  146. data/lib/ufo/task_definition/helpers/aws_data_helper.rb +18 -0
  147. data/lib/ufo/task_definition/helpers/core.rb +50 -0
  148. data/lib/ufo/task_definition/helpers/ssm/fetcher.rb +39 -0
  149. data/lib/ufo/task_definition/helpers/ssm.rb +8 -0
  150. data/lib/ufo/task_definition/helpers/stack_output.rb +23 -0
  151. data/lib/ufo/{dsl/helper → task_definition/helpers}/vars.rb +40 -19
  152. data/lib/ufo/task_definition/helpers/vpc.rb +48 -0
  153. data/lib/ufo/task_definition/helpers.rb +5 -0
  154. data/lib/ufo/task_definition.rb +19 -0
  155. data/lib/ufo/upgrade/upgrade3.rb +1 -1
  156. data/lib/ufo/upgrade/upgrade4.rb +3 -3
  157. data/lib/ufo/utils/execute.rb +30 -0
  158. data/lib/ufo/utils/logging.rb +7 -0
  159. data/lib/ufo/utils/pretty.rb +18 -0
  160. data/lib/ufo/utils/squeezer.rb +1 -1
  161. data/lib/ufo/utils/sure.rb +23 -0
  162. data/lib/ufo/version.rb +1 -1
  163. data/lib/ufo/yaml/loader.rb +48 -0
  164. data/lib/ufo/yaml/validator.rb +51 -0
  165. data/lib/ufo/yaml.rb +13 -0
  166. data/lib/ufo.rb +12 -2
  167. data/spec/spec_helper.rb +4 -26
  168. data/spec/{lib → ufo}/ecr_auth_spec.rb +0 -0
  169. data/spec/{lib → ufo}/ecr_cleaner_spec.rb +0 -2
  170. data/spec/{lib/role → ufo/iam_role}/builder_spec.rb +5 -5
  171. data/spec/{lib/role → ufo/iam_role}/dsl_spec.rb +3 -3
  172. data/spec/{lib → ufo}/logs_spec.rb +2 -2
  173. data/ufo.gemspec +9 -3
  174. metadata +244 -341
  175. data/.circleci/bin/commit_docs.sh +0 -26
  176. data/.circleci/config.yml +0 -78
  177. data/.gitmodules +0 -0
  178. data/docs/.gitignore +0 -5
  179. data/docs/CNAME +0 -1
  180. data/docs/Gemfile +0 -4
  181. data/docs/LICENSE +0 -21
  182. data/docs/README.md +0 -20
  183. data/docs/_config.yml +0 -75
  184. data/docs/_docs/aws-ecs-task-execution-role.md +0 -28
  185. data/docs/_docs/conventions.md +0 -47
  186. data/docs/_docs/extras/codebuild-iam-role.md +0 -46
  187. data/docs/_docs/extras/dockerfile-erb.md +0 -60
  188. data/docs/_docs/extras/ecs-network-mode.md +0 -37
  189. data/docs/_docs/extras/load-balancer.md +0 -83
  190. data/docs/_docs/extras/minimal-deploy-iam.md +0 -79
  191. data/docs/_docs/extras/notification-arns.md +0 -21
  192. data/docs/_docs/extras/redirection-support.md +0 -27
  193. data/docs/_docs/extras/route53-support.md +0 -27
  194. data/docs/_docs/extras/security-groups.md +0 -36
  195. data/docs/_docs/extras/ssl-support.md +0 -20
  196. data/docs/_docs/faq.md +0 -100
  197. data/docs/_docs/fargate.md +0 -5
  198. data/docs/_docs/helpers.md +0 -24
  199. data/docs/_docs/iam-roles.md +0 -112
  200. data/docs/_docs/install.md +0 -25
  201. data/docs/_docs/more/auto-completion.md +0 -24
  202. data/docs/_docs/more/automated-cleanup.md +0 -14
  203. data/docs/_docs/more/customize-cloudformation.md +0 -35
  204. data/docs/_docs/more/migrations.md +0 -25
  205. data/docs/_docs/more/run-in-pieces.md +0 -30
  206. data/docs/_docs/more/single-task.md +0 -25
  207. data/docs/_docs/more/stuck-cloudformation.md +0 -29
  208. data/docs/_docs/more/why-cloudformation.md +0 -21
  209. data/docs/_docs/next-steps.md +0 -16
  210. data/docs/_docs/quick-start-ec2.md +0 -86
  211. data/docs/_docs/secrets.md +0 -135
  212. data/docs/_docs/settings/aws_profile.md +0 -36
  213. data/docs/_docs/settings/cfn.md +0 -12
  214. data/docs/_docs/settings/cluster.md +0 -66
  215. data/docs/_docs/settings/manage-security-groups.md +0 -24
  216. data/docs/_docs/settings/network.md +0 -45
  217. data/docs/_docs/settings.md +0 -55
  218. data/docs/_docs/ssl_errors.md +0 -40
  219. data/docs/_docs/structure.md +0 -41
  220. data/docs/_docs/tutorial-ufo-docker-build.md +0 -61
  221. data/docs/_docs/tutorial-ufo-init.md +0 -86
  222. data/docs/_docs/tutorial-ufo-ship.md +0 -95
  223. data/docs/_docs/tutorial-ufo-ships.md +0 -38
  224. data/docs/_docs/tutorial-ufo-tasks-build.md +0 -177
  225. data/docs/_docs/tutorial.md +0 -14
  226. data/docs/_docs/ufo-current.md +0 -49
  227. data/docs/_docs/ufo-env-extra.md +0 -22
  228. data/docs/_docs/ufo-env.md +0 -46
  229. data/docs/_docs/ufo-logs.md +0 -49
  230. data/docs/_docs/ufo-task-params.md +0 -43
  231. data/docs/_docs/ufo-tasks-register.md +0 -21
  232. data/docs/_docs/upgrading/upgrade4.5.md +0 -52
  233. data/docs/_docs/upgrading/upgrade4.md +0 -48
  234. data/docs/_docs/upgrading/upgrade5.md +0 -19
  235. data/docs/_docs/upgrading.md +0 -13
  236. data/docs/_docs/variables.md +0 -55
  237. data/docs/_includes/about.html +0 -19
  238. data/docs/_includes/banner/foot.html +0 -2
  239. data/docs/_includes/banner/head.html +0 -5
  240. data/docs/_includes/cfn-customize.md +0 -53
  241. data/docs/_includes/commands.html +0 -80
  242. data/docs/_includes/contact.html +0 -17
  243. data/docs/_includes/contact_disqus.html +0 -16
  244. data/docs/_includes/contact_static.html +0 -17
  245. data/docs/_includes/content.html +0 -26
  246. data/docs/_includes/css/bootstrap.min.css +0 -7
  247. data/docs/_includes/css/main.css +0 -501
  248. data/docs/_includes/css/quotes.css +0 -102
  249. data/docs/_includes/css/syntax.css +0 -65
  250. data/docs/_includes/css/table.css +0 -53
  251. data/docs/_includes/css/timeline.css +0 -201
  252. data/docs/_includes/css/ufo.css +0 -218
  253. data/docs/_includes/edit-on-github.html +0 -11
  254. data/docs/_includes/example.html +0 -63
  255. data/docs/_includes/footer.html +0 -44
  256. data/docs/_includes/google_analytics.html +0 -10
  257. data/docs/_includes/head.html +0 -32
  258. data/docs/_includes/header.html +0 -15
  259. data/docs/_includes/js.html +0 -32
  260. data/docs/_includes/js_disqus.html +0 -21
  261. data/docs/_includes/modals.html +0 -40
  262. data/docs/_includes/nav.html +0 -27
  263. data/docs/_includes/prev_next.md +0 -19
  264. data/docs/_includes/quotes.html +0 -19
  265. data/docs/_includes/reference.md +0 -5
  266. data/docs/_includes/repo_push_access.md +0 -11
  267. data/docs/_includes/subnav.html +0 -78
  268. data/docs/_includes/summary.html +0 -22
  269. data/docs/_includes/ufo-ship-options.md +0 -12
  270. data/docs/_includes/uses.html +0 -19
  271. data/docs/_layouts/default.html +0 -13
  272. data/docs/_layouts/style.css +0 -6
  273. data/docs/_reference/ufo-apps.md +0 -37
  274. data/docs/_reference/ufo-cancel.md +0 -24
  275. data/docs/_reference/ufo-completion.md +0 -46
  276. data/docs/_reference/ufo-completion_script.md +0 -27
  277. data/docs/_reference/ufo-current.md +0 -93
  278. data/docs/_reference/ufo-deploy.md +0 -76
  279. data/docs/_reference/ufo-destroy.md +0 -36
  280. data/docs/_reference/ufo-docker-base.md +0 -71
  281. data/docs/_reference/ufo-docker-build.md +0 -91
  282. data/docs/_reference/ufo-docker-clean.md +0 -44
  283. data/docs/_reference/ufo-docker-compile.md +0 -19
  284. data/docs/_reference/ufo-docker-help.md +0 -15
  285. data/docs/_reference/ufo-docker-name.md +0 -37
  286. data/docs/_reference/ufo-docker-push.md +0 -49
  287. data/docs/_reference/ufo-docker.md +0 -38
  288. data/docs/_reference/ufo-init.md +0 -125
  289. data/docs/_reference/ufo-logs.md +0 -40
  290. data/docs/_reference/ufo-network-help.md +0 -15
  291. data/docs/_reference/ufo-network-init.md +0 -39
  292. data/docs/_reference/ufo-network.md +0 -26
  293. data/docs/_reference/ufo-ps.md +0 -56
  294. data/docs/_reference/ufo-releases.md +0 -40
  295. data/docs/_reference/ufo-resources.md +0 -44
  296. data/docs/_reference/ufo-rollback.md +0 -61
  297. data/docs/_reference/ufo-scale.md +0 -50
  298. data/docs/_reference/ufo-ship.md +0 -129
  299. data/docs/_reference/ufo-ships.md +0 -68
  300. data/docs/_reference/ufo-status.md +0 -23
  301. data/docs/_reference/ufo-stop.md +0 -31
  302. data/docs/_reference/ufo-task.md +0 -56
  303. data/docs/_reference/ufo-tasks-build.md +0 -178
  304. data/docs/_reference/ufo-tasks-help.md +0 -15
  305. data/docs/_reference/ufo-tasks-register.md +0 -29
  306. data/docs/_reference/ufo-tasks.md +0 -35
  307. data/docs/_reference/ufo-upgrade-help.md +0 -15
  308. data/docs/_reference/ufo-upgrade-v2to3.md +0 -15
  309. data/docs/_reference/ufo-upgrade-v33to34.md +0 -15
  310. data/docs/_reference/ufo-upgrade-v3to4.md +0 -27
  311. data/docs/_reference/ufo-upgrade-v43to45.md +0 -15
  312. data/docs/_reference/ufo-upgrade.md +0 -29
  313. data/docs/_reference/ufo-version.md +0 -23
  314. data/docs/articles.md +0 -14
  315. data/docs/bin/web +0 -4
  316. data/docs/css/font-awesome/css/font-awesome.css +0 -1566
  317. data/docs/css/font-awesome/css/font-awesome.min.css +0 -4
  318. data/docs/css/font-awesome/fonts/FontAwesome.otf +0 -0
  319. data/docs/css/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  320. data/docs/css/font-awesome/fonts/fontawesome-webfont.svg +0 -504
  321. data/docs/css/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  322. data/docs/css/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  323. data/docs/docs.md +0 -29
  324. data/docs/img/docs/cloudformation-resources.png +0 -0
  325. data/docs/img/logos/boltops-logo-full.png +0 -0
  326. data/docs/img/logos/boltops-logo.png +0 -0
  327. data/docs/img/logos/ufo-logo-2.png +0 -0
  328. data/docs/img/logos/ufo-logo.png +0 -0
  329. data/docs/img/logos/ufo-site-header.png +0 -0
  330. data/docs/img/logos/ufo.jpg +0 -0
  331. data/docs/img/tutorials/ecs-console-task-definitions.png +0 -0
  332. data/docs/img/tutorials/ecs-console-ufo-ship.png +0 -0
  333. data/docs/img/tutorials/ecs-console-ufo-ships.png +0 -0
  334. data/docs/index.html +0 -10
  335. data/docs/js/bootstrap.js +0 -2114
  336. data/docs/js/bootstrap.min.js +0 -6
  337. data/docs/js/cbpAnimatedHeader.js +0 -44
  338. data/docs/js/cbpAnimatedHeader.min.js +0 -11
  339. data/docs/js/classie.js +0 -80
  340. data/docs/js/contact_me.js +0 -70
  341. data/docs/js/contact_me_static.js +0 -23
  342. data/docs/js/freelancer.js +0 -37
  343. data/docs/js/jqBootstrapValidation.js +0 -912
  344. data/docs/js/jquery-1.11.0.js +0 -4
  345. data/docs/js/jquery.easing.min.js +0 -44
  346. data/docs/js/nav.js +0 -53
  347. data/docs/quick-start.md +0 -133
  348. data/docs/reference.md +0 -29
  349. data/docs/style.css +0 -3
  350. data/docs/utils/ssl-doctor.rb +0 -89
  351. data/docs/utils/test-aws-api-access.rb +0 -11
  352. data/docs/utils/update-cert-chains.sh +0 -11
  353. data/lib/template/.env +0 -3
  354. data/lib/template/.secrets +0 -5
  355. data/lib/template/.ufo/iam_roles/execution_role.rb +0 -7
  356. data/lib/template/.ufo/iam_roles/task_role.rb +0 -21
  357. data/lib/template/.ufo/params.yml.tt +0 -27
  358. data/lib/template/.ufo/settings/cfn/default.yml.tt +0 -72
  359. data/lib/template/.ufo/settings/network/default.yml.tt +0 -26
  360. data/lib/template/.ufo/settings.yml.tt +0 -26
  361. data/lib/template/.ufo/task_definitions.rb.tt +0 -61
  362. data/lib/template/.ufo/templates/fargate.json.erb +0 -39
  363. data/lib/template/.ufo/templates/main.json.erb +0 -43
  364. data/lib/template/.ufo/variables/base.rb.tt +0 -19
  365. data/lib/template/.ufo/variables/development.rb +0 -8
  366. data/lib/template/.ufo/variables/production.rb +0 -7
  367. data/lib/template/Dockerfile +0 -15
  368. data/lib/template/bin/deploy.tt +0 -7
  369. data/lib/ufo/apps/cfn_map.rb +0 -70
  370. data/lib/ufo/apps/cluster.rb +0 -24
  371. data/lib/ufo/apps/service.rb +0 -56
  372. data/lib/ufo/apps.rb +0 -56
  373. data/lib/ufo/aws_service.rb +0 -36
  374. data/lib/ufo/base.rb +0 -35
  375. data/lib/ufo/cancel.rb +0 -23
  376. data/lib/ufo/current.rb +0 -104
  377. data/lib/ufo/default/settings.yml +0 -24
  378. data/lib/ufo/default/templates/main.json.erb +0 -39
  379. data/lib/ufo/destroy.rb +0 -41
  380. data/lib/ufo/docker/variables.rb +0 -26
  381. data/lib/ufo/dsl/helper.rb +0 -79
  382. data/lib/ufo/dsl/outputter.rb +0 -43
  383. data/lib/ufo/dsl/task_definition.rb +0 -108
  384. data/lib/ufo/dsl.rb +0 -96
  385. data/lib/ufo/help/apps.md +0 -12
  386. data/lib/ufo/help/balancer.md +0 -3
  387. data/lib/ufo/help/completions.md +0 -16
  388. data/lib/ufo/help/completions_script.md +0 -1
  389. data/lib/ufo/help/current.md +0 -65
  390. data/lib/ufo/help/deploy.md +0 -38
  391. data/lib/ufo/help/destroy.md +0 -9
  392. data/lib/ufo/help/docker/base.md +0 -49
  393. data/lib/ufo/help/docker/name.md +0 -16
  394. data/lib/ufo/help/docker.md +0 -6
  395. data/lib/ufo/help/init.md +0 -91
  396. data/lib/ufo/help/network/init.md +0 -13
  397. data/lib/ufo/help/ps.md +0 -27
  398. data/lib/ufo/help/releases.md +0 -16
  399. data/lib/ufo/help/resources.md +0 -20
  400. data/lib/ufo/help/rollback.md +0 -35
  401. data/lib/ufo/help/scale.md +0 -26
  402. data/lib/ufo/help/ship.md +0 -95
  403. data/lib/ufo/help/ships.md +0 -35
  404. data/lib/ufo/help/stop.md +0 -7
  405. data/lib/ufo/help/task.md +0 -27
  406. data/lib/ufo/help/tasks/build.md +0 -158
  407. data/lib/ufo/help/tasks/register.md +0 -14
  408. data/lib/ufo/help/tasks.md +0 -7
  409. data/lib/ufo/help/upgrade/v3to4.md +0 -3
  410. data/lib/ufo/help.rb +0 -9
  411. data/lib/ufo/init.rb +0 -119
  412. data/lib/ufo/network/fetch.rb +0 -48
  413. data/lib/ufo/network/helper.rb +0 -23
  414. data/lib/ufo/network/init.rb +0 -26
  415. data/lib/ufo/network.rb +0 -21
  416. data/lib/ufo/ps.rb +0 -129
  417. data/lib/ufo/scale.rb +0 -28
  418. data/lib/ufo/setting/profile.rb +0 -44
  419. data/lib/ufo/setting/security_groups.rb +0 -22
  420. data/lib/ufo/setting.rb +0 -75
  421. data/lib/ufo/settings.rb +0 -20
  422. data/lib/ufo/ship.rb +0 -103
  423. data/lib/ufo/stack/builder/conditions.rb +0 -23
  424. data/lib/ufo/stack/builder/parameters.rb +0 -45
  425. data/lib/ufo/stack/builder/resources/base.rb +0 -4
  426. data/lib/ufo/stack/builder/resources/dns.rb +0 -17
  427. data/lib/ufo/stack/builder/resources/elb.rb +0 -45
  428. data/lib/ufo/stack/builder/resources/listener.rb +0 -42
  429. data/lib/ufo/stack/builder/resources/listener_ssl.rb +0 -16
  430. data/lib/ufo/stack/builder/resources/roles/base.rb +0 -22
  431. data/lib/ufo/stack/builder/resources/roles/execution_role.rb +0 -4
  432. data/lib/ufo/stack/builder/resources/roles/task_role.rb +0 -4
  433. data/lib/ufo/stack/builder/resources/security_group/base.rb +0 -4
  434. data/lib/ufo/stack/builder/resources.rb +0 -20
  435. data/lib/ufo/stack/builder.rb +0 -26
  436. data/lib/ufo/stack/context.rb +0 -253
  437. data/lib/ufo/stack/helper.rb +0 -55
  438. data/lib/ufo/stack/template_body.rb +0 -13
  439. data/lib/ufo/stack.rb +0 -213
  440. data/lib/ufo/status.rb +0 -56
  441. data/lib/ufo/stop.rb +0 -49
  442. data/lib/ufo/task.rb +0 -225
  443. data/lib/ufo/tasks/builder.rb +0 -40
  444. data/lib/ufo/tasks/register.rb +0 -90
  445. data/lib/ufo/template_scope.rb +0 -57
  446. data/lib/ufo/util.rb +0 -69
  447. data/spec/lib/apps_spec.rb +0 -20
  448. data/spec/lib/builder_spec.rb +0 -23
  449. data/spec/lib/cli_spec.rb +0 -73
  450. data/spec/lib/completion_spec.rb +0 -18
  451. data/spec/lib/ps_spec.rb +0 -14
  452. data/spec/lib/register_spec.rb +0 -49
  453. data/spec/lib/setting_spec.rb +0 -18
  454. data/spec/lib/ship_spec.rb +0 -46
  455. data/spec/lib/stack/status_spec.rb +0 -76
  456. data/spec/lib/stop_spec.rb +0 -13
  457. data/spec/lib/task_spec.rb +0 -54
data/lib/ufo/config.rb ADDED
@@ -0,0 +1,187 @@
1
+ require "singleton"
2
+
3
+ module Ufo
4
+ class Config
5
+ extend Memoist
6
+ include DslEvaluator
7
+ include Singleton
8
+ include Ufo::Utils::Logging
9
+
10
+ include Ufo::TaskDefinition::Helpers
11
+
12
+ attr_reader :config
13
+ def initialize
14
+ @config = defaults
15
+ end
16
+
17
+ def defaults
18
+ config = ActiveSupport::OrderedOptions.new
19
+
20
+ config.app = nil # required unless UFO_APP is set
21
+
22
+ config.autoscaling = ActiveSupport::OrderedOptions.new
23
+ config.autoscaling.enabled = true
24
+ config.autoscaling.max_capacity = 5 # dont use max thats an OrderedOptions method
25
+ config.autoscaling.min_capacity = 1 # dont use min thats an OrderedOptions method
26
+ config.autoscaling.predefined_metric_type = "ECSServiceAverageCPUUtilization"
27
+ config.autoscaling.scale_in_cooldown = nil
28
+ config.autoscaling.scale_out_cooldown = nil
29
+ config.autoscaling.target_value = 75.0
30
+
31
+ config.cfn = ActiveSupport::OrderedOptions.new
32
+ config.cfn.disable_rollback = nil
33
+ config.cfn.notification_arns = nil
34
+ config.cfn.tags = nil # should be Ruby Hash
35
+
36
+ config.dns = ActiveSupport::OrderedOptions.new
37
+ config.dns.comment = "cname to load balancer created by ufo"
38
+ config.dns.domain = nil # only recommended option to set
39
+ config.dns.hosted_zone_id = nil
40
+ config.dns.hosted_zone_name = nil
41
+ config.dns.name = nil
42
+ config.dns.ttl = 60
43
+ config.dns.type = "CNAME"
44
+
45
+ config.docker = ActiveSupport::OrderedOptions.new
46
+ config.docker.clean_keep = nil
47
+ config.docker.ecr_keep = nil
48
+ config.docker.repo = nil # required IE: org/repo basename of the Docker image
49
+
50
+ config.ecs = ActiveSupport::OrderedOptions.new
51
+ config.ecs.cluster = ":ENV" # => dev
52
+ config.ecs.desired_count = nil # only respected when config.autoscaling.enabled = false
53
+ config.ecs.scheduling_strategy = "REPLICA"
54
+
55
+ config.elb = ActiveSupport::OrderedOptions.new
56
+ config.elb.subnet_mappings = nil # static IP addresses for network load balancer
57
+ config.elb.enabled = "auto" # "auto", true or false
58
+ config.elb.port = 80 # default listener port
59
+ config.elb.ssl = ActiveSupport::OrderedOptions.new
60
+ config.elb.ssl.certificates = nil
61
+ config.elb.ssl.enabled = false
62
+ config.elb.ssl.port = 443
63
+ config.elb.type = "application"
64
+ config.elb.default_actions = nil # full override
65
+ config.elb.redirect = ActiveSupport::OrderedOptions.new
66
+ config.elb.redirect.code = 302 # IE: 302 or 301
67
+ config.elb.redirect.enabled = false
68
+ config.elb.redirect.port = 443
69
+ config.elb.redirect.protocol = "HTTPS"
70
+
71
+ config.exec = ActiveSupport::OrderedOptions.new
72
+ config.exec.command = "/bin/bash" # aws ecs execute-command cli
73
+ config.exec.enabled = true # EcsService EnableExecuteCommand
74
+
75
+ config.log = ActiveSupport::OrderedOptions.new
76
+ config.log.root = Ufo.log_root
77
+ config.logger = ufo_logger
78
+ config.logger.formatter = Logger::Formatter.new
79
+ config.logger.level = ENV['UFO_LOG_LEVEL'] || :info
80
+
81
+ config.logs = ActiveSupport::OrderedOptions.new
82
+ config.logs.filter_pattern = nil
83
+
84
+ config.names = ActiveSupport::OrderedOptions.new
85
+ config.names.stack = ":APP-:ROLE-:ENV" # => demo-web-dev
86
+ config.names.task_definition = ":APP-:ROLE-:ENV" # => demo-web-dev
87
+
88
+ config.ps = ActiveSupport::OrderedOptions.new
89
+ config.ps.format = "auto" # CliFormat.default_format
90
+ config.ps.hide_age = 5 # in minutes. IE: hide tasks that are older than 5 minutes
91
+ config.ps.summary = true
92
+
93
+ config.secrets = ActiveSupport::OrderedOptions.new
94
+ config.secrets.pattern = ActiveSupport::OrderedOptions.new
95
+ config.secrets.pattern.secretsmanager = ":APP-:ENV-:SECRET_NAME" # => demo-dev-DB_PASS
96
+ config.secrets.pattern.ssm = ":APP/:ENV/:SECRET_NAME" # => demo/dev/DB_PASS
97
+ config.secrets.provider = "ssm" # default provider for conventional expansion IE: ssm or secretsmanager
98
+
99
+ config.scale = ActiveSupport::OrderedOptions.new
100
+ config.scale.warning = true
101
+
102
+ config.ship = ActiveSupport::OrderedOptions.new
103
+ config.ship.docker = ActiveSupport::OrderedOptions.new
104
+ config.ship.docker.quiet = true # only affects ufo ship docker commands output
105
+
106
+ config.state = ActiveSupport::OrderedOptions.new
107
+ config.state.reminder = true
108
+
109
+ # When not set, the default vpc is used
110
+ config.vpc = ActiveSupport::OrderedOptions.new
111
+ config.vpc.id = nil
112
+ config.vpc.security_groups = ActiveSupport::OrderedOptions.new
113
+ config.vpc.security_groups.ecs = nil
114
+ config.vpc.security_groups.elb = nil
115
+ config.vpc.security_groups.managed = true
116
+ config.vpc.subnets = ActiveSupport::OrderedOptions.new
117
+ config.vpc.subnets.ecs = nil
118
+ config.vpc.subnets.elb = nil
119
+
120
+ config
121
+ end
122
+
123
+ def ufo_logger
124
+ Logger.new(ENV['UFO_LOG_PATH'] || $stderr)
125
+ end
126
+ memoize :ufo_logger
127
+
128
+ def configure
129
+ yield(@config)
130
+ end
131
+
132
+ # load_project_config gets called so early many things like logger is not available.
133
+ # Take care not to rely on things that rely on the the config or else will create
134
+ # and infinite loop.
135
+ def load_project_config
136
+ root = layer_levels(".ufo/config")
137
+ env = layer_levels(".ufo/config/env")
138
+ role = layer_levels(".ufo/config/#{Ufo.role}")
139
+ layers = root + env + role
140
+ # Dont use Ufo.app or that'll cause infinite loop since it loads Ufo.config
141
+ if ENV['UFO_APP']
142
+ root = layer_levels(".ufo/config/#{Ufo.app}")
143
+ env = layer_levels(".ufo/config/#{Ufo.app}/env")
144
+ role = layer_levels(".ufo/config/#{Ufo.app}/#{Ufo.role}")
145
+ layers += root + env + role
146
+ end
147
+ # load_project_config gets called so early that logger is not yet configured. use puts
148
+ puts "Config layers:" if ENV['UFO_SHOW_ALL_LAYERS']
149
+ layers.each do |layer|
150
+ path = "#{Ufo.root}/#{layer}"
151
+ puts " #{layer}" if ENV['UFO_SHOW_ALL_LAYERS']
152
+ evaluate_file(path)
153
+ end
154
+ end
155
+
156
+ # Works similiar to Layering::Layer. Consider combining the logic and usin Layering::Layer
157
+ #
158
+ # Examples:
159
+ #
160
+ # prefix: .ufo/config/#{Ufo.app}/env
161
+ #
162
+ # Returns
163
+ #
164
+ # .ufo/config/#{Ufo.app}/env.rb
165
+ # .ufo/config/#{Ufo.app}/env/base.rb
166
+ # .ufo/config/#{Ufo.app}/env/#{Ufo.env}.rb
167
+ #
168
+ def layer_levels(prefix=nil)
169
+ levels = ["", "base", Ufo.env]
170
+ paths = levels.map do |i|
171
+ # base layer has prefix of '', reject with blank so it doesnt produce '//'
172
+ [prefix, i].join('/')
173
+ end
174
+ add_ext!(paths)
175
+ end
176
+
177
+ def add_ext!(paths)
178
+ ext = "rb"
179
+ paths.map! do |path|
180
+ path = path.sub(/\/$/,'') if path.ends_with?('/')
181
+ "#{path}.rb"
182
+ end
183
+ paths
184
+ end
185
+
186
+ end
187
+ end
data/lib/ufo/core.rb CHANGED
@@ -4,65 +4,53 @@ require 'yaml'
4
4
  module Ufo
5
5
  module Core
6
6
  extend Memoist
7
- include Ufo::Settings
8
7
 
9
- def check_task_definition!(task_definition)
10
- task_definition_path = "#{Ufo.root}/.ufo/output/#{task_definition}.json"
11
- unless File.exist?(task_definition_path)
12
- puts "ERROR: Unable to find the task definition at #{task_definition_path}.".color(:red)
13
- puts "Are you sure you have defined it in .ufo/task_definitions.rb and it has been generated correctly in .ufo/output?".color(:red)
14
- puts "If you are calling `ufo deploy` directly, you might want to generate the task definition first with `ufo tasks build`."
15
- exit 1
16
- end
8
+ def role
9
+ ENV['UFO_ROLE'] || 'web'
17
10
  end
18
11
 
19
- def root
20
- path = ENV['UFO_ROOT'] || '.'
21
- Pathname.new(path)
12
+ def app
13
+ ENV['UFO_APP'] || config.app
22
14
  end
23
15
 
16
+ # v5: development is default
17
+ # v6: dev is default
24
18
  def env
25
- # 2-way binding
26
- ufo_env = env_from_profile || 'development'
27
- ufo_env = ENV['UFO_ENV'] if ENV['UFO_ENV'] # highest precedence
28
- ufo_env
19
+ ENV['UFO_ENV'] || 'dev'
29
20
  end
30
21
  memoize :env
31
22
 
32
- def env_extra
33
- env_extra = Current.env_extra
34
- env_extra = ENV['UFO_ENV_EXTRA'] if ENV['UFO_ENV_EXTRA'] # highest precedence
35
- return if env_extra&.empty?
36
- env_extra
23
+ def extra
24
+ extra = ENV['UFO_EXTRA'] if ENV['UFO_EXTRA'] # highest precedence
25
+ return if extra&.empty?
26
+ extra
27
+ end
28
+ memoize :extra
29
+
30
+ def root
31
+ path = ENV['UFO_ROOT'] || '.'
32
+ Pathname.new(path)
33
+ end
34
+
35
+ def log_root
36
+ "#{root}/log"
37
37
  end
38
- memoize :env_extra
39
38
 
40
- # Overrides AWS_PROFILE based on the Ufo.env if set in .ufo/settings.yml
41
- # 2-way binding.
42
- def set_aws_profile!
43
- return if ENV['TEST']
44
- return unless File.exist?("#{Ufo.root}/.ufo/settings.yml") # for rake docs
45
- return unless settings # Only load if within Ufo project and there's a settings.yml
46
- data = settings || {}
47
- if data[:aws_profile]
48
- puts "Using AWS_PROFILE=#{data[:aws_profile]} from UFO_ENV=#{Ufo.env} in config/settings.yml"
49
- ENV['AWS_PROFILE'] = data[:aws_profile]
50
- end
39
+ def configure(&block)
40
+ Config.instance.configure(&block)
51
41
  end
52
42
 
53
- def check_ufo_project!
54
- check_path = "#{Ufo.root}/.ufo/settings.yml"
55
- unless File.exist?(check_path)
56
- puts "ERROR: No settings file at #{check_path}. Are you sure you are in a project with ufo setup?".color(:red)
57
- puts "Current directory: #{Dir.pwd}"
58
- puts "If you want to set up ufo for this prjoect, please create a settings file via: ufo init"
59
- exit 1 unless ENV['TEST']
60
- end
43
+ # Generally, use the Lono.config instead of Config.instance.config since it guarantees the load_project_config call
44
+ def config
45
+ Config.instance.load_project_config
46
+ Config.instance.config
61
47
  end
48
+ memoize :config
62
49
 
63
- private
64
- def env_from_profile
65
- Ufo::Setting.new.ufo_env
50
+ # allow different logger when running up all or rspec-lono
51
+ cattr_writer :logger
52
+ def logger
53
+ @@logger ||= config.logger
66
54
  end
67
55
  end
68
56
  end
@@ -1,12 +1,11 @@
1
- require 'active_support/core_ext/module/delegation'
2
-
3
- class Ufo::Docker
1
+ module Ufo::Docker
4
2
  class Builder
5
- include Ufo::Util
3
+ extend Memoist
4
+ include Concerns
6
5
 
7
6
  delegate :push, to: :pusher
8
- def self.build(options)
9
- builder = Builder.new(options) # outside if because it need builder.full_image_name
7
+ def self.build(options={})
8
+ builder = Builder.new(options) # outside if because it need builder.docker_image
10
9
  builder.build
11
10
  pusher = Pusher.new(nil, options)
12
11
  pusher.push
@@ -21,28 +20,27 @@ class Ufo::Docker
21
20
 
22
21
  def build
23
22
  start_time = Time.now
24
- store_full_image_name
23
+ store_docker_image
25
24
 
26
- command = "docker build #{build_options}-t #{full_image_name} -f #{@dockerfile} ."
27
- say "Building docker image with:".color(:green)
28
- say " #{command}".color(:green)
25
+ logger.info "Building Docker Image"
29
26
  compile_dockerfile_erb
30
27
  check_dockerfile_exists
31
28
  update_auth_token
32
- command = "cd #{Ufo.root} && #{command}"
33
- success = execute(command, use_system: true)
29
+ command = "docker build #{build_options}-t #{docker_image} -f #{@dockerfile} ."
30
+ log = ".ufo/log/docker.log" if @options[:quiet]
31
+ success = execute(command, log: log)
34
32
  unless success
35
33
  docker_version_success = system("docker version > /dev/null 2>&1")
36
34
  unless docker_version_success
37
35
  docker_version_message = " Are you sure the docker daemon is available? Try running: docker version."
38
36
  end
39
- puts "ERROR: The docker image fail to build.#{docker_version_message}".color(:red)
37
+ logger.info "ERROR: Fail to build Docker image.#{docker_version_message}".color(:red)
40
38
  exit 1
41
39
  end
42
40
 
43
41
  took = Time.now - start_time
44
- say "Docker image #{full_image_name} built. "
45
- say "Docker build took #{pretty_time(took)}.".color(:green)
42
+ logger.info "Docker Image built: #{docker_image}"
43
+ logger.info "Took #{pretty_time(took)}"
46
44
  end
47
45
 
48
46
  def build_options
@@ -78,7 +76,7 @@ class Ufo::Docker
78
76
  end
79
77
 
80
78
  def pusher
81
- @pusher ||= Pusher.new(full_image_name, @options)
79
+ @pusher ||= Pusher.new(docker_image, @options)
82
80
  end
83
81
 
84
82
  def compile_dockerfile_erb
@@ -91,32 +89,38 @@ class Ufo::Docker
91
89
  if File.exist?(erb_path)
92
90
  compile_dockerfile_erb
93
91
  else
94
- puts "File #{erb_path.color(:green)} does not exist. Cannot compile it if it doesnt exist"
92
+ logger.info "File #{erb_path.color(:green)} does not exist. Cannot compile it if it doesnt exist"
95
93
  end
96
94
  end
97
95
 
98
96
  def check_dockerfile_exists
99
97
  unless File.exist?("#{Ufo.root}/#{@dockerfile}")
100
- puts "#{@dockerfile} does not exist. Are you sure it exists?"
98
+ logger.info "#{@dockerfile} does not exist. Are you sure it exists?"
101
99
  exit 1
102
100
  end
103
101
  end
104
102
 
105
103
  # full_image - does not include the tag
106
104
  def image_name
107
- settings[:image]
105
+ Ufo.config.docker.repo
108
106
  end
109
107
 
110
108
  # full_image - Includes the tag. Examples:
111
109
  # 123456789.dkr.ecr.us-west-2.amazonaws.com/myapp:ufo-2018-04-20T09-29-08-b7d51df
112
- # tongueroo/demo-ufo:ufo-2018-04-20T09-29-08-b7d51df
113
- def full_image_name
110
+ # org/repo:ufo-2018-04-20T09-29-08-b7d51df
111
+ def docker_image
114
112
  return generate_name if @options[:generate]
115
- return "tongueroo/demo-ufo:ufo-12345678" if ENV['TEST']
116
113
 
117
114
  unless File.exist?(docker_name_path)
118
- puts "Unable to find #{docker_name_path} which contains the last docker image name that was used as a part of `ufo docker build`. Please run `ufo docker build` first."
119
- exit 1
115
+ logger.info <<~EOL.color(:yellow)
116
+ WARN: Unable to find: #{pretty_path(docker_name_path)}
117
+ This contains the Docker image name that the build process uses.
118
+ Please first run:
119
+
120
+ ufo docker build
121
+
122
+ EOL
123
+ return "docker image not yet built"
120
124
  end
121
125
  IO.read(docker_name_path).strip
122
126
  end
@@ -125,44 +129,44 @@ class Ufo::Docker
125
129
  # and we want the image name to stay the same when the commands are run separate
126
130
  # in different processes. So we store the state in a file.
127
131
  # Only when a new docker build command gets run will the image name state be updated.
128
- def store_full_image_name
132
+ def store_docker_image
129
133
  dirname = File.dirname(docker_name_path)
130
134
  FileUtils.mkdir_p(dirname) unless File.exist?(dirname)
131
- full_image_name = generate_name
132
- IO.write(docker_name_path, full_image_name)
135
+ docker_image = generate_name
136
+ IO.write(docker_name_path, docker_image)
133
137
  end
134
138
 
135
139
  def generate_name
136
- "#{image_name}:#{@image_namespace}-#{timestamp}-#{git_sha}"
140
+ ["#{image_name}:#{@image_namespace}-#{timestamp}", git_sha].compact.join('-') # compact in case git_sha is unavailable
137
141
  end
138
142
 
139
143
  def docker_name_path
140
144
  # output gets entirely wiped by tasks builder so dotn use that folder
141
- "#{Ufo.root}/.ufo/data/docker_image_name_#{@image_namespace}.txt"
145
+ "#{Ufo.root}/.ufo/tmp/state/docker_image_name_#{@image_namespace}.txt"
142
146
  end
143
147
 
144
148
  def timestamp
145
- @timestamp ||= Time.now.strftime('%Y-%m-%dT%H-%M-%S')
149
+ Time.now.strftime('%Y-%m-%dT%H-%M-%S')
146
150
  end
151
+ memoize :timestamp
147
152
 
148
153
  def git_sha
149
- return @git_sha if @git_sha
150
- # always call this and dont use the execute method because of the noop option
151
- @git_sha = `cd #{Ufo.root} && git rev-parse --short HEAD`
152
- @git_sha.strip!
154
+ sha = if File.exist?('.git')
155
+ `git rev-parse --short HEAD`
156
+ elsif ENV['CODEBUILD_RESOLVED_SOURCE_VERSION'] # AWS codebuild
157
+ ENV['CODEBUILD_RESOLVED_SOURCE_VERSION'][0..6] # first 7 chars
158
+ end
159
+ sha.strip if sha
153
160
  end
161
+ memoize :git_sha
154
162
 
155
163
  def update_dockerfile
156
164
  updater = if File.exist?("#{Ufo.root}/Dockerfile.erb") # dont use @dockerfile on purpose
157
- Variables.new(full_image_name, @options)
165
+ State.new(docker_image, @options)
158
166
  else
159
- Dockerfile.new(full_image_name, @options)
167
+ Dockerfile.new(docker_image, @options)
160
168
  end
161
169
  updater.update
162
170
  end
163
-
164
- def say(msg)
165
- puts msg unless @options[:mute]
166
- end
167
171
  end
168
172
  end
@@ -1,26 +1,28 @@
1
- module Ufo
2
- class Docker::Cleaner
3
- include Util
1
+ module Ufo::Docker
2
+ class Cleaner
3
+ include Ufo::Utils::Execute
4
+ include Ufo::Utils::Logging
4
5
 
5
6
  def initialize(docker_image_name, options)
6
7
  # docker_image_name does not containg the tag
7
8
  # Example: 123456789.dkr.ecr.us-east-1.amazonaws.com/image
8
9
  @docker_image_name = docker_image_name
9
10
  @options = options
10
- @keep = options[:keep] || settings[:clean_keep] || 3
11
+ @keep = Ufo.config.docker.clean_keep
11
12
  @tag_prefix = options[:tag_prefix] || "ufo"
12
13
  end
13
14
 
14
15
  def cleanup
16
+ return if @keep.nil?
15
17
  return if delete_list.empty?
16
18
  command = "docker rmi #{delete_list}"
17
- say "Cleaning up docker images...".color(:green)
18
- say "=> #{"docker rmi #{delete_list}"}".color(:green)
19
+ logger.info "Cleaning docker images"
19
20
  return if @options[:noop]
20
- execute(command, use_system: false) # to use_system: false silence output
21
+ execute(command, quiet: true)
21
22
  end
22
23
 
23
24
  def delete_list
25
+ return if @keep.nil?
24
26
  return [] if ENV['TEST'] || @options[:noop]
25
27
  return @delete_list if @delete_list
26
28
 
@@ -44,10 +46,5 @@ module Ufo
44
46
  @delete_list = delete_tags.map { |t| "#{@docker_image_name}:#{t}" }.join(' ')
45
47
  end
46
48
  end
47
-
48
- def say(msg)
49
- msg = "NOOP #{msg}" if @options[:noop]
50
- puts msg unless @options[:mute]
51
- end
52
49
  end
53
50
  end
@@ -1,4 +1,4 @@
1
- class Ufo::Docker
1
+ module Ufo::Docker
2
2
  class Compiler
3
3
  def initialize(dockerfile)
4
4
  @dockerfile = dockerfile
@@ -9,13 +9,19 @@ class Ufo::Docker
9
9
  return unless File.exist?(@erb_file)
10
10
 
11
11
  puts "Compiled #{File.basename(@erb_file).color(:green)} to #{File.basename(@dockerfile).color(:green)}"
12
- path = "#{Ufo.root}/.ufo/settings/dockerfile_variables.yml"
12
+ path = "#{Ufo.root}/.ufo/state/data.yml"
13
13
  vars = YAML.load_file(path)[Ufo.env] if File.exist?(path)
14
14
  vars ||= {}
15
15
  result = RenderMePretty.result(@erb_file, vars)
16
16
  comment =<<~EOL.chop # remove the trailing newline
17
- # Note this file was generated from #{File.basename(@erb_file)} as a part of running ufo ship"
18
- # To update the FROM statement with the latest base docker image run: ufo docker base
17
+ # IMPORTANT: This file was generated from #{File.basename(@erb_file)} as a part of running:
18
+ #
19
+ # ufo ship
20
+ #
21
+ # To update the FROM statement with the latest base docker image use:
22
+ #
23
+ # ufo docker base
24
+ #
19
25
  EOL
20
26
  result = "#{comment}\n#{result}"
21
27
  IO.write(@dockerfile, result)
@@ -0,0 +1,7 @@
1
+ module Ufo::Docker
2
+ module Concerns
3
+ include Ufo::Utils::Execute
4
+ include Ufo::Utils::Logging
5
+ include Ufo::Utils::Pretty
6
+ end
7
+ end
@@ -1,7 +1,9 @@
1
- module Ufo
2
- class Docker::Dockerfile
3
- def initialize(full_image_name, options={})
4
- @full_image_name, @options = full_image_name, options
1
+ module Ufo::Docker
2
+ class Dockerfile
3
+ include Ufo::Utils::Logging
4
+
5
+ def initialize(docker_image, options={})
6
+ @docker_image, @options = docker_image, options
5
7
  end
6
8
 
7
9
  def update
@@ -21,7 +23,7 @@ module Ufo
21
23
  # replace FROM line
22
24
  new_lines = lines.map do |line|
23
25
  if line =~ /^FROM /
24
- "FROM #{@full_image_name}"
26
+ "FROM #{@docker_image}"
25
27
  else
26
28
  line
27
29
  end
@@ -31,10 +33,12 @@ module Ufo
31
33
 
32
34
  def write_new_dockerfile
33
35
  IO.write(dockerfile_path, new_dockerfile)
34
- unless @options[:mute]
35
- puts "The Dockerfile FROM statement has been updated with the latest base image:".color(:green)
36
- puts " #{@full_image_name}".color(:green)
37
- end
36
+ logger.debug <<~EOL
37
+ The Dockerfile FROM statement has been updated with the latest base image:
38
+
39
+ #{@docker_image}
40
+
41
+ EOL
38
42
  end
39
43
  end
40
44
  end
@@ -1,36 +1,29 @@
1
- require 'active_support/core_ext/module/delegation'
2
-
3
- class Ufo::Docker
1
+ module Ufo::Docker
4
2
  class Pusher
5
- include Ufo::Util
3
+ include Concerns
6
4
 
7
- delegate :full_image_name, to: :builder
5
+ delegate :docker_image, to: :builder
8
6
  attr_reader :last_image_name
9
7
  def initialize(image, options)
10
8
  @options = options
11
- # full_image_name ultimately uses @options, so @last_image_name assignment
9
+ # docker_image ultimately uses @options, so @last_image_name assignment
12
10
  # line must be defined after setting @options.
13
- @last_image_name = image || full_image_name
11
+ @last_image_name = image || docker_image
14
12
  end
15
13
 
16
14
  def push
17
15
  update_auth_token
18
16
  start_time = Time.now
19
- message = "Pushed #{last_image_name} docker image."
20
- if @options[:noop]
21
- message = "NOOP #{message}"
22
- else
23
- command = "docker push #{last_image_name}"
24
- puts "=> #{command}".color(:green)
25
- success = execute(command, use_system: true)
26
- unless success
27
- puts "ERROR: The docker image fail to push.".color(:red)
28
- exit 1
29
- end
17
+ logger.info "Pushing Docker Image"
18
+ command = "docker push #{last_image_name}"
19
+ log = ".ufo/log/docker.log" if @options[:quiet]
20
+ success = execute(command, log: log)
21
+ unless success
22
+ logger.info "ERROR: The docker image fail to push.".color(:red)
23
+ exit 1
30
24
  end
31
25
  took = Time.now - start_time
32
- message << "\nDocker push took #{pretty_time(took)}.".color(:green)
33
- puts message unless @options[:mute]
26
+ logger.info "Took #{pretty_time(took)}"
34
27
  end
35
28
 
36
29
  def builder
@@ -42,10 +35,5 @@ class Ufo::Docker
42
35
  # wont update auth token unless the image being pushed in the ECR image format
43
36
  auth.update
44
37
  end
45
-
46
- # full_image - does not include the tag
47
- def image_name
48
- settings[:image]
49
- end
50
38
  end
51
39
  end