-
Notifications
You must be signed in to change notification settings - Fork 1
/
Makefile
181 lines (130 loc) · 7.69 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
#
# Author: Pranjal Garg
SHELL = /bin/sh
.DEFAULT_GOAL := help
export VCS_URL := $(shell git config --get remote.origin.url 2> /dev/null || echo unversioned repo)
export VCS_REF := $(shell git rev-parse --short HEAD 2> /dev/null || echo unversioned repo)
export VCS_STATUS := $(if $(shell git status -s 2> /dev/null || echo unversioned repo),'modified/untracked','clean')
export BUILD_DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
export DOCKER_REGISTRY ?= itisfoundation
export DOCKER_IMAGE_NAME ?= datawave
export DOCKER_IMAGE_TAG ?= $(shell cat VERSION 2> /dev/null || echo undefined)
export COMPOSE_INPUT_DIR := ./validation/input
export COMPOSE_OUTPUT_DIR := .tmp/output
OSPARC_DIR:=$(CURDIR)/.osparc
APP_NAME := datawave
# INTEGRATION -----------------------------------------------------------------
METADATA := .osparc/metadata.yml
.PHONY: VERSION
VERSION: $(METADATA) ## generates VERSION from metadata
# updating $@ from $<
@$(OSPARC_DIR)/bin/ooil get-version --metadata-file $< > $@
service.cli/run: $(METADATA) ## generates run from metadata
# Updates adapter script from metadata in $<
@$(OSPARC_DIR)/bin/ooil run-creator --metadata $< --runscript $@
docker-compose.yml: $(METADATA) ## generates docker-compose
# Injects metadata from $< as labels
@$(OSPARC_DIR)/bin/ooil compose --to-spec-file $@ --metadata $<
# BUILD -----------------------------------------------------------------
define _docker_compose_build
export DOCKER_BUILD_TARGET=$(if $(findstring -devel,$@),development,$(if $(findstring -cache,$@),cache,production)); \
docker compose -f docker-compose.yml build $(if $(findstring -nc,$@),--no-cache,);
endef
.PHONY: build build-devel build-nc build-devel-nc
build build-devel build-nc build-devel-nc: VERSION docker-compose.yml service.cli/run ## builds image
# building image local/${DOCKER_IMAGE_NAME}...
@$(call _docker_compose_build)
define show-meta
$(foreach iid,$(shell docker images */$(1):* -q | sort | uniq),\
docker image inspect $(iid) | jq '.[0] | .RepoTags, .ContainerConfig.Labels, .Config.Labels';)
endef
.PHONY: info-build
info-build: ## displays info on the built image
# Built images
@docker images */$(DOCKER_IMAGE_NAME):*
# Tags and labels
@$(call show-meta,$(DOCKER_IMAGE_NAME))
# TESTS-----------------------------------------------------------------
.PHONY: test tests
test tests: ## runs validation tests
@$(OSPARC_DIR)/bin/ooil test .
# PUBLISHING -----------------------------------------------------------------
.PHONY: version-service-patch version-service-minor version-service-major
version-service-patch version-service-minor version-service-major: $(METADATA) ## kernel/service versioning as patch
$(OSPARC_DIR)/bin/ooil bump-version --metadata-file $< --upgrade $(subst version-service-,,$@)
# syncing metadata upstream
@$(MAKE) VERSION
.PHONY: tag-local
tag-local:
docker tag ${DOCKER_REGISTRY}/${DOCKER_IMAGE_NAME}:$(if $(findstring version,$@),$(DOCKER_IMAGE_NAME),latest) local/$(DOCKER_IMAGE_NAME):production
.PHONY: push push-force push-version push-latest pull-latest pull-version tag-latest tag-version
tag-latest tag-version:
docker tag simcore/services/comp/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(if $(findstring version,$@),$(DOCKER_IMAGE_TAG),latest)
version_valid = $(shell test $$(echo $(DOCKER_IMAGE_TAG) | cut --fields=1 --delimiter=.) -gt 0 > /dev/null && echo "image version is valid")
version_exists = $(shell DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) > /dev/null && echo "image already exists on $(DOCKER_REGISTRY)")
push push-force: ## pushes (resp. force) services to the registry if service not available in registry.
@$(if $(findstring force,$@),,\
$(if $(call version_valid),$(info version is valid), $(error $(DOCKER_IMAGE_TAG) is not a valid version (major>=1)))\
$(if $(call version_exists),$(error $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG) already exists on $(DOCKER_REGISTRY)), $(info no version found on $(DOCKER_REGISTRY)))\
)
@$(MAKE) push-version;
@$(MAKE) push-latest;
.PHONY: publish-local
publish-local: ## push to local throw away registry to test integration
docker tag simcore/services/comp/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} registry:5000/simcore/services/comp/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)
docker push registry:5000/simcore/services/comp/$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_TAG)
@curl registry:5000/v2/_catalog | jq
push-latest push-version: ## publish service to registry with latest/version tag
# pushing '$(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(if $(findstring version,$@),$(DOCKER_IMAGE_TAG),latest)'...
@$(MAKE) tag-$(subst push-,,$@)
@docker push $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(if $(findstring version,$@),$(DOCKER_IMAGE_TAG),latest)
# pushed '$(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(if $(findstring version,$@),$(DOCKER_IMAGE_TAG),latest)'
pull-latest pull-version: ## pull service from registry
@docker pull $(DOCKER_REGISTRY)/$(DOCKER_IMAGE_NAME):$(if $(findstring version,$@),$(DOCKER_IMAGE_TAG),latest)
# COOCKIECUTTER -----------------------------------------------------------------
.PHONY: replay
replay: .cookiecutterrc ## re-applies cookiecutter
# Replaying gh:ITISFoundation/cookiecutter-osparc-service ...
@cookiecutter --no-input --overwrite-if-exists \
--config-file=$< \
--output-dir="$(abspath $(CURDIR)/..)" \
"gh:ITISFoundation/cookiecutter-osparc-service"
.PHONY: info
info: ## general info
# env vars: version control
@echo " VCS_URL : $(VCS_URL)"
@echo " VCS_REF : $(VCS_REF)"
@echo " VCS_STATUS : $(VCS_STATUS)"
# env vars: docker
@echo " DOCKER_REGISTRY : $(DOCKER_REGISTRY)"
@echo " DOCKER_IMAGE_NAME : $(DOCKER_IMAGE_NAME)"
@echo " DOCKER_IMAGE_TAG : $(DOCKER_IMAGE_TAG)"
@echo " COMPOSE_INPUT_DIR : $(COMPOSE_INPUT_DIR)"
@echo " COMPOSE_OUTPUT_DIR : $(COMPOSE_OUTPUT_DIR)"
@echo " BUILD_DATE : $(BUILD_DATE)"
# exe: recommended dev tools
@echo ' git : $(shell git --version 2>/dev/null || echo not found)'
@echo ' make : $(shell make --version 2>&1 | head -n 1)'
@echo ' jq : $(shell jq --version 2>/dev/null || echo not found z)'
@echo ' awk : $(shell awk -W version 2>&1 | head -n 1 2>/dev/null || echo not found)'
@echo ' python : $(shell python3 --version 2>/dev/null || echo not found )'
@echo ' docker : $(shell docker --version)'
@echo ' docker buildx : $(shell docker buildx version)'
@echo ' docker-compose : $(shell docker-compose --version)'
# exe: integration tools
@echo ' ooil version : $(shell $(OSPARC_DIR)/bin/ooil --version)'
# MISC -----------------------------------------------------------------
.PHONY: help
help: ## this colorful help
@echo "Recipes for '$(notdir $(CURDIR))':"
@echo ""
@awk --posix 'BEGIN {FS = ":.*?## "} /^[[:alpha:][:space:]_-]+:.*?## / {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
@echo ""
.PHONY: clean
git_clean_args = -dxf --exclude=.vscode/
clean: ## cleans all unversioned files in project and temp files create by this makefile
# Cleaning unversioned
@git clean -n $(git_clean_args)
@echo -n "Are you sure? [y/N] " && read ans && [ $${ans:-N} = y ]
@echo -n "$(shell whoami), are you REALLY sure? [y/N] " && read ans && [ $${ans:-N} = y ]
@git clean $(git_clean_args)