mirror of
https://github.com/absmach/supermq.git
synced 2026-06-23 07:30:25 +00:00
28944064d1
Signed-off-by: dusan <borovcanindusan1@gmail.com>
234 lines
6.4 KiB
Makefile
234 lines
6.4 KiB
Makefile
# MQTT Broker Makefile
|
|
|
|
# Build configuration
|
|
BUILD_DIR := build
|
|
BINARY := fluxmq
|
|
GO := go
|
|
|
|
# Build flags
|
|
LDFLAGS := -s -w
|
|
GOFLAGS := -trimpath
|
|
DOCKER_IMAGE_LATEST := ghcr.io/absmach/fluxmq:latest
|
|
DOCKER_IMAGE_GIT := ghcr.io/absmach/fluxmq:$(shell git describe --tags --always --dirty)
|
|
|
|
|
|
# Default target
|
|
.PHONY: all
|
|
all: build
|
|
|
|
# Build the broker binary
|
|
.PHONY: build
|
|
build: $(BUILD_DIR)/$(BINARY)
|
|
|
|
$(BUILD_DIR)/$(BINARY): cmd/main.go $(shell find . -name '*.go' -not -path './build/*')
|
|
@mkdir -p $(BUILD_DIR)
|
|
$(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(BINARY) ./cmd
|
|
|
|
# Build Docker image (latest tag)
|
|
.PHONY: docker
|
|
docker:
|
|
docker build -f docker/Dockerfile -t $(DOCKER_IMAGE_LATEST) .
|
|
|
|
# Build Docker image tagged with the current git tag/sha
|
|
.PHONY: docker-latest
|
|
docker-latest:
|
|
docker build -f docker/Dockerfile -t $(DOCKER_IMAGE_GIT) .
|
|
|
|
# Run the broker (uses default configuration)
|
|
.PHONY: run
|
|
run: build
|
|
$(BUILD_DIR)/$(BINARY)
|
|
|
|
# Run with custom config file
|
|
.PHONY: run-config
|
|
run-config: build
|
|
$(BUILD_DIR)/$(BINARY) -config config.yaml
|
|
|
|
# Run with debug logging (uses default config with debug level override via env)
|
|
.PHONY: run-debug
|
|
run-debug: build
|
|
MQTT_LOG_LEVEL=debug $(BUILD_DIR)/$(BINARY)
|
|
|
|
# Run tests
|
|
.PHONY: test
|
|
test:
|
|
$(GO) test -short -race -failfast -timeout 3m -v ./...
|
|
|
|
# Run full tests (including stress)
|
|
.PHONY: test-full
|
|
test-full:
|
|
$(GO) test -race -count=1 -v -timeout 30m ./...
|
|
|
|
# Run tests with coverage
|
|
.PHONY: test-cover
|
|
test-cover:
|
|
$(GO) test -coverprofile=$(BUILD_DIR)/coverage.out ./...
|
|
$(GO) tool cover -html=$(BUILD_DIR)/coverage.out -o $(BUILD_DIR)/coverage.html
|
|
|
|
# Run benchmarks
|
|
.PHONY: bench
|
|
bench:
|
|
$(GO) test -bench=. -benchmem -run=^$$ ./...
|
|
|
|
# Run benchmarks for broker only
|
|
.PHONY: bench-broker
|
|
bench-broker:
|
|
$(GO) test -bench=. -benchmem -run=^$$ ./mqtt/broker
|
|
|
|
# Run zero-copy comparison benchmarks
|
|
.PHONY: bench-zerocopy
|
|
bench-zerocopy:
|
|
$(GO) test -bench=BenchmarkMessageCopy -benchmem -run=^$$ ./mqtt/broker
|
|
|
|
# Run stress tests (all)
|
|
.PHONY: stress
|
|
stress:
|
|
$(GO) test -v -run=TestStress -timeout=30m ./mqtt/broker
|
|
|
|
# Run specific stress tests
|
|
.PHONY: stress-throughput
|
|
stress-throughput:
|
|
$(GO) test -v -run=TestStress_HighThroughputPublish -timeout=5m ./mqtt/broker
|
|
|
|
.PHONY: stress-concurrent
|
|
stress-concurrent:
|
|
$(GO) test -v -run=TestStress_ConcurrentPublishers -timeout=5m ./mqtt/broker
|
|
|
|
.PHONY: stress-memory
|
|
stress-memory:
|
|
$(GO) test -v -run=TestStress_MemoryPressure -timeout=5m ./mqtt/broker
|
|
|
|
.PHONY: stress-sustained
|
|
stress-sustained:
|
|
$(GO) test -v -run=TestStress_SustainedLoad -timeout=5m ./mqtt/broker
|
|
|
|
.PHONY: stress-pool
|
|
stress-pool:
|
|
$(GO) test -v -run=TestStress_BufferPoolExhaustion -timeout=5m ./mqtt/broker
|
|
|
|
.PHONY: stress-fanout
|
|
stress-fanout:
|
|
$(GO) test -v -run=TestStress_FanOutExtreme -timeout=5m ./mqtt/broker
|
|
|
|
.PHONY: stress-churn
|
|
stress-churn:
|
|
$(GO) test -v -run=TestStress_RapidSubscribeUnsubscribe -timeout=5m ./mqtt/broker
|
|
|
|
# Generate benchmark report
|
|
.PHONY: bench-report
|
|
bench-report:
|
|
@mkdir -p $(BUILD_DIR)
|
|
$(GO) test -bench=. -benchmem -run=^$$ ./mqtt/broker | tee $(BUILD_DIR)/benchmark-results.txt
|
|
@echo ""
|
|
@echo "Benchmark results saved to $(BUILD_DIR)/benchmark-results.txt"
|
|
|
|
# Run linter
|
|
.PHONY: lint
|
|
lint:
|
|
golangci-lint run ./...
|
|
|
|
# Format code
|
|
.PHONY: fmt
|
|
fmt:
|
|
$(GO) fmt ./...
|
|
goimports -w .
|
|
|
|
# Clean build artifacts
|
|
.PHONY: clean
|
|
clean:
|
|
rm -rf $(BUILD_DIR)
|
|
|
|
# Install dependencies
|
|
.PHONY: deps
|
|
deps:
|
|
$(GO) mod tidy
|
|
$(GO) mod download
|
|
|
|
# Run examples
|
|
.PHONY: run-no-cluster
|
|
run-no-cluster: build
|
|
$(BUILD_DIR)/$(BINARY) -config examples/no-cluster.yaml
|
|
|
|
.PHONY: run-single-cluster
|
|
run-single-cluster: build
|
|
$(BUILD_DIR)/$(BINARY) -config examples/single-node-cluster.yaml
|
|
|
|
.PHONY: run-node1
|
|
run-node1: build
|
|
$(BUILD_DIR)/$(BINARY) -config examples/node1.yaml
|
|
|
|
.PHONY: run-node2
|
|
run-node2: build
|
|
$(BUILD_DIR)/$(BINARY) -config examples/node2.yaml
|
|
|
|
.PHONY: run-node3
|
|
run-node3: build
|
|
$(BUILD_DIR)/$(BINARY) -config examples/node3.yaml
|
|
|
|
# Clean all temporary data directories
|
|
.PHONY: clean-data
|
|
clean-data:
|
|
rm -rf /tmp/fluxmq
|
|
|
|
.PHONY: proto
|
|
proto:
|
|
buf generate
|
|
|
|
.PHONY: proto-lint
|
|
proto-lint:
|
|
buf lint
|
|
|
|
.PHONY: proto-breaking
|
|
proto-breaking:
|
|
buf breaking --against '.git#branch=main'
|
|
|
|
# Show help
|
|
.PHONY: help
|
|
help:
|
|
@echo "MQTT Broker Makefile"
|
|
@echo ""
|
|
@echo "Build Targets:"
|
|
@echo " build Build the broker binary to $(BUILD_DIR)/$(BINARY)"
|
|
@echo " run Build and run the broker with default config"
|
|
@echo " run-config Build and run with config.yaml"
|
|
@echo " run-debug Build and run with debug logging"
|
|
@echo ""
|
|
@echo "Example Configurations:"
|
|
@echo " run-no-cluster Run single node without clustering"
|
|
@echo " run-single-cluster Run single node with clustering enabled"
|
|
@echo " run-node1 Run first node of 3-node cluster (bootstrap)"
|
|
@echo " run-node2 Run second node of 3-node cluster"
|
|
@echo " run-node3 Run third node of 3-node cluster"
|
|
@echo ""
|
|
@echo " NOTE: For 3-node cluster, run node1, node2, and node3 in separate terminals"
|
|
@echo ""
|
|
@echo "Testing Targets:"
|
|
@echo " test Run all tests"
|
|
@echo " test-cover Run tests with coverage report"
|
|
@echo " lint Run golangci-lint"
|
|
@echo ""
|
|
@echo "Benchmark Targets:"
|
|
@echo " bench Run all benchmarks"
|
|
@echo " bench-broker Run broker benchmarks only"
|
|
@echo " bench-zerocopy Run zero-copy vs legacy comparison"
|
|
@echo " bench-report Generate benchmark report to $(BUILD_DIR)/"
|
|
@echo ""
|
|
@echo "Stress Test Targets:"
|
|
@echo " stress Run all stress tests (~30 min)"
|
|
@echo " stress-throughput High throughput test (10K msg/s)"
|
|
@echo " stress-concurrent Concurrent publishers test"
|
|
@echo " stress-memory Memory pressure test (large messages)"
|
|
@echo " stress-sustained Sustained mixed load test (30s)"
|
|
@echo " stress-pool Buffer pool exhaustion test"
|
|
@echo " stress-fanout Extreme fan-out test (5K subscribers)"
|
|
@echo " stress-churn Subscription churn test"
|
|
@echo ""
|
|
@echo "Utility Targets:"
|
|
@echo " fmt Format code"
|
|
@echo " clean Remove build artifacts"
|
|
@echo " clean-data Remove all /tmp/fluxmq data directories"
|
|
@echo " deps Download and tidy dependencies"
|
|
@echo " docker Build Docker image ($(DOCKER_IMAGE_LATEST))"
|
|
@echo " docker-latest Build Docker image ($(DOCKER_IMAGE_GIT))"
|
|
@echo " help Show this help message"
|