diff --git a/LICENSE b/LICENSE index f76e763..33511fc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License Copyright (c) 2022 Andreas Neue -Copyright (c) 2022-23 the make-deploy authors (see CONTRIBUTORS) +Copyright (c) 2022-25 the make-deploy authors (see CONTRIBUTORS) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/Makefile b/Makefile index 751fbf6..59a1159 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,7 @@ DEPLOY_START_DELAY = 0 +DEPLOY_PROJECT_DIR = + +MANDATORY = DEPLOY_NAME DEPLOY_HOSTS DEPLOY_PATH SSH_USER -include secrets.mk include config.mk @@ -9,20 +12,19 @@ ifeq ($(DEPLOY_TYPE), copy) DEPLOY_TYPE = simple endif +project_dir = $(DEPLOY_PATH)/$(DEPLOY_NAME)$(DEPLOY_PROJECT_DIR) + include make-deploy/$(DEPLOY_TYPE).mk -.PHONY: self-update mandatory cleanup prerequisites prepare build test deploy pre-deploy post-deploy pre-local post-local upload pull start stop restart reload +.PHONY: self-update mandatory cleanup prerequisites prepare build test deploy pre-deploy post-deploy pre-local post-local upload pull start stop restart reload notify self-update: @- git submodule update --remote -deploy: mandatory cleanup prepare build test upload pre-deploy pre-local pull start post-local post-deploy reload +deploy: mandatory cleanup prepare build test upload pre-deploy pre-local pull start notify post-local post-deploy reload mandatory: @- echo "\n### mandatory check" -ifndef MANDATORY-$(DEPLOY_TYPE) - $(error MANDATORY-$(DEPLOY_TYPE) is not defined) -endif @ $(foreach var,$(MANDATORY), \ if test -z "${$(var)}"; then \ echo "Missing mandatory variable: $(var)"; \ @@ -123,7 +125,17 @@ pull: pull-$(DEPLOY_TYPE) start: start-$(DEPLOY_TYPE) stop: stop-$(DEPLOY_TYPE) - + +notify: +ifdef DEPLOY_NOTIFY_HOSTS +ifdef DEPLOY_NOTIFY_MAIL +ifdef DEPLOY_NOTIFY_MSG + @- echo "\n### notify" + @- echo "$$DEPLOY_NOTIFY_MSG :: Please deploy manually on following hosts: $$DEPLOY_NOTIFY_HOSTS" | mail -s "make-deploy notification" $(DEPLOY_MAIL) +endif +endif +endif + logs: logs-$(DEPLOY_TYPE) restart: restart-$(DEPLOY_TYPE) diff --git a/README.md b/README.md index dc4693c..ca140d4 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ A simple Makefile based deployment system. -**make-deploy** was initially hosted at https://git.dnix.de/an/make-deploy. Since it has become heavily used at chefkoch.de for system deployments, and lots of code is committed there, we moved the repo to https://git.chefkoch.net/pub/make-deploy. A mirror still exists at https://git.dnix.de/mirror/make-deploy. - **make-deploy** is licensed under the terms of the MIT-License. See [LICENSE](LICENSE) for info. ## Installation @@ -24,6 +22,7 @@ Example `config.mk`: DEPLOY_PATH = /srv DEPLOY_TYPE = compose DEPLOY_HOSTS = server01.example.com server02.example.com + DEPLOY_SUBPATH = my-sub-path DOCKER_IMAGE = dr.example.com/my-project:latest DOCKER_LOGIN = 1 @@ -36,6 +35,8 @@ Example `secrets.mk`: DOCKER_USER = root DOCKER_PASS = secret1234 +`DEPLOY_SUBPATH` is used to define a location for `DEPLOY_TYPE` = compose that states where the docker-compose.yml is placed at. If that variable is undefined, it is expected to be in projects root. + By setting `DEPLOY_CONFIG_OVERRIDE`, an alternative config can be loaded to override existing configuration settings. This is useful in script calling make deploy or in a `.gitlab-ci.yml` in order to control settings for different targets. ## Usage diff --git a/apt.mk b/apt.mk index b3099ea..0741f74 100644 --- a/apt.mk +++ b/apt.mk @@ -1,4 +1,4 @@ -MANDATORY-apt = DEPLOY_HOSTS SSH_USER APT_PACKAGES DEPLOY_NAME +MANDATORY = $(shell printenv MANDATORY) APT_PACKAGES pull-apt: # nop diff --git a/compose-file.mk b/compose-file.mk index 03a194c..37a98d1 100644 --- a/compose-file.mk +++ b/compose-file.mk @@ -1,4 +1,4 @@ -MANDATORY-compose-file = DEPLOY_HOSTS DEPLOY_TYPE SSH_USER DEPLOY_COMPOSE_FILE DEPLOY_COMPOSE_PROJECT +MANDATORY = $(shell printenv MANDATORY) SSH_USER DEPLOY_COMPOSE_FILE DEPLOY_COMPOSE_PROJECT ifndef DOCKER_LOGIN DOCKER_LOGIN = 0 diff --git a/compose.mk b/compose.mk index 6de67f8..ec8b6b3 100644 --- a/compose.mk +++ b/compose.mk @@ -1,16 +1,18 @@ -MANDATORY-compose = DEPLOY_HOSTS DEPLOY_TYPE SSH_USER DEPLOY_NAME +ifdef DOCKER_LOGIN +MANDATORY = $(shell printenv MANDATORY) DOCKER_USER DOCKER_PASS DOCKER_REGISTRY +endif ifndef DOCKER_LOGIN DOCKER_LOGIN = 0 endif pull-compose: - @- echo "\n### pulling image(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ + @echo "\n### pulling image(s)" + $(foreach host,$(DEPLOY_HOSTS), \ echo "$(host)"; \ - if test $(DOCKER_LOGIN) -eq 1 ; \ + if test "$(DOCKER_LOGIN)" = "1" ; \ then \ - echo "\n#### perfom docker login with user $(DOCKER_USER) on $(DOCKER_REGISTRY)"; \ + echo "\n#### perform docker login with user $(DOCKER_USER) on $(DOCKER_REGISTRY)"; \ ssh $(SSH_USER)@$(host) "docker login -u $(DOCKER_USER) -p $(DOCKER_PASS) $(DOCKER_REGISTRY)"; \ fi; \ if test -n "$(DOCKER_IMAGE)" ; \ @@ -20,27 +22,24 @@ pull-compose: ) start-compose: - @- echo "\n### starting service(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ + @echo "\n### starting service(s)" + $(foreach host,$(DEPLOY_HOSTS), \ echo "$(host)"; \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose up -d"; \ + ssh $(SSH_USER)@$(host) "cd $(project_dir); docker-compose up -d"; \ sleep $(DEPLOY_START_DELAY); \ ) -stop-compose: - @- echo "\n### stopping service(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose down"; \ - ) - logs-compose: - @- echo "\n### logs" - @- ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose logs -f $(service)" - -restart-compose: - @- $(foreach host,$(DEPLOY_HOSTS), \ + @echo "\n### logs" + $(foreach host,$(DEPLOY_HOSTS), \ echo "$(host)"; \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose restart"; \ + ssh $(SSH_USER)@$(host) "cd $(project_dir); docker-compose logs -f $(service)"; \ + ) + +restart-compose: + @echo "\n### restarting service(s)" + $(foreach host,$(DEPLOY_HOSTS), \ + echo "$(host)"; \ + ssh $(SSH_USER)@$(host) "cd $(project_dir); docker-compose restart"; \ sleep $(DEPLOY_START_DELAY); \ ) diff --git a/cron.mk b/cron.mk index f107828..ad5a78d 100644 --- a/cron.mk +++ b/cron.mk @@ -1,4 +1,4 @@ -MANDATORY-cron = true +MANDATORY = $(shell printenv MANDATORY) CRON_USER start-cron: @- echo "\n### starting..." diff --git a/helm.mk b/helm.mk index a1ef5ab..394fb8c 100644 --- a/helm.mk +++ b/helm.mk @@ -1,4 +1,4 @@ -MANDATORY-helm = K8S_CONTEXT HELM_CHART_NAME HELM_CHART_PATH HELM_VALUES_FILE NAMESPACE +MANDATORY = $(shell printenv MANDATORY) K8S_CONTEXT HELM_CHART_NAME HELM_CHART_PATH HELM_VALUES_FILE K8S_NAMESPACE # helm # # deploys helm charts on k8s via helm diff --git a/k8s.mk b/k8s.mk index 37f712c..b439929 100644 --- a/k8s.mk +++ b/k8s.mk @@ -2,15 +2,16 @@ # # deploys k8s -MANDATORY-k8s = K8S_CONTEXT +MANDATORY = $(shell printenv MANDATORY) K8S_CONTEXT +K8S_MANIFEST_FILENAME ?= kubernetes.yaml start-k8s: @- echo "\n### starting deployment with k8s" @- echo "\n### setting kubernetes context to $(K8S_CONTEXT)" @ kubectl config use-context $(K8S_CONTEXT) - @- echo "\n### run kubectl apply -f kubernetes.yaml and secrets.yaml" - @ cat kubernetes.yaml secrets.yaml | envsubst | kubectl apply -f - + @- echo "\n### run kubectl apply -f $(K8S_MANIFEST_FILENAME) and secrets.yaml" + @ cat $(K8S_MANIFEST_FILENAME) secrets.yaml | envsubst | kubectl apply $(K8S_ADDITIONAL_PARAMS) -f - pull-k8s: # nop diff --git a/kustomize.mk b/kustomize.mk index 60dacac..9bdcfdf 100644 --- a/kustomize.mk +++ b/kustomize.mk @@ -1,4 +1,4 @@ -MANDATORY-kustomize = K8S_CONTEXT KUSTOMIZE_FOLDER NAMESPACE +MANDATORY = $(shell printenv MANDATORY) K8S_CONTEXT KUSTOMIZE_FOLDER NAMESPACE # kustomize # # this uses kustomize to install stuff on k8s diff --git a/simple.mk b/simple.mk index b95bf0f..8210118 100644 --- a/simple.mk +++ b/simple.mk @@ -1,11 +1,12 @@ -MANDATORY-copy = DEPLOY_TYPE DEPLOY_HOSTS SSH_USER DEPLOY_PATH DEPLOY_NAME -MANDATORY-simple = $(MANDATORY-copy) - -# copy +# simple # # this just rsyncs the stuff to the remote server(s) and runs # build.sh, pre-/post-deploy, pre-/post-local, start.sh, etc. +ifndef DEPLOY_StART_DELAY +DEPLOY_START_DELAY = 0 +endif + pull-simple: # nop diff --git a/swarm.mk b/swarm.mk index 913a125..45f67b8 100644 --- a/swarm.mk +++ b/swarm.mk @@ -1,5 +1,3 @@ -MANDATORY-swarm = DEPLOY_HOSTS DEPLOY_TYPE TAG - pull-swarm: start-swarm: diff --git a/test.sh b/test.sh index 42d08f0..88d79e1 100755 --- a/test.sh +++ b/test.sh @@ -30,7 +30,7 @@ function test_with_minimal_vars_compose(){ cp $TESTS/compose_config.mk config.mk cp $TESTS/docker-compose.yml . make deploy - rm -f docker-compose.yml config.mk + rm -f docker-compose.yml } function test_with_minimal_vars_compose_file(){ @@ -38,16 +38,7 @@ function test_with_minimal_vars_compose_file(){ cp $TESTS/compose_file_config.mk config.mk cp $TESTS/docker-compose.yml . make deploy - rm -f docker-compose.yml config.mk -} - -function test_with_minimal_vars_compose_and_tag(){ - echo "::::::::: $FUNCNAME ::::::::::::" - cp $TESTS/compose_config.tag.mk config.mk - cp $TESTS/docker-compose.tag.yml docker-compose.yml - echo "TAG=3.17" > .env - make deploy - rm -f docker-compose.yml config.mk + rm -f docker-compose.yml } prepdir @@ -55,6 +46,5 @@ prepdir test_with_minimal_vars_apt test_with_minimal_vars_compose test_with_minimal_vars_compose_file -test_with_minimal_vars_compose_and_tag cleandir diff --git a/testing/compose_config.tag.mk b/testing/compose_config.tag.mk deleted file mode 100644 index c63ecb7..0000000 --- a/testing/compose_config.tag.mk +++ /dev/null @@ -1,5 +0,0 @@ -DEPLOY_NAME = make-deploy-test-compose-tag -DEPLOY_PATH = /tmp -DEPLOY_HOSTS = localhost -DEPLOY_TYPE = compose -SSH_USER = $(USER) diff --git a/testing/docker-compose.tag.yml b/testing/docker-compose.tag.yml deleted file mode 100644 index c6cee18..0000000 --- a/testing/docker-compose.tag.yml +++ /dev/null @@ -1,4 +0,0 @@ -services: - curl: - image: "alpine:${TAG}" - command: cat /etc/os-release diff --git a/tf.mk b/tf.mk index b06e579..df910ed 100644 --- a/tf.mk +++ b/tf.mk @@ -1,4 +1,5 @@ -MANDATORY-tf = +MANDATORY = $(shell printenv MANDATORY) TF_FLAGS + # tf # # deploys via tf apply