feat: refactor CI workflows, consolidate release process, and enhance Makefile for multi-platform builds

gosunuts committed Feb 24, 2026 at 19:07 UTC 4afeca52bca802df2fe5a90c3b16f89c65ed1192
4 files changed +97 -156
.github/workflows/ci.yml
+35 -24
@@ -5,37 +5,48 @@ on:
5 branches: [main]
6 push:
7 branches: [main]
8 + tags: ["v*"]
9 workflow_dispatch:
10
11 jobs:
12 test:
12 - name: Test & Build
13 + name: Test
14 runs-on: ubuntu-latest
14 -
15 steps:
16 - - name: Checkout code
17 - uses: actions/checkout@v5
18 -
19 - - name: Set up Go
20 - uses: actions/setup-go@v6
16 + - uses: actions/checkout@v5
17 + - uses: actions/setup-go@v6
18 with:
19 go-version: "stable"
23 - check-latest: true
24 -
25 - - name: Download dependencies
26 - run: go mod download
27 -
28 - - name: Run vet
29 - run: go vet ./...
20 + - run: go mod download
21 + - run: go vet ./...
22 + - run: go test -v -race ./...
23 + - run: make build
24
31 - - name: Run tests
32 - run: go test -v -race ./...
33 -
34 - - name: Install golangci-lint
35 - run: go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
36 -
37 - - name: Run golangci-lint
38 - run: golangci-lint run
25 + lint:
26 + name: Lint
27 + runs-on: ubuntu-latest
28 + steps:
29 + - uses: actions/checkout@v5
30 + - uses: actions/setup-go@v6
31 + with:
32 + go-version: "stable"
33 + - run: go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
34 + - run: golangci-lint run
35
40 - - name: Build all components
41 - run: make build
36 + release:
37 + name: Release
38 + runs-on: ubuntu-latest
39 + if: startsWith(github.ref, 'refs/tags/v')
40 + needs: [test, lint]
41 + permissions:
42 + contents: write
43 + steps:
44 + - uses: actions/checkout@v5
45 + - uses: actions/setup-go@v6
46 + with:
47 + go-version: "stable"
48 + - run: make release
49 + - uses: softprops/action-gh-release@v2
50 + with:
51 + files: dist/release/*
52 + draft: true
.github/workflows/release.yml deleted
-43
@@ -1,43 +0,0 @@
1 -name: Release
2 -
3 -on:
4 - push:
5 - tags:
6 - - "*"
7 -
8 -permissions:
9 - contents: write
10 - packages: write
11 - issues: write
12 - id-token: write
13 -
14 -jobs:
15 - goreleaser:
16 - runs-on: ubuntu-latest
17 - steps:
18 - - name: Checkout
19 - uses: actions/checkout@v5
20 -
21 - - name: Set up Go
22 - uses: actions/setup-go@v6
23 - with:
24 - go-version: "stable"
25 - check-latest: true
26 -
27 - - name: Download dependencies
28 - run: go mod download
29 -
30 - - name: Install build dependencies
31 - run: |
32 - sudo apt-get update
33 - sudo apt-get install -y binaryen
34 -
35 - - name: Run GoReleaser
36 - uses: goreleaser/goreleaser-action@v6
37 - with:
38 - distribution: goreleaser
39 - # 'latest', 'nightly', or a semver
40 - version: "~> v2"
41 - args: release --clean
42 - env:
43 - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
.goreleaser.yaml deleted
-42
@@ -1,42 +0,0 @@
1 -version: 2
2 -
3 -before:
4 - hooks:
5 - - make clean
6 - - make build
7 -
8 -builds:
9 - - main: ./cmd/relay-server
10 - env:
11 - - CGO_ENABLED=0
12 - goos:
13 - - linux
14 - - windows
15 - - darwin
16 -
17 -archives:
18 - - formats: [tar.gz]
19 - # this name template makes the OS and Arch compatible with the results of `uname`.
20 - name_template: >-
21 - {{ .ProjectName }}_
22 - {{- title .Os }}_
23 - {{- if eq .Arch "amd64" }}x86_64
24 - {{- else if eq .Arch "386" }}i386
25 - {{- else }}{{ .Arch }}{{ end }}
26 - {{- if .Arm }}v{{ .Arm }}{{ end }}
27 - # use zip for windows archives
28 - format_overrides:
29 - - goos: windows
30 - formats: [zip]
31 -
32 -changelog:
33 - sort: asc
34 - filters:
35 - exclude:
36 - - "^docs:"
37 - - "^test:"
38 -
39 -release:
40 - footer: >-
41 -
42 - ---
Makefile
+62 -47
@@ -1,71 +1,86 @@
1 -.PHONY: help fmt vet lint test vuln tidy all run build build-frontend build-tunnel build-server clean
1 +.PHONY: help fmt vet lint test tidy build release clean
2
3 .DEFAULT_GOAL := help
4
5 +VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
6 +LDFLAGS := -s -w -X main.version=$(VERSION)
7 +
8 help:
9 @echo "Available targets:"
7 - @echo " make build - Build everything (frontend, tunnel, server)"
8 - @echo " make build-frontend - Build React frontend (Tailwind CSS 4)"
9 - @echo " make build-tunnel - Build portal-tunnel binaries"
10 - @echo " make build-server - Build Go relay server (includes frontend build)"
11 - @echo " make run - Run relay server"
12 - @echo " make clean - Remove build artifacts"
10 + @echo " make build - Build relay-server and portal-tunnel for current platform"
11 + @echo " make build-all - Build all binaries for all platforms (linux/darwin/windows, amd64/arm64)"
12 + @echo " make release - Create release archives in dist/"
13 + @echo " make test - Run tests"
14 + @echo " make lint - Run linter"
15 + @echo " make fmt - Format code"
16 + @echo " make clean - Remove build artifacts"
17 + @echo " make run - Run relay server locally"
18
19 fmt:
15 - gofmt -w .
16 - goimports -w .
20 + @gofmt -w .
21 + @echo "Formatted"
22
23 vet:
19 - go vet ./...
24 + @go vet ./...
25 + @echo "Vet passed"
26
27 lint:
22 - golangci-lint run
28 + @golangci-lint run
29
30 test:
25 - go test -v -race -coverprofile=coverage.out ./...
26 -
27 -vuln:
28 - govulncheck ./...
31 + @go test -v -race ./...
32
33 tidy:
31 - go mod tidy
32 - go mod verify
33 -
34 -all: fmt vet lint test vuln build
35 -
36 -run:
37 - ./bin/relay-server
34 + @go mod tidy
35 + @go mod verify
36
39 -# Convenience target
40 -build: build-frontend build-tunnel build-server
37 +build:
38 + @mkdir -p bin
39 + @echo "Building relay-server..."
40 + @CGO_ENABLED=0 go build -trimpath -ldflags "$(LDFLAGS)" -o bin/relay-server ./cmd/relay-server
41 + @echo "Building portal-tunnel..."
42 + @CGO_ENABLED=0 go build -trimpath -ldflags "$(LDFLAGS)" -o bin/portal-tunnel ./cmd/portal-tunnel
43 + @echo "Build complete: bin/"
44
42 -# Build React frontend with Tailwind CSS 4
43 -build-frontend:
44 - @echo "[frontend] building React frontend..."
45 - @mkdir -p cmd/relay-server/dist/app
46 - @cd cmd/relay-server/frontend && npm i && npm run build
47 - @echo "[frontend] build complete"
45 +build-all:
46 + @mkdir -p dist
47 + @echo "Building for all platforms..."
48 + @for os in linux darwin windows; do \
49 + for arch in amd64 arm64; do \
50 + EXT=""; \
51 + if [ "$$os" = "windows" ]; then EXT=".exe"; fi; \
52 + echo " $$os/$$arch..."; \
53 + CGO_ENABLED=0 GOOS=$$os GOARCH=$$arch go build -trimpath -ldflags "$(LDFLAGS)" -o "dist/relay-server-$$os-$$arch$$EXT" ./cmd/relay-server; \
54 + CGO_ENABLED=0 GOOS=$$os GOARCH=$$arch go build -trimpath -ldflags "$(LDFLAGS)" -o "dist/portal-tunnel-$$os-$$arch$$EXT" ./cmd/portal-tunnel; \
55 + done; \
56 + done
57 + @echo "All builds complete: dist/"
58
49 -# Build portal-tunnel binaries for distribution
50 -build-tunnel:
51 - @echo "[tunnel] building portal-tunnel binaries..."
52 - @mkdir -p cmd/relay-server/dist/tunnel
53 - @for GOOS in linux darwin windows; do \
54 - for GOARCH in amd64 arm64; do \
59 +release: clean build-all
60 + @echo "Creating release archives..."
61 + @mkdir -p dist/release
62 + @for os in linux darwin windows; do \
63 + for arch in amd64 arm64; do \
64 EXT=""; \
56 - if [ "$${GOOS}" = "windows" ]; then EXT=".exe"; fi; \
57 - OUT="cmd/relay-server/dist/tunnel/portal-tunnel-$${GOOS}-$${GOARCH}$${EXT}"; \
58 - echo " - $${OUT}"; \
59 - CGO_ENABLED=0 GOOS=$${GOOS} GOARCH=$${GOARCH} go build -trimpath -ldflags "-s -w" -o "$${OUT}" ./cmd/portal-tunnel; \
65 + if [ "$$os" = "windows" ]; then EXT=".exe"; fi; \
66 + DIR="portal-$(VERSION)-$$os-$$arch"; \
67 + mkdir -p "dist/release/$$DIR"; \
68 + cp "dist/relay-server-$$os-$$arch$$EXT" "dist/release/$$DIR/relay-server$$EXT"; \
69 + cp "dist/portal-tunnel-$$os-$$arch$$EXT" "dist/release/$$DIR/portal-tunnel$$EXT"; \
70 + cp README.md LICENSE "dist/release/$$DIR/"; \
71 + if [ "$$os" = "windows" ]; then \
72 + (cd dist/release && zip -q "$$DIR.zip" "$$DIR"/*); \
73 + else \
74 + (cd dist/release && tar -czf "$$DIR.tar.gz" "$$DIR"); \
75 + fi; \
76 + rm -rf "dist/release/$$DIR"; \
77 done; \
78 done
79 + @echo "Release archives created: dist/release/"
80
63 -# Build Go relay server
64 -build-server:
65 - @echo "[server] building Go portal..."
66 - CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o bin/relay-server ./cmd/relay-server
81 +run: build
82 + @./bin/relay-server
83
84 clean:
69 - rm -rf bin
70 - rm -rf cmd/relay-server/dist/app
71 - rm -rf cmd/relay-server/dist/tunnel
85 + @rm -rf bin dist
86 + @echo "Cleaned"