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.
- checksums.yaml +4 -4
- data/.cody/README.md +19 -0
- data/.cody/acceptance/bin/build.sh +90 -0
- data/.cody/acceptance/buildspec.yml +10 -0
- data/.cody/acceptance/project.rb +11 -0
- data/.cody/acceptance/role.rb +28 -0
- data/.cody/shared/script/install/ufo.sh +40 -0
- data/.cody/shared/script/install.sh +5 -0
- data/.github/workflows/main.yml +28 -0
- data/CHANGELOG.md +4 -1
- data/Gemfile +0 -2
- data/README.md +1 -32
- data/lib/templates/docker/Dockerfile +4 -0
- data/lib/templates/helper/%underscore_name%_helper.rb.tt +6 -0
- data/lib/templates/init/.ufo/config/web/base.rb +6 -0
- data/lib/templates/init/.ufo/config/web/dev.rb +6 -0
- data/lib/templates/init/.ufo/config/web/prod.rb +6 -0
- data/lib/templates/init/.ufo/config.rb.tt +39 -0
- data/lib/templates/init/.ufo/resources/iam_roles/execution_role.rb +23 -0
- data/lib/templates/init/.ufo/resources/iam_roles/task_role.rb +20 -0
- data/lib/templates/init/.ufo/resources/task_definitions/web.yml +29 -0
- data/lib/templates/init/.ufo/vars/base.rb +20 -0
- data/lib/templates/init/.ufo/vars/dev.rb +4 -0
- data/lib/templates/init/.ufo/vars/prod.rb +4 -0
- data/lib/ufo/aws_services.rb +118 -0
- data/lib/ufo/booter.rb +27 -0
- data/lib/ufo/cfn/base.rb +7 -0
- data/lib/ufo/cfn/deploy.rb +54 -0
- data/lib/ufo/{stack → cfn/stack}/builder/base.rb +12 -23
- data/lib/ufo/cfn/stack/builder/conditions.rb +25 -0
- data/lib/ufo/{stack → cfn/stack}/builder/outputs.rb +2 -2
- data/lib/ufo/cfn/stack/builder/parameters.rb +34 -0
- data/lib/ufo/cfn/stack/builder/resources/base.rb +4 -0
- data/lib/ufo/cfn/stack/builder/resources/dns.rb +47 -0
- data/lib/ufo/{stack/builder/resources/ecs.rb → cfn/stack/builder/resources/ecs_service.rb} +11 -10
- data/lib/ufo/cfn/stack/builder/resources/elb.rb +35 -0
- data/lib/ufo/cfn/stack/builder/resources/iam_roles/base.rb +32 -0
- data/lib/ufo/cfn/stack/builder/resources/iam_roles/execution_role.rb +4 -0
- data/lib/ufo/cfn/stack/builder/resources/iam_roles/task_role.rb +4 -0
- data/lib/ufo/cfn/stack/builder/resources/listener.rb +65 -0
- data/lib/ufo/cfn/stack/builder/resources/listener_ssl.rb +44 -0
- data/lib/ufo/cfn/stack/builder/resources/scaling/base.rb +5 -0
- data/lib/ufo/cfn/stack/builder/resources/scaling/policy.rb +27 -0
- data/lib/ufo/cfn/stack/builder/resources/scaling/role.rb +33 -0
- data/lib/ufo/cfn/stack/builder/resources/scaling/target.rb +22 -0
- data/lib/ufo/cfn/stack/builder/resources/security_group/base.rb +4 -0
- data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/ecs.rb +4 -4
- data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/ecs_rule.rb +2 -2
- data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/elb.rb +5 -6
- data/lib/ufo/{stack → cfn/stack}/builder/resources/target_group.rb +4 -4
- data/lib/ufo/{stack → cfn/stack}/builder/resources/task_definition/reconstructor.rb +4 -4
- data/lib/ufo/{stack → cfn/stack}/builder/resources/task_definition.rb +4 -4
- data/lib/ufo/cfn/stack/builder/resources.rb +24 -0
- data/lib/ufo/cfn/stack/builder.rb +30 -0
- data/lib/ufo/{stack → cfn/stack}/custom_properties.rb +21 -5
- data/lib/ufo/cfn/stack/params.rb +51 -0
- data/lib/ufo/{stack → cfn/stack}/status.rb +2 -2
- data/lib/ufo/cfn/stack/template.rb +8 -0
- data/lib/ufo/cfn/stack/vars.rb +110 -0
- data/lib/ufo/cfn/stack/vpc.rb +31 -0
- data/lib/ufo/cfn/stack.rb +175 -0
- data/lib/ufo/cli/base.rb +18 -0
- data/lib/ufo/cli/build.rb +30 -0
- data/lib/ufo/cli/cancel.rb +18 -0
- data/lib/ufo/cli/central/update.rb +80 -0
- data/lib/ufo/cli/central.rb +12 -0
- data/lib/ufo/cli/clean.rb +17 -0
- data/lib/ufo/cli/destroy.rb +31 -0
- data/lib/ufo/{docker.rb → cli/docker.rb} +18 -18
- data/lib/ufo/cli/exec.rb +82 -0
- data/lib/ufo/cli/help/central/update.md +20 -0
- data/lib/ufo/{help → cli/help}/completion.md +0 -0
- data/lib/ufo/{help → cli/help}/completion_script.md +0 -0
- data/lib/ufo/cli/help/destroy.md +9 -0
- data/lib/ufo/cli/help/docker/base.md +39 -0
- data/lib/ufo/{help → cli/help}/docker/build.md +9 -9
- data/lib/ufo/{help → cli/help}/docker/clean.md +8 -8
- data/lib/ufo/{help → cli/help}/docker/compile.md +0 -0
- data/lib/ufo/cli/help/docker/name.md +16 -0
- data/lib/ufo/{help → cli/help}/docker/push.md +0 -0
- data/lib/ufo/cli/help/docker.md +6 -0
- data/lib/ufo/{help → cli/help}/help.md +1 -1
- data/lib/ufo/cli/help/init.md +27 -0
- data/lib/ufo/{help → cli/help}/logs.md +5 -4
- data/lib/ufo/cli/help/ps.md +12 -0
- data/lib/ufo/cli/help/releases.md +15 -0
- data/lib/ufo/cli/help/rollback.md +40 -0
- data/lib/ufo/cli/help/scale.md +7 -0
- data/lib/ufo/cli/help/ship.md +41 -0
- data/lib/ufo/cli/help/stop.md +3 -0
- data/lib/ufo/cli/help.rb +62 -0
- data/lib/ufo/{logs.rb → cli/logs.rb} +13 -6
- data/lib/ufo/cli/new/concerns.rb +16 -0
- data/lib/ufo/cli/new/helper.rb +24 -0
- data/lib/ufo/cli/new/init.rb +68 -0
- data/lib/ufo/{sequence.rb → cli/new/sequence.rb} +26 -4
- data/lib/ufo/cli/new.rb +10 -0
- data/lib/ufo/cli/opts.rb +35 -0
- data/lib/ufo/{ps → cli/ps}/task.rb +22 -29
- data/lib/ufo/cli/ps.rb +190 -0
- data/lib/ufo/{releases.rb → cli/releases.rb} +4 -4
- data/lib/ufo/{rollback.rb → cli/rollback.rb} +24 -12
- data/lib/ufo/cli/scale.rb +76 -0
- data/lib/ufo/cli/ship.rb +28 -0
- data/lib/ufo/cli/status.rb +8 -0
- data/lib/ufo/cli/stop.rb +49 -0
- data/lib/ufo/{tasks.rb → cli/tasks.rb} +2 -2
- data/lib/ufo/{upgrade.rb → cli/upgrade.rb} +2 -2
- data/lib/ufo/cli.rb +82 -172
- data/lib/ufo/command.rb +56 -1
- data/lib/ufo/concerns/autoscaling.rb +11 -0
- data/lib/ufo/concerns/names.rb +9 -0
- data/lib/ufo/concerns.rb +26 -0
- data/lib/ufo/config/inits.rb +13 -0
- data/lib/ufo/config.rb +187 -0
- data/lib/ufo/core.rb +32 -44
- data/lib/ufo/docker/builder.rb +44 -40
- data/lib/ufo/docker/cleaner.rb +9 -12
- data/lib/ufo/docker/compiler.rb +10 -4
- data/lib/ufo/docker/concerns.rb +7 -0
- data/lib/ufo/docker/dockerfile.rb +13 -9
- data/lib/ufo/docker/pusher.rb +13 -25
- data/lib/ufo/docker/state.rb +63 -0
- data/lib/ufo/ecr/auth.rb +8 -7
- data/lib/ufo/ecr/cleaner.rb +10 -14
- data/lib/ufo/ext/core/module.rb +31 -0
- data/lib/ufo/ext/core/nil_class.rb +11 -0
- data/lib/ufo/ext.rb +2 -0
- data/lib/ufo/{role → iam_role}/builder.rb +1 -1
- data/lib/ufo/{role → iam_role}/dsl.rb +8 -2
- data/lib/ufo/{role → iam_role}/registry.rb +1 -1
- data/lib/ufo/info.rb +22 -4
- data/lib/ufo/layering/layer.rb +95 -0
- data/lib/ufo/layering.rb +23 -0
- data/lib/ufo/log_group.rb +18 -10
- data/lib/ufo/logger/formatter.rb +13 -0
- data/lib/ufo/logger.rb +32 -0
- data/lib/ufo/names.rb +69 -0
- data/lib/ufo/param.rb +2 -1
- data/lib/ufo/task_definition/builder.rb +7 -0
- data/lib/ufo/task_definition/context.rb +45 -0
- data/lib/ufo/task_definition/erb/base.rb +18 -0
- data/lib/ufo/task_definition/erb/json.rb +28 -0
- data/lib/ufo/task_definition/erb/yaml.rb +18 -0
- data/lib/ufo/task_definition/erb.rb +78 -0
- data/lib/ufo/task_definition/helpers/aws_data_helper.rb +18 -0
- data/lib/ufo/task_definition/helpers/core.rb +50 -0
- data/lib/ufo/task_definition/helpers/ssm/fetcher.rb +39 -0
- data/lib/ufo/task_definition/helpers/ssm.rb +8 -0
- data/lib/ufo/task_definition/helpers/stack_output.rb +23 -0
- data/lib/ufo/{dsl/helper → task_definition/helpers}/vars.rb +40 -19
- data/lib/ufo/task_definition/helpers/vpc.rb +48 -0
- data/lib/ufo/task_definition/helpers.rb +5 -0
- data/lib/ufo/task_definition.rb +19 -0
- data/lib/ufo/upgrade/upgrade3.rb +1 -1
- data/lib/ufo/upgrade/upgrade4.rb +3 -3
- data/lib/ufo/utils/execute.rb +30 -0
- data/lib/ufo/utils/logging.rb +7 -0
- data/lib/ufo/utils/pretty.rb +18 -0
- data/lib/ufo/utils/squeezer.rb +1 -1
- data/lib/ufo/utils/sure.rb +23 -0
- data/lib/ufo/version.rb +1 -1
- data/lib/ufo/yaml/loader.rb +48 -0
- data/lib/ufo/yaml/validator.rb +51 -0
- data/lib/ufo/yaml.rb +13 -0
- data/lib/ufo.rb +12 -2
- data/spec/spec_helper.rb +4 -26
- data/spec/{lib → ufo}/ecr_auth_spec.rb +0 -0
- data/spec/{lib → ufo}/ecr_cleaner_spec.rb +0 -2
- data/spec/{lib/role → ufo/iam_role}/builder_spec.rb +5 -5
- data/spec/{lib/role → ufo/iam_role}/dsl_spec.rb +3 -3
- data/spec/{lib → ufo}/logs_spec.rb +2 -2
- data/ufo.gemspec +9 -3
- metadata +244 -341
- data/.circleci/bin/commit_docs.sh +0 -26
- data/.circleci/config.yml +0 -78
- data/.gitmodules +0 -0
- data/docs/.gitignore +0 -5
- data/docs/CNAME +0 -1
- data/docs/Gemfile +0 -4
- data/docs/LICENSE +0 -21
- data/docs/README.md +0 -20
- data/docs/_config.yml +0 -75
- data/docs/_docs/aws-ecs-task-execution-role.md +0 -28
- data/docs/_docs/conventions.md +0 -47
- data/docs/_docs/extras/codebuild-iam-role.md +0 -46
- data/docs/_docs/extras/dockerfile-erb.md +0 -60
- data/docs/_docs/extras/ecs-network-mode.md +0 -37
- data/docs/_docs/extras/load-balancer.md +0 -83
- data/docs/_docs/extras/minimal-deploy-iam.md +0 -79
- data/docs/_docs/extras/notification-arns.md +0 -21
- data/docs/_docs/extras/redirection-support.md +0 -27
- data/docs/_docs/extras/route53-support.md +0 -27
- data/docs/_docs/extras/security-groups.md +0 -36
- data/docs/_docs/extras/ssl-support.md +0 -20
- data/docs/_docs/faq.md +0 -100
- data/docs/_docs/fargate.md +0 -5
- data/docs/_docs/helpers.md +0 -24
- data/docs/_docs/iam-roles.md +0 -112
- data/docs/_docs/install.md +0 -25
- data/docs/_docs/more/auto-completion.md +0 -24
- data/docs/_docs/more/automated-cleanup.md +0 -14
- data/docs/_docs/more/customize-cloudformation.md +0 -35
- data/docs/_docs/more/migrations.md +0 -25
- data/docs/_docs/more/run-in-pieces.md +0 -30
- data/docs/_docs/more/single-task.md +0 -25
- data/docs/_docs/more/stuck-cloudformation.md +0 -29
- data/docs/_docs/more/why-cloudformation.md +0 -21
- data/docs/_docs/next-steps.md +0 -16
- data/docs/_docs/quick-start-ec2.md +0 -86
- data/docs/_docs/secrets.md +0 -135
- data/docs/_docs/settings/aws_profile.md +0 -36
- data/docs/_docs/settings/cfn.md +0 -12
- data/docs/_docs/settings/cluster.md +0 -66
- data/docs/_docs/settings/manage-security-groups.md +0 -24
- data/docs/_docs/settings/network.md +0 -45
- data/docs/_docs/settings.md +0 -55
- data/docs/_docs/ssl_errors.md +0 -40
- data/docs/_docs/structure.md +0 -41
- data/docs/_docs/tutorial-ufo-docker-build.md +0 -61
- data/docs/_docs/tutorial-ufo-init.md +0 -86
- data/docs/_docs/tutorial-ufo-ship.md +0 -95
- data/docs/_docs/tutorial-ufo-ships.md +0 -38
- data/docs/_docs/tutorial-ufo-tasks-build.md +0 -177
- data/docs/_docs/tutorial.md +0 -14
- data/docs/_docs/ufo-current.md +0 -49
- data/docs/_docs/ufo-env-extra.md +0 -22
- data/docs/_docs/ufo-env.md +0 -46
- data/docs/_docs/ufo-logs.md +0 -49
- data/docs/_docs/ufo-task-params.md +0 -43
- data/docs/_docs/ufo-tasks-register.md +0 -21
- data/docs/_docs/upgrading/upgrade4.5.md +0 -52
- data/docs/_docs/upgrading/upgrade4.md +0 -48
- data/docs/_docs/upgrading/upgrade5.md +0 -19
- data/docs/_docs/upgrading.md +0 -13
- data/docs/_docs/variables.md +0 -55
- data/docs/_includes/about.html +0 -19
- data/docs/_includes/banner/foot.html +0 -2
- data/docs/_includes/banner/head.html +0 -5
- data/docs/_includes/cfn-customize.md +0 -53
- data/docs/_includes/commands.html +0 -80
- data/docs/_includes/contact.html +0 -17
- data/docs/_includes/contact_disqus.html +0 -16
- data/docs/_includes/contact_static.html +0 -17
- data/docs/_includes/content.html +0 -26
- data/docs/_includes/css/bootstrap.min.css +0 -7
- data/docs/_includes/css/main.css +0 -501
- data/docs/_includes/css/quotes.css +0 -102
- data/docs/_includes/css/syntax.css +0 -65
- data/docs/_includes/css/table.css +0 -53
- data/docs/_includes/css/timeline.css +0 -201
- data/docs/_includes/css/ufo.css +0 -218
- data/docs/_includes/edit-on-github.html +0 -11
- data/docs/_includes/example.html +0 -63
- data/docs/_includes/footer.html +0 -44
- data/docs/_includes/google_analytics.html +0 -10
- data/docs/_includes/head.html +0 -32
- data/docs/_includes/header.html +0 -15
- data/docs/_includes/js.html +0 -32
- data/docs/_includes/js_disqus.html +0 -21
- data/docs/_includes/modals.html +0 -40
- data/docs/_includes/nav.html +0 -27
- data/docs/_includes/prev_next.md +0 -19
- data/docs/_includes/quotes.html +0 -19
- data/docs/_includes/reference.md +0 -5
- data/docs/_includes/repo_push_access.md +0 -11
- data/docs/_includes/subnav.html +0 -78
- data/docs/_includes/summary.html +0 -22
- data/docs/_includes/ufo-ship-options.md +0 -12
- data/docs/_includes/uses.html +0 -19
- data/docs/_layouts/default.html +0 -13
- data/docs/_layouts/style.css +0 -6
- data/docs/_reference/ufo-apps.md +0 -37
- data/docs/_reference/ufo-cancel.md +0 -24
- data/docs/_reference/ufo-completion.md +0 -46
- data/docs/_reference/ufo-completion_script.md +0 -27
- data/docs/_reference/ufo-current.md +0 -93
- data/docs/_reference/ufo-deploy.md +0 -76
- data/docs/_reference/ufo-destroy.md +0 -36
- data/docs/_reference/ufo-docker-base.md +0 -71
- data/docs/_reference/ufo-docker-build.md +0 -91
- data/docs/_reference/ufo-docker-clean.md +0 -44
- data/docs/_reference/ufo-docker-compile.md +0 -19
- data/docs/_reference/ufo-docker-help.md +0 -15
- data/docs/_reference/ufo-docker-name.md +0 -37
- data/docs/_reference/ufo-docker-push.md +0 -49
- data/docs/_reference/ufo-docker.md +0 -38
- data/docs/_reference/ufo-init.md +0 -125
- data/docs/_reference/ufo-logs.md +0 -40
- data/docs/_reference/ufo-network-help.md +0 -15
- data/docs/_reference/ufo-network-init.md +0 -39
- data/docs/_reference/ufo-network.md +0 -26
- data/docs/_reference/ufo-ps.md +0 -56
- data/docs/_reference/ufo-releases.md +0 -40
- data/docs/_reference/ufo-resources.md +0 -44
- data/docs/_reference/ufo-rollback.md +0 -61
- data/docs/_reference/ufo-scale.md +0 -50
- data/docs/_reference/ufo-ship.md +0 -129
- data/docs/_reference/ufo-ships.md +0 -68
- data/docs/_reference/ufo-status.md +0 -23
- data/docs/_reference/ufo-stop.md +0 -31
- data/docs/_reference/ufo-task.md +0 -56
- data/docs/_reference/ufo-tasks-build.md +0 -178
- data/docs/_reference/ufo-tasks-help.md +0 -15
- data/docs/_reference/ufo-tasks-register.md +0 -29
- data/docs/_reference/ufo-tasks.md +0 -35
- data/docs/_reference/ufo-upgrade-help.md +0 -15
- data/docs/_reference/ufo-upgrade-v2to3.md +0 -15
- data/docs/_reference/ufo-upgrade-v33to34.md +0 -15
- data/docs/_reference/ufo-upgrade-v3to4.md +0 -27
- data/docs/_reference/ufo-upgrade-v43to45.md +0 -15
- data/docs/_reference/ufo-upgrade.md +0 -29
- data/docs/_reference/ufo-version.md +0 -23
- data/docs/articles.md +0 -14
- data/docs/bin/web +0 -4
- data/docs/css/font-awesome/css/font-awesome.css +0 -1566
- data/docs/css/font-awesome/css/font-awesome.min.css +0 -4
- data/docs/css/font-awesome/fonts/FontAwesome.otf +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.eot +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.svg +0 -504
- data/docs/css/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.woff +0 -0
- data/docs/docs.md +0 -29
- data/docs/img/docs/cloudformation-resources.png +0 -0
- data/docs/img/logos/boltops-logo-full.png +0 -0
- data/docs/img/logos/boltops-logo.png +0 -0
- data/docs/img/logos/ufo-logo-2.png +0 -0
- data/docs/img/logos/ufo-logo.png +0 -0
- data/docs/img/logos/ufo-site-header.png +0 -0
- data/docs/img/logos/ufo.jpg +0 -0
- data/docs/img/tutorials/ecs-console-task-definitions.png +0 -0
- data/docs/img/tutorials/ecs-console-ufo-ship.png +0 -0
- data/docs/img/tutorials/ecs-console-ufo-ships.png +0 -0
- data/docs/index.html +0 -10
- data/docs/js/bootstrap.js +0 -2114
- data/docs/js/bootstrap.min.js +0 -6
- data/docs/js/cbpAnimatedHeader.js +0 -44
- data/docs/js/cbpAnimatedHeader.min.js +0 -11
- data/docs/js/classie.js +0 -80
- data/docs/js/contact_me.js +0 -70
- data/docs/js/contact_me_static.js +0 -23
- data/docs/js/freelancer.js +0 -37
- data/docs/js/jqBootstrapValidation.js +0 -912
- data/docs/js/jquery-1.11.0.js +0 -4
- data/docs/js/jquery.easing.min.js +0 -44
- data/docs/js/nav.js +0 -53
- data/docs/quick-start.md +0 -133
- data/docs/reference.md +0 -29
- data/docs/style.css +0 -3
- data/docs/utils/ssl-doctor.rb +0 -89
- data/docs/utils/test-aws-api-access.rb +0 -11
- data/docs/utils/update-cert-chains.sh +0 -11
- data/lib/template/.env +0 -3
- data/lib/template/.secrets +0 -5
- data/lib/template/.ufo/iam_roles/execution_role.rb +0 -7
- data/lib/template/.ufo/iam_roles/task_role.rb +0 -21
- data/lib/template/.ufo/params.yml.tt +0 -27
- data/lib/template/.ufo/settings/cfn/default.yml.tt +0 -72
- data/lib/template/.ufo/settings/network/default.yml.tt +0 -26
- data/lib/template/.ufo/settings.yml.tt +0 -26
- data/lib/template/.ufo/task_definitions.rb.tt +0 -61
- data/lib/template/.ufo/templates/fargate.json.erb +0 -39
- data/lib/template/.ufo/templates/main.json.erb +0 -43
- data/lib/template/.ufo/variables/base.rb.tt +0 -19
- data/lib/template/.ufo/variables/development.rb +0 -8
- data/lib/template/.ufo/variables/production.rb +0 -7
- data/lib/template/Dockerfile +0 -15
- data/lib/template/bin/deploy.tt +0 -7
- data/lib/ufo/apps/cfn_map.rb +0 -70
- data/lib/ufo/apps/cluster.rb +0 -24
- data/lib/ufo/apps/service.rb +0 -56
- data/lib/ufo/apps.rb +0 -56
- data/lib/ufo/aws_service.rb +0 -36
- data/lib/ufo/base.rb +0 -35
- data/lib/ufo/cancel.rb +0 -23
- data/lib/ufo/current.rb +0 -104
- data/lib/ufo/default/settings.yml +0 -24
- data/lib/ufo/default/templates/main.json.erb +0 -39
- data/lib/ufo/destroy.rb +0 -41
- data/lib/ufo/docker/variables.rb +0 -26
- data/lib/ufo/dsl/helper.rb +0 -79
- data/lib/ufo/dsl/outputter.rb +0 -43
- data/lib/ufo/dsl/task_definition.rb +0 -108
- data/lib/ufo/dsl.rb +0 -96
- data/lib/ufo/help/apps.md +0 -12
- data/lib/ufo/help/balancer.md +0 -3
- data/lib/ufo/help/completions.md +0 -16
- data/lib/ufo/help/completions_script.md +0 -1
- data/lib/ufo/help/current.md +0 -65
- data/lib/ufo/help/deploy.md +0 -38
- data/lib/ufo/help/destroy.md +0 -9
- data/lib/ufo/help/docker/base.md +0 -49
- data/lib/ufo/help/docker/name.md +0 -16
- data/lib/ufo/help/docker.md +0 -6
- data/lib/ufo/help/init.md +0 -91
- data/lib/ufo/help/network/init.md +0 -13
- data/lib/ufo/help/ps.md +0 -27
- data/lib/ufo/help/releases.md +0 -16
- data/lib/ufo/help/resources.md +0 -20
- data/lib/ufo/help/rollback.md +0 -35
- data/lib/ufo/help/scale.md +0 -26
- data/lib/ufo/help/ship.md +0 -95
- data/lib/ufo/help/ships.md +0 -35
- data/lib/ufo/help/stop.md +0 -7
- data/lib/ufo/help/task.md +0 -27
- data/lib/ufo/help/tasks/build.md +0 -158
- data/lib/ufo/help/tasks/register.md +0 -14
- data/lib/ufo/help/tasks.md +0 -7
- data/lib/ufo/help/upgrade/v3to4.md +0 -3
- data/lib/ufo/help.rb +0 -9
- data/lib/ufo/init.rb +0 -119
- data/lib/ufo/network/fetch.rb +0 -48
- data/lib/ufo/network/helper.rb +0 -23
- data/lib/ufo/network/init.rb +0 -26
- data/lib/ufo/network.rb +0 -21
- data/lib/ufo/ps.rb +0 -129
- data/lib/ufo/scale.rb +0 -28
- data/lib/ufo/setting/profile.rb +0 -44
- data/lib/ufo/setting/security_groups.rb +0 -22
- data/lib/ufo/setting.rb +0 -75
- data/lib/ufo/settings.rb +0 -20
- data/lib/ufo/ship.rb +0 -103
- data/lib/ufo/stack/builder/conditions.rb +0 -23
- data/lib/ufo/stack/builder/parameters.rb +0 -45
- data/lib/ufo/stack/builder/resources/base.rb +0 -4
- data/lib/ufo/stack/builder/resources/dns.rb +0 -17
- data/lib/ufo/stack/builder/resources/elb.rb +0 -45
- data/lib/ufo/stack/builder/resources/listener.rb +0 -42
- data/lib/ufo/stack/builder/resources/listener_ssl.rb +0 -16
- data/lib/ufo/stack/builder/resources/roles/base.rb +0 -22
- data/lib/ufo/stack/builder/resources/roles/execution_role.rb +0 -4
- data/lib/ufo/stack/builder/resources/roles/task_role.rb +0 -4
- data/lib/ufo/stack/builder/resources/security_group/base.rb +0 -4
- data/lib/ufo/stack/builder/resources.rb +0 -20
- data/lib/ufo/stack/builder.rb +0 -26
- data/lib/ufo/stack/context.rb +0 -253
- data/lib/ufo/stack/helper.rb +0 -55
- data/lib/ufo/stack/template_body.rb +0 -13
- data/lib/ufo/stack.rb +0 -213
- data/lib/ufo/status.rb +0 -56
- data/lib/ufo/stop.rb +0 -49
- data/lib/ufo/task.rb +0 -225
- data/lib/ufo/tasks/builder.rb +0 -40
- data/lib/ufo/tasks/register.rb +0 -90
- data/lib/ufo/template_scope.rb +0 -57
- data/lib/ufo/util.rb +0 -69
- data/spec/lib/apps_spec.rb +0 -20
- data/spec/lib/builder_spec.rb +0 -23
- data/spec/lib/cli_spec.rb +0 -73
- data/spec/lib/completion_spec.rb +0 -18
- data/spec/lib/ps_spec.rb +0 -14
- data/spec/lib/register_spec.rb +0 -49
- data/spec/lib/setting_spec.rb +0 -18
- data/spec/lib/ship_spec.rb +0 -46
- data/spec/lib/stack/status_spec.rb +0 -76
- data/spec/lib/stop_spec.rb +0 -13
- 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
|
|
10
|
-
|
|
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
|
|
20
|
-
|
|
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
|
-
|
|
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
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
data/lib/ufo/docker/builder.rb
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
class Ufo::Docker
|
|
1
|
+
module Ufo::Docker
|
|
4
2
|
class Builder
|
|
5
|
-
|
|
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.
|
|
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
|
-
|
|
23
|
+
store_docker_image
|
|
25
24
|
|
|
26
|
-
|
|
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 = "
|
|
33
|
-
|
|
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
|
-
|
|
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
|
-
|
|
45
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
113
|
-
def
|
|
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
|
-
|
|
119
|
-
|
|
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
|
|
132
|
+
def store_docker_image
|
|
129
133
|
dirname = File.dirname(docker_name_path)
|
|
130
134
|
FileUtils.mkdir_p(dirname) unless File.exist?(dirname)
|
|
131
|
-
|
|
132
|
-
IO.write(docker_name_path,
|
|
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}
|
|
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/
|
|
145
|
+
"#{Ufo.root}/.ufo/tmp/state/docker_image_name_#{@image_namespace}.txt"
|
|
142
146
|
end
|
|
143
147
|
|
|
144
148
|
def timestamp
|
|
145
|
-
|
|
149
|
+
Time.now.strftime('%Y-%m-%dT%H-%M-%S')
|
|
146
150
|
end
|
|
151
|
+
memoize :timestamp
|
|
147
152
|
|
|
148
153
|
def git_sha
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
165
|
+
State.new(docker_image, @options)
|
|
158
166
|
else
|
|
159
|
-
Dockerfile.new(
|
|
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
|
data/lib/ufo/docker/cleaner.rb
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
|
-
module Ufo
|
|
2
|
-
class
|
|
3
|
-
include
|
|
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 =
|
|
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
|
-
|
|
18
|
-
say "=> #{"docker rmi #{delete_list}"}".color(:green)
|
|
19
|
+
logger.info "Cleaning docker images"
|
|
19
20
|
return if @options[:noop]
|
|
20
|
-
execute(command,
|
|
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
|
data/lib/ufo/docker/compiler.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
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/
|
|
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
|
-
#
|
|
18
|
-
#
|
|
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)
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
module Ufo
|
|
2
|
-
class
|
|
3
|
-
|
|
4
|
-
|
|
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 #{@
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
data/lib/ufo/docker/pusher.rb
CHANGED
|
@@ -1,36 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
class Ufo::Docker
|
|
1
|
+
module Ufo::Docker
|
|
4
2
|
class Pusher
|
|
5
|
-
include
|
|
3
|
+
include Concerns
|
|
6
4
|
|
|
7
|
-
delegate :
|
|
5
|
+
delegate :docker_image, to: :builder
|
|
8
6
|
attr_reader :last_image_name
|
|
9
7
|
def initialize(image, options)
|
|
10
8
|
@options = options
|
|
11
|
-
#
|
|
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 ||
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|