From 67fd09496fe73f2d38a2db4e526475d9c6e9daa3 Mon Sep 17 00:00:00 2001 From: "stefan.riepenhausen" Date: Fri, 18 Jul 2025 10:11:53 +0200 Subject: [PATCH] more everything --- Makefile | 43 ++++++++++++++++++++++++++----------------- README.md | 2 ++ apt.mk | 9 ++++++--- compose-file.mk | 38 ++++++++++++++++++++++---------------- compose.mk | 34 ++++++++++++++++++++-------------- cron.mk | 4 ++++ k8s.mk | 9 +++++++-- simple.mk | 8 +++++--- swarm.mk | 2 ++ 9 files changed, 94 insertions(+), 55 deletions(-) diff --git a/Makefile b/Makefile index 59a1159..9b9a703 100644 --- a/Makefile +++ b/Makefile @@ -39,17 +39,19 @@ prerequisites: ifdef DEPLOY_CLEANUP cleanup: @- echo "\n### cleanup ..." - @- $(foreach host,$(DEPLOY_HOSTS), \ + @ $(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ scp cleanup.sh $(SSH_USER)@$(host):/$(DEPLOY_PATH)/$(DEPLOY_NAME); \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh cleanup.sh $(host)"; \ + if [ -e cleanup.sh ]; then ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh cleanup.sh $(host)"; fi; \ ) endif prepare: @- echo "\n### preparing ..." @- chmod 600 secrets.mk - @- $(foreach host,$(DEPLOY_HOSTS), \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH); mkdir $(DEPLOY_NAME)"; \ + @ $(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ + ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH); if [ ! -d $(DEPLOY_NAME) ] ; then mkdir $(DEPLOY_NAME); fi"; \ ) build: @@ -71,23 +73,28 @@ endif pre-deploy: ifdef DEPLOY_HOSTS @- echo "\n### running pre-deploy script(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh pre-deploy.sh $(host); sh pre-deploy_$(host).sh"; \ + @ $(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ + if [ -e pre-deploy.sh ]; then ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh pre-deploy.sh $(host)"; fi; \ + if [ -e pre-deploy_$(host).sh ]; then ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh pre-deploy_$(host).sh"; fi; \ ) endif post-deploy: ifdef DEPLOY_HOSTS @- echo "\n### running post-deploy script(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh post-deploy.sh $(host); sh post-deploy_$(host).sh"; \ + @ $(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ + if [ -e post-deploy.sh ]; then ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh post-deploy.sh $(host)"; fi; \ + if [ -e post-deploy_$(host).sh ]; then ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh post-deploy_$(host).sh"; fi; \ ) endif pre-local: ifneq (,$(wildcard pre-local.sh)) @- echo "\n### running pre-local script" - @- $(foreach host,$(DEPLOY_HOSTS), \ + @ $(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ ./pre-local.sh $(host); \ ) else @@ -97,7 +104,8 @@ endif post-local: ifneq (,$(wildcard post-local.sh)) @- echo "\n### running post-local script" - @- $(foreach host,$(DEPLOY_HOSTS), \ + @ $(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ ./post-local.sh $(host); \ ) else @@ -107,16 +115,17 @@ endif upload: ifdef DEPLOY_HOSTS @- echo "\n### uploading files" - @- $(foreach host,$(DEPLOY_HOSTS), \ - ssh $(SSH_USER)@$(host) "mkdir -p $(DEPLOY_PATH)/$(DEPLOY_NAME)"; \ - rsync_xtra=`cat .rsync`; \ - rsync_xtra_host=`cat .rsync_$(host)`; \ + @$(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ + ssh $(SSH_USER)@$(host) "if [ ! -d $(DEPLOY_PATH)/$(DEPLOY_NAME) ]; then mkdir -p $(DEPLOY_PATH)/$(DEPLOY_NAME); fi"; \ + if [ -r .rsync ] ; then rsync_xtra=`cat .rsync`; fi; \ + if [ -r .rsync_$(host) ] ; then rsync_xtra_host=`cat .rsync_$(host)`; fi; \ param="-ravv"; \ param="$$param $$rsync_xtra"; \ param="$$param $$rsync_xtra_host"; \ param="$$param --exclude '*~' --exclude '.git*' --exclude '*.swp' . $(SSH_USER)@$(host):$(DEPLOY_PATH)/$(DEPLOY_NAME)"; \ eval rsync $$param; \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME) && chmod o-r .env secrets*"; \ + ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); if [ -e .env ]; then chmod o-r .env ; fi; if [ -e secrets.mk ]; then chmod o-r secrets.mk; fi; if [ -e secrets.yaml ]; then chmod o-r secrets.yaml; fi"; \ ) endif @@ -143,9 +152,9 @@ restart: restart-$(DEPLOY_TYPE) reload: ifneq (,$(wildcard reload.sh)) @- echo "\n### reloading ..." - @- $(foreach host,$(DEPLOY_HOSTS), \ + @ $(foreach host,$(DEPLOY_HOSTS), \ echo "### reloading service on $(host)"; \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); ./reload.sh"; \ + if [ -e reload.sh ]; then ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); ./reload.sh"; fi; \ ) else @- echo "\n### no reload script found" diff --git a/README.md b/README.md index ca140d4..dc64d02 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ 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 diff --git a/apt.mk b/apt.mk index 0741f74..cbec207 100644 --- a/apt.mk +++ b/apt.mk @@ -5,8 +5,11 @@ pull-apt: start-apt: @- echo "\n### start" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ - ssh $(SSH_USER)@$(host) "sudo apt install -y $(APT_PACKAGES); sh start.sh"; \ + @ $(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ + set -e; \ + ssh $(SSH_USER)@$(host) "sudo apt install -y $(APT_PACKAGES)"; \ + if [ -e start.sh ]; then ssh $(SSH_USER)@$(host) "sh start.sh"; fi; \ sleep $(DEPLOY_START_DELAY); \ + set +e; \ ) diff --git a/compose-file.mk b/compose-file.mk index 37a98d1..26a889c 100644 --- a/compose-file.mk +++ b/compose-file.mk @@ -5,13 +5,13 @@ DOCKER_LOGIN = 0 endif pull-compose-file: - @- echo "\n### pulling image(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ - if test $(DOCKER_LOGIN) -eq 1 ; \ + @ echo "\n### pulling image(s)" + @$(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ + if test "$(DOCKER_LOGIN)" -eq 1 ; \ then \ - echo "\n#### perfom docker login with user $(DOCKER_USER) on $(DOCKER_REGISTRY)"; \ - ssh $(SSH_USER)@$(host) "docker login -u $(DOCKER_USER) -p $(DOCKER_PASS) $(DOCKER_REGISTRY)"; \ + echo "\n#### perform docker login with user $(DOCKER_USER) on $(DOCKER_REGISTRY)"; \ + ssh $(SSH_USER)@$(host) "echo $(DOCKER_PASS) | docker login -u $(DOCKER_USER) --password-stdin $(DOCKER_REGISTRY)"; \ fi; \ if test -n "$(DOCKER_IMAGE)" ; \ then \ @@ -20,27 +20,33 @@ pull-compose-file: ) start-compose-file: - @- echo "\n### starting service(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ + @ echo "\n### starting service(s)" + @$(foreach host,$(DEPLOY_HOSTS), \ + set -e; \ + echo "#host: $(host)"; \ ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose -f $(DEPLOY_COMPOSE_FILE) -p $(DEPLOY_COMPOSE_PROJECT) up -d"; \ sleep $(DEPLOY_START_DELAY); \ + set +e; \ ) stop-compose-file: - @- echo "\n### stopping service(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ + @echo "\n### stopping service(s)" + @$(foreach host,$(DEPLOY_HOSTS), \ + set -e; \ + echo "#host: $(host)"; \ ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose -f $(DEPLOY_COMPOSE_FILE) -p $(DEPLOY_COMPOSE_PROJECT) down"; \ + set +e; \ ) logs-compose-file: - @- echo "\n### logs" - @- ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose -f $(DEPLOY_COMPOSE_FILE) -p $(DEPLOY_COMPOSE_PROJECT) logs -f $(service)" + @ echo "\n### logs" + @ ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose -f $(DEPLOY_COMPOSE_FILE) -p $(DEPLOY_COMPOSE_PROJECT) logs -f $(service)" restart-compose-file: - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ + @$(foreach host,$(DEPLOY_HOSTS), \ + set -e; \ + echo "#host: $(host)"; \ ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker-compose -f $(DEPLOY_COMPOSE_FILE) -p $(DEPLOY_COMPOSE_PROJECT) restart"; \ sleep $(DEPLOY_START_DELAY); \ + set +e; \ ) diff --git a/compose.mk b/compose.mk index 2854b72..0142d3f 100644 --- a/compose.mk +++ b/compose.mk @@ -7,13 +7,13 @@ DOCKER_LOGIN = 0 endif pull-compose: - @- echo "\n### pulling image(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ - if test "$(DOCKER_LOGIN)" = "1" ; \ + @echo "\n### pulling image(s)" + @$(foreach host,$(DEPLOY_HOSTS), \ + echo "#host: $(host)"; \ + if test "$(DOCKER_LOGIN)" -eq 1 ; \ then \ 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)"; \ + ssh $(SSH_USER)@$(host) "echo $(DOCKER_PASS) | docker login -u $(DOCKER_USER) --password-stdin $(DOCKER_REGISTRY)"; \ fi; \ if test -n "$(DOCKER_IMAGE)" ; \ then \ @@ -22,24 +22,30 @@ pull-compose: ) start-compose: - @- echo "\n### starting service(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ + @echo "\n### starting service(s)" + @$(foreach host,$(DEPLOY_HOSTS), \ + set -e; \ + echo "#host: $(host)"; \ ssh $(SSH_USER)@$(host) "cd $(project_dir); docker-compose up -d"; \ sleep $(DEPLOY_START_DELAY); \ + set +e; \ ) logs-compose: - @- echo "\n### logs" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ + @echo "\n### logs" + @$(foreach host,$(DEPLOY_HOSTS), \ + set -e; \ + echo "#host: $(host)"; \ ssh $(SSH_USER)@$(host) "cd $(project_dir); docker-compose logs -f $(service)"; \ + set +e; \ ) restart-compose: - @- echo "\n### restarting service(s)" - @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ + @echo "\n### restarting service(s)" + @$(foreach host,$(DEPLOY_HOSTS), \ + set -e; \ + echo "#host: $(host)"; \ ssh $(SSH_USER)@$(host) "cd $(project_dir); docker-compose restart"; \ sleep $(DEPLOY_START_DELAY); \ + set +e; \ ) diff --git a/cron.mk b/cron.mk index ad5a78d..4296a07 100644 --- a/cron.mk +++ b/cron.mk @@ -4,15 +4,19 @@ start-cron: @- echo "\n### starting..." @- $(foreach host,$(DEPLOY_HOSTS), \ echo "$(host)"; \ + set -e; \ ssh $(SSH_USER)@$(host) "sudo -u $(CRON_USER) sh -c 'crontab -l | sed \"/^#make-deploy-cron:$(DEPLOY_NAME)/,+1 d\" | { cat; echo \"#make-deploy-cron:$(DEPLOY_NAME)\"; cat \"$(DEPLOY_PATH)/$(DEPLOY_NAME)/crontab\"; } | crontab -'"; \ sleep $(DEPLOY_START_DELAY); \ + set +e; \ ) stop-cron: @- echo "\n### stopping ..." @- $(foreach host,$(DEPLOY_HOSTS), \ echo "$(host)"; \ + set -e; \ ssh $(SSH_USER)@$(host) "sudo -u $(CRON_USER) sh -c 'crontab -l | sed \"/^#make-deploy-cron:$(DEPLOY_NAME)/,+1 d\" | crontab -'"; \ + set +e; \ ) pull-cron: diff --git a/k8s.mk b/k8s.mk index b439929..e5e8f02 100644 --- a/k8s.mk +++ b/k8s.mk @@ -4,14 +4,19 @@ MANDATORY = $(shell printenv MANDATORY) K8S_CONTEXT K8S_MANIFEST_FILENAME ?= kubernetes.yaml +ifneq ("$(wildcard secrets.yaml)","") + SECRETS="secrets.yaml" +else + SECRETS="" +endif 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 $(K8S_MANIFEST_FILENAME) and secrets.yaml" - @ cat $(K8S_MANIFEST_FILENAME) secrets.yaml | envsubst | kubectl apply $(K8S_ADDITIONAL_PARAMS) -f - + @- echo "\n### run kubectl apply -f $(K8S_MANIFEST_FILENAME) and if available secrets file $(SECRETS)" + @ cat $(K8S_MANIFEST_FILENAME) $(SECRETS) | envsubst | kubectl apply $(K8S_ADDITIONAL_PARAMS) -f - pull-k8s: # nop diff --git a/simple.mk b/simple.mk index 8210118..908e4ce 100644 --- a/simple.mk +++ b/simple.mk @@ -3,7 +3,7 @@ # 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 +ifndef DEPLOY_START_DELAY DEPLOY_START_DELAY = 0 endif @@ -13,7 +13,9 @@ pull-simple: start-simple: @- echo "\n### start" @- $(foreach host,$(DEPLOY_HOSTS), \ - echo "$(host)"; \ - ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh start.sh"; \ + echo "#host: $(host)"; \ + set -e; \ + if [ -e start.sh ] ; then ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); sh start.sh"; fi; \ sleep $(DEPLOY_START_DELAY); \ + set +e; \ ) diff --git a/swarm.mk b/swarm.mk index 45f67b8..dd4461d 100644 --- a/swarm.mk +++ b/swarm.mk @@ -4,7 +4,9 @@ start-swarm: @- echo "\n### starting service(s)" @- $(foreach host,$(DEPLOY_HOSTS), \ echo "$(host)"; \ + set -e; \ ssh $(SSH_USER)@$(host) "cd $(DEPLOY_PATH)/$(DEPLOY_NAME); docker stack deploy -c stack.yml $(DEPLOY_NAME)"; \ + set +e; \ ) stop-swarm: