From 4f390ce36aefd8b78565a530d0ce63254fda44a3 Mon Sep 17 00:00:00 2001 From: "aynic.os" Date: Sat, 12 Jun 2021 03:13:01 +0200 Subject: [PATCH] verbose mode --- README.md | 18 +++++++++++++++ ansible/def.ansible.mk | 12 ++++++---- aws/aws.mk | 2 +- aws/def.aws.mk | 4 ++-- make/apps/build.mk | 2 +- make/apps/common.mk | 2 +- make/apps/def.docker.mk | 28 +++++++++++++++-------- make/apps/def.install.mk | 11 +++++---- make/apps/def.mk | 6 +++-- make/apps/deploy.mk | 4 ++-- make/apps/docker.mk | 8 +++---- make/apps/myos/def.ssh.mk | 8 ++++--- make/apps/release.mk | 2 +- make/apps/setup.mk | 1 + make/common.mk | 6 ++--- make/def.docker.mk | 24 +++++++++++++------ make/def.mk | 57 +++++++++++++++++++++++++++------------------- make/env.mk | 2 ++ make/help.mk | 8 +++++-- make/include.mk | 22 ++++++++++++------ make/monorepo/common.mk | 2 +- make/monorepo/release.mk | 2 +- openstack/.env.dist | 3 --- openstack/def.openstack.mk | 7 ++++-- packer/def.packer.mk | 2 +- stack/base.mk | 2 +- 26 files changed, 157 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index 1dfa6f6..a8e7488 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,24 @@ This is work in progress ;) $ make install ``` +### Make variables + +#### DEBUG + +Show debug informations + +```shell +$ make install DEBUG=true +``` + +#### DRYRUN + +Show commands, do nothing + +```shell +$ make install DRYRUN=true +``` + ## Status Use it at your own risks. diff --git a/ansible/def.ansible.mk b/ansible/def.ansible.mk index db3b273..0c7a986 100644 --- a/ansible/def.ansible.mk +++ b/ansible/def.ansible.mk @@ -18,37 +18,39 @@ ANSIBLE_PLAYBOOK ?= ansible/playbook.yml ANSIBLE_SSH_PRIVATE_KEYS ?= $(SSH_PRIVATE_KEYS) ANSIBLE_SERVER_NAME ?= $(SERVER_NAME) ANSIBLE_USERNAME ?= root -ANSIBLE_VERBOSE ?= -v +ANSIBLE_VERBOSE ?= $(if $(DEBUG),-vvvv,$(if $(VERBOSE),-v)) CMDS += ansible ansible-playbook DOCKER_RUN_OPTIONS += --add-host=host.docker.internal:$(DOCKER_INTERNAL_DOCKER_HOST) ENV_VARS += ANSIBLE_AWS_ACCESS_KEY_ID ANSIBLE_AWS_DEFAULT_OUTPUT ANSIBLE_AWS_DEFAULT_REGION ANSIBLE_AWS_SECRET_ACCESS_KEY ANSIBLE_CONFIG ANSIBLE_DISKS_NFS_DISK ANSIBLE_DISKS_NFS_OPTIONS ANSIBLE_DISKS_NFS_PATH ANSIBLE_DOCKER_IMAGE_TAG ANSIBLE_DOCKER_REGISTRY ANSIBLE_EXTRA_VARS ANSIBLE_GIT_DIRECTORY ANSIBLE_GIT_KEY_FILE ANSIBLE_GIT_REPOSITORY ANSIBLE_GIT_VERSION ANSIBLE_INVENTORY ANSIBLE_PLAYBOOK ANSIBLE_SSH_PRIVATE_KEYS ANSIBLE_USERNAME ANSIBLE_VERBOSE -ifeq ($(DEBUG), true) -ANSIBLE_VERBOSE := -vvvv -endif - ifeq ($(DOCKER), true) define ansible + $(call INFO,ansible,$(1)) $(call run,$(DOCKER_REPOSITORY)/ansible:$(DOCKER_IMAGE_TAG) $(ANSIBLE_ARGS) -i $(ANSIBLE_INVENTORY)/.host.docker.internal $(ANSIBLE_VERBOSE) $(1)) endef define ansible-playbook + $(call INFO,ansible-playbook,$(1)) $(call run,--entrypoint=ansible-playbook $(DOCKER_REPOSITORY)/ansible:$(DOCKER_IMAGE_TAG) $(ANSIBLE_ARGS) -i $(ANSIBLE_INVENTORY)/.host.docker.internal $(ANSIBLE_VERBOSE) $(1)) endef define ansible-pull + $(call INFO,ansible-pull,$(1)) # TODO : run ansible in docker and target localhost outside docker $(call env-exec,ansible-pull $(ANSIBLE_ARGS) $(ANSIBLE_VERBOSE) $(1)) endef else # function ansible: Call run ansible ANSIBLE_ARGS with arg 1 define ansible + $(call INFO,ansible,$(1)) $(call run,ansible $(ANSIBLE_ARGS) $(ANSIBLE_VERBOSE) $(1)) endef # function ansible-playbook: Call run ansible-playbook ANSIBLE_ARGS with arg 1 define ansible-playbook + $(call INFO,ansible-playbook,$(1)) $(call run,ansible-playbook $(ANSIBLE_ARGS) $(ANSIBLE_VERBOSE) $(1)) endef # function ansible-pull: Call run ansible-pull ANSIBLE_ARGS with arg 1 define ansible-pull + $(call INFO,ansible-pull,$(1)) $(call run,ansible-pull $(ANSIBLE_ARGS) $(ANSIBLE_VERBOSE) $(1)) endef endif diff --git a/aws/aws.mk b/aws/aws.mk index 9e6ded1..0bd2114 100644 --- a/aws/aws.mk +++ b/aws/aws.mk @@ -23,7 +23,7 @@ aws-ecr-get-login: $(eval DRYRUN_IGNORE := true) $(eval docker_login := $(shell $(call aws,ecr get-login --no-include-email --region $(AWS_DEFAULT_REGION)))) $(eval DRYRUN_IGNORE := FALSE) - $(ECHO) $(docker_login) + $(RUN) $(docker_login) # target aws-iam-create-role-%: Call aws iam create-role with role-name % and role-policy file aws/policies/%-trust.json .PHONY: aws-iam-create-role-% diff --git a/aws/def.aws.mk b/aws/def.aws.mk index 2758e5e..ed272f5 100644 --- a/aws/def.aws.mk +++ b/aws/def.aws.mk @@ -1,4 +1,4 @@ -AWS_ACCESS_KEY_ID ?= $(shell $(call conf,$(HOME)/.aws/credentials,$(or $(AWS_PROFILE),default),aws_access_key_id)) +AWS_ACCESS_KEY_ID := $(shell $(call conf,$(HOME)/.aws/credentials,$(or $(AWS_PROFILE),default),aws_access_key_id)) AWS_AMI_DESCRIPTION ?= app: $(APP) branch: $(BRANCH) env: $(ENV) iso: $(AWS_S3_KEY) user: $(USER) version: $(VERSION) AWS_AMI_NAME ?= $(USER)/$(ENV)/$(APP)/ami/$(VERSION)/$(shell date +%Y%m%dT%H%M%S) AWS_DEFAULT_REGION ?= eu-west-1 @@ -7,7 +7,7 @@ AWS_INSTANCE_ID ?= $(shell timeout 0.1 curl -s http://169.254.16 AWS_VM_IMPORT_ROLE_NAME ?= vmimport AWS_S3_BUCKET ?= $(USER)-$(ENV)-config AWS_S3_KEY ?= $(PACKER_ISO_FILE) -AWS_SECRET_ACCESS_KEY ?= $(shell $(call conf,$(HOME)/.aws/credentials,$(or $(AWS_PROFILE),default),aws_secret_access_key)) +AWS_SECRET_ACCESS_KEY := $(shell $(call conf,$(HOME)/.aws/credentials,$(or $(AWS_PROFILE),default),aws_secret_access_key)) AWS_SNAP_DESCRIPTION ?= iso: $(AWS_S3_KEY) env: $(ENV) app: $(APP) branch: $(BRANCH) version: $(VERSION) user: $(USER) etag: $(AWS_S3_KEY_ETAG) date: $(AWS_S3_KEY_DATE) CMDS += aws DOCKER_RUN_VOLUME += -v $(HOME)/.aws:/home/$(USER)/.aws diff --git a/make/apps/build.mk b/make/apps/build.mk index 5f5ff45..0692daf 100644 --- a/make/apps/build.mk +++ b/make/apps/build.mk @@ -22,7 +22,7 @@ build-env: bootstrap # on local host .PHONY: build-init build-init: - $(ECHO) rm -rf build && $(ECHO) mkdir -p build + $(RUN) rm -rf build && $(RUN) mkdir -p build # target build-shared: Create SHARED folder in docker SERVICE to deploy # on local host diff --git a/make/apps/common.mk b/make/apps/common.mk index 75d6058..00cfabb 100644 --- a/make/apps/common.mk +++ b/make/apps/common.mk @@ -37,7 +37,7 @@ build@%: myos-base $(eval build_app := $(or $(filter $(DOCKER_BUILD_CACHE),false),$(filter-out $(docker_images),$(SERVICES)))) $(if $(build_app), \ $(call make,build-init app-build), \ - $(if $(filter $(VERBOSE),true), \ + $(if $(VERBOSE), \ $(foreach service,$(SERVICES), \ echo "docker image $(DOCKER_REPOSITORY)/$(service):$(DOCKER_IMAGE_TAG) has id $(shell docker images -q $(DOCKER_REPOSITORY)/$(service):$(DOCKER_IMAGE_TAG) 2>/dev/null)" && \ ) true \ diff --git a/make/apps/def.docker.mk b/make/apps/def.docker.mk index d329e5f..100363b 100644 --- a/make/apps/def.docker.mk +++ b/make/apps/def.docker.mk @@ -17,7 +17,7 @@ endif COMPOSE_IGNORE_ORPHANS ?= false COMPOSE_PROJECT_NAME ?= $(USER)_$(ENV)_$(APP) COMPOSE_SERVICE_NAME ?= $(subst _,-,$(COMPOSE_PROJECT_NAME)) -CONTEXT += COMPOSE_FILE DOCKER_IMAGE_TAG DOCKER_REPOSITORY DOCKER_SERVICE +CONTEXT += COMPOSE_FILE DOCKER_IMAGE_TAG DOCKER_REPOSITORY CONTEXT_DEBUG += DOCKER_REGISTRY DOCKER_BUILD_ARGS ?= $(if $(filter $(DOCKER_BUILD_NO_CACHE),true),--pull --no-cache) $(foreach var,$(DOCKER_BUILD_VARS),$(if $($(var)),--build-arg $(var)='$($(var))')) DOCKER_BUILD_CACHE ?= true @@ -34,9 +34,9 @@ DOCKER_IMAGES ?= $(patsubst %/,%,$(patsubst docker/%,%,$(dir $ DOCKER_PLUGIN ?= rexray/s3fs:latest DOCKER_PLUGIN_ARGS ?= $(foreach var,$(DOCKER_PLUGIN_VARS),$(if $(DOCKER_PLUGIN_$(var)),$(var)='$(DOCKER_PLUGIN_$(var))')) DOCKER_PLUGIN_OPTIONS ?= --grant-all-permissions -DOCKER_PLUGIN_S3FS_ACCESSKEY ?= $(shell $(call conf,$(HOME)/.aws/credentials,$(or $(AWS_PROFILE),default),aws_access_key_id)) +DOCKER_PLUGIN_S3FS_ACCESSKEY ?= $(AWS_ACCESS_KEY_ID) DOCKER_PLUGIN_S3FS_OPTIONS ?= allow_other,nonempty,use_path_request_style,url=https://s3-eu-west-1.amazonaws.com -DOCKER_PLUGIN_S3FS_SECRETKEY ?= $(shell $(call conf,$(HOME)/.aws/credentials,$(or $(AWS_PROFILE),default),aws_secret_access_key)) +DOCKER_PLUGIN_S3FS_SECRETKEY ?= $(AWS_SECRET_ACCESS_KEY) DOCKER_PLUGIN_S3FS_REGION ?= eu-west-1 DOCKER_PLUGIN_VARS ?= S3FS_ACCESSKEY S3FS_OPTIONS S3FS_SECRETKEY S3FS_REGION DOCKER_REGISTRY ?= registry @@ -44,6 +44,7 @@ DOCKER_REGISTRY_USERNAME ?= $(USER) DOCKER_REGISTRY_REPOSITORY ?= $(addsuffix /,$(DOCKER_REGISTRY))$(subst $(USER),$(DOCKER_REGISTRY_USERNAME),$(DOCKER_REPOSITORY)) DOCKER_REPOSITORY ?= $(subst _,/,$(COMPOSE_PROJECT_NAME)) DOCKER_SERVICE ?= $(shell $(call docker-compose,--log-level critical config --services) |tail -1) +DOCKER_SERVICES ?= $(eval DRYRUN_IGNORE := true) $(shell $(call docker-compose,--log-level critical config --services)) $(eval DRYRUN_IGNORE := false) DOCKER_SHELL ?= $(SHELL) ENV_VARS += COMPOSE_PROJECT_NAME COMPOSE_SERVICE_NAME DOCKER_BUILD_TARGET DOCKER_GID DOCKER_IMAGE_TAG DOCKER_REGISTRY DOCKER_REPOSITORY DOCKER_SHELL @@ -74,10 +75,12 @@ ifeq ($(DOCKER), true) # function docker-compose: Run docker-compose with arg 1 define docker-compose + $(call INFO,docker-compose,$(1)) $(call run,docker/compose:$(COMPOSE_VERSION) $(patsubst %,-f %,$(COMPOSE_FILE)) -p $(COMPOSE_PROJECT_NAME) $(1)) endef # function docker-compose-exec: Run docker-compose-exec with arg 2 in service 1 define docker-compose-exec + $(call INFO,docker-compose-exec,$(1)$(comma) $(2)) $(call run,docker/compose:$(COMPOSE_VERSION) $(patsubst %,-f %,$(COMPOSE_FILE)) -p $(COMPOSE_PROJECT_NAME) exec -T $(1) sh -c '$(2)') endef @@ -85,9 +88,11 @@ else SHELL := /bin/bash define docker-compose + $(call INFO,docker-compose,$(1)) $(call run,docker-compose $(patsubst %,-f %,$(COMPOSE_FILE)) -p $(COMPOSE_PROJECT_NAME) $(1)) endef define docker-compose-exec + $(call INFO,docker-compose-exec,$(1)$(comma) $(2)) $(call run,docker-compose $(patsubst %,-f %,$(COMPOSE_FILE)) -p $(COMPOSE_PROJECT_NAME) exec -T $(1) sh -c '$(2)') endef @@ -95,29 +100,30 @@ endif # function docker-build: Build docker image define docker-build + $(call INFO,docker-build,$(1)$(comma) $(2)$(comma) $(3)) $(eval path := $(patsubst %/,%,$(1))) $(eval tag := $(or $(2),$(DOCKER_REPOSITORY)/$(lastword $(subst /, ,$(path))):$(DOCKER_IMAGE_TAG))) $(eval target := $(subst ",,$(subst ',,$(or $(3),$(DOCKER_BUILD_TARGET))))) $(eval image_id := $(shell docker images -q $(tag) 2>/dev/null)) $(eval build_image := $(or $(filter $(DOCKER_BUILD_CACHE),false),$(if $(image_id),,true))) - $(if $(build_image),$(ECHO) docker build $(DOCKER_BUILD_ARGS) --build-arg DOCKER_BUILD_DIR="$(path)" --tag $(tag) $(if $(target),--target $(target)) -f $(path)/Dockerfile .,$(if $(filter $(VERBOSE),true),echo "docker image $(tag) has id $(image_id)",true)) + $(if $(build_image),$(RUN) docker build $(DOCKER_BUILD_ARGS) --build-arg DOCKER_BUILD_DIR="$(path)" --tag $(tag) $(if $(target),--target $(target)) -f $(path)/Dockerfile .,$(if $(VERBOSE),echo "docker image $(tag) has id $(image_id)",true)) endef # function docker-commit: Commit docker image define docker-commit + $(call INFO,docker-commit,$(1)$(comma) $(2)$(comma) $(3)$(comma) $(4)) $(eval service := $(or $(1),$(DOCKER_SERVICE))) $(eval container := $(or $(2),$(firstword $(shell $(call docker-compose,--log-level critical ps -q $(service)))))) $(eval repository := $(or $(3),$(DOCKER_REPOSITORY)/$(service))) $(eval tag := $(or $(4),$(DOCKER_IMAGE_TAG))) - $(if $(filter $(VERBOSE),true),echo docker commit $(container) $(repository):$(tag)) - $(ECHO) docker commit $(container) $(repository):$(tag) + $(RUN) docker commit $(container) $(repository):$(tag) endef # function docker-push: Push docker image define docker-push + $(call INFO,docker-push,$(1)$(comma) $(2)$(comma) $(3)) $(eval service := $(or $(1),$(DOCKER_SERVICE))) $(eval name := $(or $(2),$(DOCKER_REGISTRY_REPOSITORY)/$(service))) $(eval tag := $(or $(3),$(DOCKER_IMAGE_TAG))) - $(if $(filter $(VERBOSE),true),echo docker push $(name):$(tag)) - $(ECHO) docker push $(name):$(tag) + $(RUN) docker push $(name):$(tag) endef # function docker-stack: Call itself recursively for each stack to expand stacks # docker-stack: if 1st arg is a variable and can be expand to values, it calls @@ -125,6 +131,7 @@ endef # 1st arg: stacks, extract it from stack_names:stack_versions # 2nd arg: versions, extract it from stack_names:stack_versions or 2nd arg define docker-stack + $(call INFO,docker-stack,$(1)$(comma) $(2)) $(eval stacks := $(firstword $(subst :, ,$(1)))) $(eval versions := $(or $(if $(findstring :,$(1)),$(lastword $(subst :, ,$(1)))),$(2))) $(if $($(stacks)),$(foreach substack,$($(stacks)),$(call docker-stack,$(substack),$(if $(findstring :,$(1)),$(versions)))),$(call docker-stack-update,$(stacks),$(versions))) @@ -140,6 +147,7 @@ endef # add $(path)/$(name).yml, $(path)/$(name).$(ENV).yml and $(path)/$(name).$(version).yml to COMPOSE_FILE variable # if $(path)/.env.dist file exists, update .env file define docker-stack-update + $(call INFO,docker-stack-update,$(1)$(comma) $(2)$(comma) $(3)) $(eval stack := $(patsubst %.yml,%,$(notdir $(1)))) $(eval name := $(firstword $(subst :, ,$(stack)))) $(eval version := $(or $(2),$(if $(findstring :,$(stack)),$(lastword $(subst :, ,$(stack))),latest))) @@ -149,11 +157,11 @@ define docker-stack-update endef # function docker-tag: Tag docker image define docker-tag + $(call INFO,docker-tag,$(1)$(comma) $(2)$(comma) $(3)$(comma) $(4)$(comma) $(5)) $(eval service := $(or $(1),$(DOCKER_SERVICE))) $(eval source := $(or $(2),$(DOCKER_REPOSITORY)/$(service))) $(eval source_tag := $(or $(3),$(DOCKER_IMAGE_TAG))) $(eval target := $(or $(4),$(DOCKER_REGISTRY_REPOSITORY)/$(service))) $(eval target_tag := $(or $(5),$(source_tag))) - $(if $(filter $(VERBOSE),true),echo docker tag $(source):$(source_tag) $(target):$(target_tag)) - $(ECHO) docker tag $(source):$(source_tag) $(target):$(target_tag) + $(RUN) docker tag $(source):$(source_tag) $(target):$(target_tag) endef diff --git a/make/apps/def.install.mk b/make/apps/def.install.mk index 71e5ac6..f3dbf5f 100644 --- a/make/apps/def.install.mk +++ b/make/apps/def.install.mk @@ -1,8 +1,9 @@ # function install-config: copy CONFIG files to application config folder define install-config - $(eval path:=$(or $(1),$(APP))) - $(eval file:=$(or $(2),$(DOCKER_SERVICE))) - $(eval dest:=$(or $(3),config)) - $(eval env:=$(or $(4),$(ENV))) - $(if $(wildcard $(dest)/$(file)),,$(if $(wildcard $(CONFIG)/$(env)/$(path)/$(file)),$(ECHO) cp -a $(CONFIG)/$(env)/$(path)/$(file) $(dest))) + $(call INFO,install-config,$(1)$(comma) $(2)$(comma) $(3)$(comma) $(4)) + $(eval path:=$(or $(1),$(APP))) + $(eval file:=$(or $(2),$(DOCKER_SERVICE))) + $(eval dest:=$(or $(3),config)) + $(eval env:=$(or $(4),$(ENV))) + $(if $(wildcard $(dest)/$(file)),,$(if $(wildcard $(CONFIG)/$(env)/$(path)/$(file)),$(RUN) cp -a $(CONFIG)/$(env)/$(path)/$(file) $(dest))) endef diff --git a/make/apps/def.mk b/make/apps/def.mk index b374816..73fe242 100644 --- a/make/apps/def.mk +++ b/make/apps/def.mk @@ -1,19 +1,21 @@ APP_DIR ?= $(CURDIR) APP_DOMAIN ?= $(ENV)$(addprefix .,$(DOMAIN)) APP_HOST ?= $(APP)$(addprefix .,$(APP_DOMAIN)) +APP_INSTALLED ?= $(APPS) APP_PARENT ?= $(MONOREPO) APP_PARENT_DIR ?= $(MONOREPO_DIR) APP_PATH ?= /$(APP_PATH_PREFIX) APP_REPOSITORY ?= $(GIT_REPOSITORY) +APP_REQUIRED ?= $(APP_REPOSITORY) APP_SCHEME ?= https APP_UPSTREAM_REPOSITORY ?= $(or $(shell git config --get remote.upstream.url 2>/dev/null),$(GIT_UPSTREAM_REPOSITORY)) APP_URI ?= $(APP_HOST)$(APP_PATH) APP_URL ?= $(APP_SCHEME)://$(APP_URI) BUILD_ENV_VARS ?= APP BRANCH COMMIT DEPLOY_HOOK_URL ENV VERSION -CONTEXT_DEBUG += APP_DIR APP_DOMAIN APP_HOST APP_PATH APP_URL APP_REPOSITORY APP_UPSTREAM_REPOSITORY CONSUL_HTTP_TOKEN SERVICES +CONTEXT_DEBUG += APP_DIR APP_DOMAIN APP_HOST APP_PATH APP_URL APP_REPOSITORY APP_UPSTREAM_REPOSITORY ENV_DEPLOY ?= $(shell ls .git/refs/heads/) ENV_VARS += APP_DIR APP_DOMAIN APP_HOST APP_PATH APP_URL CONSUL_HTTP_TOKEN $(if $(filter true,$(MOUNT_NFS)),NFS_CONFIG) MOUNT_NFS ?= false NFS_CONFIG ?= addr=$(NFS_HOST),actimeo=3,intr,noacl,noatime,nocto,nodiratime,nolock,soft,rsize=32768,wsize=32768,tcp,rw,vers=3 NFS_HOST ?= host.docker.internal -SERVICES ?= $(eval DRYRUN_IGNORE := true) $(shell $(call docker-compose,--log-level critical config --services)) $(eval DRYRUN_IGNORE := false) +SERVICES ?= $(DOCKER_SERVICES) diff --git a/make/apps/deploy.mk b/make/apps/deploy.mk index 0a82558..2aef2f9 100644 --- a/make/apps/deploy.mk +++ b/make/apps/deploy.mk @@ -8,7 +8,7 @@ .PHONY: deploy@% deploy@%: myos-base build@% ## Deploy application docker images $(call make,docker-login docker-tag docker-push) - $(call make,myos-ansible-pull@$(ENV) ANSIBLE_DOCKER_IMAGE_TAG=$(VERSION) ANSIBLE_TAGS=aws,,APP AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY) + $(call make,myos-ansible-pull@$(ENV) ANSIBLE_DOCKER_IMAGE_TAG=$(VERSION) ANSIBLE_TAGS=aws AWS_ACCESS_KEY_ID=$(AWS_ACCESS_KEY_ID) AWS_SECRET_ACCESS_KEY=$(AWS_SECRET_ACCESS_KEY),,APP) $(call make,docker-tag-latest docker-push-latest) # target deploy-hook: Fire app-deploy deploy-hook-ping @@ -23,7 +23,7 @@ deploy-hook-ping: deploy-hook-ping-curl # target deploy-hook-ping-curl: Post install hook to curl DEPLOY_HOOK_URL .PHONY: deploy-hook-ping-curl deploy-hook-ping-curl: - $(if $(DEPLOY_HOOK_URL),$(ECHO) curl -X POST --data-urlencode \ + $(if $(DEPLOY_HOOK_URL),$(RUN) curl -X POST --data-urlencode \ 'payload={"text": "$(DEPLOY_HOOK_TEXT)"}' \ $(DEPLOY_HOOK_URL) \ ||: ) diff --git a/make/apps/docker.mk b/make/apps/docker.mk index 8a3052a..a0deee9 100644 --- a/make/apps/docker.mk +++ b/make/apps/docker.mk @@ -125,7 +125,7 @@ docker-images-rm-%: # target docker-login: Exec 'docker login' .PHONY: docker-login docker-login: myos-base - $(ECHO) docker login + $(RUN) docker login # target docker-network-create: Fire docker-network-create-% for DOCKER_NETWORK .PHONY: docker-network-create @@ -135,7 +135,7 @@ docker-network-create: docker-network-create-$(DOCKER_NETWORK) .PHONY: docker-network-create-% docker-network-create-%: [ -n "$(shell docker network ls -q --filter name='^$*$$' 2>/dev/null)" ] \ - || { echo -n "Creating docker network $* ... " && $(ECHO) docker network create $* >/dev/null 2>&1 && echo "done" || echo "ERROR"; } + || { echo -n "Creating docker network $* ... " && $(RUN) docker network create $* >/dev/null 2>&1 && echo "done" || echo "ERROR"; } # target docker-network-rm: Fire docker-network-rm-% for DOCKER_NETWORK .PHONY: docker-network-rm @@ -145,13 +145,13 @@ docker-network-rm: docker-network-rm-$(DOCKER_NETWORK) .PHONY: docker-network-rm-% docker-network-rm-%: [ -z "$(shell docker network ls -q --filter name='^$*$$' 2>/dev/null)" ] \ - || { echo -n "Removing docker network $* ... " && $(ECHO) docker network rm $* >/dev/null 2>&1 && echo "done" || echo "ERROR"; } + || { echo -n "Removing docker network $* ... " && $(RUN) docker network rm $* >/dev/null 2>&1 && echo "done" || echo "ERROR"; } # target docker-plugin-install: Exec 'docker plugin install DOCKER_PLUGIN_OPTIONS DOCKER_PLUGIN' .PHONY: docker-plugin-install docker-plugin-install: $(eval docker_plugin_state := $(shell docker plugin ls | awk '$$2 == "$(DOCKER_PLUGIN)" {print $$NF}') ) - $(if $(docker_plugin_state),$(if $(filter $(docker_plugin_state),false),echo -n "Enabling docker plugin $(DOCKER_PLUGIN) ... " && $(ECHO) docker plugin enable $(DOCKER_PLUGIN) >/dev/null 2>&1 && echo "done" || echo "ERROR"),echo -n "Installing docker plugin $(DOCKER_PLUGIN) ... " && $(ECHO) docker plugin install $(DOCKER_PLUGIN_OPTIONS) $(DOCKER_PLUGIN) $(DOCKER_PLUGIN_ARGS) >/dev/null 2>&1 && echo "done" || echo "ERROR") + $(if $(docker_plugin_state),$(if $(filter $(docker_plugin_state),false),echo -n "Enabling docker plugin $(DOCKER_PLUGIN) ... " && $(RUN) docker plugin enable $(DOCKER_PLUGIN) >/dev/null 2>&1 && echo "done" || echo "ERROR"),echo -n "Installing docker plugin $(DOCKER_PLUGIN) ... " && $(RUN) docker plugin install $(DOCKER_PLUGIN_OPTIONS) $(DOCKER_PLUGIN) $(DOCKER_PLUGIN_ARGS) >/dev/null 2>&1 && echo "done" || echo "ERROR") # target docker-push: Call docker-push for each SERVICES .PHONY: docker-push diff --git a/make/apps/myos/def.ssh.mk b/make/apps/myos/def.ssh.mk index 943a52e..02e99f8 100644 --- a/make/apps/myos/def.ssh.mk +++ b/make/apps/myos/def.ssh.mk @@ -1,14 +1,15 @@ DOCKER_BUILD_VARS += $(SSH_ENV_VARS) ENV_VARS += $(SSH_ENV_VARS) -SSH_BASTION_HOSTNAME ?= -SSH_BASTION_USERNAME ?= +SSH_BASTION_HOSTNAME ?= +SSH_BASTION_USERNAME ?= SSH_ENV_VARS ?= SSH_BASTION_HOSTNAME SSH_BASTION_USERNAME SSH_PUBLIC_HOST_KEYS SSH_PRIVATE_IP_RANGE SSH_PUBLIC_HOST_KEYS ?= $(SSH_REMOTE_HOSTS) $(SSH_BASTION_HOSTNAME) -SSH_PRIVATE_IP_RANGE ?= 10.10.* +SSH_PRIVATE_IP_RANGE ?= SSH_REMOTE_HOSTS ?= github.com gitlab.com # function ssh-connect: Exec command 2 on remote hosts 1 with tty define ssh-connect + $(call INFO,ssh-connect,$(1)$(comma) $(2)$(comma) $(3)) $(eval hosts := $(1)) $(eval command := $(2)) $(eval user := $(or $(3),root)) @@ -18,6 +19,7 @@ endef # function ssh-exec: Exec command 2 on remote hosts 1 without tty define ssh-exec + $(call INFO,ssh-exec,$(1)$(comma) $(2)$(comma) $(3)) $(eval hosts := $(1)) $(eval command := $(2)) $(eval user := $(or $(3),root)) diff --git a/make/apps/release.mk b/make/apps/release.mk index a0b61a6..45d0870 100644 --- a/make/apps/release.mk +++ b/make/apps/release.mk @@ -34,7 +34,7 @@ release-finish: release-check git-stash # target release-update: Update RELEASE with RELEASE_VERSION in .env .PHONY: release-update release-update: - $(ECHO) awk -v s=RELEASE=$(RELEASE_VERSION) '/^RELEASE=/{$$0=s;f=1} {a[++n]=$$0} END{if(!f)a[++n]=s;for(i=1;i<=n;i++)print a[i]>ARGV[1]}' .env + $(RUN) awk -v s=RELEASE=$(RELEASE_VERSION) '/^RELEASE=/{$$0=s;f=1} {a[++n]=$$0} END{if(!f)a[++n]=s;for(i=1;i<=n;i++)print a[i]>ARGV[1]}' .env # target release-upgrade: Run migration targets to upgrade specific releases .PHONY: release-upgrade diff --git a/make/apps/setup.mk b/make/apps/setup.mk index ee15e7c..999af12 100644 --- a/make/apps/setup.mk +++ b/make/apps/setup.mk @@ -16,6 +16,7 @@ endif endif define setup-nfsd-osx + $(call INFO,setup-nfsd-osx,$(1)$(comma) $(2)$(comma) $(3)) $(eval dir:=$(or $(1),$(MONOREPO_DIR))) $(eval uid:=$(or $(2),$(UID))) $(eval gid:=$(or $(3),$(GID))) diff --git a/make/common.mk b/make/common.mk index 3768495..66d2cee 100644 --- a/make/common.mk +++ b/make/common.mk @@ -19,7 +19,7 @@ install-app-required: myos-base # target $(SHARED): Create SHARED folder $(SHARED): - $(ECHO) mkdir -p $(SHARED) + $(RUN) mkdir -p $(SHARED) # target update-apps: Call update-app target for each APPS .PHONY: update-apps @@ -47,7 +47,7 @@ update-config: myos-base .PHONY: update-hosts update-hosts: ifneq (,$(filter $(ENV),local)) - cat */.env 2>/dev/null |grep -Eo 'urlprefix-[^/]+' |sed 's/urlprefix-//' |while read host; do grep $$host /etc/hosts >/dev/null 2>&1 || { echo "Adding $$host to /etc/hosts"; echo 127.0.0.1 $$host |$(ECHO) sudo tee -a /etc/hosts >/dev/null; }; done + cat */.env 2>/dev/null |grep -Eo 'urlprefix-[^/]+' |sed 's/urlprefix-//' |while read host; do grep $$host /etc/hosts >/dev/null 2>&1 || { echo "Adding $$host to /etc/hosts"; echo 127.0.0.1 $$host |$(RUN) sudo tee -a /etc/hosts >/dev/null; }; done endif # target update-remote-%: fetch git remote % @@ -67,7 +67,7 @@ update-upstream: myos-base .git/refs/remotes/upstream/master # target .git/refs/remotes/upstream/master: git add upstream APP_UPSTREAM_REPOSITORY .git/refs/remotes/upstream/master: - $(ECHO) git remote add upstream $(APP_UPSTREAM_REPOSITORY) 2>/dev/null ||: + $(RUN) git remote add upstream $(APP_UPSTREAM_REPOSITORY) 2>/dev/null ||: # target shared: Fire SHARED .PHONY: update-shared diff --git a/make/def.docker.mk b/make/def.docker.mk index b265513..8bbaaf6 100644 --- a/make/def.docker.mk +++ b/make/def.docker.mk @@ -10,7 +10,7 @@ DOCKER_NAME ?= $(DOCKER_NAME_CLI) DOCKER_NAME_CLI ?= $(COMPOSE_PROJECT_NAME_MYOS)_cli DOCKER_NAME_SSH ?= $(COMPOSE_PROJECT_NAME_MYOS)_ssh DOCKER_NETWORK ?= $(DOCKER_NETWORK_PRIVATE) -DOCKER_NETWORK_PRIVATE ?= $(ENV) +DOCKER_NETWORK_PRIVATE ?= $(USER)_$(ENV) DOCKER_NETWORK_PUBLIC ?= node DOCKER_REPOSITORY_MYOS ?= $(subst _,/,$(COMPOSE_PROJECT_NAME_MYOS)) DOCKER_REPOSITORY_NODE ?= $(subst _,/,$(COMPOSE_PROJECT_NAME_NODE)) @@ -34,10 +34,12 @@ endif # function env-run: Call env-exec with arg 1 in a subshell define env-run + $(call INFO,env-run,$(1)) $(call env-exec,sh -c '$(or $(1),$(SHELL))') endef # function env-exec: Exec arg 1 in a new env define env-exec + $(call INFO,env-exec,$(1)) IFS=$$'\n'; env $(env_reset) $(env) $(1) endef @@ -47,22 +49,26 @@ DOCKER_SSH_AUTH := -e SSH_AUTH_SOCK=/tmp/ssh-agent/socket -v $(D # function docker-run: Run new DOCKER_IMAGE:DOCKER_IMAGE_TAG docker with arg 2 define docker-run + $(call INFO,docker-run,$(1)$(comma) $(2)) $(call run,$(or $(1),$(DOCKER_IMAGE):$(DOCKER_IMAGE_TAG)) $(2)) endef ifeq ($(DRONE), true) # function exec: Run new DOCKER_IMAGE docker with arg 1 define exec + $(call INFO,exec,$(1)) $(call run,$(DOCKER_IMAGE) sh -c '$(or $(1),$(SHELL))') endef else # function exec: Exec arg 1 in docker DOCKER_NAME define exec - $(ECHO) docker exec $(DOCKER_ENV) $(DOCKER_EXEC_OPTIONS) $(DOCKER_RUN_WORKDIR) $(DOCKER_NAME) sh -c '$(or $(1),$(SHELL))' + $(call INFO,exec,$(1)) + $(RUN) docker exec $(DOCKER_ENV) $(DOCKER_EXEC_OPTIONS) $(DOCKER_RUN_WORKDIR) $(DOCKER_NAME) sh -c '$(or $(1),$(SHELL))' endef endif # function run: Pass arg 1 to docker run define run - $(ECHO) docker run $(DOCKER_ENV) $(DOCKER_RUN_OPTIONS) $(DOCKER_RUN_VOLUME) $(DOCKER_RUN_WORKDIR) $(DOCKER_SSH_AUTH) $(1) + $(call INFO,run,$(1)) + $(RUN) docker run $(DOCKER_ENV) $(DOCKER_RUN_OPTIONS) $(DOCKER_RUN_VOLUME) $(DOCKER_RUN_WORKDIR) $(DOCKER_SSH_AUTH) $(1) endef else @@ -70,14 +76,17 @@ else SHELL := /bin/bash # function docker-run: Run new DOCKER_IMAGE:DOCKER_IMAGE_TAG docker with arg 2 define docker-run - $(ECHO) docker run $(DOCKER_RUN_OPTIONS) $(DOCKER_ENV) $(DOCKER_RUN_VOLUME) $(DOCKER_RUN_WORKDIR) $(or $(1),$(DOCKER_IMAGE):$(DOCKER_IMAGE_TAG)) $(2) + $(call INFO,docker-run,$(1)$(comma) $(2)) + $(RUN) docker run $(DOCKER_RUN_OPTIONS) $(DOCKER_ENV) $(DOCKER_RUN_VOLUME) $(DOCKER_RUN_WORKDIR) $(or $(1),$(DOCKER_IMAGE):$(DOCKER_IMAGE_TAG)) $(2) endef # function exec: Call env-exec with arg 1 or SHELL define exec + $(call INFO,exec,$(1)) $(call env-exec,$(or $(1),$(SHELL))) endef # function run: Call env-run with arg 1 define run + $(call INFO,run,$(1)) $(call env-run,$(1)) endef @@ -85,9 +94,10 @@ endif # function docker-volume-copy: Copy files from a docker volume to another define docker-volume-copy + $(call INFO,docker-volume-copy,$(1)$(comma) $(2)) $(eval from := $(1)) $(eval to := $(2)) - $(ECHO) docker volume inspect $(from) >/dev/null - $(ECHO) docker volume inspect $(to) >/dev/null 2>&1 || $(ECHO) docker volume create $(to) >/dev/null - $(ECHO) docker run --rm -v $(from):/from -v $(to):/to alpine ash -c "cd /from; cp -a . /to" + $(RUN) docker volume inspect $(from) >/dev/null + $(RUN) docker volume inspect $(to) >/dev/null 2>&1 || $(RUN) docker volume create $(to) >/dev/null + $(RUN) docker run --rm -v $(from):/from -v $(to):/to alpine ash -c "cd /from; cp -a . /to" endef diff --git a/make/def.mk b/make/def.mk index a33d11b..978a0d5 100644 --- a/make/def.mk +++ b/make/def.mk @@ -2,6 +2,8 @@ comma ?= , dollar ?= $ dquote ?= " quote ?= ' +lbracket ?= ( +rbracket ?= ) APP ?= $(if $(wildcard .git),$(notdir $(CURDIR))) APP_NAME ?= $(APP) APP_TYPE ?= $(if $(SUBREPO),subrepo) $(if $(filter .,$(MYOS)),myos) @@ -14,7 +16,7 @@ CONFIG ?= $(RELATIVE)config CONFIG_REPOSITORY ?= $(call pop,$(or $(APP_UPSTREAM_REPOSITORY),$(GIT_UPSTREAM_REPOSITORY)))/$(notdir $(CONFIG)) CONTEXT ?= $(if $(APP),APP BRANCH VERSION) $(shell awk 'BEGIN {FS="="}; $$1 !~ /^(\#|$$)/ {print $$1}' .env.dist 2>/dev/null) CONTEXT_DEBUG ?= MAKEFILE_LIST env env.docker APPS GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME LOG_LEVEL MAKE_DIR MAKE_SUBDIRS MAKE_CMD_ARGS MAKE_ENV_ARGS MONOREPO_DIR UID USER -DEBUG ?= false +DEBUG ?= DOCKER ?= true DOMAIN ?= localhost DRONE ?= false @@ -37,7 +39,7 @@ GIT_UPSTREAM_REPOSITORY ?= $(if $(findstring ://,$(GIT_REPOSITORY)),$(ca GIT_UPSTREAM_USER ?= $(or $(MONOREPO),$(USER)) GIT_VERSION ?= $(shell git describe --tags $(BRANCH) 2>/dev/null || git rev-parse $(BRANCH) 2>/dev/null) HOSTNAME ?= $(shell hostname 2>/dev/null |sed 's/\..*//') -LOG_LEVEL ?= $(if $(filter false,$(VERBOSE)),error,$(if $(filter true,$(DEBUG)),debug)) +LOG_LEVEL ?= $(if $(DEBUG),debug,$(if $(VERBOSE),info,error)) MAKE_ARGS ?= $(foreach var,$(MAKE_VARS),$(if $($(var)),$(var)='$($(var))')) MAKE_SUBDIRS ?= $(if $(filter myos,$(MYOS)),monorepo,$(if $(APP),apps $(foreach type,$(APP_TYPE),$(if $(wildcard $(MAKE_DIR)/apps/$(type)),apps/$(type))))) MAKE_CMD_ARGS ?= $(foreach var,$(MAKE_CMD_VARS),$(var)='$($(var))') @@ -53,7 +55,7 @@ MAKE_VARS ?= ENV MONOREPO ?= $(if $(filter myos,$(MYOS)),$(notdir $(CURDIR)),$(if $(APP),$(notdir $(realpath $(CURDIR)/..)))) MONOREPO_DIR ?= $(if $(MONOREPO),$(if $(filter myos,$(MYOS)),$(realpath $(CURDIR)),$(if $(APP),$(realpath $(CURDIR)/..)))) MYOS ?= $(if $(filter $(MAKE_DIR),$(call pop,$(MAKE_DIR))),.,$(call pop,$(MAKE_DIR))) -QUIET ?= $(if $(filter false,$(VERBOSE)),--quiet) +QUIET ?= $(if $(VERBOSE),,--quiet) RECURSIVE ?= true RELATIVE ?= $(if $(filter myos,$(MYOS)),./,../) SHARED ?= $(RELATIVE)shared @@ -62,7 +64,7 @@ SUBREPO ?= $(if $(wildcard .gitrepo),$(notdir $(CURDIR)) TAG ?= $(GIT_TAG) UID ?= $(shell id -u 2>/dev/null) USER ?= $(shell id -nu 2>/dev/null) -VERBOSE ?= false +VERBOSE ?= $(if $(DEBUG),true) VERSION ?= $(GIT_VERSION) ifeq ($(DOCKER), true) @@ -71,13 +73,14 @@ else ENV_ARGS = $(env.args) $(env.dist) endif -ifneq ($(DEBUG),true) -.SILENT: -else +ifneq ($(DEBUG),) CONTEXT += $(CONTEXT_DEBUG) +else +.SILENT: endif + ifeq ($(DRYRUN),true) -ECHO = $(if $(filter $(DRYRUN_IGNORE),true),,printf '${COLOR_BROWN}$(APP)${COLOR_RESET}[${COLOR_GREEN}$(MAKELEVEL)${COLOR_RESET}] ${COLOR_BLUE}$@${COLOR_RESET}:${COLOR_RESET} '; echo) +RUN = $(if $(filter $(DRYRUN_IGNORE),true),,echo) ifeq ($(RECURSIVE), true) DRYRUN_RECURSIVE := true endif @@ -110,6 +113,7 @@ endif # function conf: Extract variable=value line from configuration files ## it prints the line with variable 3 definition from block 2 in file 1 define conf + $(call INFO,conf,$(1)$(comma) $(2)$(comma) $(3)) $(eval file := $(1)) $(eval block := $(2)) $(eval variable := $(3)) @@ -138,11 +142,25 @@ endef # macro force: Run command 1 sine die ## it starts command 1 if it is not already running ## it returns never -force = $$(while true; do [ $$(ps x |awk 'BEGIN {nargs=split("'"$$*"'",args)} $$field == args[1] { matched=1; for (i=1;i<=NF-field;i++) { if ($$(i+field) == args[i+1]) {matched++} } if (matched == nargs) {found++} } END {print found+0}' field=4) -eq 0 ] && $(ECHO) $(1) || sleep 1; done) +force = $$(while true; do [ $$(ps x |awk 'BEGIN {nargs=split("'"$$*"'",args)} $$field == args[1] { matched=1; for (i=1;i<=NF-field;i++) { if ($$(i+field) == args[i+1]) {matched++} } if (matched == nargs) {found++} } END {print found+0}' field=4) -eq 0 ] && $(RUN) $(1) || sleep 1; done) # macro gid: Return GID of group 1 gid = $(shell grep '^$(1):' /etc/group 2>/dev/null |awk -F: '{print $$3}') +# function INFO: customized info +INFO = $(if $(VERBOSE),printf '${COLOR_BROWN}$(APP)${COLOR_RESET}[${COLOR_GREEN}$(MAKELEVEL)${COLOR_RESET}] ${COLOR_BLUE}$@${COLOR_RESET}:${COLOR_RESET} ${COLOR_GREEN}Called${COLOR_RESET} $(1)$(if $(2),$(lbracket)$(2)$(rbracket)) $(if $(3),${COLOR_BLUE}in folder${COLOR_RESET} $(3) )\n' >&2) + +# function install-app: Exec 'git clone url 1 dir 2' or Call update-app with url 1 dir 2 +define install-app + $(call INFO,install-app,$(1)$(comma) $(2)) + $(eval url := $(or $(1), $(APP_REPOSITORY))) + $(eval dir := $(or $(2), $(RELATIVE)$(lastword $(subst /, ,$(url))))) + $(if $(wildcard $(dir)/.git), \ + $(call update-app,$(url),$(dir)), \ + $(call exec,$(RUN) git clone $(QUIET) $(url) $(dir)) \ + ) +endef + # function make: Call make with predefined options and variables # 1st arg: make command line (targets and arguments) # 2nd arg: directory to call make from @@ -164,8 +182,8 @@ define make $(if $(wildcard $(file)),$(eval MAKE_ARGS += $(shell cat $(file) |sed '/^$$/d; /^#/d; /=/!d; s/^[[\s\t]]*//; s/[[\s\t]]*=[[\s\t]]*/=/;' |awk -F '=' '{print $$1"='\''"$$2"'\''"}'))) $(eval MAKE_DIR := $(if $(dir),-C $(dir))) $(eval MAKE_OLDFILE += $(filter-out $(MAKE_OLDFILE), $^)) - $(if $(filter $(VERBOSE),true),printf '${COLOR_GREEN}Running${COLOR_RESET} "'"make $(MAKE_ARGS) $(cmd)"'" $(if $(dir),${COLOR_BLUE}in folder${COLOR_RESET} $(dir) )\n') - $(ECHO) $(MAKE) $(MAKE_DIR) $(patsubst %,-o %,$(MAKE_OLDFILE)) MAKE_OLDFILE="$(MAKE_OLDFILE)" $(MAKE_ARGS) $(cmd) + $(call INFO,make,$(MAKE_ARGS) $(cmd),$(dir)) + $(RUN) $(MAKE) $(MAKE_DIR) $(patsubst %,-o %,$(MAKE_OLDFILE)) MAKE_OLDFILE="$(MAKE_OLDFILE)" $(MAKE_ARGS) $(cmd) $(if $(filter $(DRYRUN_RECURSIVE),true),$(MAKE) $(MAKE_DIR) $(patsubst %,-o %,$(MAKE_OLDFILE)) MAKE_OLDFILE="$(MAKE_OLDFILE)" DRYRUN=$(DRYRUN) RECURSIVE=$(RECURSIVE) $(MAKE_ARGS) $(cmd)) endef @@ -175,22 +193,15 @@ pop = $(patsubst %$(or $(2),/)$(lastword $(subst $(or $(2),/), ,$(1))),%,$(1)) # macro sed: Exec sed script 1 on file 2 sed = $(call exec,sed -i $(SED_SUFFIX) '\''$(1)'\'' $(2)) -# function install-app: Exec 'git clone url 1 dir 2' or Call update-app -## it installs application source files -define install-app - $(eval url := $(or $(1), $(APP_REPOSITORY))) - $(eval dir := $(or $(2), $(RELATIVE)$(lastword $(subst /, ,$(url))))) - [ -d $(dir)/.git ] && $(call update-app,$(url),$(dir)) - [ -d $(dir)/.git ] || $(call exec,$(ECHO) git clone $(QUIET) $(url) $(dir)) -endef - # function update-app: Exec 'cd dir 1 && git pull' or Call install-app -## it updates application source files define update-app + $(call INFO,update-app,$(1)$(comma) $(2)) $(eval url := $(or $(1), $(APP_REPOSITORY))) $(eval dir := $(or $(2), $(APP_DIR))) - [ -d $(dir)/.git ] && $(call exec,cd $(dir) && $(ECHO) git pull $(QUIET)) - [ -d $(dir)/.git ] || $(call install-app,$(url),$(dir)) + $(if $(wildcard $(dir)/.git), \ + $(call exec,cd $(dir) && $(RUN) git pull $(QUIET)), \ + $(call install-app,$(url),$(dir)) \ + ) endef # function TARGET:ENV: Create a new target ending with :env diff --git a/make/env.mk b/make/env.mk index 47e5cc6..728f0c4 100644 --- a/make/env.mk +++ b/make/env.mk @@ -37,6 +37,7 @@ SHELL:=/bin/bash # 2nd arg: path to .env.dist file, default to .env.dist # 3rd arg: path to .env override files, default to .env.$(ENV) define .env + $(call INFO,.env,$(1)$(comma) $(2)$(comma) $(3)) $(eval env_file:=$(or $(1),.env)) $(eval env_dist:=$(or $(2),$(env_file).dist)) $(eval env_over:=$(or $(wildcard $(3)),$(wildcard $(env_file).$(ENV)))) @@ -70,6 +71,7 @@ endef # sort alphabetically # add variables definition to the .env file define .env_update + $(call INFO,.env_update,$(env_file) $(env_dist) $(env_over)) touch $(env_file) printenv \ |awk -F '=' 'NR == FNR { if($$1 !~ /^(#|$$)/) { A[$$1]; next } } !($$1 in A)' - $(env_dist) \ diff --git a/make/help.mk b/make/help.mk index c9b3d1a..100c935 100644 --- a/make/help.mk +++ b/make/help.mk @@ -13,11 +13,15 @@ COLOR_BLUE ?= \033[36m blank1 blank2: printf "\n" -# target context: Call context-% target for each CONTEXT +# target context: Print Context and Call contexts target .PHONY: context context: printf "${COLOR_BROWN}Context:${COLOR_RESET}\n" - $(MAKE) $(foreach var,$(CONTEXT),$(if $($(var)),context-$(var))) FORCE + $(MAKE) contexts + +# target context: Fire context-% target for each CONTEXT +.PHONY: contexts +contexts: $(foreach var,$(CONTEXT),$(if $($(var)),context-$(var))) # target context-%: Print % value .PHONY: context-% diff --git a/make/include.mk b/make/include.mk index 1b3ff42..3bc5cf5 100644 --- a/make/include.mk +++ b/make/include.mk @@ -1,13 +1,21 @@ ## # INCLUDE -# variable MAKE_DIR: Directory path of this file +# variable MAKE_DIR: Path of this file MAKE_DIR := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +# variable MAKE_FILE: Name of this file +MAKE_FILE := $(notdir $(lastword $(MAKEFILE_LIST))) # variable MAKE_FILES: List of first files to load MAKE_FILES := env.mk def.mk $(wildcard def.*.mk) -## it includes $(MAKE_DIR)/$(MAKE_FILES) $(MAKE_DIR)/*.mk -include $(wildcard $(patsubst %,$(MAKE_DIR)/%,$(MAKE_FILES))) $(filter-out $(wildcard $(patsubst %,$(MAKE_DIR)/%,$(notdir $(lastword $(MAKEFILE_LIST))) $(MAKE_FILES))),$(wildcard $(MAKE_DIR)/*.mk)) -## it includes $(MAKE_DIR)/*/def.mk $(MAKE_DIR)/*/def.*.mk $(MAKE_DIR)/*/*.mk -include $(foreach subdir,$(MAKE_SUBDIRS),$(wildcard $(MAKE_DIR)/$(subdir)/def.mk $(MAKE_DIR)/$(subdir)/def.*.mk) $(filter-out $(wildcard $(MAKE_DIR)/$(subdir)/def.mk $(MAKE_DIR)/$(subdir)/def.*.mk),$(wildcard $(MAKE_DIR)/$(subdir)/*.mk))) -## it includes def.mk def.*.mk *.mk */def.mk */def.*.mk */*.mk -include $(wildcard def.mk def.*.mk) $(filter-out $(wildcard def.mk def.*.mk),$(wildcard *.mk)) $(filter-out $(wildcard $(MAKE_DIR)/*.mk),$(wildcard */def.mk */def.*.mk) $(filter-out $(wildcard */def.mk */def.*.mk),$(wildcard */*.mk))) +## it includes $(MAKE_DIR)/$(MAKE_FILES) +include $(wildcard $(patsubst %,$(MAKE_DIR)/%,$(MAKE_FILES))) +## it includes $(MAKE_DIR)/*/def.mk $(MAKE_DIR)/*/def.*.mk +include $(foreach subdir,$(MAKE_SUBDIRS),$(wildcard $(MAKE_DIR)/$(subdir)/def.mk $(MAKE_DIR)/$(subdir)/def.*.mk)) +## it includes def.mk def.*.mk */def.mk */def.*.mk +include $(wildcard def.mk def.*.mk) $(filter-out $(wildcard $(MAKE_DIR)/*.mk),$(wildcard */def.mk */def.*.mk)) +## it includes $(MAKE_DIR)/*.mk +include $(filter-out $(wildcard $(patsubst %,$(MAKE_DIR)/%,$(MAKE_FILE) $(MAKE_FILES))),$(wildcard $(MAKE_DIR)/*.mk)) +## it includes $(MAKE_DIR)/*/*.mk +include $(foreach subdir,$(MAKE_SUBDIRS),$(filter-out $(wildcard $(MAKE_DIR)/$(subdir)/def.mk $(MAKE_DIR)/$(subdir)/def.*.mk),$(wildcard $(MAKE_DIR)/$(subdir)/*.mk))) +## it includes *.mk */*.mk +include $(filter-out $(wildcard def.mk def.*.mk),$(wildcard *.mk)) $(filter-out $(wildcard $(MAKE_DIR)/*.mk */def.mk */def.*.mk),$(wildcard */*.mk)) diff --git a/make/monorepo/common.mk b/make/monorepo/common.mk index 6bb20fa..0d2a24a 100644 --- a/make/monorepo/common.mk +++ b/make/monorepo/common.mk @@ -24,7 +24,7 @@ config: $(APPS) # target copy: Copy files and folders to all APPS .PHONY: copy copy: - $(foreach app,$(APPS),$(foreach file,$(ARGS),$(if $(wildcard $(file)),$(ECHO) $(if $(filter LINUX,$(HOST_SYSTEM)),cp -a --parents $(file) $(app)/,rsync -a $(file) $(app)/$(file)) &&)) true &&) true + $(foreach app,$(APPS),$(foreach file,$(ARGS),$(if $(wildcard $(file)),$(RUN) $(if $(filter LINUX,$(HOST_SYSTEM)),cp -a --parents $(file) $(app)/,rsync -a $(file) $(app)/$(file)) &&)) true &&) true # target deploy: Fire APPS target .PHONY: deploy diff --git a/make/monorepo/release.mk b/make/monorepo/release.mk index 3525c91..fcc2e70 100644 --- a/make/monorepo/release.mk +++ b/make/monorepo/release.mk @@ -37,7 +37,7 @@ release-finish: release-check git-stash # target release-update: Update RELEASE with RELEASE_VERSION in .env .PHONY: release-update release-update: - $(ECHO) awk -v s=RELEASE=$(RELEASE_VERSION) '/^RELEASE=/{$$0=s;f=1} {a[++n]=$$0} END{if(!f)a[++n]=s;for(i=1;i<=n;i++)print a[i]>ARGV[1]}' .env + $(RUN) awk -v s=RELEASE=$(RELEASE_VERSION) '/^RELEASE=/{$$0=s;f=1} {a[++n]=$$0} END{if(!f)a[++n]=s;for(i=1;i<=n;i++)print a[i]>ARGV[1]}' .env # target release-upgrade: Run migration targets to upgrade specific releases .PHONY: release-upgrade diff --git a/openstack/.env.dist b/openstack/.env.dist index a6499b2..878103c 100644 --- a/openstack/.env.dist +++ b/openstack/.env.dist @@ -1,6 +1,3 @@ -DEBUG=false -DOCKER=true -ENV=local OS_AUTH_URL= OS_TENANT_ID= OS_TENANT_NAME= diff --git a/openstack/def.openstack.mk b/openstack/def.openstack.mk index aee5d76..ac450db 100644 --- a/openstack/def.openstack.mk +++ b/openstack/def.openstack.mk @@ -1,19 +1,22 @@ CMDS += openstack ENV_VARS += OS_AUTH_URL OS_TENANT_ID OS_TENANT_NAME OS_USERNAME OS_PASSWORD OS_REGION_NAME OS_USER_DOMAIN_NAME OS_PROJECT_DOMAIN_NAME -ifeq ($(DEBUG), true) +ifneq ($(DEBUG),) OPENSTACK_ARGS += --debug endif -ifeq ($(ENV), local) +ifneq ($(VERBOSE),) OPENSTACK_ARGS += -v endif ifeq ($(DOCKER), true) + # function openstack: Call run DOCKER_REPOSITORY/openstack:DOCKER_IMAGE_TAG with arg 1 define openstack + $(call INFO,openstack,$(1)) $(call run,$(DOCKER_REPOSITORY)/openstack:$(DOCKER_IMAGE_TAG) $(1)) endef else # function openstack: Call run openstack with arg 1 define openstack + $(call INFO,openstack,$(1)) $(call run,openstack $(1)) endef endif diff --git a/packer/def.packer.mk b/packer/def.packer.mk index bcc9671..40c6750 100644 --- a/packer/def.packer.mk +++ b/packer/def.packer.mk @@ -30,7 +30,7 @@ PACKER_TEMPLATE ?= alpine PACKER_USERNAME ?= root PACKER_VNC_PORT ?= $(if $(vnc_port_max),$(vnc_port_max),5900) PACKER_VNC_ADDRESS ?= $(if $(vnc_bind_address),$(vnc_bind_address),0.0.0.0) -ifeq ($(DEBUG), true) +ifneq ($(DEBUG),) PACKER_BUILD_ARGS += -debug endif ifeq ($(FORCE), true) diff --git a/stack/base.mk b/stack/base.mk index 5f22cd9..f270704 100644 --- a/stack/base.mk +++ b/stack/base.mk @@ -1,6 +1,6 @@ # target base: Fire docker-network-create stack-base-up base-ssh-add .PHONY: base -base: docker-network-create stack-base-up base-ssh-add +base: docker-network-create $(if $(filter $(DOCKER),true),stack-base-up base-ssh-add) # target ssh-add: Fire base-ssh-add .PHONY: ssh-add