95 lines
2.9 KiB
Makefile
95 lines
2.9 KiB
Makefile
|
|
SHELL := /bin/bash
|
||
|
|
.DEFAULT_GOAL := help
|
||
|
|
|
||
|
|
PROJECT := compro-mit
|
||
|
|
REPO := repository.promas.id/ComproMIT/compro-mit
|
||
|
|
ENV_FILE := .env
|
||
|
|
|
||
|
|
ifneq (,$(wildcard $(ENV_FILE)))
|
||
|
|
include $(ENV_FILE)
|
||
|
|
export $(shell sed -n 's/^\([A-Za-z_][A-Za-z0-9_]*\)=.*/\1/p' $(ENV_FILE))
|
||
|
|
endif
|
||
|
|
|
||
|
|
# ---- per-environment (env = prod | dev | local) ----
|
||
|
|
WORK_DIR_prod := /var/www/compro-mit-prod
|
||
|
|
WORK_DIR_dev := /var/www/compro-mit
|
||
|
|
WORK_DIR_local := $(CURDIR)
|
||
|
|
COMPOSE_prod := docker-compose.yml
|
||
|
|
COMPOSE_dev := docker-compose.dev.yml
|
||
|
|
COMPOSE_local := docker-compose.local.yml
|
||
|
|
BRANCH_prod := production
|
||
|
|
BRANCH_dev := main
|
||
|
|
|
||
|
|
WORK_DIR = $(WORK_DIR_$*)
|
||
|
|
COMPOSE = $(COMPOSE_$*)
|
||
|
|
BRANCH = $(BRANCH_$*)
|
||
|
|
DC = sudo docker compose -f $(COMPOSE)
|
||
|
|
|
||
|
|
# ---- deploy log ----
|
||
|
|
LOG_DIR := $(or $(DEPLOY_LOG_DIR),/var/lib/deploy-log)
|
||
|
|
LOG_IMAGE := deploy-log:1
|
||
|
|
OUT_FILE = $(LOG_DIR)/$(PROJECT)/.last-deploy.out
|
||
|
|
HIST_FILE = $(LOG_DIR)/$(PROJECT)/$*.jsonl
|
||
|
|
LOG = sudo docker run --rm \
|
||
|
|
-v $(LOG_DIR):/logs -v $(WORK_DIR):/repo:ro \
|
||
|
|
-e DEPLOY_ACTOR="$$(id -un 2>/dev/null)" $(LOG_IMAGE)
|
||
|
|
|
||
|
|
.PHONY: help install run-local log-dir status ps
|
||
|
|
|
||
|
|
help: ## Tampilkan daftar perintah
|
||
|
|
@echo "make <target> (env = prod | dev | local)"
|
||
|
|
@grep -hE '^[a-zA-Z%-]+:.*##' $(MAKEFILE_LIST) \
|
||
|
|
| sed -e 's/%/<env>/' -e 's/:.*## /|/' \
|
||
|
|
| awk -F'|' '{printf " %-16s %s\n", $$1, $$2}'
|
||
|
|
|
||
|
|
# ---- deploy ----
|
||
|
|
deploy-%: log-dir ## Pull + build + up (prod/dev)
|
||
|
|
@$(LOG) start $(PROJECT) $* || true
|
||
|
|
@cd $(WORK_DIR) || exit 1; \
|
||
|
|
( \
|
||
|
|
sudo git pull https://$(GITLAB_USERNAME):$(GITLAB_PASSWORD)@$(REPO) $(BRANCH) && \
|
||
|
|
$(DC) build --no-cache --progress=plain && \
|
||
|
|
$(DC) up -d --remove-orphans && \
|
||
|
|
sudo docker system prune -f \
|
||
|
|
) 2>&1 | tee $(OUT_FILE); \
|
||
|
|
RC=$${PIPESTATUS[0]}; \
|
||
|
|
if [ "$$RC" = "0" ]; then $(LOG) end $(PROJECT) $* ok || true; \
|
||
|
|
else $(LOG) end $(PROJECT) $* fail || true; fi; \
|
||
|
|
exit $$RC
|
||
|
|
|
||
|
|
# ---- operasional ----
|
||
|
|
up-%: ## Build + start container
|
||
|
|
@cd $(WORK_DIR) && $(DC) up -d --build --remove-orphans
|
||
|
|
|
||
|
|
stop-%: ## Stop container
|
||
|
|
@cd $(WORK_DIR) && $(DC) stop
|
||
|
|
|
||
|
|
restart-%: ## Restart container
|
||
|
|
@cd $(WORK_DIR) && $(DC) restart
|
||
|
|
|
||
|
|
logs-%: ## Tail log container
|
||
|
|
@cd $(WORK_DIR) && $(DC) logs -f --tail=200
|
||
|
|
|
||
|
|
clean-%: ## Down + hapus image + prune
|
||
|
|
@cd $(WORK_DIR) && $(DC) down -v --rmi local && sudo docker system prune -f
|
||
|
|
|
||
|
|
history-%: ## 10 deploy terakhir
|
||
|
|
@test -s $(HIST_FILE) && tail -n 10 $(HIST_FILE) | tac || echo "belum ada entri"
|
||
|
|
|
||
|
|
# ---- lokal & utilitas ----
|
||
|
|
install: ## Install dependency
|
||
|
|
@bun install
|
||
|
|
|
||
|
|
run-local: ## Jalankan dev server (tanpa docker)
|
||
|
|
@bun run dev
|
||
|
|
|
||
|
|
status: ## Status container project ini
|
||
|
|
@sudo docker ps -a --filter "name=$(PROJECT)" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
||
|
|
|
||
|
|
ps: ## Status semua container
|
||
|
|
@sudo docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
|
||
|
|
|
||
|
|
log-dir:
|
||
|
|
@sudo mkdir -p $(LOG_DIR)/$(PROJECT) && sudo touch $(OUT_FILE) \
|
||
|
|
&& sudo chown -R $$(id -u):$$(id -g) $(LOG_DIR)/$(PROJECT)
|