HTML_DIR := html SQL_DIR := sql WP_CONFIG_FILENAME := wp-config.php DOCKER_COMPOSE_YML := docker-compose.yml DOCKER_COMPOSE_UP_OPT := -d DOCKER_COMPOSE = docker-compose -f $(DOCKER_COMPOSE_YML) DOCKER := docker SSH := ssh TAR := tar REMOTE_TAR := tar PV := pv PERL := perl FIND := find RSYNC := rsync MYSQLDUMP_OPT := --single-transaction --quick --skip-lock-tables --add-drop-table CLONE_EXCLUDE := REMOTE_TAR_OPT := RSYNC_OPT = -rltv --delete SYNC_PATH = wp-content/themes deploy-once-file = ./do-deploy deploy-always-file = ./deploy-with-skipping-confirm check-deploy = $(if $(wildcard $(deploy-once-file) $(deploy-always-file)),1) include .env.makefile include .db.env REMOTE_TAR_OPT += $(addprefix --exclude=,$(CLONE_EXCLUDE)) # $(call exist-or-error,some-file) define exist-or-error $(if $(wildcard $1),,$(error no $1 variable)) endef .PHONY: up up: build-docker $(DOCKER_COMPOSE) up $(DOCKER_COMPOSE_UP_OPT) .PHONY: down down: $(DOCKER_COMPOSE) down build-docker: BUILD_OPT := --build-arg WP_IMAGE_TAG=$(WP_IMAGE_TAG) build-docker: build $(DOCKER_COMPOSE) build $(BUILD_OPT) touch $@ .PHONY: logs logs: $(DOCKER_COMPOSE) logs -f .PHONY: clone-to-local clone-to-local: $(SSH) $(SSH_REMOTE_HOST) -- $(REMOTE_TAR) -C $(REMOTE_DOCROOT_PATH) -cf - $(REMOTE_TAR_OPT) . \ | $(PV) | $(TAR) -C $(HTML_DIR)/ -xf - .PHONY: guard-sync guard-sync: ifndef SSH_REMOTE_HOST $(error SSH_REMOTE_HOST variable is not defined) endif .PHONY: pull pull: guard-sync $(RSYNC) $(RSYNC_OPT) $(SSH_REMOTE_HOST):$(REMOTE_DOCROOT_PATH)/$(SYNC_PATH)/ $(HTML_DIR)/$(SYNC_PATH)/ .PHONY: deploy deploy: RSYNC_OPT += $(if $(call check-deploy),,-n) deploy: guard-sync $(RSYNC) $(RSYNC_OPT) $(HTML_DIR)/$(SYNC_PATH)/ $(SSH_REMOTE_HOST):$(REMOTE_DOCROOT_PATH)/$(SYNC_PATH)/ @[[ -z "$(call check-deploy)" ]] \ && echo 'info: You need to create a file `$(deploy-once-file)` to deploy for once or `$(deploy-always-file)` for skipping this confirmation every time.' rm -f $(deploy-once-file) %.replaced.sql: %.sql perl -pe " \ s|$(SITE_URL_PATTERN)|$(LOCAL_URL)|g; \ s|$(REMOTE_DOCROOT_PATH)|$(LOCAL_DOCROOT)|g; \ " $< > $@ %.replaced.sql.imported: %.replaced.sql | wait-db-up cat "$^" | $(DOCKER_COMPOSE) exec -T -- db sh -c 'mysql --user $$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE' touch $@ replaced-sql-files = $(addsuffix .replaced.sql,$(basename $(filter-out %.replaced.sql,$(wildcard $(SQL_DIR)/*.sql)))) imported-sql-files = $(addsuffix .imported,$(replaced-sql-files)) .PHONY: import-sql import-sql: $(imported-sql-files) .PHONY: wait-db-up wait-db-up: up $(DOCKER_COMPOSE) exec -T -- db sh -c ' \ while [ ! -e /var/run/mysqld/mysqld.sock ] ; do sleep 1 ; done' .PHONY: init-conf init-conf: WP_CONF ?= $(shell $(FIND) $(HTML_DIR)/ -name $(WP_CONFIG_FILENAME) | head -n 1) init-conf: .db.env perl -i.orig -pe " \ s/define\\(\\s*'DB_HOST',\\s*'[^']*'\\s*\\)/define('DB_HOST', 'db')/; \ s/define\\(\\s*'DB_NAME',\\s*'[^']*'\\s*\\)/define('DB_NAME', '$(MYSQL_DATABASE)')/; \ s/define\\(\\s*'DB_USER',\\s*'[^']*'\\s*\\)/define('DB_USER', '$(MYSQL_USER)')/; \ s/define\\(\\s*'DB_PASSWORD',\\s*'[^']*'\\s*\\)/define('DB_PASSWORD', '$(MYSQL_PASSWORD)')/; \ " $(WP_CONF) .PHONY: dump-remote-db dump-remote-db: WP_CONF = $(shell $(SSH) $(SSH_REMOTE_HOST) -- find $(REMOTE_DOCROOT_PATH) -type f -name $(WP_CONFIG_FILENAME) | head -n 1) dump-remote-db: get-val = $(shell $(SSH) $(SSH_REMOTE_HOST) -- 'perl -nle "/\\(\\s*'"'"'$1'"'"'\\s*,\\s*'"'"'(.+)'"'"'\\s*\\)/ and print \$$1" $(WP_CONF)') dump-remote-db: DB_PASSWORD = $(call get-val,DB_PASSWORD) dump-remote-db: DB_HOST = $(call get-val,DB_HOST) dump-remote-db: DB_USER = $(call get-val,DB_USER) dump-remote-db: DB_NAME = $(call get-val,DB_NAME) dump-remote-db: SQL_FILE = $(SQL_DIR)/$(shell date "+%Y-%m-%d").sql dump-remote-db: @$(SSH) $(SSH_REMOTE_HOST) -- mysqldump $(MYSQLDUMP_OPT) -u $(DB_USER) -h $(DB_HOST) -p$(DB_PASSWORD) $(DB_NAME) \ | $(PV) > $(SQL_FILE) .PHONY: purge-db purge-db: $(DOCKER_COMPOSE) down -v rm $(SQL_DIR)/*.imported .PHONY: wp-cli wp-cli: $(DOCKER_COMPOSE) run --rm -- cli bash