d13n 0.5.2

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 (95) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.rspec +6 -0
  4. data/.rubocop.yml +5 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +22 -0
  7. data/Gemfile.lock +151 -0
  8. data/Guardfile +63 -0
  9. data/README.md +200 -0
  10. data/bin/d13n +11 -0
  11. data/d13n.gemspec +34 -0
  12. data/lib/d13n/application/class_methods.rb +56 -0
  13. data/lib/d13n/application.rb +3 -0
  14. data/lib/d13n/cli/command.rb +76 -0
  15. data/lib/d13n/cli/commands/scaffold.rb +345 -0
  16. data/lib/d13n/configuration/default_source.rb +200 -0
  17. data/lib/d13n/configuration/dotted_hash.rb +39 -0
  18. data/lib/d13n/configuration/environment_source.rb +89 -0
  19. data/lib/d13n/configuration/manager.rb +239 -0
  20. data/lib/d13n/configuration/manual_source.rb +4 -0
  21. data/lib/d13n/configuration/mask_defaults.rb +6 -0
  22. data/lib/d13n/configuration/server_source.rb +83 -0
  23. data/lib/d13n/configuration/yaml_source.rb +66 -0
  24. data/lib/d13n/configuration.rb +6 -0
  25. data/lib/d13n/ext/string.rb +17 -0
  26. data/lib/d13n/logger/log_once.rb +24 -0
  27. data/lib/d13n/logger/memory_logger.rb +48 -0
  28. data/lib/d13n/logger/null_logger.rb +16 -0
  29. data/lib/d13n/logger.rb +213 -0
  30. data/lib/d13n/metric/conductor.rb +123 -0
  31. data/lib/d13n/metric/helper.rb +62 -0
  32. data/lib/d13n/metric/http_clients/http_helper.rb +15 -0
  33. data/lib/d13n/metric/http_clients/net_http_wrappers.rb +54 -0
  34. data/lib/d13n/metric/http_clients.rb +4 -0
  35. data/lib/d13n/metric/instrumentation/app_exception.rb +70 -0
  36. data/lib/d13n/metric/instrumentation/controller_instrumentation.rb +91 -0
  37. data/lib/d13n/metric/instrumentation/em-websocket.rb +71 -0
  38. data/lib/d13n/metric/instrumentation/exception.rb +65 -0
  39. data/lib/d13n/metric/instrumentation/middleware_tracing.rb +82 -0
  40. data/lib/d13n/metric/instrumentation/net.rb +36 -0
  41. data/lib/d13n/metric/instrumentation/sinatra/stream_namer.rb +35 -0
  42. data/lib/d13n/metric/instrumentation/sinatra.rb +165 -0
  43. data/lib/d13n/metric/instrumentation/websocket_instrumentation.rb +42 -0
  44. data/lib/d13n/metric/instrumentation.rb +41 -0
  45. data/lib/d13n/metric/manager.rb +106 -0
  46. data/lib/d13n/metric/metrics/app_database_metric.rb +4 -0
  47. data/lib/d13n/metric/metrics/app_http_metric.rb +229 -0
  48. data/lib/d13n/metric/metrics/app_state_metric.rb +103 -0
  49. data/lib/d13n/metric/metrics/base.rb +14 -0
  50. data/lib/d13n/metric/metrics/biz_state_metric.rb +4 -0
  51. data/lib/d13n/metric/metrics.rb +6 -0
  52. data/lib/d13n/metric/stream/span_tracer_helpers.rb +72 -0
  53. data/lib/d13n/metric/stream/stream_tracer_helpers.rb +141 -0
  54. data/lib/d13n/metric/stream/traced_span_stack.rb +73 -0
  55. data/lib/d13n/metric/stream.rb +322 -0
  56. data/lib/d13n/metric/stream_state.rb +68 -0
  57. data/lib/d13n/metric.rb +11 -0
  58. data/lib/d13n/rack/d13n_middleware.rb +21 -0
  59. data/lib/d13n/rack/metric_middleware.rb +18 -0
  60. data/lib/d13n/service/background_job/sinatra.rb +24 -0
  61. data/lib/d13n/service/background_job.rb +1 -0
  62. data/lib/d13n/service/start.rb +75 -0
  63. data/lib/d13n/service.rb +91 -0
  64. data/lib/d13n/support/request_id.rb +29 -0
  65. data/lib/d13n/version.rb +14 -0
  66. data/lib/d13n.rb +92 -0
  67. data/templates/.rspec.template +6 -0
  68. data/templates/.ruby-version.template +1 -0
  69. data/templates/Gemfile.template +16 -0
  70. data/templates/Guardfile.template +64 -0
  71. data/templates/Jenkinsfile.template +85 -0
  72. data/templates/Makefile.template +178 -0
  73. data/templates/README.md.template +1 -0
  74. data/templates/Rakefile.template +6 -0
  75. data/templates/application.yml.template +14 -0
  76. data/templates/config.ru.template +4 -0
  77. data/templates/docker/.dockerignore.template +5 -0
  78. data/templates/docker/Dockerfile.application.development +15 -0
  79. data/templates/docker/Dockerfile.cache.development +18 -0
  80. data/templates/docker/Dockerfile.development +27 -0
  81. data/templates/docker/Dockerfile.release +16 -0
  82. data/templates/docker/docker-compose.yml.development +53 -0
  83. data/templates/docker/docker-compose.yml.release +37 -0
  84. data/templates/lib/api/service.rb.template +10 -0
  85. data/templates/lib/api/support.rb.template +38 -0
  86. data/templates/lib/api/version.rb.template +3 -0
  87. data/templates/lib/api.rb.template +4 -0
  88. data/templates/lib/application.rb.template +49 -0
  89. data/templates/lib/service.rb.template +4 -0
  90. data/templates/lib/version.rb.template +3 -0
  91. data/templates/scripts/test.sh.template +7 -0
  92. data/templates/spec/spec_helper.rb.template +56 -0
  93. data/templates/tasks/migration.rake.template +11 -0
  94. data/templates/tasks/spec.rake.template +21 -0
  95. metadata +199 -0
data/lib/d13n.rb ADDED
@@ -0,0 +1,92 @@
1
+ require 'd13n/version'
2
+
3
+
4
+ module D13n
5
+ class Error < StandardError;end
6
+
7
+ class << self
8
+ def dry_run?
9
+ @dry_run ||= false
10
+ end
11
+
12
+ def enable_dry_run
13
+ @dry_run = true
14
+ end
15
+
16
+ def config
17
+ @config ||= D13n::Configuration::Manager.new
18
+ end
19
+
20
+ def config=(cfg)
21
+ @config = cfg
22
+ end
23
+
24
+ def logger
25
+ @logger ||= if dry_run?
26
+ D13n::Logger::NullLogger.instance
27
+ else
28
+ D13n::Logger::StartupLogger.instance
29
+ end
30
+ end
31
+
32
+ def logger=(log)
33
+ @logger = log
34
+ end
35
+
36
+ # def opt_state
37
+ # D13n::Operation::State
38
+ # end
39
+
40
+ def threaded
41
+ #@threaded ||= {}
42
+ Thread.current[:d13n] ||= {}
43
+ end
44
+
45
+ def reset
46
+ Thread.current[:d13n] = {}
47
+ end
48
+
49
+ def service
50
+ @service ||= D13n::Service
51
+ end
52
+
53
+ def service=(srv)
54
+ @service = srv
55
+ end
56
+
57
+ def application
58
+ @application ||= self
59
+ end
60
+
61
+ def application=(app)
62
+ @application = app
63
+ @app_name = nil
64
+ @app_prefix = nil
65
+ end
66
+
67
+ def app_name
68
+ application.name.underscore
69
+ end
70
+
71
+ def app_prefix
72
+ app_name.upcase
73
+ end
74
+
75
+ def idc_name
76
+ config[:'idc.name'] || 'hqidc'
77
+ end
78
+
79
+ def idc_env
80
+ config[:'idc.env'] || 'dev'
81
+ end
82
+ end
83
+ end
84
+
85
+ require 'd13n/ext/string'
86
+ require 'd13n/metric'
87
+ require 'd13n/logger'
88
+ require 'd13n/configuration'
89
+ require 'd13n/application'
90
+ require 'd13n/service'
91
+
92
+
@@ -0,0 +1,6 @@
1
+ --format Fuubar
2
+ --color
3
+ --format html
4
+ --out reports/rspec/result.html
5
+ --format json
6
+ --out reports/rspec/result.json
@@ -0,0 +1 @@
1
+ ruby-<%= ruby_version %>
@@ -0,0 +1,16 @@
1
+ source 'http://gems.sd.laxino.com'
2
+ #source 'http://rubygems.org'
3
+
4
+ gem 'd13n', '<%= D13n::VERSION::STRING %>'
5
+ gem 'sinatra', '2.0.0'
6
+ gem 'rake'
7
+
8
+ group :test do
9
+ gem 'simplecov'
10
+ gem 'rspec'
11
+ gem 'rspec-nc'
12
+ gem 'factory_bot'
13
+ gem 'rack-test'
14
+ gem 'faker'
15
+ gem 'as-duration'
16
+ end
@@ -0,0 +1,64 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ ## Uncomment and set this to only include directories you want to watch
5
+ # directories %w(app lib config test spec features) \
6
+ # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
7
+
8
+ ## Note: if you are using the `directories` clause above and you are not
9
+ ## watching the project directory ('.'), then you will want to move
10
+ ## the Guardfile to a watched dir and symlink it back, e.g.
11
+ #
12
+ # $ mkdir config
13
+ # $ mv Guardfile config/
14
+ # $ ln -s config/Guardfile .
15
+ #
16
+ # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
17
+
18
+ # Note: The cmd option is now required due to the increasing number of ways
19
+ # rspec may be run, below are examples of the most common uses.
20
+ # * bundler: 'bundle exec rspec'
21
+ # * bundler binstubs: 'bin/rspec'
22
+ # * spring: 'bin/rspec' (This will use spring if running and you have
23
+ # installed the spring binstubs per the docs)
24
+ # * zeus: 'zeus rspec' (requires the server to be started separately)
25
+ # * 'just' rspec: 'rspec'
26
+ require "linguistics"
27
+ Linguistics.use( :en, classes: [String] )
28
+
29
+ guard :rspec, cmd: "bundle exec rspec --format documentation" do
30
+ require "guard/rspec/dsl"
31
+
32
+ dsl = Guard::RSpec::Dsl.new(self)
33
+
34
+ # Feel free to open issues for suggestions and improvements
35
+
36
+ # RSpec files
37
+ rspec = dsl.rspec
38
+ watch(rspec.spec_helper) { rspec.spec_dir }
39
+ watch(rspec.spec_support) { rspec.spec_dir }
40
+ watch(rspec.spec_files)
41
+
42
+ # Ruby files
43
+ ruby = dsl.ruby
44
+ dsl.watch_spec_files_for(ruby.lib_files)
45
+
46
+ watch(%r{^spec/(.+)\.rb$}) {|m| puts m}
47
+ watch(%r{^lib/<%= application %>/service_objects/(.+)\.rb$}) { |m| ["spec/functional/service_objects/#{m[1].en.plural}_spec.rb","spec/unit/service_objects/#{m[1].en.plural}_spec.rb"]}
48
+ watch(%r{^lib/<%= application %>/(.+)\.rb$}) { |m| ["spec/unit/#{m[1]}_spec.rb","spec/funcational/#{m[1]}_spec.rb"]}
49
+ watch(%r{^spec/factories/(.+)\.rb$}) { |m| ["spec/functional/service_objects/#{m[1]}_spec.rb","spec/unit/service_objects/#{m[1]}_spec.rb"] }
50
+ watch('spec/spec_helper.rb') { "spec" }
51
+ end
52
+
53
+ guard :bundler do
54
+ require 'guard/bundler'
55
+ require 'guard/bundler/verify'
56
+ helper = Guard::Bundler::Verify.new
57
+
58
+ files = ['Gemfile']
59
+ files += Dir['*.gemspec'] if files.any? { |f| helper.uses_gemspec?(f) }
60
+
61
+ # Assume files are symlinked from somewhere
62
+ files.each { |file| watch(helper.real_path(file)) }
63
+ end
64
+
@@ -0,0 +1,85 @@
1
+ pipeline {
2
+ agent { label 'docker' }
3
+ options {
4
+ buildDiscarder( logRotator( numToKeepStr: '15' ) )
5
+ skipDefaultCheckout()
6
+ timeout( time: 10, unit: 'MINUTES')
7
+ }
8
+ stages {
9
+ stage('Checkout SCM') {
10
+ steps {
11
+ deleteDir()
12
+ checkout scm
13
+ }
14
+ }
15
+ stage('Test') {
16
+ steps {
17
+ sh 'make test'
18
+ }
19
+ post {
20
+ always {
21
+ publishHTML(target:[allowMissing: false,
22
+ alwaysLinkToLastBuild: false,
23
+ keepAll: true,
24
+ reportDir: 'target/reports',
25
+ reportFiles: '*.html',
26
+ reportName: 'Test Report'])
27
+
28
+ publishHTML(target:[allowMissing: false,
29
+ alwaysLinkToLastBuild: false,
30
+ keepAll: true,
31
+ reportDir: 'target/reports/coverage',
32
+ reportFiles: 'index.html',
33
+ reportName: 'Test Case Coverage Report'])
34
+
35
+ }
36
+ }
37
+ }
38
+ stage('Build & Release') {
39
+ when {
40
+ branch 'master'
41
+ }
42
+ steps {
43
+ sh 'make build'
44
+ sh 'make release'
45
+ }
46
+ }
47
+ stage('Tag & Publish') {
48
+ when {
49
+ branch 'master'
50
+ }
51
+ steps {
52
+ sh "make tag ${tagName()}"
53
+ sh 'make publish'
54
+ }
55
+ }
56
+ }
57
+ post {
58
+ always {
59
+ sh 'make clean'
60
+ notifyBuild( currentBuild.result )
61
+ }
62
+ }
63
+ }
64
+
65
+ def notifyBuild(String buildStatus) {
66
+ // Default values
67
+ buildStatus = buildStatus ?: 'PASSED'
68
+ def subject = "${buildStatus}: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'"
69
+ def details = "Check console output at ${env.BUILD_URL} to view the results."
70
+
71
+ emailext (
72
+ subject: subject,
73
+ body: details,
74
+ recipientProviders: [[$class: 'DevelopersRecipientProvider'], [$class: 'RequesterRecipientProvider']]
75
+ )
76
+ }
77
+
78
+ def tagName() {
79
+ "${version()}.build${env.BUILD_NUMBER}"
80
+ }
81
+
82
+ def version() {
83
+ def matcher = readFile( findFiles(glob: 'lib/*/version.rb')[0].path ) =~ /VERSION\s+\=\s+['"](.*)['"]/
84
+ matcher ? matcher[0][1] : error('Version not find')
85
+ }
@@ -0,0 +1,178 @@
1
+ # Project variables
2
+ PROJECT_NAME ?= <%= application %>
3
+ #ORG_NAME ?= cheokman
4
+ ORG_NAME ?= <%= project %>
5
+ REPO_NAME ?= <%= application %>
6
+
7
+ # Filenames
8
+ DEV_COMPOSE_FILE := docker/development/docker-compose.yml
9
+ REL_COMPOSE_FILE := docker/release/docker-compose.yml
10
+
11
+ # Docker Compose Project Names
12
+ REL_PROJECT := $(PROJECT_NAME)$(BUILD_NUMBER)
13
+ DEV_PROJECT := $(PROJECT_NAME)dev$(EXECUTOR_NUMBER)
14
+
15
+ # Application Service Name - must match Docker Compose release specification application service name
16
+ APP_SERVICE_NAME := app
17
+
18
+ # Build tag expression - can be used to evaulate a shell expression at runtime
19
+ BUILD_TAG_EXPRESSION ?= date -u +%Y%m%d%H%M%S
20
+
21
+ # Execute shell expression
22
+ BUILD_EXPRESSION := $(shell $(BUILD_TAG_EXPRESSION))
23
+
24
+ # Build tag - defaults to BUILD_EXPRESSION if not defined
25
+ BUILD_TAG ?= $(BUILD_EXPRESSION)
26
+
27
+ # Check and Inspect Logic
28
+ INSPECT := $$(docker-compose -p $$1 -f $$2 ps -q $$3 | xargs -I ARGS docker inspect -f "{{ .State.ExitCode }}" ARGS)
29
+
30
+ CHECK := @bash -c '\
31
+ if [[ $(INSPECT) -ne 0 ]]; \
32
+ then exit $(INSPECT); fi' VALUE
33
+
34
+
35
+ # Use these settings to specify a custom Docker registry
36
+ DOCKER_REGISTRY ?= docker-repos:8123
37
+
38
+ # WARNING: Set DOCKER_REGISTRY_AUTH to empty for Docker Hub
39
+ # Set DOCKER_REGISTRY_AUTH to auth endpoint for private Docker registry
40
+ DOCKER_REGISTRY_AUTH ?= docker-repos:8123
41
+
42
+ .PHONY: test fasttest build release clean tag buildtag login logout publish
43
+
44
+ test:
45
+ ${INFO} "Pulling latest images..."
46
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) pull
47
+ ${INFO} "Building images..."
48
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) build --pull test
49
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) build cache
50
+ ${INFO} "Ensuring database is ready..."
51
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) run --rm agent
52
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) run --rm test bundle exec rake db:migrate:up
53
+ ${INFO} "Running tests..."
54
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) up test
55
+ @ rm -rf ./target
56
+ @ mkdir ./target
57
+ @ docker cp $$(docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) ps -q cache):/opt/deploy/application/release/reports/. ./target/reports
58
+ ${CHECK} $(DEV_PROJECT) $(DEV_COMPOSE_FILE) test
59
+ ${INFO} "Testing complete"
60
+
61
+ build:
62
+ ${INFO} "Creating builder image..."
63
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) build builder
64
+ ${INFO} "Building application artifacts..."
65
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) up builder
66
+ ${CHECK} $(DEV_PROJECT) $(DEV_COMPOSE_FILE) builder
67
+ ${INFO} "Copying application artifacts..."
68
+ @ rm -rf ./target/*
69
+ @ rm -rf /tmp/application
70
+ @ mkdir -p /tmp/application
71
+ @ docker cp $$(docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) ps -q builder):/opt/deploy/application/ /tmp/
72
+ @ rm -rf /tmp/application/release/target
73
+ @ mv /tmp/application/* ./target/
74
+ ${INFO} "Build complete"
75
+
76
+ package:
77
+ ${INFO} "Pulling latest images..."
78
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) pull test
79
+ ${INFO} "Packaging..."
80
+ @ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) build app
81
+ ${INFO} "Package complete"
82
+
83
+ release:
84
+ ${INFO} "Pulling latest images..."
85
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) pull test
86
+ ${INFO} "Releasing..."
87
+ @ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) build app
88
+ #@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) build --pull nginx
89
+ ${INFO} "Running database..."
90
+ @ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) up -d db
91
+ @ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) run --rm agent
92
+ ${INFO} "Running application..."
93
+ @ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) up -d app
94
+ ${INFO} "Running database migrations..."
95
+ @ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) run --rm app bundle exec rake db:migrate:up
96
+ ${INFO} "Running acceptance tests..."
97
+ #@ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) run --rm test
98
+ #${CHECK} $(REL_PROJECT) $(REL_COMPOSE_FILE) test
99
+ #${INFO} "Acceptance testing complete"
100
+
101
+ clean:
102
+ ${INFO} "Cleaning Test Images..."
103
+ @ docker-compose -p $(DEV_PROJECT) -f $(DEV_COMPOSE_FILE) down -v
104
+ ${INFO} "Cleaning Release Images..."
105
+ @ docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) down -v
106
+ ${INFO} "Removing dangling images..."
107
+ @ docker images -q -f dangling=true -f label=application=$(REPO_NAME) | xargs -I ARGS docker rmi -f ARGS
108
+ ${INFO} "Clean complete"
109
+
110
+ tag:
111
+ ${INFO} "Tagging release image with tags $(TAG_ARGS)..."
112
+ @ $(foreach tag,$(TAG_ARGS), docker tag $(IMAGE_ID) $(DOCKER_REGISTRY)/$(ORG_NAME)/$(REPO_NAME):$(tag);)
113
+ ${INFO} "Tagging complete"
114
+
115
+ buildtag:
116
+ ${INFO} "Tagging release image with suffix $(BUILD_TAG) and build tags $(BUILDTAG_ARGS)..."
117
+ @ $(foreach tag,$(BUILDTAG_ARGS), docker tag $(IMAGE_ID) $(DOCKER_REGISTRY)/$(ORG_NAME)/$(REPO_NAME):$(tag).$(BUILD_TAG);)
118
+ ${INFO} "Tagging complete"
119
+
120
+ login:
121
+ ${INFO} "Logging in to Docker registry $$DOCKER_REGISTRY..."
122
+ @ docker login -u $$DOCKER_USER -p $$DOCKER_PASSWORD $(DOCKER_REGISTRY_AUTH)
123
+ ${INFO} "Logged in to Docker registry $$DOCKER_REGISTRY"
124
+
125
+ logout:
126
+ ${INFO} "Logging out of Docker registry $$DOCKER_REGISTRY..."
127
+ @ docker logout
128
+ ${INFO} "Logged out of Docker registry $$DOCKER_REGISTRY"
129
+
130
+ publish:
131
+ ${INFO} "Publishing release image $(IMAGE_ID) to $(DOCKER_REGISTRY)/$(ORG_NAME)/$(REPO_NAME)..."
132
+ @ $(foreach tag,$(shell echo $(REPO_EXPR)), docker push $(tag);)
133
+ ${INFO} "Publish complete"
134
+
135
+
136
+ # Cosmetics
137
+ YELLOW := "\e[1;33m"
138
+ NC := "\e[0m"
139
+
140
+ # Shell Functions
141
+ INFO := @bash -c '\
142
+ printf $(YELLOW); \
143
+ echo "=> $$1"; \
144
+ printf $(NC)' SOME_VALUE
145
+
146
+ # Get container id of application service container
147
+ APP_CONTAINER_ID := $$(docker-compose -p $(REL_PROJECT) -f $(REL_COMPOSE_FILE) ps -q $(APP_SERVICE_NAME))
148
+
149
+ # Get image id of application service
150
+ IMAGE_ID := $$(docker inspect -f '{{ .Image }}' $(APP_CONTAINER_ID))
151
+
152
+ # Repository Filter
153
+ ifeq ($(DOCKER_REGISTRY), docker.io)
154
+ REPO_FILTER := $(ORG_NAME)/$(REPO_NAME)[^[:space:]|\$$]*
155
+ else
156
+ REPO_FILTER := $(DOCKER_REGISTRY)/$(ORG_NAME)/$(REPO_NAME)[^[:space:]|\$$]*
157
+ endif
158
+
159
+ # Introspect repository tags
160
+ REPO_EXPR := $$(docker inspect -f '{{range .RepoTags}}{{.}} {{end}}' $(IMAGE_ID) | grep -oh "$(REPO_FILTER)" | xargs)
161
+
162
+ # Extract build tag arguments
163
+ ifeq (buildtag,$(firstword $(MAKECMDGOALS)))
164
+ BUILDTAG_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
165
+ ifeq ($(BUILDTAG_ARGS),)
166
+ $(error You must specify a tag)
167
+ endif
168
+ $(eval $(BUILDTAG_ARGS):;@:)
169
+ endif
170
+
171
+ # Extract tag arguments
172
+ ifeq (tag,$(firstword $(MAKECMDGOALS)))
173
+ TAG_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))
174
+ ifeq ($(TAG_ARGS),)
175
+ $(error You must specify a tag)
176
+ endif
177
+ $(eval $(TAG_ARGS):;@:)
178
+ endif
@@ -0,0 +1 @@
1
+ # <%= application_base %>
@@ -0,0 +1,6 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rdoc/task'
4
+ Dir.glob('tasks/*.rake').each { |r| import r }
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ common: &default_settings
2
+ app_name: '<%= application %>'
3
+
4
+ # Logging level for log/<%= application %>.log
5
+ log_level: 'info'
6
+
7
+ development:
8
+ <<: *default_settings
9
+
10
+ test:
11
+ <<: *default_settings
12
+
13
+ production:
14
+ <<: *default_settings
@@ -0,0 +1,4 @@
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), "lib")))
2
+ require "<%= application %>"
3
+
4
+ <%= application_base %>::Service.run! :port => <%= application_base %>.config[:port], :host => <%= application_base %>.config[:host]
@@ -0,0 +1,5 @@
1
+ mp/*
2
+ log/*
3
+ db/*.sqlite3
4
+ .git
5
+ docker
@@ -0,0 +1,15 @@
1
+ FROM cheokman/lax-base:latest
2
+ MAINTAINER Ben Wu <wucheokman@gmail.com>
3
+
4
+ ENV DEPLOY_PATH=/opt/deploy
5
+ ENV APP_PATH=$DEPLOY_PATH/application
6
+ ENV REL_PATH=$APP_PATH/release
7
+ ENV SHARE_PATH=$APP_PATH/shared
8
+
9
+ RUN mkdir -p $REL_PATH
10
+
11
+ WORKDIR $REL_PATH
12
+
13
+ COPY .ruby-version $REL_PATH/.ruby-version
14
+
15
+ RUN /bin/bash -l -c "rvm install --force $(cat .ruby-version); gem install bundler; rvm cleanup all"
@@ -0,0 +1,18 @@
1
+ FROM busybox:latest
2
+ MAINTAINER Ben Wu <wucheokman@gmail.com>
3
+
4
+ ENV DEPLOY_PATH=/opt/deploy
5
+ ENV APP_PATH=$DEPLOY_PATH/application
6
+ ENV REL_PATH=$APP_PATH/release
7
+ ENV SHARE_PATH=$APP_PATH/shared
8
+
9
+ RUN mkdir -p $REL_PATH && \
10
+ mkdir -p $APP_PATH/reports && \
11
+ mkdir -p $SHARE_PATH/build && \
12
+ mkdir -p $SHARE_PATH/log && \
13
+ mkdir -p $SHARE_PATH/pids && \
14
+ mkdir -p $SHARE_PATH/system
15
+
16
+ COPY . $REL_PATH
17
+ VOLUME /opt/deploy/application
18
+ LABEL application=<%= application %>
@@ -0,0 +1,27 @@
1
+ FROM cheokman/lax-base:latest
2
+ #FROM cheokman/todo-ruby:2.3.1
3
+ MAINTAINER Ben Wu <wucheokman@gmail.com>
4
+
5
+ ENV DEPLOY_PATH=/opt/deploy
6
+ ENV APP_PATH=$DEPLOY_PATH/application
7
+ ENV REL_PATH=$APP_PATH/release
8
+ ENV SHARE_PATH=$APP_PATH/shared
9
+
10
+ RUN mkdir -p $REL_PATH
11
+
12
+ WORKDIR $REL_PATH
13
+
14
+ COPY .ruby-version $REL_PATH/.ruby-version
15
+
16
+ RUN /bin/bash -l -c "rvm install --force $(cat .ruby-version); gem install bundler; rvm cleanup all"
17
+
18
+ ENV BUILD_PATH $SHARE_PATH/build
19
+
20
+ COPY scripts/test.sh /usr/local/bin/test.sh
21
+ RUN chmod +x /usr/local/bin/test.sh
22
+
23
+ ENTRYPOINT ["test.sh"]
24
+ CMD ["bundle", "exec", "rake", "spec:ci"]
25
+
26
+ VOLUME /opt/deploy/application
27
+ LABEL application=<%= application %>
@@ -0,0 +1,16 @@
1
+ FROM cheokman/lax-base:latest
2
+ MAINTAINER Ben Wu <wucheokman@gmail.com>
3
+
4
+ ENV DEPLOY_PATH=/opt/deploy
5
+ ENV APP_PATH=$DEPLOY_PATH/application
6
+ ENV REL_PATH=$APP_PATH/release
7
+ ENV SHARE_PATH=$APP_PATH/shared
8
+
9
+ RUN mkdir -p $APP_PATH
10
+
11
+ WORKDIR $REL_PATH
12
+ COPY .ruby-version $REL_PATH/.ruby-version
13
+
14
+ RUN /bin/bash -l -c "rvm install $(cat .ruby-version); gem install bundler; rvm cleanup all"
15
+
16
+ COPY target/. $APP_PATH
@@ -0,0 +1,53 @@
1
+ version: '2'
2
+ services:
3
+ test:
4
+ build:
5
+ context: ../../
6
+ dockerfile: docker/development/Dockerfile
7
+ volumes_from:
8
+ - cache
9
+ links:
10
+ - db
11
+ environment:
12
+ RAILS_ENV: test
13
+ HOST_IP: localhost
14
+ HOST_PORT: 3000
15
+ MYSQL_HOST: db
16
+ MYSQL_DATABASE: <%= application %>_test
17
+ MYSQL_USER: laxino
18
+ MYSQL_PASSWORD: password
19
+ TEST_OUTPUT_DIR: /opt/deploy/application/reports
20
+
21
+ builder:
22
+ build:
23
+ context: ../../
24
+ dockerfile: docker/development/Dockerfile
25
+ volumes_from:
26
+ - cache
27
+ entrypoint: "entrypoint.sh"
28
+ command: ['bundle', 'install']
29
+
30
+ agent:
31
+ image: cheokman/ansible
32
+ links:
33
+ - db
34
+ environment:
35
+ PROBE_HOST: "db"
36
+ PROBE_PORT: "3306"
37
+ command: ["probe.yml"]
38
+
39
+ db:
40
+ image: mysql:5.7
41
+ hostname: db
42
+ expose:
43
+ - "3306"
44
+ environment:
45
+ MYSQL_USER: laxino
46
+ MYSQL_DATABASE: <%= application %>_test
47
+ MYSQL_PASSWORD: password
48
+ MYSQL_ROOT_PASSWORD: password
49
+
50
+ cache:
51
+ build:
52
+ context: ../../
53
+ dockerfile: docker/development/Dockerfile.cache
@@ -0,0 +1,37 @@
1
+ version: '2'
2
+ services:
3
+ app:
4
+ build:
5
+ context: ../../
6
+ dockerfile: docker/release/Dockerfile
7
+ links:
8
+ - db
9
+ environment:
10
+ RAILS_ENV: production
11
+ HOST_IP: localhost
12
+ HOST_PORT: 3000
13
+ MYSQL_HOST: db
14
+ MYSQL_DATABASE: <%= application %>_production
15
+ MYSQL_USER: laxino
16
+ MYSQL_PASSWORD: password
17
+ TEST_OUTPUT_DIR: /opt/deploy/application/reports
18
+ command: ["bundle", "exec", "thin", "start"]
19
+
20
+ db:
21
+ image: mysql:5.7
22
+ hostname: db
23
+ expose:
24
+ - "3306"
25
+ environment:
26
+ MYSQL_USER: laxino
27
+ MYSQL_DATABASE: <%= application %>_production
28
+ MYSQL_PASSWORD: password
29
+ MYSQL_ROOT_PASSWORD: password
30
+ agent:
31
+ image: cheokman/ansible
32
+ links:
33
+ - db
34
+ environment:
35
+ PROBE_HOST: "db"
36
+ PROBE_PORT: "3306"
37
+ command: ["probe.yml"]
@@ -0,0 +1,10 @@
1
+ module <%= application_base %>::Api
2
+ class Service < ::Sinatra::Base
3
+ #
4
+ # define service routes here
5
+ #
6
+ get '/service' do
7
+ "Hello Service"
8
+ end
9
+ end
10
+ end