forked from uselagoon/lagoon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
689 lines (581 loc) · 30.1 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
SHELL := /bin/bash
# amazee.io lagoon Makefile The main purpose of this Makefile is to provide easier handling of
# building images and running tests It understands the relation of the different images (like
# nginx-drupal is based on nginx) and builds them in the correct order Also it knows which
# services in docker-compose.yml are depending on which base images or maybe even other service
# images
#
# The main commands are:
# make build/<imagename>
# Builds an individual image and all of it's needed parents. Run `make build-list` to get a list of
# all buildable images. Make will keep track of each build image with creating an empty file with
# the name of the image in the folder `build`. If you want to force a rebuild of the image, either
# remove that file or run `make clean`
# make build
# builds all images in the correct order. Uses existing images for layer caching, define via `TAG`
# which branch should be used
# make tests/<testname>
# Runs individual tests. In a nutshell it does:
# 1. Builds all needed images for the test
# 2. Starts needed Lagoon services for the test via docker-compose up
# 3. Executes the test
#
# Run `make tests-list` to see a list of all tests.
# make tests
# Runs all tests together. Can be executed with `-j2` for two parallel running tests
# make up
# Starts all Lagoon Services at once, usefull for local development or just to start all of them.
# make logs
# Shows logs of Lagoon Services (aka docker-compose logs -f)
# make minishift
# Some tests need a full openshift running in order to test deployments and such. This can be
# started via openshift. It will:
# 1. Download minishift cli
# 2. Start an OpenShift Cluster
# 3. Configure OpenShift cluster to our needs
# make minishift/stop
# Removes an OpenShift Cluster
# make minishift/clean
# Removes all openshift related things: OpenShift itself and the minishift cli
#######
####### Default Variables
#######
# Parameter for all `docker build` commands, can be overwritten with `DOCKER_BUILD_PARAMS=` in cli
DOCKER_BUILD_PARAMS := --quiet
# Version and Hash of the OpenShift cli that should be downloaded
MINISHIFT_VERSION := 1.15.1
MINISHIFT_CPUS := 6
MINISHIFT_MEMORY := 2GB
MINISHIFT_DISK_SIZE := 30GB
# On CI systems like jenkins we need a way to run multiple testings at the same time. We expect the
# CI systems to define an Environment variable CI_BUILD_TAG which uniquely identifies each build.
# If it's not set we assume that we are running local and just call it lagoon.
CI_BUILD_TAG ?= lagoon
ARCH := $(shell uname)
VERSION := $(shell git describe --tags --exact-match 2>/dev/null || echo development)
# Docker Image Tag that should be used when publishing to docker hub registry
PUBLISH_TAG :=
#######
####### Functions
#######
# Builds a docker image. Expects as arguments: name of the image, location of Dockerfile, path of
# Docker Build Context
docker_build = docker build $(DOCKER_BUILD_PARAMS) --build-arg LAGOON_VERSION=$(VERSION) --build-arg IMAGE_REPO=$(CI_BUILD_TAG) -t $(CI_BUILD_TAG)/$(1) -f $(2) $(3)
# Build a PHP docker image. Expects as arguments:
# 1. PHP version
# 2. PHP version and type of image (ie 7.0-fpm, 7.0-cli etc)
# 3. Location of Dockerfile
# 4. Path of Docker Build Context
docker_build_php = docker build $(DOCKER_BUILD_PARAMS) --build-arg IMAGE_REPO=$(CI_BUILD_TAG) --build-arg PHP_VERSION=$(1) -t $(CI_BUILD_TAG)/php:$(2) -f $(3) $(4)
docker_build_node = docker build $(DOCKER_BUILD_PARAMS) --build-arg IMAGE_REPO=$(CI_BUILD_TAG) --build-arg NODE_VERSION=$(1) -t $(CI_BUILD_TAG)/node:$(2) -f $(3) $(4)
docker_build_solr = docker build $(DOCKER_BUILD_PARAMS) --build-arg IMAGE_REPO=$(CI_BUILD_TAG) --build-arg SOLR_MAJ_MIN_VERSION=$(1) -t $(CI_BUILD_TAG)/solr:$(2) -f $(3) $(4)
# Tags and image with the `amazeeio` repository and pushes it
docker_publish_amazeeio_baseimages = docker tag $(CI_BUILD_TAG)/$(1) amazeeio/$(1) && docker push amazeeio/$(1) | cat
# Tags and image with the `amazeeiolagoon` repository and pushes it
docker_publish_amazeeiolagoon_serviceimages = docker tag $(CI_BUILD_TAG)/$(1) amazeeiolagoon/$(1):$(PUBLISH_TAG) && docker push amazeeiolagoon/$(1):$(PUBLISH_TAG) | cat
docker_publish_amazeeiolagoon_baseimages = docker tag $(CI_BUILD_TAG)/$(1) amazeeiolagoon/$(PUBLISH_TAG)-$(1) && docker push amazeeiolagoon/$(PUBLISH_TAG)-$(1) | cat
#######
####### Base Images
#######
####### Base Images are the base for all other images and are also published for clients to use during local development
images := oc \
mariadb \
mariadb-drupal \
postgres \
postgres-drupal \
oc-build-deploy-dind \
commons \
nginx \
nginx-drupal \
varnish \
varnish-drupal \
redis \
mongo \
elasticsearch \
kibana \
logstash \
curator \
docker-host
# base-images is a variable that will be constantly filled with all base image there are
base-images += $(images)
s3-images += $(images)
# List with all images prefixed with `build/`. Which are the commands to actually build images
build-images = $(foreach image,$(images),build/$(image))
# Define the make recepie for all base images
$(build-images):
# Generate variable image without the prefix `build/`
$(eval image = $(subst build/,,$@))
# Call the docker build
$(call docker_build,$(image),images/$(image)/Dockerfile,images/$(image))
# Touch an empty file which make itself is using to understand when the image has been last build
touch $@
# Define dependencies of Base Images so that make can build them in the right order. There are two
# types of Dependencies
# 1. Parent Images, like `build/centos7-node6` is based on `build/centos7` and need to be rebuild
# if the parent has been built
# 2. Dockerfiles of the Images itself, will cause make to rebuild the images if something has
# changed on the Dockerfiles
build/mariadb: build/commons images/mariadb/Dockerfile
build/mariadb-drupal: build/mariadb images/mariadb-drupal/Dockerfile
build/postgres: build/commons images/postgres/Dockerfile
build/postgres-drupal: build/postgres images/postgres-drupal/Dockerfile
build/commons: images/commons/Dockerfile
build/nginx: build/commons images/nginx/Dockerfile
build/nginx-drupal: build/nginx images/nginx-drupal/Dockerfile
build/varnish: build/commons images/varnish/Dockerfile
build/varnish-drupal: build/varnish images/varnish-drupal/Dockerfile
build/redis: build/commons images/redis/Dockerfile
build/mongo: build/commons images/mongo/Dockerfile
build/elasticsearch: build/commons images/elasticsearch/Dockerfile
build/logstash: build/commons images/logstash/Dockerfile
build/kibana: build/commons images/kibana/Dockerfile
build/docker-host: build/commons images/docker-host/Dockerfile
build/oc: build/commons images/oc/Dockerfile
build/curator: build/commons images/curator/Dockerfile
build/oc-build-deploy-dind: build/oc images/oc-build-deploy-dind
#######
####### PHP Images
#######
####### PHP Images are alpine linux based PHP images.
phpimages := php__5.6-fpm \
php__7.0-fpm \
php__7.1-fpm \
php__7.2-fpm \
php__5.6-cli \
php__7.0-cli \
php__7.1-cli \
php__7.2-cli \
php__5.6-cli-drupal \
php__7.0-cli-drupal \
php__7.1-cli-drupal \
php__7.2-cli-drupal
build-phpimages = $(foreach image,$(phpimages),build/$(image))
# Define the make recepie for all base images
$(build-phpimages): build/commons
$(eval clean = $(subst build/php__,,$@))
$(eval version = $(word 1,$(subst -, ,$(clean))))
$(eval type = $(word 2,$(subst -, ,$(clean))))
$(eval subtype = $(word 3,$(subst -, ,$(clean))))
# this fills variables only if $type is existing, if not they are just empty
$(eval type_dash = $(if $(type),-$(type)))
$(eval type_slash = $(if $(type),/$(type)))
# if there is a subtype, add it. If not, just keep what we already had
$(eval type_dash = $(if $(subtype),-$(type)-$(subtype),$(type_dash)))
$(eval type_slash = $(if $(subtype),/$(type)-$(subtype),$(type_slash)))
# Call the docker build
$(call docker_build_php,$(version),$(version)$(type_dash),images/php$(type_slash)/Dockerfile,images/php$(type_slash))
# Touch an empty file which make itself is using to understand when the image has been last build
touch $@
base-images += $(phpimages)
s3-images += php
build/php__5.6-fpm build/php__7.0-fpm build/php__7.1-fpm build/php__7.2-fpm: images/commons
build/php__5.6-cli: build/php__5.6-fpm
build/php__7.0-cli: build/php__7.0-fpm
build/php__7.1-cli: build/php__7.1-fpm
build/php__7.2-cli: build/php__7.2-fpm
build/php__5.6-cli-drupal: build/php__5.6-cli
build/php__7.0-cli-drupal: build/php__7.0-cli
build/php__7.1-cli-drupal: build/php__7.1-cli
build/php__7.2-cli-drupal: build/php__7.2-cli
#######
####### Solr Images
#######
####### Solr Images are alpine linux based Solr images.
solrimages := solr__5.5 \
solr__6.6 \
solr__5.5-drupal \
solr__6.6-drupal
build-solrimages = $(foreach image,$(solrimages),build/$(image))
# Define the make recepie for all base images
$(build-solrimages): build/commons
$(eval clean = $(subst build/solr__,,$@))
$(eval version = $(word 1,$(subst -, ,$(clean))))
$(eval type = $(word 2,$(subst -, ,$(clean))))
# this fills variables only if $type is existing, if not they are just empty
$(eval type_dash = $(if $(type),-$(type)))
# Call the docker build
$(call docker_build_solr,$(version),$(version)$(type_dash),images/solr$(type_dash)/Dockerfile,images/solr$(type_dash))
# Touch an empty file which make itself is using to understand when the image has been last build
touch $@
base-images += $(solrimages)
s3-images += solr
build/solr__5.5 build/solr__6.6: images/commons
build/solr__5.5-drupal: build/solr__5.5
build/solr__6.6-drupal: build/solr__6.6
#######
####### Node Images
#######
####### Node Images are alpine linux based Node images.
nodeimages := node__10 \
node__9 \
node__8 \
node__6 \
node__10-builder \
node__9-builder \
node__8-builder \
node__6-builder
build-nodeimages = $(foreach image,$(nodeimages),build/$(image))
# Define the make recepie for all base images
$(build-nodeimages): build/commons
$(eval clean = $(subst build/node__,,$@))
$(eval version = $(word 1,$(subst -, ,$(clean))))
$(eval type = $(word 2,$(subst -, ,$(clean))))
# this fills variables only if $type is existing, if not they are just empty
$(eval type_dash = $(if $(type),-$(type)))
$(eval type_slash = $(if $(type),/$(type)))
# Call the docker build
$(call docker_build_node,$(version),$(version)$(type_dash),images/node$(type_slash)/Dockerfile,images/node$(type_slash))
# Touch an empty file which make itself is using to understand when the image has been last build
touch $@
base-images += $(nodeimages)
s3-images += node
build/node__9 build/node__8 build/node__6: images/commons images/node/Dockerfile
build/node__10-builder: build/node__10 images/node/builder/Dockerfile
build/node__9-builder: build/node__9 images/node/builder/Dockerfile
build/node__8-builder: build/node__8 images/node/builder/Dockerfile
build/node__6-builder: build/node__6 images/node/builder/Dockerfile
#######
####### Service Images
#######
####### Services Images are the Docker Images used to run the Lagoon Microservices, these images
####### will be expected by docker-compose to exist.
# Yarn Workspace Image which builds the Yarn Workspace within a single image. This image will be
# used by all microservices based on Node.js to not build similar node packages again
build-images += yarn-workspace-builder
build/yarn-workspace-builder: build/node__8-builder images/yarn-workspace-builder/Dockerfile
$(eval image = $(subst build/,,$@))
$(call docker_build,$(image),images/$(image)/Dockerfile,.)
touch $@
# Variables of service images we manage and build
services := api \
auth-server \
logs2slack \
logs2rocketchat \
openshiftbuilddeploy \
openshiftbuilddeploymonitor \
openshiftremove \
rest2tasks \
webhook-handler \
webhooks2tasks \
rabbitmq \
logs-forwarder \
logs-db \
logs-db-ui \
logs-db-curator \
logs2logs-db \
auto-idler \
storage-calculator \
api-db \
drush-alias \
ui
service-images += $(services)
build-services = $(foreach image,$(services),build/$(image))
# Recepie for all building service-images
$(build-services):
$(eval image = $(subst build/,,$@))
$(call docker_build,$(image),services/$(image)/Dockerfile,services/$(image))
touch $@
# Dependencies of Service Images
build/auth-server build/logs2slack build/logs2rocketchat build/openshiftbuilddeploy build/openshiftbuilddeploymonitor build/openshiftremove build/rest2tasks build/webhook-handler build/webhooks2tasks build/api build/cli build/ui: build/yarn-workspace-builder
build/logs2logs-db: build/logstash
build/logs-db: build/elasticsearch
build/logs-db-ui: build/kibana
build/logs-db-curator: build/curator
build/auto-idler: build/oc
build/storage-calculator: build/oc
build/api-db: build/mariadb
# Auth SSH needs the context of the root folder, so we have it individually
build/ssh: build/commons
$(eval image = $(subst build/,,$@))
$(call docker_build,$(image),services/$(image)/Dockerfile,.)
touch $@
service-images += ssh
# Images for local helpers that exist in another folder than the service images
localdevimages := local-git \
local-api-data-watcher-pusher \
local-es-kibana-watcher-pusher
service-images += $(localdevimages)
build-localdevimages = $(foreach image,$(localdevimages),build/$(image))
$(build-localdevimages):
$(eval folder = $(subst build/local-,,$@))
$(eval image = $(subst build/,,$@))
$(call docker_build,$(image),local-dev/$(folder)/Dockerfile,local-dev/$(folder))
touch $@
# Images for local helpers that exist in another folder than the service images
cliimages := cli
service-images += $(cliimages)
build/cli: build/ssh cli/Dockerfile
$(eval image = $(subst build/,,$@))
$(call docker_build,$(image),cli/Dockerfile,cli)
touch $@
# Image with ansible test
build/tests:
$(eval image = $(subst build/,,$@))
$(call docker_build,$(image),$(image)/Dockerfile,$(image))
touch $@
service-images += tests
s3-images += $(service-images)
#######
####### Commands
#######
####### List of commands in our Makefile
# Builds all Images
.PHONY: build
build: $(foreach image,$(base-images) $(service-images),build/$(image))
# Outputs a list of all Images we manage
.PHONY: build-list
build-list:
@for number in $(foreach image,$(build-images),build/$(image)); do \
echo $$number ; \
done
# Define list of all tests
all-tests-list:= features \
node \
drupal \
drupal-postgres \
drupal-galera \
github \
gitlab \
bitbucket \
rest \
nginx \
elasticsearch
all-tests = $(foreach image,$(all-tests-list),tests/$(image))
# Run all tests
.PHONY: tests
tests: $(all-tests)
# List of tests existing
.PHONY: tests-list
tests-list:
@for number in $(all-tests); do \
echo $$number ; \
done
#### Definition of tests
# Define a list of which Lagoon Services are needed for running any deployment testing
deployment-test-services-main = rabbitmq openshiftremove openshiftbuilddeploy openshiftbuilddeploymonitor logs2slack logs2rocketchat api ssh auth-server local-git local-api-data-watcher-pusher local-es-kibana-watcher-pusher tests
# All Tests that use REST endpoints
rest-tests = rest node features nginx elasticsearch
run-rest-tests = $(foreach image,$(rest-tests),tests/$(image))
# List of Lagoon Services needed for REST endpoint testing
deployment-test-services-rest = $(deployment-test-services-main) rest2tasks
.PHONY: $(run-rest-tests)
$(run-rest-tests): minishift build/node__6-builder build/node__8-builder build/oc-build-deploy-dind $(foreach image,$(deployment-test-services-rest),build/$(image)) push-minishift
$(eval testname = $(subst tests/,,$@))
IMAGE_REPO=$(CI_BUILD_TAG) docker-compose -p $(CI_BUILD_TAG) up -d $(deployment-test-services-rest)
IMAGE_REPO=$(CI_BUILD_TAG) docker exec -i $$(docker-compose -p $(CI_BUILD_TAG) ps -q tests) ansible-playbook /ansible/tests/$(testname).yaml $(testparameter)
tests/drupal tests/drupal-postgres tests/drupal-galera: minishift build/varnish-drupal build/solr__5.5-drupal build/nginx-drupal build/redis build/php__5.6-cli-drupal build/php__7.0-cli-drupal build/php__7.1-cli-drupal build/php__7.2-cli-drupal build/api-db build/postgres-drupal build/mariadb-drupal build/oc-build-deploy-dind $(foreach image,$(deployment-test-services-rest),build/$(image)) build/drush-alias push-minishift
$(eval testname = $(subst tests/,,$@))
IMAGE_REPO=$(CI_BUILD_TAG) docker-compose -p $(CI_BUILD_TAG) up -d $(deployment-test-services-rest) drush-alias
IMAGE_REPO=$(CI_BUILD_TAG) docker exec -i $$(docker-compose -p $(CI_BUILD_TAG) ps -q tests) ansible-playbook /ansible/tests/$(testname).yaml $(testparameter)
# All tests that use Webhook endpoints
webhook-tests = github gitlab bitbucket
run-webhook-tests = $(foreach image,$(webhook-tests),tests/$(image))
# List of Lagoon Services needed for webhook endpoint testing
deployment-test-services-webhooks = $(deployment-test-services-main) webhook-handler webhooks2tasks
.PHONY: $(run-webhook-tests)
$(run-webhook-tests): openshift build/node__6-builder build/node__8-builder build/oc-build-deploy-dind $(foreach image,$(deployment-test-services-webhooks),build/$(image)) push-minishift
$(eval testname = $(subst tests/,,$@))
IMAGE_REPO=$(CI_BUILD_TAG) docker-compose -p $(CI_BUILD_TAG) up -d $(deployment-test-services-webhooks)
IMAGE_REPO=$(CI_BUILD_TAG) docker exec -i $$(docker-compose -p $(CI_BUILD_TAG) ps -q tests) ansible-playbook /ansible/tests/$(testname).yaml $(testparameter)
end2end-all-tests = $(foreach image,$(all-tests-list),end2end-tests/$(image))
.PHONY: end2end-tests
end2end-tests: $(end2end-all-tests)
.PHONY: start-end2end-ansible
start-end2end-ansible: build/tests
docker-compose -f docker-compose.yaml -f docker-compose.end2end.yaml -p end2end up -d tests
$(end2end-all-tests): start-end2end-ansible
$(eval testname = $(subst end2end-tests/,,$@))
docker exec -i $$(docker-compose -f docker-compose.yaml -f docker-compose.end2end.yaml -p end2end ps -q tests) ansible-playbook /ansible/tests/$(testname).yaml
end2end-tests/clean:
docker-compose -f docker-compose.yaml -f docker-compose.end2end.yaml -p end2end down -v
# push command of our base images into minishift
push-minishift-images = $(foreach image,$(base-images),[push-minishift]-$(image))
# tag and push all images
.PHONY: push-minishift
push-minishift: minishift/login-docker-registry $(push-minishift-images)
# tag and push of each image
.PHONY: $(push-minishift-images)
$(push-minishift-images):
$(eval image = $(subst [push-minishift]-,,$@))
$(eval image = $(subst __,:,$(image)))
$(info pushing $(image) to minishift registry)
if docker inspect $(CI_BUILD_TAG)/$(image) > /dev/null 2>&1; then \
docker tag $(CI_BUILD_TAG)/$(image) $$(cat minishift):30000/lagoon/$(image) && \
docker push $$(cat minishift):30000/lagoon/$(image) | cat; \
fi
push-docker-host-image: build/docker-host minishift/login-docker-registry
docker tag $(CI_BUILD_TAG)/docker-host $$(cat minishift):30000/lagoon/docker-host
docker push $$(cat minishift):30000/lagoon/docker-host | cat
lagoon-kickstart: $(foreach image,$(deployment-test-services-rest),build/$(image))
IMAGE_REPO=$(CI_BUILD_TAG) CI=false docker-compose -p $(CI_BUILD_TAG) up -d $(deployment-test-services-rest)
sleep 30
curl -X POST http://localhost:5555/deploy -H 'content-type: application/json' -d '{ "projectName": "lagoon", "branchName": "master" }'
make logs
# Publish command to amazeeio docker hub, this should probably only be done during a master deployments
publish-amazeeio-baseimages = $(foreach image,$(base-images),[publish-amazeeio-baseimages]-$(image))
# tag and push all images
.PHONY: publish-amazeeio-baseimages
publish-amazeeio-baseimages: $(publish-amazeeio-baseimages)
# tag and push of each image
.PHONY: $(publish-amazeeio-baseimages)
$(publish-amazeeio-baseimages):
# Calling docker_publish for image, but remove the prefix '[[publish]]-' first
$(eval image = $(subst [publish-amazeeio-baseimages]-,,$@))
$(eval image = $(subst __,:,$(image)))
$(call docker_publish_amazeeio_baseimages,$(image))
# Publish command to amazeeio docker hub, this should probably only be done during a master deployments
publish-amazeeiolagoon-baseimages = $(foreach image,$(base-images),[publish-amazeeiolagoon-baseimages]-$(image))
# tag and push all images
.PHONY: publish-amazeeiolagoon-baseimages
publish-amazeeiolagoon-baseimages: $(publish-amazeeiolagoon-baseimages)
# tag and push of each image
.PHONY: $(publish-amazeeiolagoon-baseimages)
$(publish-amazeeiolagoon-baseimages):
# Calling docker_publish for image, but remove the prefix '[[publish]]-' first
$(eval image = $(subst [publish-amazeeiolagoon-baseimages]-,,$@))
$(eval image = $(subst __,:,$(image)))
$(call docker_publish_amazeeiolagoon_baseimages,$(image))
# Publish command to amazeeiolagoon docker hub, we want all branches there, so this is save to run on every deployment
publish-amazeeiolagoon-serviceimages = $(foreach image,$(service-images),[publish-amazeeiolagoon-serviceimages]-$(image))
# tag and push all images
.PHONY: publish-amazeeiolagoon-serviceimages
publish-amazeeiolagoon-serviceimages: $(publish-amazeeiolagoon-serviceimages)
# tag and push of each image
.PHONY: $(publish-amazeeiolagoon-serviceimagesimages)
$(publish-amazeeiolagoon-serviceimages):
# Calling docker_publish for image, but remove the prefix '[[publish]]-' first
$(eval image = $(subst [publish-amazeeiolagoon-serviceimages]-,,$@))
$(eval image = $(subst __,:,$(image)))
$(call docker_publish_amazeeiolagoon_serviceimages,$(image))
s3-save = $(foreach image,$(s3-images),[s3-save]-$(image))
# save all images to s3
.PHONY: s3-save
s3-save: $(s3-save)
# tag and push of each image
.PHONY: $(s3-save)
$(s3-save):
# remove the prefix '[s3-save]-' first
$(eval image = $(subst [s3-save]-,,$@))
$(eval image = $(subst __,:,$(image)))
docker save $(CI_BUILD_TAG)/$(image) $$(docker history -q $(CI_BUILD_TAG)/$(image) | grep -v missing) | gzip -9 | aws s3 cp - s3://lagoon-images/$(image).tar.gz
s3-load = $(foreach image,$(s3-images),[s3-load]-$(image))
# save all images to s3
.PHONY: s3-load
s3-load: $(s3-load)
# tag and push of each image
.PHONY: $(s3-load)
$(s3-load):
# remove the prefix '[s3-load]-' first
$(eval image = $(subst [s3-load]-,,$@))
$(eval image = $(subst __,:,$(image)))
curl -s https://s3.us-east-2.amazonaws.com/lagoon-images/$(image).tar.gz | gunzip -c | docker load
# Clean all build touches, which will case make to rebuild the Docker Images (Layer caching is
# still active, so this is a very safe command)
clean:
rm -rf build/*
# Show Lagoon Service Logs
logs:
IMAGE_REPO=$(CI_BUILD_TAG) docker-compose -p $(CI_BUILD_TAG) logs --tail=10 -f $(service)
# Start all Lagoon Services
up:
IMAGE_REPO=$(CI_BUILD_TAG) docker-compose -p $(CI_BUILD_TAG) up -d api-db
sleep 20
IMAGE_REPO=$(CI_BUILD_TAG) docker-compose -p $(CI_BUILD_TAG) up -d
down:
IMAGE_REPO=$(CI_BUILD_TAG) docker-compose -p $(CI_BUILD_TAG) down -v
# kill all containers containing the name "lagoon"
kill:
docker ps --format "{{.Names}}" | grep lagoon | xargs -t -r -n1 docker rm -f -v
openshift:
$(info the openshift command has been renamed to minishift)
# Start Local OpenShift Cluster within a docker machine with a given name, also check if the IP
# that has been assigned to the machine is not the default one and then replace the IP in the yaml files with it
minishift: local-dev/minishift/minishift
$(info starting minishift with name $(CI_BUILD_TAG))
./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) start --cpus $(MINISHIFT_CPUS) --memory $(MINISHIFT_MEMORY) --disk-size $(MINISHIFT_DISK_SIZE) --vm-driver virtualbox --openshift-version="v3.7.2"
ifeq ($(ARCH), Darwin)
@OPENSHIFT_MACHINE_IP=$$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) ip); \
echo "replacing IP in local-dev/api-data/api-data.gql and docker-compose.yaml with the IP '$$OPENSHIFT_MACHINE_IP'"; \
sed -i '' -e "s/192.168\.[0-9]\{1,3\}\.[0-9]\{3\}/$${OPENSHIFT_MACHINE_IP}/g" local-dev/api-data/api-data.gql docker-compose.yaml;
else
@OPENSHIFT_MACHINE_IP=$$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) ip); \
echo "replacing IP in local-dev/api-data/api-data.gql and docker-compose.yaml with the IP '$$OPENSHIFT_MACHINE_IP'"; \
sed -i "s/192.168\.[0-9]\{1,3\}\.[0-9]\{3\}/$${OPENSHIFT_MACHINE_IP}/g" local-dev/api-data/api-data.gql docker-compose.yaml;
endif
./local-dev/minishift/minishift ssh -- '/bin/sh -c "sudo sysctl -w vm.max_map_count=262144"'
eval $$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) oc-env); \
oc login -u system:admin; \
bash -c "echo '{\"apiVersion\":\"v1\",\"kind\":\"Service\",\"metadata\":{\"name\":\"docker-registry-external\"},\"spec\":{\"ports\":[{\"port\":5000,\"protocol\":\"TCP\",\"targetPort\":5000,\"nodePort\":30000}],\"selector\":{\"docker-registry\":\"default\"},\"sessionAffinity\":\"None\",\"type\":\"NodePort\"}}' | oc --context="default/$$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) ip | sed 's/\./-/g'):8443/system:admin" create -n default -f -"; \
oc --context="default/$$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) ip | sed 's/\./-/g'):8443/system:admin" adm policy add-cluster-role-to-user cluster-admin system:anonymous; \
oc --context="default/$$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) ip | sed 's/\./-/g'):8443/system:admin" adm policy add-cluster-role-to-user cluster-admin developer;
@echo "$$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) ip)" > $@
@echo "wait 60secs in order to give openshift time to setup it's registry"
sleep 60
eval $$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) oc-env); \
for i in {10..30}; do oc --context="default/$$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) ip | sed 's/\./-/g'):8443/system:admin" patch pv pv00$${i} -p '{"spec":{"storageClassName":"bulk"}}'; done;
$(MAKE) minishift/configure-lagoon-local push-docker-host-image
minishift/login-docker-registry:
eval $$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) oc-env); \
oc login --insecure-skip-tls-verify -u developer -p developer $$(cat minishift):8443; \
oc whoami -t | docker login --username developer --password-stdin $$(cat minishift):30000
# Configures an openshift to use with Lagoon
.PHONY: openshift-lagoon-setup
openshift-lagoon-setup:
# Only use the minishift provided oc if we don't have one yet (allows system engineers to use their own oc)
if ! which oc; then eval $$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) oc-env); fi; \
oc -n default set env dc/router -e ROUTER_LOG_LEVEL=info -e ROUTER_SYSLOG_ADDRESS=router-logs.lagoon.svc:5140; \
oc new-project lagoon; \
oc adm pod-network make-projects-global lagoon; \
oc -n lagoon create serviceaccount openshiftbuilddeploy; \
oc -n lagoon policy add-role-to-user admin -z openshiftbuilddeploy; \
oc -n lagoon create -f openshift-setup/clusterrole-openshiftbuilddeploy.yaml; \
oc -n lagoon adm policy add-cluster-role-to-user openshiftbuilddeploy -z openshiftbuilddeploy; \
oc -n lagoon create -f openshift-setup/shared-resource-viewer.yaml; \
oc -n lagoon create -f openshift-setup/policybinding.yaml | oc -n lagoon create -f openshift-setup/rolebinding.yaml; \
oc -n lagoon create serviceaccount docker-host; \
oc -n lagoon adm policy add-scc-to-user privileged -z docker-host; \
oc -n lagoon policy add-role-to-user edit -z docker-host; \
oc -n lagoon create serviceaccount logs-collector; \
oc -n lagoon adm policy add-cluster-role-to-user cluster-reader -z logs-collector; \
oc -n lagoon adm policy add-scc-to-user hostaccess -z logs-collector; \
oc -n lagoon adm policy add-scc-to-user privileged -z logs-collector; \
oc -n lagoon adm policy add-cluster-role-to-user daemonset-admin -z lagoon-deployer; \
oc -n lagoon create serviceaccount lagoon-deployer; \
oc -n lagoon policy add-role-to-user edit -z lagoon-deployer; \
oc -n lagoon create -f openshift-setup/clusterrole-daemonset-admin.yaml; \
oc -n lagoon adm policy add-cluster-role-to-user daemonset-admin -z lagoon-deployer; \
bash -c "oc process -n lagoon -f services/docker-host/docker-host.yaml | oc -n lagoon apply -f -"; \
echo -e "\n\nAll Setup, use this token as described in the Lagoon Install Documentation:" \
oc -n lagoon serviceaccounts get-token openshiftbuilddeploy
# This calles the regular openshift-lagoon-setup first, which configures our minishift like we configure a real openshift for laggon
# It then overwrite the docker-host deploymentconfig and cronjobs to use our own just builded docker-host images
.PHONY: openshift/configure-lagoon-local
minishift/configure-lagoon-local: openshift-lagoon-setup
eval $$(./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) oc-env); \
bash -c "oc process -n lagoon -p SERVICE_IMAGE=172.30.1.1:5000/lagoon/docker-host:latest -p REPOSITORY_TO_UPDATE=lagoon -f services/docker-host/docker-host.yaml | oc -n lagoon apply -f -"; \
oc -n default set env dc/router -e ROUTER_LOG_LEVEL=info -e ROUTER_SYSLOG_ADDRESS=192.168.99.1:5140; \
# Stop OpenShift Cluster
.PHONY: minishift/stop
minishift/stop: local-dev/minishift/minishift
./local-dev/minishift/minishift --profile $(CI_BUILD_TAG) delete --force
rm minishift
# Stop OpenShift, remove downloaded minishift
.PHONY: openshift/clean
minishift/clean: minishift/stop
rm -rf ./local-dev/minishift/minishift
# Downloads the correct oc cli client based on if we are on OS X or Linux
local-dev/minishift/minishift:
$(info downloading minishift)
@mkdir -p ./local-dev/minishift
ifeq ($(ARCH), Darwin)
curl -L https://github.com/minishift/minishift/releases/download/v$(MINISHIFT_VERSION)/minishift-$(MINISHIFT_VERSION)-darwin-amd64.tgz | tar xzC local-dev/minishift --strip-components=1
else
curl -L https://github.com/minishift/minishift/releases/download/v$(MINISHIFT_VERSION)/minishift-$(MINISHIFT_VERSION)-linux-amd64.tgz | tar xzC local-dev/minishift --strip-components=1
endif
.PHONY: push-oc-build-deploy-dind
rebuild-push-oc-build-deploy-dind:
rm -rf build/oc-build-deploy-dind
$(MAKE) build/oc-build-deploy-dind [push-minishift]-oc-build-deploy-dind
.PHONY: ui-development
ui-development: build/api build/api-db build/local-api-data-watcher-pusher build/ui
IMAGE_REPO=$(CI_BUILD_TAG) docker-compose -p $(CI_BUILD_TAG) up -d api api-db local-api-data-watcher-pusher ui