239 lines
7.5 KiB
Makefile
239 lines
7.5 KiB
Makefile
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
# Entry point for building, testing and releasing. Run `make help`.
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Central names (ADR 0018). Override on the command line to rebrand, e.g.
|
|
# make release PRODUCT=acme-ddi DISPLAY_NAME="ACME DDI"
|
|
# ---------------------------------------------------------------------------
|
|
PRODUCT ?= ddi-suite
|
|
DISPLAY_NAME ?= DDI-Suite
|
|
BIN_SERVER ?= ddi-server
|
|
BIN_AGENT_DNS ?= ddi-agent-dns
|
|
BIN_AGENT_DHCP ?= ddi-agent-dhcp
|
|
|
|
# Licensing trust anchor embedded into the server (ADR 0016). Both values are
|
|
# public; they are embedded so that configuration cannot redirect licensing.
|
|
KEYGEN_ACCOUNT_ID ?= 9de54794-8e94-4250-83f6-87e3d5686a0b
|
|
KEYGEN_PUBLIC_KEY ?= 40495568fa239e44736e28949ae2ae93f2c9b6e6bc6d917f4c8cc0eb629e3c62
|
|
|
|
MODULE := git.beugsiud.de/beug.k/DDI
|
|
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo dev)
|
|
COMMIT ?= $(shell git rev-parse HEAD 2>/dev/null || echo unknown)
|
|
BUILD_DATE ?= $(shell git log -1 --format=%cI 2>/dev/null)
|
|
|
|
PLATFORMS ?= linux/amd64 linux/arm64
|
|
BIN_DIR ?= bin
|
|
DIST_DIR ?= dist
|
|
# nfpm for make packages / PACKAGES=1; scripts/ci/install-tools.sh installs
|
|
# the pinned version (NFPM_VERSION there).
|
|
NFPM ?= nfpm
|
|
export NFPM
|
|
|
|
COMPOSE_DEV := docker compose -f deploy/compose/compose.dev.yaml
|
|
|
|
export PRODUCT DISPLAY_NAME BIN_SERVER BIN_AGENT_DNS BIN_AGENT_DHCP VERSION COMMIT BUILD_DATE
|
|
export KEYGEN_ACCOUNT_ID KEYGEN_PUBLIC_KEY
|
|
export DDI_DISPLAY_NAME := $(DISPLAY_NAME)
|
|
export CGO_ENABLED := 0
|
|
|
|
# Values are single-quoted so that names may contain spaces.
|
|
GO_LDFLAGS := -s -w \
|
|
-X '$(MODULE)/internal/buildinfo.Version=$(VERSION)' \
|
|
-X '$(MODULE)/internal/buildinfo.Commit=$(COMMIT)' \
|
|
-X '$(MODULE)/internal/buildinfo.Date=$(BUILD_DATE)' \
|
|
-X '$(MODULE)/internal/brand.Product=$(PRODUCT)' \
|
|
-X '$(MODULE)/internal/brand.DisplayName=$(DISPLAY_NAME)' \
|
|
-X '$(MODULE)/internal/brand.ServerBinary=$(BIN_SERVER)' \
|
|
-X '$(MODULE)/internal/brand.AgentDNSBinary=$(BIN_AGENT_DNS)' \
|
|
-X '$(MODULE)/internal/brand.AgentDHCPBinary=$(BIN_AGENT_DHCP)' \
|
|
-X '$(MODULE)/internal/brand.ConfigDir=/etc/$(PRODUCT)' \
|
|
-X '$(MODULE)/internal/brand.StateDir=/var/lib/$(PRODUCT)' \
|
|
-X '$(MODULE)/internal/brand.LogDir=/var/log/$(PRODUCT)' \
|
|
-X '$(MODULE)/server/internal/license.EmbeddedAccountID=$(KEYGEN_ACCOUNT_ID)' \
|
|
-X '$(MODULE)/server/internal/license.EmbeddedPublicKey=$(KEYGEN_PUBLIC_KEY)'
|
|
|
|
SHELL_SCRIPTS := $(shell git ls-files '*.sh')
|
|
|
|
.DEFAULT_GOAL := help
|
|
|
|
## help: list targets
|
|
.PHONY: help
|
|
help:
|
|
@awk -F': ' '/^## /{ sub(/^## /, ""); printf " %-16s %s\n", $$1, $$2 }' $(MAKEFILE_LIST)
|
|
|
|
# --------------------------------------------------------------------------- build
|
|
|
|
## build: build web UI and all binaries for the host platform into bin/
|
|
.PHONY: build
|
|
build: web build-go
|
|
|
|
## build-go: build the Go binaries only (uses whatever is in web/dist)
|
|
.PHONY: build-go
|
|
build-go:
|
|
go build -trimpath -ldflags "$(GO_LDFLAGS)" -o $(BIN_DIR)/$(BIN_SERVER) ./server/cmd/ddi-server
|
|
go build -trimpath -ldflags "$(GO_LDFLAGS)" -o $(BIN_DIR)/$(BIN_AGENT_DNS) ./agent/cmd/ddi-agent-dns
|
|
go build -trimpath -ldflags "$(GO_LDFLAGS)" -o $(BIN_DIR)/$(BIN_AGENT_DHCP) ./agent/cmd/ddi-agent-dhcp
|
|
|
|
## web-deps: install frontend dependencies exactly as locked
|
|
.PHONY: web-deps
|
|
web-deps:
|
|
cd web && npm ci --no-fund --no-audit
|
|
|
|
## web: build the frontend into web/dist (embedded by the server)
|
|
.PHONY: web
|
|
web: web-deps
|
|
cd web && npm run build
|
|
|
|
## generate: regenerate protobuf code and the TypeScript API types
|
|
.PHONY: generate
|
|
generate:
|
|
buf generate
|
|
cd web && npm run gen:api
|
|
|
|
## check-generated: fail if generated code is out of date
|
|
.PHONY: check-generated
|
|
check-generated: generate
|
|
git diff --exit-code -- proto/gen web/src/api/schema.d.ts
|
|
|
|
# --------------------------------------------------------------------------- quality
|
|
|
|
## fmt: format Go, protobuf and frontend code
|
|
.PHONY: fmt
|
|
fmt:
|
|
golangci-lint fmt ./...
|
|
buf format -w
|
|
cd web && npm run format
|
|
|
|
## lint: run all linters
|
|
.PHONY: lint
|
|
lint: lint-go lint-proto lint-web lint-shell lint-spdx lint-brand
|
|
|
|
.PHONY: lint-go
|
|
lint-go:
|
|
go vet ./...
|
|
golangci-lint run ./...
|
|
|
|
.PHONY: lint-proto
|
|
lint-proto:
|
|
buf lint
|
|
buf format --diff --exit-code
|
|
|
|
.PHONY: lint-web
|
|
lint-web:
|
|
cd web && npm run lint && npm run format:check && npm run typecheck
|
|
|
|
.PHONY: lint-shell
|
|
lint-shell:
|
|
shellcheck $(SHELL_SCRIPTS)
|
|
|
|
.PHONY: lint-spdx
|
|
lint-spdx:
|
|
scripts/check-spdx.sh
|
|
|
|
## lint-brand: no hard-coded product names in units, packages, installer (ADR 0018)
|
|
.PHONY: lint-brand
|
|
lint-brand:
|
|
scripts/check-brand.sh
|
|
|
|
## test: run Go and frontend unit tests
|
|
.PHONY: test
|
|
test: test-go test-web
|
|
|
|
.PHONY: test-go
|
|
test-go:
|
|
CGO_ENABLED=1 go test -race -count=1 -coverprofile=coverage.txt ./...
|
|
|
|
.PHONY: test-web
|
|
test-web:
|
|
cd web && npm test
|
|
|
|
## test-e2e: API change -> revision -> agents -> BIND/Kea in containers (needs docker)
|
|
.PHONY: test-e2e
|
|
test-e2e: build
|
|
test/e2e/run.sh
|
|
|
|
## test-integration: generated configs and agent roles against real BIND and Kea (needs docker)
|
|
.PHONY: test-integration
|
|
test-integration:
|
|
go test -tags integration -count=1 -v -timeout 20m \
|
|
./server/internal/configgen/integration/ ./agent/role/integration/
|
|
|
|
## bench: measure server, BIND and Kea with generated data (needs docker and bin/ from build-go)
|
|
.PHONY: bench
|
|
bench:
|
|
test/bench/run.sh
|
|
|
|
## vuln: scan dependencies for known vulnerabilities
|
|
.PHONY: vuln
|
|
vuln:
|
|
go tool govulncheck ./...
|
|
cd web && npm audit --audit-level=high
|
|
|
|
## ci: everything the CI checks, in one go
|
|
.PHONY: ci
|
|
ci: lint check-generated test vuln build
|
|
|
|
# --------------------------------------------------------------------------- release
|
|
|
|
## release: cross-compile tarballs and SHA256SUMS into dist/ (PACKAGES=1: also .deb/.rpm)
|
|
.PHONY: release
|
|
release: web
|
|
scripts/build-release.sh -o $(DIST_DIR) -p "$(PLATFORMS)"
|
|
ifeq ($(PACKAGES),1)
|
|
scripts/build-packages.sh -d $(DIST_DIR) -p "$(PLATFORMS)"
|
|
endif
|
|
|
|
## packages: .deb and .rpm from the tarballs in dist/ (after make release; needs nfpm)
|
|
.PHONY: packages
|
|
packages:
|
|
scripts/build-packages.sh -d $(DIST_DIR) -p "$(PLATFORMS)"
|
|
|
|
## sign-release: sign dist/SHA256SUMS with the Ed25519 key in RELEASE_SIGNING_KEY_FILE
|
|
.PHONY: sign-release
|
|
sign-release:
|
|
scripts/sign-release.sh sign $(DIST_DIR)/SHA256SUMS "$(RELEASE_SIGNING_KEY_FILE)"
|
|
|
|
# --------------------------------------------------------------------------- development
|
|
|
|
## dev-up: start PostgreSQL, BIND and Kea for development
|
|
.PHONY: dev-up
|
|
dev-up:
|
|
$(COMPOSE_DEV) up -d --build --wait
|
|
|
|
## dev-down: stop the development environment (keeps volumes)
|
|
.PHONY: dev-down
|
|
dev-down:
|
|
$(COMPOSE_DEV) down
|
|
|
|
## dev-logs: follow logs of the development environment
|
|
.PHONY: dev-logs
|
|
dev-logs:
|
|
$(COMPOSE_DEV) logs -f
|
|
|
|
## dev-smoke: verify the development environment answers (needs dev-up)
|
|
.PHONY: dev-smoke
|
|
dev-smoke:
|
|
deploy/compose/smoke-test.sh
|
|
|
|
DEV_CONFIG := deploy/config/server.dev.yaml
|
|
|
|
local/master.key:
|
|
go run ./server/cmd/ddi-server gen-master-key -out $@
|
|
|
|
## run-server: run the server on http://127.0.0.1:8080 against the dev database (make dev-up)
|
|
.PHONY: run-server
|
|
run-server: local/master.key
|
|
DDI_CONFIG_FILE=$(DEV_CONFIG) go run ./server/cmd/ddi-server serve
|
|
|
|
## dev-admin: create the first administrator in the dev database
|
|
.PHONY: dev-admin
|
|
dev-admin: local/master.key
|
|
DDI_CONFIG_FILE=$(DEV_CONFIG) go run ./server/cmd/ddi-server bootstrap-admin
|
|
|
|
## clean: remove build output
|
|
.PHONY: clean
|
|
clean:
|
|
rm -rf $(BIN_DIR) $(DIST_DIR) coverage.txt
|
|
find web/dist -mindepth 1 ! -name .gitkeep -delete 2>/dev/null || true
|