Stop remote processes with pkill -f before upload so long binary names are matched and busy executables can be overwritten.
82 lines
3.4 KiB
Makefile
82 lines
3.4 KiB
Makefile
.PHONY: service webui dev remotedev test build clean
|
|
|
|
export PATH := $(HOME)/.local/go/bin:$(PATH)
|
|
|
|
# Optional local overrides (gitignored): REMOTEDEV_USER, REMOTEDEV_HOST, etc.
|
|
-include remotedev.mk
|
|
|
|
REMOTEDEV_DIR ?= clustercanvas-remotedev
|
|
PORT ?= 8080
|
|
WEBUI_PORT ?= 5173
|
|
# Dev-only AES key for remotedev (base64 of 32 bytes). Override in remotedev.mk if needed.
|
|
# NOT for production.
|
|
REMOTEDEV_CONFIG_KEY ?= Q2x1c3RlckNhbnZhcy1yZW1vdGVkZXYta2V5ISEhISE=
|
|
|
|
# Build SSH target from prepared user+host, or use REMOTEDEV_HOST as-is (user@host / SSH alias).
|
|
ifneq ($(strip $(REMOTEDEV_USER)),)
|
|
REMOTEDEV_SSH := $(REMOTEDEV_USER)@$(REMOTEDEV_HOST)
|
|
else
|
|
REMOTEDEV_SSH := $(REMOTEDEV_HOST)
|
|
endif
|
|
|
|
# pkill -x cannot match names longer than 15 chars (Linux /proc/*/comm). Use -f on argv.
|
|
# Stop before scp so running binaries are not busy when overwritten.
|
|
REMOTEDEV_KILL = pkill -f './clustercanvas-server( |$$)' >/dev/null 2>&1 || true; \
|
|
pkill -f './clustercanvas-webui( |$$)' >/dev/null 2>&1 || true; \
|
|
sleep 0.2
|
|
|
|
service:
|
|
cd service && go run ./cmd/server
|
|
|
|
webui:
|
|
cd webui && npm run dev
|
|
|
|
# Run API (:8080) and web UI (:5173) together; Ctrl+C stops both.
|
|
# Export CLUSTERCANVAS_CONFIG_KEY in your shell (or remotedev.mk) before first-run setup.
|
|
dev:
|
|
@trap 'kill 0' EXIT INT TERM; \
|
|
(cd service && go run ./cmd/server) & \
|
|
(cd webui && npm run dev) & \
|
|
wait
|
|
|
|
# Build locally, copy binaries + SPA to a VM over SSH, run both there (no SDKs on remote).
|
|
# Prepare remotedev.mk with REMOTEDEV_USER + REMOTEDEV_HOST, or pass them on the CLI.
|
|
# Usage: make remotedev
|
|
# or: REMOTEDEV_HOST=user@192.168.1.50 make remotedev
|
|
remotedev:
|
|
@test -n "$(REMOTEDEV_HOST)" || (echo 'Set REMOTEDEV_HOST (and optional REMOTEDEV_USER) in remotedev.mk or on the CLI'; exit 1)
|
|
mkdir -p bin
|
|
cd service && go build -o ../bin/clustercanvas-server ./cmd/server
|
|
cd service && go build -o ../bin/clustercanvas-webui ./cmd/webui
|
|
cd webui && VITE_API_BASE_URL= npm run build
|
|
# scp only needs OpenSSH on the remote (rsync is often missing on minimal VMs).
|
|
# Leave ~ unquoted so the remote shell expands REMOTEDEV_DIR=~/... correctly.
|
|
ssh "$(REMOTEDEV_SSH)" "mkdir -p $(REMOTEDEV_DIR)/web $(REMOTEDEV_DIR)/config"
|
|
ssh "$(REMOTEDEV_SSH)" "cd $(REMOTEDEV_DIR) 2>/dev/null || true; $(REMOTEDEV_KILL)"
|
|
scp bin/clustercanvas-server bin/clustercanvas-webui "$(REMOTEDEV_SSH):$(REMOTEDEV_DIR)/"
|
|
ssh "$(REMOTEDEV_SSH)" "rm -rf $(REMOTEDEV_DIR)/web && mkdir -p $(REMOTEDEV_DIR)/web"
|
|
scp -r webui/dist/. "$(REMOTEDEV_SSH):$(REMOTEDEV_DIR)/web/"
|
|
@echo "Starting on $(REMOTEDEV_SSH) — open http://<vm-ip>:$(WEBUI_PORT) (Ctrl+C stops both)"
|
|
# Kill in a separate ssh so pkill -f cannot match this start script's own argv.
|
|
ssh "$(REMOTEDEV_SSH)" "cd $(REMOTEDEV_DIR) 2>/dev/null || true; $(REMOTEDEV_KILL)"
|
|
ssh -t "$(REMOTEDEV_SSH)" "cd $(REMOTEDEV_DIR) && \
|
|
trap 'kill 0' EXIT INT TERM; \
|
|
export CLUSTERCANVAS_CONFIG_KEY='$(REMOTEDEV_CONFIG_KEY)'; \
|
|
export CLUSTERCANVAS_CONFIG_DIR=\"\$$PWD/config\"; \
|
|
PORT=$(PORT) ./clustercanvas-server -configdir=config & \
|
|
WEBUI_PORT=$(WEBUI_PORT) API_URL=http://127.0.0.1:$(PORT) ./clustercanvas-webui -webdir=web -configdir=config & \
|
|
wait"
|
|
|
|
test:
|
|
cd service && go test ./...
|
|
cd webui && npm test
|
|
|
|
build:
|
|
mkdir -p bin
|
|
cd service && go build -o ../bin/clustercanvas-server ./cmd/server
|
|
cd service && go build -o ../bin/clustercanvas-webui ./cmd/webui
|
|
cd webui && npm run build
|
|
|
|
clean:
|
|
rm -rf bin service/coverage.out webui/dist webui/coverage
|