CI / Test (ubuntu-latest) (push) Canceled after 0s
CI / Test (windows-latest) (push) Canceled after 0s
CI / Storage tests on PostgreSQL (push) Canceled after 0s
CI / Complement (federation off) (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
CI / Smoke test the binary (push) Canceled after 0s
CI / Admin panel (push) Canceled after 0s
CI / Web client (push) Canceled after 0s
apps/web: a Matrix client for the browser on Vue 3, Tailwind and matrix-js-sdk, built on @warp/ui. Like the admin panel it is an optional, separate service: warp-web embeds the built app, serves /config.json and proxies only /_matrix/client and /_matrix/media to the homeserver (or, with -public-homeserver, lets the browser call it directly). Sign-in and sign-up with registration tokens, room list, timeline with back-pagination, text, images, video and files over authenticated media, local echo with sent/read/failed states, receipts, typing, invites, creating, joining and leaving rooms, room info, settings, phone layout. End-to-end encryption through the Rust crypto: encrypted messages and files, emoji verification, key backup setup and restore. apps/ui: WRoomItem, WMessageBubble and WComposer from the brand package, and the icons the client needs. syncapi fixes found with the client: - A room joined inside the sync window was sent as the join alone with limited: false, so clients thought they had the whole room. It is now read like an initial sync; a profile change is not mistaken for a join. - A live typing notification was reported on every sync, so every long poll returned at once while anybody typed. Typing now has a position in the sync token and is reported when it changes, including the empty list when the last person stops. Also: Dockerfile, a `web` compose profile, Makefile targets, a CI job with a proxy smoke test, docs. PLAN.md moves out of the repository. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
195 lines
6.4 KiB
Makefile
195 lines
6.4 KiB
Makefile
# Warp — build, test and lint.
|
|
#
|
|
# Everything Go lives in ./server; the frontend packages (apps/*) get their
|
|
# own targets as they are created.
|
|
|
|
SHELL := /bin/sh
|
|
GO ?= go
|
|
BIN_DIR := bin
|
|
BINARY := warp
|
|
SERVER_DIR := server
|
|
|
|
COMPLEMENT_IMAGE ?= complement-warp
|
|
|
|
VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo 0.0.0-dev)
|
|
COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown)
|
|
DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
|
|
PKG := github.com/dariuszjaniak/warp/server/internal/buildinfo
|
|
LDFLAGS := -X $(PKG).Version=$(VERSION) -X $(PKG).Commit=$(COMMIT) -X $(PKG).BuildDate=$(DATE)
|
|
|
|
# Windows builds need the .exe suffix for `make run` to work from MSYS.
|
|
ifeq ($(OS),Windows_NT)
|
|
EXE := .exe
|
|
else
|
|
EXE :=
|
|
endif
|
|
|
|
.DEFAULT_GOAL := build
|
|
|
|
.PHONY: help
|
|
help: ## List the targets
|
|
@grep -hE '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | \
|
|
awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-16s\033[0m %s\n", $$1, $$2}'
|
|
|
|
.PHONY: build
|
|
build: ## Build the warp binary into bin/
|
|
cd $(SERVER_DIR) && $(GO) build -ldflags "$(LDFLAGS)" -o ../$(BIN_DIR)/$(BINARY)$(EXE) ./cmd/warp
|
|
|
|
.PHONY: run
|
|
run: build ## Build and run the server
|
|
./$(BIN_DIR)/$(BINARY)$(EXE) serve
|
|
|
|
.PHONY: test
|
|
test: ## Run the unit tests (sqlite only)
|
|
cd $(SERVER_DIR) && $(GO) test ./...
|
|
|
|
.PHONY: test-race
|
|
test-race: ## Run the tests with the race detector (needs cgo)
|
|
cd $(SERVER_DIR) && CGO_ENABLED=1 $(GO) test -race ./...
|
|
|
|
.PHONY: test-postgres
|
|
test-postgres: ## Run the storage tests against PostgreSQL too
|
|
@test -n "$(WARP_TEST_POSTGRES_DSN)" || \
|
|
{ echo "set WARP_TEST_POSTGRES_DSN, e.g. postgres://warp:warp@localhost/warp_test?sslmode=disable"; exit 1; }
|
|
cd $(SERVER_DIR) && WARP_TEST_POSTGRES_DSN="$(WARP_TEST_POSTGRES_DSN)" $(GO) test ./internal/storage/...
|
|
|
|
.PHONY: cover
|
|
cover: ## Run the tests and write coverage.out / coverage.html
|
|
cd $(SERVER_DIR) && $(GO) test -coverprofile=../coverage.out -covermode=count ./...
|
|
$(GO) tool cover -html=coverage.out -o coverage.html
|
|
@echo "wrote coverage.html"
|
|
|
|
.PHONY: fmt
|
|
fmt: ## Format the Go code
|
|
cd $(SERVER_DIR) && $(GO) fmt ./...
|
|
|
|
.PHONY: vet
|
|
vet: ## Run go vet
|
|
cd $(SERVER_DIR) && $(GO) vet ./...
|
|
|
|
.PHONY: lint
|
|
lint: ## Run golangci-lint
|
|
cd $(SERVER_DIR) && golangci-lint run
|
|
|
|
.PHONY: tidy
|
|
tidy: ## Tidy the Go module files
|
|
cd $(SERVER_DIR) && $(GO) mod tidy
|
|
|
|
.PHONY: check
|
|
check: vet test ## What CI runs on every push (minus the linter)
|
|
|
|
.PHONY: generate-keys
|
|
generate-keys: build ## Create the ed25519 signing key
|
|
./$(BIN_DIR)/$(BINARY)$(EXE) generate-keys
|
|
|
|
.PHONY: migrate
|
|
migrate: build ## Apply pending database migrations
|
|
./$(BIN_DIR)/$(BINARY)$(EXE) migrate
|
|
|
|
.PHONY: create-account
|
|
create-account: build ## Create an account: make create-account ACCOUNT=alice ARGS=--admin
|
|
@test -n "$(ACCOUNT)" || { echo "set ACCOUNT, e.g. make create-account ACCOUNT=alice ARGS=--admin"; exit 1; }
|
|
./$(BIN_DIR)/$(BINARY)$(EXE) create-account --username "$(ACCOUNT)" $(ARGS)
|
|
|
|
# --- Admin panel (apps/admin) -------------------------------------------
|
|
# The panel is optional and runs as its own process, warp-admin, which
|
|
# serves the built frontend and proxies to the homeserver.
|
|
|
|
PNPM ?= pnpm
|
|
ADMIN_DIR := apps/admin
|
|
ADMIN_IMAGE ?= warp-admin
|
|
|
|
.PHONY: admin-deps
|
|
admin-deps: ## Install the frontend dependencies (pnpm)
|
|
$(PNPM) install --frozen-lockfile
|
|
|
|
.PHONY: admin-web
|
|
admin-web: ## Build the admin panel frontend into apps/admin/internal/panel/build/dist
|
|
$(PNPM) --filter @warp/admin build
|
|
|
|
.PHONY: admin
|
|
admin: admin-web ## Build bin/warp-admin with the panel embedded
|
|
cd $(ADMIN_DIR) && $(GO) build -ldflags "-X main.version=$(VERSION)" -o ../../$(BIN_DIR)/warp-admin$(EXE) ./cmd/warp-admin
|
|
|
|
.PHONY: admin-run
|
|
admin-run: admin ## Run warp-admin against http://localhost:8008
|
|
./$(BIN_DIR)/warp-admin$(EXE) -homeserver http://localhost:8008
|
|
|
|
.PHONY: admin-dev
|
|
admin-dev: ## Run the panel with hot reload on :5174, proxied to localhost:8008
|
|
$(PNPM) --filter @warp/admin dev
|
|
|
|
.PHONY: admin-test
|
|
admin-test: ## Typecheck the frontend and test warp-admin
|
|
$(PNPM) -r typecheck
|
|
cd $(ADMIN_DIR) && $(GO) vet ./... && $(GO) test ./...
|
|
|
|
.PHONY: admin-docker
|
|
admin-docker: ## Build the warp-admin container image
|
|
docker build -t $(ADMIN_IMAGE):$(VERSION) -f $(ADMIN_DIR)/Dockerfile .
|
|
|
|
# --- Web client (apps/web) --------------------------------------------
|
|
# Optional too: warp-web serves the built client and proxies its Matrix
|
|
# requests to the homeserver.
|
|
|
|
WEB_DIR := apps/web
|
|
WEB_IMAGE ?= warp-web
|
|
|
|
.PHONY: web-web
|
|
web-web: ## Build the web client frontend into apps/web/internal/client/build/dist
|
|
$(PNPM) --filter @warp/web build
|
|
|
|
.PHONY: web
|
|
web: web-web ## Build bin/warp-web with the client embedded
|
|
cd $(WEB_DIR) && $(GO) build -ldflags "-X main.version=$(VERSION)" -o ../../$(BIN_DIR)/warp-web$(EXE) ./cmd/warp-web
|
|
|
|
.PHONY: web-run
|
|
web-run: web ## Run warp-web against http://localhost:8008
|
|
./$(BIN_DIR)/warp-web$(EXE) -homeserver http://localhost:8008
|
|
|
|
.PHONY: web-dev
|
|
web-dev: ## Run the client with hot reload on :5175, proxied to localhost:8008
|
|
$(PNPM) --filter @warp/web dev
|
|
|
|
.PHONY: web-test
|
|
web-test: ## Typecheck the frontend and test warp-web
|
|
$(PNPM) -r typecheck
|
|
cd $(WEB_DIR) && $(GO) vet ./... && $(GO) test ./...
|
|
|
|
.PHONY: web-docker
|
|
web-docker: ## Build the warp-web container image
|
|
docker build -t $(WEB_IMAGE):$(VERSION) -f $(WEB_DIR)/Dockerfile .
|
|
|
|
.PHONY: complement-image
|
|
complement-image: ## Build the Complement homeserver image
|
|
docker build -t $(COMPLEMENT_IMAGE) -f $(SERVER_DIR)/test/complement/Dockerfile .
|
|
|
|
.PHONY: complement
|
|
complement: ## Run the Complement C-S subset (federation off)
|
|
bash $(SERVER_DIR)/test/complement/run.sh
|
|
|
|
.PHONY: complement-federation
|
|
complement-federation: ## Run the Complement federation subset
|
|
COMPLEMENT_PROFILE=federation bash $(SERVER_DIR)/test/complement/run.sh
|
|
|
|
.PHONY: docker
|
|
docker: ## Build the container image
|
|
docker build -t warp:$(VERSION) .
|
|
|
|
.PHONY: loadtest
|
|
loadtest: ## Load a test server: make loadtest ARGS="-url http://localhost:8008 -users 50"
|
|
cd $(SERVER_DIR) && $(GO) run ./cmd/warp-loadtest $(ARGS)
|
|
|
|
.PHONY: compose-up
|
|
compose-up: ## Run Warp, PostgreSQL and the observability stack with Docker Compose
|
|
cd deploy/compose && docker compose --profile observability up -d --build
|
|
|
|
.PHONY: helm-lint
|
|
helm-lint: ## Lint and render the Helm chart (needs helm)
|
|
helm lint deploy/helm/warp
|
|
helm template warp deploy/helm/warp > /dev/null
|
|
|
|
.PHONY: clean
|
|
clean: ## Remove build output
|
|
rm -rf $(BIN_DIR) coverage.out coverage.html
|