git describe had started picking the nearest release tag (v0.1.0-137-gc129f65, fetched from Gitea), so a build came out as v0.1.0-137-gc129f65-36-g7d0b87b, which the version compare reads as build 137: older than the 169 it replaces. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
78 lines
3.1 KiB
Makefile
78 lines
3.1 KiB
Makefile
# Commit first, then deploy: the version is the commit the binary was built from, counted
|
|
# from the base tag. A published release is tagged with a version of this same shape
|
|
# (v0.1.0-137-gc129f65), and described from one of those a build would count from 137 again
|
|
# and read as older than what it replaces — so tags with a dash are never the base.
|
|
VERSION ?= $(shell git describe --tags --exclude '*-*' --always 2>/dev/null || echo dev)
|
|
GO ?= go
|
|
PREFIX ?= /usr/local/bin
|
|
|
|
# every architecture a release carries; arm is ARMv6 hard-float, so it covers every Raspberry Pi
|
|
ARCHES ?= amd64 arm64 arm 386 riscv64
|
|
LDFLAGS = -s -w -X main.version=$(VERSION)
|
|
# static, no cgo: the same file runs on glibc, musl (Alpine) and anything else with a Linux kernel
|
|
GOBUILD = CGO_ENABLED=0 GOOS=linux GOARM=6 $(GO) build -trimpath -ldflags "$(LDFLAGS)"
|
|
|
|
.PHONY: all web build go dev cross release gitea-release deploy push-nodes push-nodes-force test clean
|
|
|
|
all: build
|
|
|
|
web:
|
|
cd web && npm ci --no-audit --no-fund && npm run build
|
|
|
|
build: web go
|
|
|
|
# backend only (assumes web/dist already built)
|
|
go:
|
|
$(GOBUILD) -o bin/hamlab ./cmd/hamlab
|
|
|
|
# one other architecture: make build-arm64, build-arm, build-386, build-riscv64, build-amd64
|
|
build-%: web
|
|
GOARCH=$* $(GOBUILD) -o bin/hamlab-linux-$* ./cmd/hamlab
|
|
|
|
dev:
|
|
cd web && npm run dev
|
|
|
|
# siblings for every other architecture; installed beside the binary, and the hub pushes
|
|
# each managed machine the one that matches it
|
|
cross:
|
|
@for a in $(filter-out $(shell $(GO) env GOARCH),$(ARCHES)); do \
|
|
echo "build linux/$$a"; GOARCH=$$a $(GOBUILD) -o bin/hamlab-linux-$$a ./cmd/hamlab || exit 1; done
|
|
|
|
# dist/: one static binary per architecture, install.sh, SHA256SUMS. Serve the directory
|
|
# anywhere (or attach it to a release) and install.sh does the rest.
|
|
release: web
|
|
rm -rf dist && mkdir -p dist
|
|
@for a in $(ARCHES); do \
|
|
echo "build linux/$$a"; GOARCH=$$a $(GOBUILD) -o dist/hamlab-linux-$$a ./cmd/hamlab || exit 1; done
|
|
sed 's|@VERSION@|$(VERSION)|' install.sh > dist/install.sh && chmod +x dist/install.sh
|
|
echo $(VERSION) > dist/VERSION
|
|
cd dist && sha256sum hamlab-linux-* install.sh > SHA256SUMS
|
|
|
|
test:
|
|
$(GO) vet ./... && $(GO) test ./...
|
|
sh -n install.sh
|
|
cd web && npm test --silent
|
|
|
|
# installs here (keeping the config, user and password), then updates every managed machine
|
|
# Offer this build to every install, wherever it is: a release on Gitea, which is what
|
|
# Settings -> Updates reads. Deliberate, and not part of deploy — deploy pushes to the
|
|
# machines this hub owns, publishing offers it to everyone else.
|
|
gitea-release: release
|
|
./scripts/gitea-release.sh $(RELEASE_ARGS)
|
|
|
|
deploy: build cross
|
|
./bin/hamlab install --prefix $(PREFIX)
|
|
@sleep 1; $(PREFIX)/hamlab push-nodes || true
|
|
@echo "deployed $(VERSION); 'make gitea-release' publishes it for everyone else"
|
|
|
|
# push the installed binary to every managed machine (what deploy does last)
|
|
push-nodes:
|
|
$(PREFIX)/hamlab push-nodes
|
|
|
|
# same, interrupting running tasks and attached terminals on the nodes
|
|
push-nodes-force:
|
|
$(PREFIX)/hamlab push-nodes --force
|
|
|
|
clean:
|
|
rm -rf bin dist internal/web/dist web/dist
|