mirror of
https://github.com/GlueOps/autoglue.git
synced 2026-02-13 04:40:05 +01:00
278 lines
9.3 KiB
Makefile
278 lines
9.3 KiB
Makefile
# --- variables ---
|
||
GOCMD ?= go
|
||
GOINSTALL := $(GOCMD) install
|
||
BIN ?= autoglue
|
||
MAIN ?= main.go
|
||
UI_DIR ?= ui
|
||
UI_DEST_DIR ?= internal/web
|
||
|
||
# Module path (used for ldflags to internal/version)
|
||
GIT_HOST ?= github.com
|
||
GIT_USER ?= glueops
|
||
MODULE_PATH ?= $(GIT_HOST)/$(GIT_USER)/$(BIN)
|
||
|
||
# SDK / module settings (Go)
|
||
SDK_REPO ?= $(BIN)-sdk-go # repo name used for module path
|
||
SDK_OUTDIR ?= sdk/go # output directory (inside repo)
|
||
SDK_PKG ?= ${BIN} # package name inside the SDK
|
||
|
||
UI_SSG_ROUTES ?= /,/login,/docs,/pricing
|
||
|
||
# Go versioning (go.mod uses major.minor; you’re on 1.25.3)
|
||
GO_VERSION ?= 1.25.3
|
||
|
||
# SDK / package settings (TypeScript)
|
||
SDK_TS_OUTDIR ?= sdk/ts
|
||
SDK_TS_GEN ?= typescript-fetch
|
||
SDK_TS_NPM_NAME ?= @glueops/$(SDK_REPO)
|
||
SDK_TS_NPM_VER ?= 0.1.0
|
||
SDK_TS_DIR := $(abspath $(SDK_TS_OUTDIR))
|
||
SDK_TS_PROPS ?= supportsES6=true,typescriptThreePlus=true,useSingleRequestParameter=true,withSeparateModelsAndApi=true,modelPropertyNaming=original,enumPropertyNaming=original,useUnionTypes=true
|
||
SDK_TS_PROPS_FLAGS := $(foreach p,$(subst , ,$(SDK_TS_PROPS)),-p $(p))
|
||
|
||
# Path for vendored UI SDK (absolute, path-safe)
|
||
SDK_TS_UI_OUTDIR ?= ui/src/sdk
|
||
SDK_TS_UI_DIR := $(abspath $(SDK_TS_UI_OUTDIR))
|
||
|
||
SWAG := $(shell command -v swag 2>/dev/null)
|
||
GMU := $(shell command -v go-mod-upgrade 2>/dev/null)
|
||
YARN := $(shell command -v yarn 2>/dev/null)
|
||
NPM := $(shell command -v npm 2>/dev/null)
|
||
OGC := $(shell command -v openapi-generator-cli 2>/dev/null || command -v openapi-generator 2>/dev/null)
|
||
BROTLI := $(shell command -v brotli 2>/dev/null)
|
||
GZIP := $(shell command -v gzip 2>/dev/null)
|
||
.DEFAULT_GOAL := build
|
||
|
||
# --- version metadata (ldflags) ---
|
||
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
||
COMMIT := $(shell git rev-parse HEAD 2>/dev/null || echo "none")
|
||
DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||
BUILT_BY := $(shell whoami)
|
||
|
||
LDFLAGS := -X '$(MODULE_PATH)/internal/version.Version=$(VERSION)' \
|
||
-X '$(MODULE_PATH)/internal/version.Commit=$(COMMIT)' \
|
||
-X '$(MODULE_PATH)/internal/version.Date=$(DATE)' \
|
||
-X '$(MODULE_PATH)/internal/version.BuiltBy=$(BUILT_BY)'
|
||
|
||
# --- phony targets ---
|
||
.PHONY: all prepare ui-install ui-build ui swagger build clean fmt vet tidy upgrade \
|
||
sdk sdk-go sdk-ts sdk-ts-ui sdk-all worksync wire-sdk-replace help dev ui-compress \
|
||
print-version
|
||
|
||
# --- meta targets ---
|
||
all: build
|
||
prepare: fmt vet tidy upgrade
|
||
|
||
# --- go hygiene ---
|
||
fmt:
|
||
@$(GOCMD) fmt ./...
|
||
|
||
vet:
|
||
@$(GOCMD) vet ./...
|
||
|
||
tidy:
|
||
@$(GOCMD) mod tidy
|
||
|
||
upgrade:
|
||
@echo ">> Checking go-mod-upgrade..."
|
||
@if [ -z "$(GMU)" ]; then \
|
||
echo "Installing go-mod-upgrade..."; \
|
||
$(GOINSTALL) github.com/oligot/go-mod-upgrade@latest; \
|
||
fi
|
||
@go-mod-upgrade -f || true
|
||
|
||
# --- ui ---
|
||
ui-install:
|
||
@echo ">> Installing UI deps in $(UI_DIR)..."
|
||
@if [ -n "$(YARN)" ]; then \
|
||
cd $(UI_DIR) && yarn install --frozen-lockfile; \
|
||
elif [ -n "$(NPM)" ]; then \
|
||
cd $(UI_DIR) && npm ci; \
|
||
else \
|
||
echo "Error: neither yarn nor npm is installed." >&2; exit 1; \
|
||
fi
|
||
|
||
ui-build: ui-install
|
||
@echo ">> Building UI in $(UI_DIR)..."
|
||
@rm -rf $(UI_DEST_DIR)/dist
|
||
@if [ -n "$(YARN)" ]; then \
|
||
cd $(UI_DIR) && yarn build; \
|
||
else \
|
||
cd $(UI_DIR) && npm run build; \
|
||
fi
|
||
|
||
ui-compress: ui-build
|
||
@echo ">> Precompressing assets (brotli + gzip) in $(UI_DEST_DIR)/dist"
|
||
@if [ -n "$(BROTLI)" ]; then \
|
||
find "$(UI_DEST_DIR)/dist" -type f \( -name '*.js' -o -name '*.css' -o -name '*.html' \) -print0 | \
|
||
xargs -0 -I{} brotli -f {}; \
|
||
else echo "brotli not found; skipping .br"; fi
|
||
@if [ -n "$(GZIP)" ]; then \
|
||
find "$(UI_DEST_DIR)/dist" -type f \( -name '*.js' -o -name '*.css' -o -name '*.html' \) -print0 | \
|
||
xargs -0 -I{} gzip -kf {}; \
|
||
else echo "gzip not found; skipping .gz"; fi
|
||
|
||
ui: ui-compress
|
||
|
||
# --- swagger ---
|
||
swagger:
|
||
@echo ">> Generating Swagger docs..."
|
||
@if [ -z "$(SWAG)" ]; then \
|
||
echo "Installing swag..."; \
|
||
$(GOINSTALL) github.com/swaggo/swag/cmd/swag@latest; \
|
||
fi
|
||
@rm -rf docs/swagger.* docs/docs.go
|
||
@swag init -g $(MAIN) -o docs
|
||
|
||
# --- build ---
|
||
build: prepare ui swagger sdk-all
|
||
@echo ">> Building Go binary: $(BIN)"
|
||
@$(GOCMD) build -trimpath -ldflags "$(LDFLAGS)" -o $(BIN) $(MAIN)
|
||
|
||
# Handy: print resolved version metadata
|
||
print-version:
|
||
@echo "VERSION = $(VERSION)"
|
||
@echo "COMMIT = $(COMMIT)"
|
||
@echo "DATE = $(DATE)"
|
||
@echo "BUILT_BY = $(BUILT_BY)"
|
||
@echo "LDFLAGS = $(LDFLAGS)"
|
||
|
||
# --- development ---
|
||
dev: ui-install swagger
|
||
@echo ">> Starting Vite (frontend) and Go API (backend) with dev env..."
|
||
@cd $(UI_DIR) && \
|
||
( \
|
||
if command -v yarn >/dev/null 2>&1; then \
|
||
yarn dev & \
|
||
elif command -v npm >/dev/null 2>&1; then \
|
||
npm run dev & \
|
||
else \
|
||
echo "Error: neither yarn nor npm is installed." >&2; exit 1; \
|
||
fi; \
|
||
cd .. && \
|
||
$(GOCMD) run . serve & \
|
||
wait \
|
||
)
|
||
|
||
# --- sdk generation (Go) ---
|
||
sdk-go: swagger
|
||
@echo ">> Generating Go SDK (module $(GIT_HOST)/$(GIT_USER)/$(SDK_REPO), Go $(GO_VERSION))..."
|
||
@set -e; \
|
||
export GO_POST_PROCESS_FILE="gofmt -w"; \
|
||
if [ -z "$(OGC)" ]; then \
|
||
if [ -z "$(NPM)" ]; then \
|
||
echo "Error: npm is required to install openapi-generator-cli." >&2; exit 1; \
|
||
fi; \
|
||
echo "Installing openapi-generator-cli..."; \
|
||
$(NPM) i -g @openapitools/openapi-generator-cli; \
|
||
OGC_BIN=openapi-generator-cli; \
|
||
else \
|
||
OGC_BIN="$(OGC)"; \
|
||
fi; \
|
||
rm -rf "$(SDK_OUTDIR)"; \
|
||
mkdir -p "$(SDK_OUTDIR)"; \
|
||
"$$OGC_BIN" generate \
|
||
--enable-post-process-file \
|
||
--generate-alias-as-model \
|
||
-i docs/swagger.json \
|
||
-g go \
|
||
-o "$(SDK_OUTDIR)" \
|
||
--additional-properties=packageName=$(SDK_PKG) \
|
||
--git-host "$(GIT_HOST)" \
|
||
--git-user-id "$(GIT_USER)" \
|
||
--git-repo-id "$(SDK_REPO)"; \
|
||
cd "$(SDK_OUTDIR)"; \
|
||
$(GOCMD) mod edit -go=$(GO_VERSION); \
|
||
$(GOCMD) mod tidy
|
||
|
||
# --- sdk generation (TypeScript) ---
|
||
sdk-ts: swagger
|
||
@set -e; \
|
||
if [ -z "$(OGC)" ]; then \
|
||
if [ -z "$(NPM)" ]; then echo "Error: npm is required to install openapi-generator-cli." >&2; exit 1; fi; \
|
||
echo "Installing openapi-generator-cli..."; \
|
||
$(NPM) i -g @openapitools/openapi-generator-cli; \
|
||
OGC_BIN=openapi-generator-cli; \
|
||
else \
|
||
OGC_BIN="$(OGC)"; \
|
||
fi; \
|
||
rm -rf "$(SDK_TS_DIR)"; \
|
||
mkdir -p "$(SDK_TS_DIR)"; \
|
||
"$$OGC_BIN" generate \
|
||
-i docs/swagger.json \
|
||
-g "$(SDK_TS_GEN)" \
|
||
-o "$(SDK_TS_DIR)" \
|
||
-p npmName=$(SDK_TS_NPM_NAME) \
|
||
-p npmVersion=$(SDK_TS_NPM_VER) \
|
||
$(SDK_TS_PROPS_FLAGS); \
|
||
if [ ! -d "$(SDK_TS_DIR)" ]; then \
|
||
echo "Generation failed: $(SDK_TS_DIR) not found." >&2; exit 1; \
|
||
fi; \
|
||
if command -v npx >/dev/null 2>&1; then \
|
||
echo ">> Prettier: formatting generated TS SDK"; \
|
||
cd "$(SDK_TS_DIR)" && npx --yes prettier -w . || true; \
|
||
fi; \
|
||
echo ">> Installing & building TS SDK in $(SDK_TS_DIR)"; \
|
||
if command -v yarn >/dev/null 2>&1; then \
|
||
cd "$(SDK_TS_DIR)" && yarn install --frozen-lockfile || true; \
|
||
cd "$(SDK_TS_DIR)" && yarn build || true; \
|
||
elif command -v npm >/dev/null 2>&1; then \
|
||
cd "$(SDK_TS_DIR)" && npm ci || npm install || true; \
|
||
cd "$(SDK_TS_DIR)" && npm run build || true; \
|
||
else \
|
||
echo "Warning: neither yarn nor npm is installed; skipping install/build for TS SDK."; \
|
||
fi
|
||
|
||
# --- sdk generation (TypeScript into UI/src) ---
|
||
sdk-ts-ui: swagger
|
||
@echo ">> Generating TypeScript SDK directly into UI source: $(SDK_TS_UI_DIR)"
|
||
@set -e; \
|
||
if [ -z "$(OGC)" ]; then \
|
||
if [ -z "$(NPM)" ]; then \
|
||
echo "Error: npm is required to install openapi-generator-cli." >&2; exit 1; \
|
||
fi; \
|
||
echo "Installing openapi-generator-cli..."; \
|
||
$(NPM) i -g @openapitools/openapi-generator-cli; \
|
||
OGC_BIN=openapi-generator-cli; \
|
||
else \
|
||
OGC_BIN="$(OGC)"; \
|
||
fi; \
|
||
rm -rf "$(SDK_TS_UI_DIR)"; \
|
||
mkdir -p "$(SDK_TS_UI_DIR)"; \
|
||
"$$OGC_BIN" generate \
|
||
-i docs/swagger.json \
|
||
-g typescript-fetch \
|
||
-o "$(SDK_TS_UI_DIR)" \
|
||
-p npmName=$(SDK_TS_NPM_NAME) \
|
||
-p npmVersion=$(SDK_TS_NPM_VER) \
|
||
$(SDK_TS_PROPS_FLAGS); \
|
||
# --- move src/* up one level ---
|
||
@if [ -d "$(SDK_TS_UI_DIR)/src" ]; then \
|
||
mv "$(SDK_TS_UI_DIR)/src/"* "$(SDK_TS_UI_DIR)/"; \
|
||
rm -rf "$(SDK_TS_UI_DIR)/src"; \
|
||
fi; \
|
||
rm -f "$(SDK_TS_UI_DIR)/package.json" "$(SDK_TS_UI_DIR)/tsconfig.json" "$(SDK_TS_UI_DIR)/README.md"
|
||
|
||
# convenience
|
||
sdk-all: sdk-go sdk-ts sdk-ts-ui
|
||
sdk: sdk-go
|
||
|
||
# --- clean/help ---
|
||
clean:
|
||
@echo ">> Cleaning artifacts..."
|
||
@rm -rf "$(BIN)" docs/swagger.* docs/docs.go $(UI_DEST_DIR)/dist $(UI_DIR)/dist $(UI_DIR)/node_modules "$(SDK_OUTDIR)" "$(SDK_TS_OUTDIR)"
|
||
|
||
help:
|
||
@echo "Targets:"
|
||
@echo " build - fmt, vet, tidy, upgrade, build UI, generate Swagger, build Go binary (with ldflags)"
|
||
@echo " ui - build the Vite UI and copy to $(UI_DEST_DIR)/dist (with compression)"
|
||
@echo " swagger - (re)generate Swagger docs using swag"
|
||
@echo " sdk-go (sdk) - generate Go SDK with correct module path and Go version"
|
||
@echo " sdk-ts - generate TypeScript SDK (typescript-fetch) with package.json"
|
||
@echo " sdk-ts-ui - generate TypeScript SDK directly into ui/src for inline consumption"
|
||
@echo " sdk-all - generate both Go and TypeScript SDKs"
|
||
@echo " dev - run Vite UI dev server + Go API"
|
||
@echo " clean - remove binary, Swagger outputs, UI dist, and SDKs"
|
||
@echo " prepare - fmt, vet, tidy, upgrade deps"
|
||
@echo " print-version - show computed ldflags values"
|