orchestration 0.6.14 → 0.6.15
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5284c8bbcd13c4f409437f693bc1c9042ae79368dae8e2c7eef4c00fb79b11f3
|
4
|
+
data.tar.gz: 9350eee6b69c1b7b85d7267513cf4b76dd12a2a6d0a9699c249cb2ecafc5c3b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 245335a561f1e72c5c74ca387e698c1a7186de4ee02de9f14cae0d0edf7257550d85eed880d590590ce3a7fd6b4eb9231461d336a50ab3a333f2064763f116bc
|
7
|
+
data.tar.gz: 6b8e6cbe7e45bee8acfef9ad828e986a8cf7c2ed702aced42d9ec029227004c091b7b60b01bd2ebdcf59f488f230728d17c8986068ad6a2b0f1a31f4997449b5
|
@@ -393,14 +393,13 @@ tag:
|
|
393
393
|
.PHONY: deploy
|
394
394
|
deploy: _log-notify _clean-logs
|
395
395
|
ifdef env_file
|
396
|
-
deploy: env_file_option =
|
396
|
+
deploy: env_file_option = . ${env_file}
|
397
397
|
endif
|
398
398
|
deploy: RAILS_ENV := ${env}
|
399
399
|
deploy: RACK_ENV := ${env}
|
400
400
|
deploy: DOCKER_TAG = ${git_version}
|
401
401
|
deploy: base_vars = DOCKER_ORGANIZATION=${docker_organization} DOCKER_REPOSITORY=${docker_repository} DOCKER_TAG=${git_version}
|
402
|
-
deploy:
|
403
|
-
deploy: config_cmd = ${compose_deploy} config
|
402
|
+
deploy: config_cmd := ( set -a ; ${env_file_option} ; ${base_vars} COMPOSE_PROJECT_NAME=${project_base} HOST_UID=$(shell id -u) docker stack config --compose-file orchestration/docker-compose.deployment.yml )
|
404
403
|
deploy: remote_cmd = cat | docker stack deploy --prune --with-registry-auth -c - ${project_base}
|
405
404
|
deploy: ssh_cmd = ssh "${manager}"
|
406
405
|
deploy: deploy_cmd := ${config_cmd} | ${ssh_cmd} "/bin/bash -lc '${remote_cmd}'"
|
@@ -0,0 +1,535 @@
|
|
1
|
+
|
2
|
+
### Environment setup ###
|
3
|
+
SHELL:=/bin/bash
|
4
|
+
MAKE:=mkpath=${mkpath} make --no-print-directory
|
5
|
+
ORCHESTRATION_DISABLE_ENV=1
|
6
|
+
export
|
7
|
+
TERM ?= 'dumb'
|
8
|
+
pwd:=$(shell pwd)
|
9
|
+
|
10
|
+
orchestration_dir_name=orchestration
|
11
|
+
orchestration_dir=orchestration
|
12
|
+
|
13
|
+
ifdef env_file
|
14
|
+
custom_env_file ?= 1
|
15
|
+
else
|
16
|
+
custom_env_file ?= 0
|
17
|
+
endif
|
18
|
+
|
19
|
+
ifneq (,$(wildcard ${pwd}/config/database.yml))
|
20
|
+
database_enabled = 1
|
21
|
+
else
|
22
|
+
database_enabled = 0
|
23
|
+
endif
|
24
|
+
|
25
|
+
red:=$(shell tput setaf 1)
|
26
|
+
green:=$(shell tput setaf 2)
|
27
|
+
yellow:=$(shell tput setaf 3)
|
28
|
+
blue:=$(shell tput setaf 4)
|
29
|
+
magenta:=$(shell tput setaf 5)
|
30
|
+
cyan:=$(shell tput setaf 6)
|
31
|
+
gray:=$(shell tput setaf 7)
|
32
|
+
reset:=$(shell tput sgr0)
|
33
|
+
tick=[${green}✓${reset}]
|
34
|
+
cross=[${red}✘${reset}]
|
35
|
+
|
36
|
+
make=$(MAKE) $1
|
37
|
+
orchestration_config_filename:=.orchestration.yml
|
38
|
+
orchestration_config:=${pwd}/${orchestration_config_filename}
|
39
|
+
system_prefix=${reset}[${cyan}exec${reset}]
|
40
|
+
warn_prefix=${reset}[${yellow}warn${reset}]
|
41
|
+
echo_prefix=${reset}[${blue}info${reset}]
|
42
|
+
fail_prefix=${reset}[${red}fail${reset}]
|
43
|
+
logs_prefix=${reset}[${green}logs${reset}]
|
44
|
+
system=echo '${system_prefix} ${cyan}$1${reset}'
|
45
|
+
warn=echo '${warn_prefix} ${reset}$1${reset}'
|
46
|
+
echo=echo '${echo_prefix} ${reset}$1${reset}'
|
47
|
+
fail=echo '${fail_prefix} ${reset}$1${reset}'
|
48
|
+
logs=echo '${logs_prefix} ${reset}$1${reset}'
|
49
|
+
print_error=printf '${red}\#${reset} '$1 | tee '${stderr}'
|
50
|
+
println_error=$(call print_error,$1'\n')
|
51
|
+
print=printf '${blue}\#${reset} '$1
|
52
|
+
println=$(call print,$1'\n')
|
53
|
+
printraw=printf $1
|
54
|
+
stdout=${pwd}/log/orchestration.stdout.log
|
55
|
+
stderr=${pwd}/log/orchestration.stderr.log
|
56
|
+
log_path_length:=$(shell echo "${stdout}" | wc -c)
|
57
|
+
ifndef verbose
|
58
|
+
log_tee:= 2>&1 | tee -a ${stdout}
|
59
|
+
log:= >>${stdout} 2>>${stderr}
|
60
|
+
progress_point:=perl -e 'printf("[${magenta}busy${reset}] "); while( my $$line = <STDIN> ) { printf("."); select()->flush(); }'
|
61
|
+
log_progress:= > >(tee -ai ${stdout} >&1 | ${progress_point}) 2> >(tee -ai ${stderr} 2>&1 | ${progress_point})
|
62
|
+
endif
|
63
|
+
hr:=$(call println,"$1$(shell head -c ${log_path_length} < /dev/zero | tr '\0' '=')${reset}")
|
64
|
+
managed_env_tag:=\# -|- ORCHESTRATION
|
65
|
+
standard_env_path:=${pwd}/.env
|
66
|
+
backup_env_path:=${pwd}/.env.orchestration.backup
|
67
|
+
is_managed_env:=$$(test -f '${standard_env_path}' && tail -n 1 '${standard_env_path}') == "${managed_env_tag}"*
|
68
|
+
token:=$(shell cat /dev/urandom | LC_CTYPE=C tr -dc 'a-z0-9' | fold -w8 | head -n1)
|
69
|
+
back_up_env:=( \
|
70
|
+
[ ! -f '${standard_env_path}' ] \
|
71
|
+
|| \
|
72
|
+
( \
|
73
|
+
[ -f '${standard_env_path}' ] \
|
74
|
+
&& cp '${standard_env_path}' '${backup_env_path}' \
|
75
|
+
) \
|
76
|
+
)
|
77
|
+
|
78
|
+
key_chars:=[a-zA-Z0-9_]
|
79
|
+
censored:=**********
|
80
|
+
censor=s/\(^${key_chars}*$(1)${key_chars}*\)=\(.*\)$$/\1=${censored}/
|
81
|
+
censor_urls:=s|\([a-zA-Z0-9_+]\+://.*:\).*\(@.*\)$$|\1${censored}\2|
|
82
|
+
format_env:=sed '$(call censor,SECRET); \
|
83
|
+
$(call censor,TOKEN); \
|
84
|
+
$(call censor,PRIVATE); \
|
85
|
+
$(call censor,KEY); \
|
86
|
+
$(censor_urls); \
|
87
|
+
/^\s*$$/d; \
|
88
|
+
/^\s*\#/d; \
|
89
|
+
s/\(^[a-zA-Z0-9_]\+\)=/${blue}\1${reset}=/; \
|
90
|
+
s/^/ /; \
|
91
|
+
s/=\(.*\)$$/=${yellow}\1${reset}/' | \
|
92
|
+
sort
|
93
|
+
|
94
|
+
exit_fail=( \
|
95
|
+
$(call printraw,' ${cross}') ; \
|
96
|
+
$(call make,dump src_cmd=$(MAKECMDGOALS)) ; \
|
97
|
+
echo ; \
|
98
|
+
$(call println,'Failed. ${cross}') ; \
|
99
|
+
exit 1 \
|
100
|
+
)
|
101
|
+
|
102
|
+
ifdef env_file
|
103
|
+
env_path=${env_file}
|
104
|
+
else
|
105
|
+
env_path=.env
|
106
|
+
endif
|
107
|
+
|
108
|
+
ifneq (${env},test)
|
109
|
+
ifeq (,$(findstring test,$(MAKECMDGOALS)))
|
110
|
+
ifeq (,$(findstring deploy,$(MAKECMDGOALS)))
|
111
|
+
ifeq (,$(findstring setup,$(MAKECMDGOALS)))
|
112
|
+
-include ${env_path}
|
113
|
+
endif
|
114
|
+
endif
|
115
|
+
endif
|
116
|
+
endif
|
117
|
+
|
118
|
+
ifneq (,$(findstring deploy,$(MAKECMDGOALS)))
|
119
|
+
RAILS_ENV=$(shell grep '^RAILS_ENV=' '${env_path}' | tail -n1 | sed 's/^RAILS_ENV=//')
|
120
|
+
endif
|
121
|
+
|
122
|
+
export
|
123
|
+
|
124
|
+
ifneq (,$(findstring test,$(MAKECMDGOALS)))
|
125
|
+
env=test
|
126
|
+
endif
|
127
|
+
|
128
|
+
ifneq (,$(RAILS_ENV))
|
129
|
+
env=$(RAILS_ENV)
|
130
|
+
else ifneq (,$(env))
|
131
|
+
# `env` set by current shell.
|
132
|
+
else ifneq (,$(RAILS_ENV))
|
133
|
+
env=$(RAILS_ENV)
|
134
|
+
else ifneq (,$(RACK_ENV))
|
135
|
+
env=$(RACK_ENV)
|
136
|
+
else
|
137
|
+
env=development
|
138
|
+
endif
|
139
|
+
|
140
|
+
env_human=${gray}${env}${reset}
|
141
|
+
DOCKER_TAG ?= latest
|
142
|
+
|
143
|
+
ifneq (,$(wildcard ./Gemfile))
|
144
|
+
bundle_cmd = bundle exec
|
145
|
+
endif
|
146
|
+
rake=ORCHESTRATION_DISABLE_ENV=1 DEVPACK_DISABLE=1 RACK_ENV=${env} SECRET_KEY_BASE='placeholder-secret' RAILS_ENV=${env} ${bundle_cmd} rake
|
147
|
+
|
148
|
+
ifneq (,$(wildcard ${env_file}))
|
149
|
+
ifeq (,$(findstring deploy,$(MAKECMDGOALS)))
|
150
|
+
rake_cmd:=${rake}
|
151
|
+
rake=. ${env_file} && ${rake_cmd}
|
152
|
+
endif
|
153
|
+
endif
|
154
|
+
|
155
|
+
docker_config:=$(shell DEVPACK_DISABLE=1 RAILS_ENV=development ${bundle_cmd} rake orchestration:config 2>/dev/null || echo no-org no-repo)
|
156
|
+
docker_organization=$(word 1,$(docker_config))
|
157
|
+
docker_repository=$(word 2,$(docker_config))
|
158
|
+
|
159
|
+
compose_services:=$(shell ${rake} orchestration:compose_services RAILS_ENV=${env})
|
160
|
+
|
161
|
+
ifeq (,$(project_name))
|
162
|
+
project_base = ${docker_repository}_${env}
|
163
|
+
else
|
164
|
+
project_base := $(project_name)
|
165
|
+
endif
|
166
|
+
|
167
|
+
ifeq (,$(findstring deploy,$(MAKECMDGOALS)))
|
168
|
+
sidecar_suffix := $(shell test -f ${orchestration_dir}/.sidecar && cat ${orchestration_dir}/.sidecar)
|
169
|
+
ifneq (,${sidecar_suffix})
|
170
|
+
sidecar := 1
|
171
|
+
endif
|
172
|
+
|
173
|
+
ifdef sidecar
|
174
|
+
# Set the variable to an empty string so that "#{sidecar-1234}" will
|
175
|
+
# evaluate to "1234" in port mappings.
|
176
|
+
sidecar_compose = sidecar=''
|
177
|
+
ifeq (,${sidecar_suffix})
|
178
|
+
sidecar_suffix := $(call token)
|
179
|
+
_ignore := $(shell echo ${sidecar_suffix} > ${orchestration_dir}/.sidecar)
|
180
|
+
endif
|
181
|
+
|
182
|
+
ifeq (,${sidecar_suffix})
|
183
|
+
$(warning Unable to generate project suffix; project name collisions may occur.)
|
184
|
+
endif
|
185
|
+
compose_project_name_base = ${project_base}_${sidecar_suffix}
|
186
|
+
else
|
187
|
+
compose_project_name_base = ${project_base}
|
188
|
+
endif
|
189
|
+
else
|
190
|
+
compose_project_name_base = ${project_base}
|
191
|
+
endif
|
192
|
+
|
193
|
+
ifdef COMPOSE_PROJECT_NAME_SUFFIX
|
194
|
+
compose_project_name = ${compose_project_name_base}_${COMPOSE_PROJECT_NAME_SUFFIX}
|
195
|
+
else
|
196
|
+
compose_project_name = ${compose_project_name_base}
|
197
|
+
endif
|
198
|
+
|
199
|
+
compose_base:=env -i \
|
200
|
+
PATH=$(PATH) \
|
201
|
+
HOST_UID=$(shell id -u) \
|
202
|
+
DOCKER_ORGANIZATION="${docker_organization}" \
|
203
|
+
DOCKER_REPOSITORY="${docker_repository}" \
|
204
|
+
COMPOSE_PROJECT_NAME="${compose_project_name}" \
|
205
|
+
COMPOSE_PROJECT_NAME_SUFFIX="${COMPOSE_PROJECT_NAME_SUFFIX}" \
|
206
|
+
${sidecar_compose} \
|
207
|
+
docker-compose \
|
208
|
+
-f ${orchestration_dir}/docker-compose.${env}.yml
|
209
|
+
|
210
|
+
git_branch := $(if $(branch),$(branch),$(shell git rev-parse --abbrev-ref HEAD 2>/dev/null || echo no-branch))
|
211
|
+
ifndef dev
|
212
|
+
git_version := $(shell git rev-parse --short --verify ${git_branch} 2>/dev/null || echo no-version)
|
213
|
+
else
|
214
|
+
git_version := dev
|
215
|
+
endif
|
216
|
+
|
217
|
+
docker_image:=${docker_organization}/${docker_repository}:${git_version}
|
218
|
+
|
219
|
+
compose=${compose_base}
|
220
|
+
compose_human=docker-compose -f ${orchestration_dir_name}/docker-compose.${env}.yml
|
221
|
+
random_str=cat /dev/urandom | LC_ALL=C tr -dc 'a-z' | head -c $1
|
222
|
+
|
223
|
+
ifneq (,$(wildcard ${orchestration_dir}/docker-compose.local.yml))
|
224
|
+
compose:=${compose} -f ${orchestration_dir}/docker-compose.local.yml
|
225
|
+
endif
|
226
|
+
|
227
|
+
all: build
|
228
|
+
|
229
|
+
### Container management commands ###
|
230
|
+
|
231
|
+
.PHONY: pull
|
232
|
+
pull:
|
233
|
+
@$(call system,${compose_human} pull)
|
234
|
+
@${compose} pull
|
235
|
+
|
236
|
+
.PHONY: start
|
237
|
+
ifndef network
|
238
|
+
start: network := ${compose_project_name}
|
239
|
+
endif
|
240
|
+
start: _create-log-directory _clean-logs pull
|
241
|
+
ifneq (,${compose_services})
|
242
|
+
@$(call system,${compose_human} up --detach)
|
243
|
+
ifeq (${env},$(filter ${env},test development))
|
244
|
+
@${compose} up --detach --force-recreate --renew-anon-volumes --remove-orphans ${services} ${log} || ${exit_fail}
|
245
|
+
@[ -n '${sidecar}' ] && \
|
246
|
+
( \
|
247
|
+
$(call echo,(joining dependency network ${cyan}${network}${reset})) ; \
|
248
|
+
$(call system,docker network connect "${network}") ; \
|
249
|
+
docker network connect '${network}' '$(shell hostname)' ${log} \
|
250
|
+
|| ( \
|
251
|
+
$(call warn,Unable to join network: "${cyan}${network}${reset}". Container will not be able to connect to dependency services) ; \
|
252
|
+
$(call echo,Try deleting "${cyan}orchestration/.sidecar${reset}" if you do not want to use sidecar mode) ; \
|
253
|
+
) \
|
254
|
+
) \
|
255
|
+
|| ( [ -z '${sidecar}' ] || ${exit_fail} )
|
256
|
+
else
|
257
|
+
@${compose} up --detach --scale app=$${instances:-1} ${log} || ${exit_fail}
|
258
|
+
endif
|
259
|
+
@$(call echo,${env_human} containers started ${tick})
|
260
|
+
@$(call echo,Waiting for services to become available)
|
261
|
+
@$(call make,wait) 2>${stderr} || ${exit_fail}
|
262
|
+
endif
|
263
|
+
|
264
|
+
.PHONY: stop
|
265
|
+
stop: network := ${compose_project_name}
|
266
|
+
stop:
|
267
|
+
ifneq (,${compose_services})
|
268
|
+
@$(call echo,Stopping ${env_human} containers)
|
269
|
+
@$(call system,${compose_human} down)
|
270
|
+
@if docker ps --format "{{.ID}}" | grep -q $(shell hostname) ; \
|
271
|
+
then \
|
272
|
+
( docker network disconnect ${network} $(shell hostname) ${log} || : ) \
|
273
|
+
&& \
|
274
|
+
( ${compose} down ${log} || ${exit_fail} ) ; \
|
275
|
+
else \
|
276
|
+
${compose} down ${log} || ${exit_fail} ; \
|
277
|
+
fi
|
278
|
+
@$(call echo,${env_human} containers stopped ${tick})
|
279
|
+
endif
|
280
|
+
|
281
|
+
.PHONY: logs
|
282
|
+
logs:
|
283
|
+
@${compose} logs -f
|
284
|
+
|
285
|
+
.PHONY: config
|
286
|
+
config:
|
287
|
+
@${compose} config
|
288
|
+
|
289
|
+
.PHONY: compose
|
290
|
+
compose:
|
291
|
+
@echo ${compose}
|
292
|
+
|
293
|
+
### Development/Test Utility Commands
|
294
|
+
|
295
|
+
.PHONY: serve
|
296
|
+
serve: env_file ?= ./.env
|
297
|
+
serve: rails = RAILS_ENV='${env}' bundle exec rails server ${server}
|
298
|
+
serve:
|
299
|
+
@if [ -f "${env_file}" ] ; \
|
300
|
+
then ( \
|
301
|
+
$(call echo,Environment${reset}: ${cyan}${env_file}${reset}) && \
|
302
|
+
cat '${env_file}' | ${format_env} \
|
303
|
+
) ; \
|
304
|
+
fi
|
305
|
+
${rails}
|
306
|
+
|
307
|
+
.PHONY: console
|
308
|
+
console: env_file ?= ./.env
|
309
|
+
console: rails = RAILS_ENV='${env}' bundle exec rails
|
310
|
+
console:
|
311
|
+
@if [ -f "${env_file}" ] ; \
|
312
|
+
then ( \
|
313
|
+
$(call echo,Environment${reset}: ${cyan}${env_file}${reset}) && \
|
314
|
+
cat '${env_file}' | ${format_env} \
|
315
|
+
) ; \
|
316
|
+
fi
|
317
|
+
${rails} console
|
318
|
+
|
319
|
+
.PHONY: db-console
|
320
|
+
db-console:
|
321
|
+
@${rake} orchestration:db:console RAILS_ENV=${env}
|
322
|
+
|
323
|
+
.PHONY: setup
|
324
|
+
ifneq (,$(wildcard config/database.yml))
|
325
|
+
setup: url := $(shell ${rake} orchestration:db:url RAILS_ENV=${env} 2>/dev/null)
|
326
|
+
endif
|
327
|
+
setup: _log-notify
|
328
|
+
@$(call echo,Setting up ${env_human} environment)
|
329
|
+
@$(call make,start env=${env})
|
330
|
+
ifneq (,$(wildcard config/database.yml))
|
331
|
+
@$(call echo,Preparing ${env_human} database)
|
332
|
+
@$(call system,rake db:create RAILS_ENV="${env}")
|
333
|
+
@${rake} db:create RAILS_ENV=${env} DATABASE_URL='${url}' ${log} || : ${log}
|
334
|
+
ifneq (,$(wildcard db/structure.sql))
|
335
|
+
@$(call system,rake db:structure:load RAILS_ENV="${env}" ${url_prefix}DATABASE_URL="${url}")
|
336
|
+
@${rake} db:structure:load RAILS_ENV="${env}" DATABASE_URL='${url}' ${log} || ${exit_fail}
|
337
|
+
else ifneq (,$(wildcard db/schema.rb))
|
338
|
+
@$(call system,rake db:schema:load RAILS_ENV="${env}" ${url_prefix}DATABASE_URL="${url}")
|
339
|
+
@${rake} db:schema:load RAILS_ENV="${env}" DATABASE_URL='${url}' ${log} || ${exit_fail}
|
340
|
+
endif
|
341
|
+
@$(call system,rake db:migrate RAILS_ENV="${env}" ${url_prefix}DATABASE_URL="${url}")
|
342
|
+
@${rake} db:migrate RAILS_ENV="${env}" DATABASE_URL='${url}' ${log} || ${exit_fail}
|
343
|
+
endif
|
344
|
+
@if $(MAKE) -n post-setup >/dev/null 2>&1; then \
|
345
|
+
$(call system,make post-setup RAILS_ENV="${env}") \
|
346
|
+
&& $(MAKE) post-setup RAILS_ENV=${env}; fi
|
347
|
+
@$(call echo,${env_human} environment setup complete ${tick})
|
348
|
+
|
349
|
+
.PHONY: dump
|
350
|
+
dump:
|
351
|
+
ifndef verbose
|
352
|
+
@$(call println)
|
353
|
+
@$(call println,'${yellow}Captured${reset} ${green}stdout${reset} ${yellow}and${reset} ${red}stderr${reset} ${yellow}log data [${cyan}${env}${yellow}]${reset}:')
|
354
|
+
@$(call println)
|
355
|
+
@echo
|
356
|
+
@test -f '${stdout}' && ( \
|
357
|
+
$(call hr,${green}) ; \
|
358
|
+
$(call println,'${gray}${stdout}${reset}') ; \
|
359
|
+
$(call hr,${green}) ; \
|
360
|
+
echo ; cat '${stdout}' ; echo ; \
|
361
|
+
$(call hr,${green}) ; \
|
362
|
+
)
|
363
|
+
|
364
|
+
@test -f '${stdout}' && ( \
|
365
|
+
echo ; \
|
366
|
+
$(call hr,${red}) ; \
|
367
|
+
$(call println,'${gray}${stderr}${reset}') ; \
|
368
|
+
$(call hr,${red}) ; \
|
369
|
+
echo ; cat '${stderr}' ; echo ; \
|
370
|
+
$(call hr,${red}) ; \
|
371
|
+
)
|
372
|
+
endif
|
373
|
+
ifneq (build,${src_cmd})
|
374
|
+
ifneq (push,${src_cmd})
|
375
|
+
@echo ; \
|
376
|
+
$(call hr,${yellow}) ; \
|
377
|
+
$(call println,'${gray}docker-compose logs${reset}') ; \
|
378
|
+
$(call hr,${yellow}) ; \
|
379
|
+
echo
|
380
|
+
@${compose} logs
|
381
|
+
@echo ; \
|
382
|
+
$(call hr,${yellow})
|
383
|
+
@$(NOOP)
|
384
|
+
endif
|
385
|
+
endif
|
386
|
+
|
387
|
+
.PHONY: tag
|
388
|
+
tag:
|
389
|
+
@echo ${docker_image}
|
390
|
+
|
391
|
+
### Deployment utility commands ###
|
392
|
+
|
393
|
+
.PHONY: deploy
|
394
|
+
deploy: _log-notify _clean-logs
|
395
|
+
ifdef env_file
|
396
|
+
deploy: env_file_option = --env-file ${env_file}
|
397
|
+
endif
|
398
|
+
deploy: RAILS_ENV := ${env}
|
399
|
+
deploy: RACK_ENV := ${env}
|
400
|
+
deploy: DOCKER_TAG = ${git_version}
|
401
|
+
deploy: base_vars = DOCKER_ORGANIZATION=${docker_organization} DOCKER_REPOSITORY=${docker_repository} DOCKER_TAG=${git_version}
|
402
|
+
deploy: compose_deploy := ${base_vars} COMPOSE_PROJECT_NAME=${project_base} HOST_UID=$(shell id -u) docker-compose ${env_file_option} --project-name ${project_base} -f orchestration/docker-compose.deployment.yml
|
403
|
+
deploy: config_cmd = ${compose_deploy} config
|
404
|
+
deploy: remote_cmd = cat | docker stack deploy --prune --with-registry-auth -c - ${project_base}
|
405
|
+
deploy: ssh_cmd = ssh "${manager}"
|
406
|
+
deploy: deploy_cmd := ${config_cmd} | ${ssh_cmd} "/bin/bash -lc '${remote_cmd}'"
|
407
|
+
deploy:
|
408
|
+
ifndef manager
|
409
|
+
@$(call fail,Missing ${cyan}manager${reset} parameter: ${cyan}make deploy manager=swarm-manager.example.com${reset}) ; exit 1
|
410
|
+
endif
|
411
|
+
@$(call echo,Deploying ${env_human} stack via ${cyan}${manager}${reset} as ${cyan}${project_base}${reset}) && \
|
412
|
+
( \
|
413
|
+
( test -f '${env_file}' && $(call echo,Deployment environment:) && cat '${env_file}' | ${format_env} || : ) && \
|
414
|
+
$(call echo,Application image: ${cyan}${docker_image}${reset}) ; \
|
415
|
+
$(call system,${config_cmd} | ${ssh_cmd} "/bin/bash -lc '\''${remote_cmd}'\''") ; \
|
416
|
+
${deploy_cmd} \
|
417
|
+
)
|
418
|
+
@$(call echo,Deployment ${green}complete${reset} ${tick})
|
419
|
+
|
420
|
+
.PHONY: rollback
|
421
|
+
ifndef service
|
422
|
+
rollback: service = app
|
423
|
+
endif
|
424
|
+
rollback:
|
425
|
+
ifndef manager
|
426
|
+
@$(call fail,Missing `manager` parameter: `make deploy manager=swarm-manager.example.com`)
|
427
|
+
@exit 1
|
428
|
+
endif
|
429
|
+
@$(call echo,Rolling back ${cyan}${compose_project_name}_${service}${reset} via ${cyan}${manager}${reset} ...)
|
430
|
+
@$(call system,docker service rollback --detach "${compose_project_name}_${service}")
|
431
|
+
@ssh "${manager}" 'docker service rollback --detach "${compose_project_name}_${service}"' ${log} || ${exit_fail}
|
432
|
+
@$(call echo,Rollback request ${green}complete${reset} ${tick})
|
433
|
+
|
434
|
+
### Service healthcheck commands ###
|
435
|
+
|
436
|
+
.PHONY: wait
|
437
|
+
wait:
|
438
|
+
@${rake} orchestration:wait
|
439
|
+
@$(call echo,${env_human} services ${green}ready${reset} ${tick})
|
440
|
+
|
441
|
+
## Generic Listener healthcheck for TCP services ##
|
442
|
+
|
443
|
+
wait-listener:
|
444
|
+
@${rake} orchestration:listener:wait service=${service} sidecar=${sidecar}
|
445
|
+
|
446
|
+
### Docker build commands ###
|
447
|
+
|
448
|
+
.PHONY: build
|
449
|
+
build: _log-notify _clean-logs
|
450
|
+
build: build_dir = ${orchestration_dir}/.build
|
451
|
+
build: context = ${build_dir}/context.tar
|
452
|
+
build: build_args := --build-arg GIT_COMMIT='${git_version}' $(shell grep '^ARG ' orchestration/Dockerfile | sed -e 's/=.*$$//' -e 's/^ARG /--build-arg /')
|
453
|
+
build: tag_human = ${cyan}${docker_organization}/${docker_repository}:${git_version}${reset}
|
454
|
+
build: latest_tag_human = ${cyan}${docker_organization}/${docker_repository}:latest${reset}
|
455
|
+
build: _create-log-directory check-local-changes
|
456
|
+
@$(call echo,Preparing build context from ${cyan}${git_branch}${reset} (${cyan}${git_version}${reset})${reset})
|
457
|
+
@$(call system,git archive --format "tar" -o "${context}" "${git_branch}")
|
458
|
+
@mkdir -p ${orchestration_dir}/.build ${log} || ${exit_fail}
|
459
|
+
@cp '$(shell bundle info --path orchestration)/lib/orchestration/healthcheck.bash' '${orchestration_dir}/healthcheck'
|
460
|
+
@chmod +x '${orchestration_dir}/healthcheck'
|
461
|
+
ifndef dev
|
462
|
+
@git show ${git_branch}:./Gemfile > ${orchestration_dir}/.build/Gemfile 2>${stderr} || ${exit_fail}
|
463
|
+
@git show ${git_branch}:./Gemfile.lock > ${orchestration_dir}/.build/Gemfile.lock 2>${stderr} || ${exit_fail}
|
464
|
+
@git archive --format 'tar' -o '${context}' '${git_branch}' ${log} || ${exit_fail}
|
465
|
+
else
|
466
|
+
@tar -cvf '${context}' . ${log} || ${exit_fail}
|
467
|
+
endif
|
468
|
+
@tar --append --file '${context}' '${orchestration_dir}/healthcheck'
|
469
|
+
@rm '${orchestration_dir}/healthcheck'
|
470
|
+
ifdef include
|
471
|
+
@$(call echo,Including files from: ${cyan}${include}${reset})
|
472
|
+
@(while read line; do \
|
473
|
+
export line; \
|
474
|
+
include_dir="${build_dir}/$$(dirname "$${line}")/" && \
|
475
|
+
mkdir -p "$${include_dir}" && cp "$${line}" "$${include_dir}" \
|
476
|
+
&& (cd '${orchestration_dir}/.build/' && tar rf 'context.tar' "$${line}"); \
|
477
|
+
echo "${system_prefix}" "tar rf 'context.tar' '$${line}'"; \
|
478
|
+
done < '${include}') ${log} || ${exit_fail}
|
479
|
+
@$(call echo,Build context ${green}ready${reset} ${tick})
|
480
|
+
endif
|
481
|
+
@$(call echo,Building image ${tag_human})
|
482
|
+
@$(call system,docker build ${build_args} -t ${docker_organization}/${docker_repository}:${git_version} ${orchestration_dir}/)
|
483
|
+
@docker build ${build_args} \
|
484
|
+
-t ${docker_organization}/${docker_repository}:${git_version} \
|
485
|
+
${orchestration_dir}/ ${log_progress} || ${exit_fail}
|
486
|
+
@echo
|
487
|
+
@$(call echo,Build ${green}complete${reset} ${tick})
|
488
|
+
@$(call echo,[${green}tag${reset}] ${tag_human})
|
489
|
+
|
490
|
+
.PHONY: push
|
491
|
+
push: _log-notify _clean-logs
|
492
|
+
@$(call echo,Pushing ${cyan}${docker_image}${reset} to registry)
|
493
|
+
@$(call system,docker push ${docker_image})
|
494
|
+
@docker push ${docker_image} ${log_progress} || ${exit_fail}
|
495
|
+
@echo
|
496
|
+
@$(call echo,Push ${green}complete${reset} ${tick})
|
497
|
+
|
498
|
+
.PHONY: check-local-changes
|
499
|
+
check-local-changes:
|
500
|
+
ifndef dev
|
501
|
+
@changes="$$(git status --porcelain)"; if ! [ -z "${changes}" ] && [[ "${changes}" != "?? orchestration/.sidecar" ]]; \
|
502
|
+
then \
|
503
|
+
$(call warn,You have uncommitted changes which will not be included in your build:) ; \
|
504
|
+
git status --porcelain ; \
|
505
|
+
$(call echo,Commit these changes to Git or, alternatively, build in development mode to test your changes before committing: ${cyan}make build dev=1${reset}) ; \
|
506
|
+
fi
|
507
|
+
endif
|
508
|
+
|
509
|
+
### Internal Commands ###
|
510
|
+
#
|
511
|
+
.PHONY: _log-notify
|
512
|
+
_log-notify: comma=,
|
513
|
+
_log-notify: _verify-repository
|
514
|
+
ifndef verbose
|
515
|
+
@$(call logs,${green}stdout${reset}: ${cyan}log/orchestration.stdout.log${reset}${comma} ${red}stderr${reset}: ${cyan}log/orchestration.stderr.log)
|
516
|
+
endif
|
517
|
+
|
518
|
+
.PHONY: _verify-repository
|
519
|
+
_verify-repository:
|
520
|
+
@if ! git rev-parse HEAD >/dev/null 2>&1 ; then $(call fail,You must make at least one commit before you can use Orchestration commands) ; exit 1 ; fi
|
521
|
+
|
522
|
+
.PHONY: _clean-logs
|
523
|
+
_clean-logs:
|
524
|
+
_clean-logs: _create-log-directory
|
525
|
+
@rm -f '${stdout}' '${stderr}'
|
526
|
+
@touch '${stdout}' '${stderr}'
|
527
|
+
|
528
|
+
.PHONY: _create-log-directory
|
529
|
+
_create-log-directory:
|
530
|
+
@mkdir -p log
|
531
|
+
|
532
|
+
# Used by Orchestration test suite to verify Makefile syntax
|
533
|
+
.PHONY: _test
|
534
|
+
_test:
|
535
|
+
@echo 'test command'
|
@@ -14,14 +14,10 @@ RUN apt-get update \
|
|
14
14
|
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
|
15
15
|
&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
|
16
16
|
&& apt-get update \
|
17
|
-
&& apt-get install nodejs \
|
17
|
+
&& DEBIAN_FRONTEND=noninteractive apt-get install -y nodejs \
|
18
18
|
&& rm -rf /var/lib/apt/lists/* \
|
19
19
|
&& gem install bundler \
|
20
20
|
&& mkdir /app<%if defined?(Webpacker) %> \
|
21
|
-
&& curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash \
|
22
|
-
&& . /root/.bashrc \
|
23
|
-
&& npm config set user 0 \
|
24
|
-
&& npm config set unsafe-perm true \
|
25
21
|
&& npm install -g yarn<% end %>
|
26
22
|
WORKDIR /app
|
27
23
|
COPY .build/Gemfile .build/Gemfile.lock ./
|
@@ -29,7 +25,7 @@ RUN bundle config set deployment 'true' \
|
|
29
25
|
&& bundle config set without 'development test' \
|
30
26
|
&& bundle install
|
31
27
|
ADD .build/context.tar .
|
32
|
-
<% if defined?(Webpacker) %>RUN
|
28
|
+
<% if defined?(Webpacker) %>RUN NODE_ENV=production RAILS_ENV=production yarn install && NODE_ENV=production RAILS_ENV=production SECRET_KEY_BASE=placeholder-secret bundle exec rake assets:precompile<% elsif Rake::Task.tasks.map(&:name).include?('assets:precompile') %>RUN NODE_ENV=production RAILS_ENV=production SECRET_KEY_BASE=placeholder-secret bundle exec rake assets:precompile<% end %>
|
33
29
|
RUN echo "${GIT_COMMIT}" > /app/GIT_COMMIT
|
34
30
|
HEALTHCHECK --interval=<%= healthcheck['interval'] %> \
|
35
31
|
--timeout=<%= healthcheck['timeout'] %> \
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orchestration
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bob Farrell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: database_url
|
@@ -403,6 +403,7 @@ files:
|
|
403
403
|
- lib/orchestration/install_generator.rb
|
404
404
|
- lib/orchestration/make.rb
|
405
405
|
- lib/orchestration/make/orchestration.mk
|
406
|
+
- lib/orchestration/make/orchestration.mk.orig
|
406
407
|
- lib/orchestration/railtie.rb
|
407
408
|
- lib/orchestration/service_check.rb
|
408
409
|
- lib/orchestration/services.rb
|