380931b3a8
Bumping CI to v2.5.0 surfaced two new gofumpt findings (in two test files that gofumpt v2.1.6 considered fine). Local re-format with the matching tool brings them in line. Pre-commit hook config: prepend $GOPATH/bin to PATH inside the hook entry so gofumpt + golangci-lint resolve when ~/go/bin isn't on the operator's interactive shell PATH (common — go install puts them there but PATH config varies). Without this, the hooks fail with 'Executable not found' even when the tools are installed. Pin the Makefile setup target to v2.5.0 so a fresh clone gets the same binary CI runs — keeps pre-commit and CI from drifting again.
102 lines
4.3 KiB
Makefile
102 lines
4.3 KiB
Makefile
# restic-manager — common dev targets
|
|
|
|
SHELL := /bin/bash
|
|
BIN_DIR := bin
|
|
SERVER_BIN := $(BIN_DIR)/restic-manager-server
|
|
AGENT_BIN := $(BIN_DIR)/restic-manager-agent
|
|
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev)
|
|
LDFLAGS := -s -w -X main.version=$(VERSION)
|
|
GOFLAGS := -trimpath
|
|
DOCKER_IMAGE ?= ghcr.io/dcglab/restic-manager
|
|
DOCKER_TAG ?= dev
|
|
|
|
# Tailwind standalone CLI — single binary, no Node toolchain.
|
|
# See spec.md §4.1 / tasks.md P1-28 for why.
|
|
TAILWIND_VERSION ?= v3.4.17
|
|
TAILWIND_OS := $(shell uname -s | tr A-Z a-z)
|
|
TAILWIND_ARCH := $(shell uname -m | sed 's/x86_64/x64/;s/aarch64/arm64/')
|
|
TAILWIND_BIN := $(BIN_DIR)/tailwindcss
|
|
TAILWIND_URL := https://github.com/tailwindlabs/tailwindcss/releases/download/$(TAILWIND_VERSION)/tailwindcss-$(TAILWIND_OS)-$(TAILWIND_ARCH)
|
|
TAILWIND_INPUT := web/styles/input.css
|
|
TAILWIND_OUTPUT := web/static/css/styles.css
|
|
|
|
.PHONY: help build server agent test test-race lint fmt tidy clean run-server run-agent docker release tailwind tailwind-watch setup hooks
|
|
|
|
help:
|
|
@grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN{FS=":.*?## "};{printf " \033[36m%-14s\033[0m %s\n",$$1,$$2}'
|
|
|
|
build: tailwind server agent ## Build server + agent into ./bin (incl. Tailwind CSS)
|
|
|
|
server: ## Build the server binary
|
|
@mkdir -p $(BIN_DIR)
|
|
CGO_ENABLED=0 go build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(SERVER_BIN) ./cmd/server
|
|
|
|
$(TAILWIND_BIN):
|
|
@mkdir -p $(BIN_DIR)
|
|
@echo "==> downloading tailwindcss $(TAILWIND_VERSION) ($(TAILWIND_OS)/$(TAILWIND_ARCH))"
|
|
curl -fsSL -o $@ "$(TAILWIND_URL)"
|
|
chmod +x $@
|
|
|
|
tailwind: $(TAILWIND_BIN) ## Build the CSS bundle from web/styles/input.css
|
|
@mkdir -p $$(dirname $(TAILWIND_OUTPUT))
|
|
$(TAILWIND_BIN) -c tailwind.config.js -i $(TAILWIND_INPUT) -o $(TAILWIND_OUTPUT) --minify
|
|
|
|
tailwind-watch: $(TAILWIND_BIN) ## Watch and rebuild on every save
|
|
@mkdir -p $$(dirname $(TAILWIND_OUTPUT))
|
|
$(TAILWIND_BIN) -c tailwind.config.js -i $(TAILWIND_INPUT) -o $(TAILWIND_OUTPUT) --watch
|
|
|
|
agent: ## Build the agent binary
|
|
@mkdir -p $(BIN_DIR)
|
|
CGO_ENABLED=0 go build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(AGENT_BIN) ./cmd/agent
|
|
|
|
test: ## Run tests
|
|
go test ./...
|
|
|
|
test-race: ## Run tests with the race detector
|
|
go test -race -coverprofile=coverage.out ./...
|
|
|
|
lint: ## Run golangci-lint
|
|
golangci-lint run ./...
|
|
|
|
setup: hooks ## One-time per-clone setup (Go tools + git hooks)
|
|
@command -v gofumpt >/dev/null 2>&1 || go install mvdan.cc/gofumpt@latest
|
|
@command -v golangci-lint >/dev/null 2>&1 || go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.5.0
|
|
@echo "==> setup complete: gofumpt, golangci-lint, pre-commit hooks installed"
|
|
|
|
hooks: ## Install the pre-commit hooks defined in .pre-commit-config.yaml
|
|
@command -v pre-commit >/dev/null 2>&1 || { echo "pre-commit not found — install with 'pip install pre-commit' or 'brew install pre-commit'" >&2; exit 1; }
|
|
pre-commit install
|
|
|
|
fmt: ## Format with gofumpt + goimports
|
|
gofumpt -w .
|
|
goimports -local gitea.dcglab.co.uk/steve/restic-manager -w .
|
|
|
|
tidy: ## go mod tidy
|
|
go mod tidy
|
|
|
|
clean: ## Remove build artifacts
|
|
rm -rf $(BIN_DIR) coverage.out coverage.html $(TAILWIND_OUTPUT)
|
|
|
|
run-server: server ## Build and run the server
|
|
$(SERVER_BIN)
|
|
|
|
run-agent: agent ## Build and run the agent
|
|
$(AGENT_BIN)
|
|
|
|
docker: ## Build the server Docker image
|
|
docker build -f deploy/Dockerfile.server --build-arg VERSION=$(VERSION) -t $(DOCKER_IMAGE):$(DOCKER_TAG) .
|
|
|
|
release: ## Cross-compile for all supported platforms
|
|
@mkdir -p $(BIN_DIR)
|
|
@for target in linux/amd64 linux/arm64 windows/amd64; do \
|
|
goos=$${target%/*}; goarch=$${target#*/}; \
|
|
ext=""; if [ "$$goos" = "windows" ]; then ext=".exe"; fi; \
|
|
echo "==> $$goos/$$goarch"; \
|
|
GOOS=$$goos GOARCH=$$goarch CGO_ENABLED=0 \
|
|
go build $(GOFLAGS) -ldflags "$(LDFLAGS)" \
|
|
-o $(BIN_DIR)/restic-manager-server-$$goos-$$goarch$$ext ./cmd/server; \
|
|
GOOS=$$goos GOARCH=$$goarch CGO_ENABLED=0 \
|
|
go build $(GOFLAGS) -ldflags "$(LDFLAGS)" \
|
|
-o $(BIN_DIR)/restic-manager-agent-$$goos-$$goarch$$ext ./cmd/agent; \
|
|
done
|