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"