From 6e982393ac6e848f9bc30c417a52f29bf620b250 Mon Sep 17 00:00:00 2001 From: Yann Autissier Date: Wed, 17 Dec 2025 04:15:18 +0100 Subject: [PATCH] dynamic stack dir and env vars --- make/apps/def.docker.mk | 3 ++- make/def.docker.mk | 3 ++- make/def.mk | 17 ++++++++++++----- make/include.mk | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/make/apps/def.docker.mk b/make/apps/def.docker.mk index 716552b..2e2d1f9 100644 --- a/make/apps/def.docker.mk +++ b/make/apps/def.docker.mk @@ -152,9 +152,10 @@ define docker-stack-update $(eval stack := $(patsubst %.yml,%,$(notdir $(1)))) $(eval name := $(firstword $(subst :, ,$(stack)))) $(eval version := $(or $(2),$(if $(findstring :,$(stack)),$(lastword $(subst :, ,$(stack))),latest))) - $(eval path := $(patsubst %/,%,$(or $(3),$(if $(findstring /,$(1)),$(if $(wildcard stack/$(1) stack/$(1).yml),stack/$(if $(findstring .yml,$(1)),$(dir $(1)),$(if $(wildcard stack/$(1).yml),$(dir $(1)),$(1))),$(if $(wildcard stack/$(stackz)/$(1) stack/$(stackz)/$(1).yml),stack/$(stackz)/$(if $(findstring .yml,$(1)),$(dir $(1)),$(if $(wildcard stack/$(stackz)/$(1).yml),$(dir $(1)),$(1))),$(dir $(1))))),$(firstword $(wildcard stack/$(stackz)/$(name) stack/$(stackz) stack/$(name)))))) + $(eval path := $(patsubst %/,%,$(or $(3),$(foreach stack_dir,$(STACK_DIR),$(if $(findstring /,$(1)),$(if $(wildcard $(stack_dir)/$(1) $(stack_dir)/$(1).yml),$(stack_dir)/$(if $(findstring .yml,$(1)),$(dir $(1)),$(if $(wildcard $(stack_dir)/$(1).yml),$(dir $(1)),$(1))),$(if $(wildcard $(stack_dir)/$(stackz)/$(1) $(stack_dir)/$(stackz)/$(1).yml),$(stack_dir)/$(stackz)/$(if $(findstring .yml,$(1)),$(dir $(1)),$(if $(wildcard $(stack_dir)/$(stackz)/$(1).yml),$(dir $(1)),$(1))),$(dir $(1)))))),$(foreach stack_dir,$(STACK_DIR),$(firstword $(wildcard $(stack_dir)/$(stackz)/$(name) $(stack_dir)/$(stackz) $(stack_dir)/$(name))))))) $(call compose-file,$(path),docker-compose $(name),$(COMPOSE_FILE_SUFFIX) $(version)) $(if $(wildcard $(path)/.env.dist),$(call .env,,$(path)/.env.dist,$(wildcard $(CONFIG)/$(ENV)/$(APP)/.env $(path)/.env.$(ENV) .env))) + $(call env-vars,$(COMPOSE_FILE)) endef # function docker-tag: Tag docker image define docker-tag diff --git a/make/def.docker.mk b/make/def.docker.mk index 37e238c..8269759 100644 --- a/make/def.docker.mk +++ b/make/def.docker.mk @@ -33,10 +33,11 @@ HOST_DOCKER_VOLUME ?= $(HOST_COMPOSE_PROJECT_NAME) HOST_GID ?= $(HOST_UID) HOST_UID ?= 123 HOST_STACK ?= $(filter host,$(firstword $(subst /, ,$(STACK)))) -MYOS_STACK ?= $(MYOS)/stack/myos +MYOS_STACK ?= $(foreach stack_dir,$(STACK_DIR),$(MYOS)/$(stack_dir)/myos) MYOS_STACK_FILE ?= networks volumes RESU_DOCKER_REPOSITORY ?= $(subst -,/,$(USER_COMPOSE_PROJECT_NAME)) STACK ?= $(APP) +STACK_DIR ?= stack USER_COMPOSE_PROJECT_NAME ?= $(subst .,-,$(RESU)) USER_COMPOSE_SERVICE_NAME ?= $(USER_COMPOSE_PROJECT_NAME) USER_DOCKER_IMAGE ?= $(USER_DOCKER_REPOSITORY):${DOCKER_IMAGE_TAG} diff --git a/make/def.mk b/make/def.mk index e9a381a..b51bdfc 100644 --- a/make/def.mk +++ b/make/def.mk @@ -8,8 +8,8 @@ percent ?= % quote ?= ' rbracket ?= ) APP ?= $(if $(wildcard .git),$(notdir $(CURDIR))) -APP_LOAD ?= $(if $(SUBREPO),subrepo) $(if $(filter .,$(MYOS)),myos) APP_NAME ?= $(subst _,,$(subst -,,$(subst .,,$(call LOWERCASE,$(APP))))) +APP_TYPE ?= $(if $(SUBREPO),subrepo) $(if $(filter .,$(MYOS)),myos) APPS ?= $(if $(MONOREPO),$(sort $(patsubst $(MONOREPO_DIR)/%/.git,%,$(wildcard $(MONOREPO_DIR)/*/.git)))) APPS_NAME ?= $(foreach app,$(APPS),$(or $(shell awk -F '=' '$$1 == "APP" {print $$2}' $(or $(wildcard $(MONOREPO_DIR)/$(app)/.env),$(wildcard $(MONOREPO_DIR)/$(app)/.env.$(ENV)),$(MONOREPO_DIR)/$(app)/.env.dist) 2>/dev/null),$(app))) BRANCH ?= $(GIT_BRANCH) @@ -43,7 +43,7 @@ CONTEXT ?= ENV $(shell awk 'BEGIN {FS="="}; $$1 !~ /^(\# CONTEXT_DEBUG ?= MAKEFILE_LIST DOCKER_ENV_ARGS ENV_ARGS APPS GIT_AUTHOR_EMAIL GIT_AUTHOR_NAME MAKE_DIR MAKE_SUBDIRS MAKE_CMD_ARGS MAKE_ENV_ARGS UID USER DEBUG ?= DOCKER ?= $(shell type -p docker) -DOMAIN ?= $(or $(shell dnsdomainname 2>/dev/null),$(shell hostname -d 2>/dev/null),$(shell hostname -f | sed -n 's/[^\.]*\.\([^/ ]*\).*/\1/p'), localhost) +DOMAIN ?= $(or $(filter-out local,$(or $(shell dnsdomainname 2>/dev/null),$(shell hostname -d 2>/dev/null),$(shell hostname -f | sed -n 's/[^\.]*\.\([^/ ]*\).*/\1/p'))), localhost) DOMAINNAME ?= $(firstword $(DOMAIN)) DRONE ?= false DRYRUN ?= false @@ -79,13 +79,13 @@ $(foreach cmd,$(INSTALL_CMDS),$(if $(CMD_$(cmd)),$(eval INSTALL_CMD ?= $(CMD_$(c LOG_LEVEL := $(or $(if $(DEBUG),debug),$(if $(VERBOSE),info),error) MAIL ?= $(GIT_AUTHOR_EMAIL) MAKE_ARGS = $(foreach var,$(MAKE_VARS),$(if $($(var)),$(var)='$($(var))')) -MAKE_SUBDIRS ?= $(if $(filter myos,$(MYOS)),monorepo,$(if $(APP),apps $(foreach type,$(APP_LOAD),$(if $(wildcard $(MAKE_DIR)/apps/$(type)),apps/$(type))))) +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))') MAKE_CMD_VARS ?= $(strip $(foreach var, $(filter-out .VARIABLES,$(.VARIABLES)), $(if $(filter command\ line,$(origin $(var))),$(var)))) MAKE_ENV_ARGS ?= $(foreach var,$(filter $(ENV_VARS),$(MAKE_ENV_VARS)),$(var)='$($(var))') MAKE_ENV_VARS ?= $(strip $(foreach var, $(filter-out .VARIABLES,$(.VARIABLES)), $(if $(filter environment,$(origin $(var))),$(var)))) MAKE_FILE_ARGS ?= $(foreach var,$(filter $(ENV_VARS),$(MAKE_FILE_VARS)),$(var)='$($(var))') -MAKE_FILE_VARS ?= $(strip $(foreach var, $(filter-out .VARIABLES,$(.VARIABLES)), $(if $(filter file,$(origin $(var))),$(var)))) +MAKE_FILE_VARS ?= $(sort $(foreach var, $(filter-out .VARIABLES COLOR_% MAKE_FILE_VARS,$(.VARIABLES)), $(if $(filter file,$(origin $(var))),$(var)))) MAKE_OLDFILE ?= $@ MAKE_TARGETS ?= $(filter-out $(.VARIABLES),$(shell $(MAKE) -qp 2>/dev/null |awk -F':' '/^[a-zA-Z0-9][^$$\#\/\t=]*:([^=]|$$)/ {print $$1}' 2>/dev/null |sort -u)) MAKE_UNIXTIME_START := $(shell date -u +'%s' 2>/dev/null) @@ -187,7 +187,7 @@ rs256 = $(shell echo -n '$(1)' |openssl dgst -sha256 -binary -sign '$(2)') JWT_HEADER = {"alg":"HS256","typ":"JWT"} # macro JWT: Print Json Web Token for header $1 payload $2 and key $3 -JWT = $(strip \ +JWT := $(strip \ $(eval header := $(or $(1),$(JWT_HEADER))) \ $(eval payload := $(or $(2),$(JWT_PAYLOAD))) \ $(eval secret := $(or $(3),$(JWT_SECRET))) \ @@ -309,6 +309,13 @@ define env-exec IFS=$$'\n'; env $(env_reset) $(env_args) $(1) endef +# function env-vars: Extract variables from file 1 to update variable ENV_VARS +define env-vars + $(call INFO,env-vars,$(1)) + $(eval file := $(wildcard $(or $(1),$(COMPOSE_FILE)))) + $(if $(file),$(eval ENV_VARS := $(sort $(ENV_VARS) $(shell sed 's/\$$\$$//g' $(file) | grep -oE '\$$\{?[A-Z0-9_]+' | tr -d '{}$$')))) +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 diff --git a/make/include.mk b/make/include.mk index 2e5ef08..13af1b1 100644 --- a/make/include.mk +++ b/make/include.mk @@ -21,6 +21,6 @@ include $(filter-out $(wildcard $(MAKE_FILE) $(MAKE_FIRST) $(MAKE_LATEST)),$(wil ## it includes $(MAKE_DIR)/$(MAKE_SUBDIRS)/*.mk include $(foreach subdir,$(MAKE_SUBDIRS),$(filter-out $(wildcard $(MAKE_DIR)/$(subdir)/def.mk $(MAKE_DIR)/$(subdir)/def.*.mk),$(wildcard $(MAKE_DIR)/$(subdir)/*.mk))) ## if not in $(MYOS) nor $(MONOREPO), it includes *.mk */*.mk, else stack/*.mk if in $(MYOS) -include $(if $(filter-out myos,$(MYOS)),$(if $(filter-out .,$(MYOS)),$(filter-out $(wildcard def.mk def.*.mk */def.mk */def.*.mk),$(wildcard *.mk */*.mk)),$(wildcard stack/*.mk stack/*/*.mk))) +include $(if $(filter-out myos,$(MYOS)),$(if $(filter-out .,$(MYOS)),$(filter-out $(wildcard def.mk def.*.mk */def.mk */def.*.mk),$(wildcard *.mk */*.mk)),$(foreach stack_dir,$(STACK_DIR),$(wildcard $(stack_dir)/*.mk $(stack_dir)/*/*.mk)))) ## it includes $(MAKE_LATEST) include $(wildcard $(MAKE_LATEST))